上一篇博客已经说到了信息录入后,初始地图的显示。下面就是开始游戏后的了。
1、掷筛子过程流程图
2、通过上面的流程图,可以写出2个方法
(1)方法6:判断是否在地图上,如果不在更改下标,使其玩家在地图上
public static void CheckPos()//判断玩家的坐标范围,超过99让其等于99,小于0,让其等于0
{
if (PlayeraPos[0]>99)
{
PlayeraPos[0] = 99;
}
if (PlayeraPos[1] > 99)
{
PlayeraPos[1] = 99;
}
if (PlayeraPos[0] < 0)
{
PlayeraPos[0] = 0;
}
if (PlayeraPos[1] < 0)
{
PlayeraPos[1] = 0;
}
}
(2)方法7:提示玩家胜利,显示方法
public static void Win()
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(" ◆ ");
Console.WriteLine(" ■ ◆ ■ ■");
Console.WriteLine(" ■■■■ ■ ■ ◆■ ■ ■ ■");
Console.WriteLine(" ■ ■ ■ ■ ◆ ■ ■ ■ ■");
Console.WriteLine(" ■ ■ ■■■■■■ ■■■■■■■ ■ ■ ■");
Console.WriteLine(" ■■■■ ■ ■ ●■● ■ ■ ■");
Console.WriteLine(" ■ ■ ■ ● ■ ● ■ ■ ■");
Console.WriteLine(" ■ ■ ■■■■■■ ● ■ ● ■ ■ ■");
Console.WriteLine(" ■■■■ ■ ● ■ ■ ■ ■ ■");
Console.WriteLine(" ■ ■ ■ ■ ■ ■ ■ ■");
Console.WriteLine(" ■ ■ ■ ■ ■ ■ ");
Console.WriteLine(" ■ ■ ■ ■ ● ■ ");
Console.WriteLine(" ■ ■■ ■■■■■■ ■ ● ●");
Console.ResetColor();
}
(3)、设置一个含有2个元素的bool类型的变量来判断是2个玩家是否需要暂停一次掷筛子
public static bool[] flag = new bool[] { false, false };//声明一个变量来判断中间是否需要暂停一次掷筛子
3、通过上一个流程图可以看出,玩家掷筛子结束,要行动,那么行动到指定的位置,有可能碰上6种点,其流程图为
从上面的流程图可以看出2个方法
(1)方法8:当玩家移动到幸运轮盘时,输入的数字是否符合要求
public static int ReadInt (string msg,int min,int max)
{
while(true)
{
try
{
Console.WriteLine(msg);
int number = Convert.ToInt32(Console.ReadLine());
if(number>=min && number<=max)
{
return number;
}
else
{
Console.WriteLine("你的输入不合法!只能输入{0}到{1}之间的数字!", min, max);
continue;
}
}
catch
{
Console.WriteLine("输入有误,请重新输入!");
}
}
}
(2)方法9:掷筛子的方法为:
public static void RowTouZ(int playerPos)//掷筛子的方法
{
//定义掷筛子的随机数
Random r = new Random();
int num = r.Next(1,7);
string msg = "";//显示掷筛子之后行动提示
Console.WriteLine("{0}按任意键掷筛子", PlayerNames[playerPos]);
Console.ReadKey(true);//为true时,不显示输入的内容
Console.WriteLine("{0}掷出了{1}", PlayerNames[playerPos], num);
Console.WriteLine("{0}按任意键开始行动......", PlayerNames[playerPos]);
Console.ReadKey(true);//按任意键,下一步
PlayeraPos[playerPos] += num;
CheckPos();//调用判断坐标范围方法
if (PlayeraPos[playerPos] == PlayeraPos[1 - playerPos])
{
msg=string.Format("玩家{0}踩到玩家{1},玩家{2}退6格", PlayeraPos[playerPos], PlayeraPos[1 - playerPos], PlayeraPos[1 - playerPos]);
PlayeraPos[1 - playerPos] -= 6;
CheckPos();//调用判断坐标范围方法
}
else
{
switch (Map[PlayeraPos[playerPos]])
{
case 0:msg="行动完了"; break;
case 1:
msg = string.Format("{0}走到幸运轮盘,请选择 1--交换位置,2--轰炸对方", PlayerNames[playerPos]);
int number = ReadInt(msg, 1, 2);
if (number == 1)
{
int temp = 0;
temp = PlayeraPos[playerPos];
PlayeraPos[playerPos] = PlayeraPos[1 - playerPos];
PlayeraPos[1 - playerPos] = temp;
msg=string.Format("玩家{0}选择了与玩家{1}交换位置", PlayerNames[playerPos], PlayerNames[1 - playerPos]);
}
else
{
PlayeraPos[1 - playerPos] = 0;
msg = string.Format("玩家{0}选择轰炸玩家{1}", PlayerNames[playerPos], PlayerNames[1 - playerPos]);
}
break;
case 2:
msg = "恭喜你,能踩到地雷,百年不遇,退6格";
PlayeraPos[playerPos] -= 6;
CheckPos();//调用判断坐标范围方法
break;
case 3:
msg = "踩到暂停了";
flag[playerPos] = true;
break;
case 4:
msg = "恭喜你,元芳让我告诉你将会穿越10步";
PlayeraPos[playerPos] += 10;
CheckPos();//调用判断坐标范围方法
break;
}
}
Console.Clear();//清空屏幕
DrawMap();//更新地图
Console.WriteLine(msg);//显示内容
}
4、第二部分代码:整体游戏过程代码
while(PlayeraPos[0] <=99 && PlayeraPos[1]<=99)
{
//玩家A掷筛子
if (flag[0]==false)
{
RowTouZ(0);
}
else
{
flag[0] = false;
}
//判断玩家A是否到达终点
if (PlayeraPos[0]==99)
{
Console.WriteLine("恭喜{0}胜利了!", PlayerNames[0]);
break;
}
//玩家B掷筛子
if (flag[1] == false)
{
RowTouZ(1);
}
else
{
flag[1] = false;
}
//判断玩家B是否到达终点
if (PlayeraPos[1] == 99)
{
Console.WriteLine("恭喜{0}胜利了!", PlayerNames[1]);
break;
}
Console.WriteLine("行动完毕...");
}
Win();
Console.ReadKey();
全部的整体部分的代码我就不再写了,逻辑只要屡清楚,那些不是问题
但其实整个飞行棋问题存在: 当踩到地雷,或者走到另外一个玩家的位置是,退回6步,那退回后的位置没有进过判断,如果继续踩到地雷应该再次退