首先要注意的就是绘制飞行棋的名称,这个在名臣在游戏中多次用到,为了避免代码的冗余,定义成一个方法就方便多了—ShowUi();
棋盘上玩家走到的位置和关卡的位置都是彩色的,那么我们如何改变控制台的前景色:Console.ForegroundColor =ConsoleColor.Yellow;这样就可以改变控制台输出的颜色了,想还原控制台的输出颜色:Console.ResetColor();
下面就要开始绘制地图了
首先定义一个长度为100的整形数组,然后按照指定的位置,将代表关卡和普通的值填写进去
图例:
0:表示普通□;
1:表示幸运轮盘 ◎;
2:表示地雷☆;
3:表示暂停▲;
4:表示时空隧道卍
这样先写一个方法初始化地图:InitialMap()
static void InitialMap()
{
int[] luckyTurn = { 6,23, 40, 55, 69, 83, 98 };//幸运轮盘 1
int[] landMine = { 5,13, 17, 33, 38, 50, 64, 80, 94 };//地雷 2
int[] pause = { 9, 27,60, 93 };//暂停 3
int[] timeTunnel = {20, 25, 45, 63, 72, 88, 90 };//时空隧道 4
for (int i = 0; i <luckyTurn.Length; i++)
{
Map[luckyTurn[i]] = 1;
}
for (int i = 0; i <landMine.Length; i++)
{
Map[landMine[i]] = 2;
}
for (int i = 0; i <pause.Length; i++)
{
Map[pause[i]] = 3;
}
for (int i = 0; i <timeTunnel.Length; i++)
{
Map[timeTunnel[i]] = 4;
}
}
通过InitialMap()方法,将Map数组中关卡的地方的值都替换为自己的值,然后就需要将值换位特殊的符号了,然后在定义一个方法GetMapString(int pos)//传入的参数pos表示Map数组中开始到结束这100个数的值,然后生成对应的特殊符号
static string GetMapString(int pos)
{
string result = "";
if (playerPos[0] ==pos && playerPos[1] == pos)
{
Console.ForegroundColor = ConsoleColor.Yellow;
result = "<>";
}
else if (playerPos[0] ==pos)
{
Console.ForegroundColor = ConsoleColor.Yellow;
result = "A";
}
else if (playerPos[1] ==pos)
{
Console.ForegroundColor = ConsoleColor.Yellow;
result = "B";
}
else
{
switch (Map[pos])
{
case 0:
Console.ForegroundColor = ConsoleColor.White;
result = "□";
break;
case 1:
Console.ForegroundColor = ConsoleColor.Red;
result = "◎";
break;
case 2:
Console.ForegroundColor = ConsoleColor.Green;
result = "☆";
break;
case 3:
Console.ForegroundColor = ConsoleColor.Blue;
result = "▲";
break;
case 4:
Console.ForegroundColor = ConsoleColor.DarkYellow;
result = "卍";
break;
}
}
return result;
}
特殊的图标生成好了之后就可以按照棋盘上的每行没列的个数来画出棋盘了,此时定义一个DrawMap的方法
static void DrawMap()
{
Console.WriteLine("图例:幸运轮盘 ◎ 地雷☆ 暂停▲ 时空隧道卍");//此处绘制图例
for (int i = 0; i <= 29;i++) // 此处绘制的是地图的第一行
{
Console.Write(GetMapString(i));
}
Console.WriteLine();//第一行绘制完毕,需要换行
for (int i = 30; i <=34; i++)//绘制第一列
{
for (int j = 0; j < 29;j++)
{
Console.Write(" ");
}
Console.WriteLine(GetMapString(i));
}
for (int i = 64; i >=35; i--)//绘制第二行
{
Console.Write(GetMapString(i));
}
Console.WriteLine();//第二行绘制结束需要换行
for (int i = 65; i <= 69;i++)//绘制第二列
{
Console.WriteLine(GetMapString(i));
}
for (int i = 70; i <=99; i++) //绘制第三行
{
Console.Write(GetMapString(i));
}
Console.WriteLine();//第三行绘制结束,需要换行
Console.ResetColor();
}
至此,绘制棋盘的方法就写好了,想绘制棋盘的时候,就需要调用一下DrawMap()方法即可
本体中还有很多方法需要定义和实现,下面就不一一详细列举。下面介绍一下定义的全局的变量和数组
static int[] Map = new int[100];//100格的地图
static int[] playerPos = { 0, 0 };//playerPos[0]存储玩家A的下标,playerPos[1]存储玩家B的下标
static Random r = new Random();//r用来生成随机数
static int step = 0;//用来接收生成的随机数
static string[] names = new string[2];//定义一个数组存储玩家名称,names[0]存储玩家A的姓名names[1]存储玩家B的姓名
static int input = 0;//用于存储用户幸运轮盘的输入
static string msg = "";//用于接收执行信息
static bool[] isStop = { false, false };//isStop[0]表示玩家A是否暂停一次,isStop[1]表示玩家B是否暂停一次
过程中还需要定义一个ReadInt方法,在进入幸运轮盘的时候需要输入数字1和2,而ReadInt()方法就是过滤用户输入不正确的情况
还需要定义一个方法CheckPos()去验证玩家的位置是否超出棋盘,超出计算赢
还将玩家掷骰子的过程写成了方法Action(),轮到那个玩家玩的时候只需要调用方法就行
还有就是用户每次掷骰子的时候按任意键,这时候在控制台不希望输入用户按下的键,可以通过ReadKey()的重载方法实现
Console.ReadKey(true);//将不会显示用户输入的键值