骑士飞行棋代码如下:
class Program
{
//在下面的数组中存储我们游戏地图里的各个关卡
//数组的下标为0的元素对应地图上的第一格,下标为1的元素对应第二格。。。下标为n的元素对应第n+1格
//在数组中用:1:表示幸运轮盘○
// 2:表示地雷☆
// 3:表示暂停△
// 4:表示时空隧道卐
// 5:表示普通■
static bool[] isStop = { false, false }; //isStop[0]表示A上一次是否走到了暂停,isStop[1]表示B,如果走到暂停,则设置其值为true;
static string[] names = new string[2]; //用names[0]存储玩家A的姓名,用names[1]存储玩家B的姓名。
static int[] Map = new int[100]; //这是一个字段,由于下面的方法都是静态的,所以想访问此字段,必须在字段前加static修饰。
static int[] playerPos = { 0, 0 }; //playerPos[0]存储玩家A的下标,palyerPos[1]存储玩家B的下标
static void Main(string[] args)
{
ShowUI(); //显示游戏名称界面
Console.WriteLine("请输入玩家A的姓名?");
names[0] = Console.ReadLine();
//判断用户输入的内容是否为空,如果为空,则让用户重新输入!
while (names[0] == "")
{
Console.WriteLine("玩家A的姓名不能为空,请重新输入!");
names[0] = Console.ReadLine();
}
Console.WriteLine("请输入玩家B的姓名?");
names[1] = Console.ReadLine();
while (names[1] == "" || names[1] == names[0])
{
if (names[1] == "")
{
Console.WriteLine("玩家B的姓名不能为空,请重新输入!");
}
if (names[1] == names[0]) //玩家A和玩家B 重名!
{
Console.WriteLine("该用户名已被玩家A占用,请重新输入!");
}
names[1] = Console.ReadLine();
}
Console.Clear();
ShowUI();
Console.WriteLine("对战开始-----");
Console.WriteLine("{0}的士兵用A表示",names[0]);
Console.WriteLine("{0}的士兵用B表示",names[1]);
Console.WriteLine("如果AB在同一位置用<>来表示!");
InitialMap(); //初始化地图
DrawMap(); //绘制地图
//这个循环让玩家A和玩家B轮流掷骰子,当玩家A或玩家B的坐标>=99的时候,结束循环
//所以循环条件是
while (playerPos[0] < 99 && playerPos[1] < 99)
{
if (isStop[0] == false)
{
Action(0);
}
else
{
//说明isStop=true;
isStop[0] = false;
}
if (playerPos[0] >= 99)
{
break;
}
if (isStop[1] == false)
{
Action(1);
}
else
{
isStop[1] = false;
}
}
//判断谁取得了胜利,谁失败
if (playerPos[0] == 99)
{
Console.Clear();
ShowUI();
Console.WriteLine("{0},恭喜,您获得了胜利!", names[0]);
Console.WriteLine("{0},很遗憾,您失败了,下次继续努力!",names[1]);
}
else
{
Console.Clear();
ShowUI();
Console.WriteLine("{0},恭喜,您获得了胜利!", names[1]);
Console.WriteLine("{0},很遗憾,您失败了,下次继续努力!", names[0]);
}
Console.ReadKey();
}
/// <summary>
/// A或B掷骰子的方法
/// </summary>
/// <param name="playNumber">A掷骰子传过来0 B掷骰子传过来1</param>
static void Action(int playNumber)
{
string msg = "";//用于存储用户踩到关卡时所输出的话
Random r = new Random();//r用于产生随机数的变量
int step = 0; //step用于接收随机数
Console.WriteLine("{0}按任意键开始掷骰子---", names[playNumber]);
ConsoleKeyInfo rec = Console.ReadKey(true);
if (rec.Key == ConsoleKey.Tab)
{
step = 20;
}
else
{
//得到一个随机数,并把这个随机数赋给step
step = r.Next(1, 7); //产生一个1到6的随机整数
}
Console.WriteLine("{0}得到一个:{1}", names[playNumber], step);
Console.WriteLine("按任意键开始行动----");
Console.ReadKey(true);
playerPos[playNumber] += step; //注意:一旦坐标发生改变,就要判断坐标值是否>99或者<0
checkpos(); //检测坐标是否越界
if (playerPos[0] == playerPos[1]) //检测玩家A 是否踩到了玩家B
{
playerPos[1 - playNumber] = 0; //踩到了
msg = string.Format("{0}踩到了{1},{1}退回原点!", names[playNumber], names[1 - playNumber]);
}
else
{
//没踩到 就要判断玩家A所在的位置是否有关卡
switch (Map[playerPos[playNumber]])
{
case 0:
//普通 没有效果
msg = "";
break;
case 1:
//幸运轮盘 选择运气
Console.Clear();
DrawMap();
Console.WriteLine("{0}走到了幸运轮盘,请选择运气?", names[playNumber]);
Console.WriteLine("1--交换位置 2--轰炸对方");
int userSelect = ReadInt(1, 2);
if (userSelect == 1)
{
//要与对方交换位置
int stemp = playerPos[0];
playerPos[0] = playerPos[1];
playerPos[1] = stemp;
msg = string.Format("{0}选择了与{1}交换位置!", names[playNumber], names[1 - playNumber]);
}
else
{
//要轰炸对方
playerPos[1 - playNumber] -= 6; //注意,坐标一旦发生改变,就要判断时都越界
checkpos();
msg = string.Format("{0}选择了轰炸{1},{1}退后6格!", names[playNumber], names[1 - playNumber]);
}
break;
case 2:
//踩到地雷 倒退6步
playerPos[playNumber] -= 6;
checkpos();
msg = string.Format("{0}踩到了地雷,后退6格!", names[playNumber]);
break;
case 3:
//暂停一次
isStop[playNumber] = true;
msg = string.Format("{0}走到了暂停,{1}连续掷两次骰子", names[playNumber], names[1 - playNumber]);
break;
case 4:
//时空隧道
playerPos[playNumber] += 10;
checkpos();
msg = string.Format("{0}进入了时空隧道,太幸运啦,前进10格!", names[playNumber]);
break;
}
}
Console.Clear();
DrawMap();
Console.WriteLine("{0}掷出了{1}", names[playNumber], step);
if (msg != "")
{
Console.WriteLine(msg);
}
Console.WriteLine("*************玩家A和玩家B的位置是**************");
Console.WriteLine("{0}的新位置是{1}", names[0], playerPos[0] + 1);
Console.WriteLine("{0}的新位置是{1}", names[1], playerPos[1] + 1);
Console.ReadKey(true);
}
/// <summary>
/// 用于绘制骑士飞行棋的名称,并显示界面
/// </summary>
static void ShowUI()
{
Console.WriteLine("************************************************");
Console.WriteLine("* *");
Console.WriteLine("* 骑 士 飞 行 棋 *");
Console.WriteLine("* *");
Console.WriteLine("************************************************");
}
/// <summary>
/// 进行玩家A和玩家B坐标越界的判断
/// </summary>
static void checkpos()
{
for (int i = 0; i < 2; i++)
{
if (playerPos[i] > 99)
{
playerPos[i] = 99;
}
if (playerPos[i] < 0)
{
playerPos[i] = 0;
}
}
}
/// <summary>
/// 对地图中的关卡进行初始化。
/// </summary>
static void InitialMap()
{
//下面的数组用于存储Map数组中需要改变值得下标。
int[] luckyTurn = { 6, 23, 40, 55, 69, 83 }; //幸运轮盘 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
//把Map数组中元素进行赋值
for (int i = 0; i < luckyTurn.Length; i++)
{
int pos = luckyTurn[i];
Map[pos] = 1;
}
for (int i = 0; i < landMine.Length; i++)
{
int pos = landMine[i];
Map[pos] = 2;
}
for (int i = 0; i < pause.Length; i++)
{
int pos = pause[i];
Map[pos] = 3;
}
for (int i = 0; i < timeTunnel.Length; i++)
{
int pos = timeTunnel[i];
Map[pos] = 4;
}
}
/// <summary>
/// 获得第pos坐标上应该绘制的图案
/// </summary>
/// <param name="pos">要绘制的坐标</param>
/// <returns></returns>
static string getMapString(int pos) //pos是指要绘制的那一格的坐标
{
string result="";
if (playerPos[0] == pos && playerPos[1] == pos)
{
Console.ForegroundColor = ConsoleColor.Yellow; //对所输出的图案附上颜色。
result = "<>";
}
else if (playerPos[0] == pos) //A在当前画的格上
{
Console.ForegroundColor = ConsoleColor.Yellow;
result = "A";
}
else if (playerPos[1] == pos)
{
Console.ForegroundColor = ConsoleColor.Yellow;
result = "B"; //B在当前画的格上
}
else
{
switch (Map[pos])
{
case 0:
Console.ForegroundColor = ConsoleColor.Gray;
result = "口";
break;
case 1:
Console.ForegroundColor = ConsoleColor.Red;
result = "◎";
break;
case 2:
Console.ForegroundColor = ConsoleColor.Blue;
result = "★";
break;
case 3:
Console.ForegroundColor = ConsoleColor.Yellow;
result = "▲";
break;
case 4:
result = "卍";
Console.ForegroundColor = ConsoleColor.Green;
break;
}
}
return result;
}
/// <summary>
/// 绘制地图
/// </summary>
static void DrawMap()
{
Console.WriteLine("图例:幸运轮盘:◎ 地雷:★ 暂停:▲ 时空隧道:卍");
//画第一行
for (int i = 0; i < 30; i++)
{
string result = getMapString(i);
Console.Write(result);
}
Console.WriteLine(); //在绘制完30个格的时候换一下行。
//画第一列
for (int i = 30; i <= 34; i++)
{
//绘制29个双空格,因为全角的字符是两个空格
for (int j = 0; j < 29; j++)
{
Console.Write(" ");
}
string result = getMapString(i);
Console.WriteLine(result);
}
//画第二行
for (int i = 64; i >= 35; i--) //注意 i--
{
Console.Write(getMapString(i));
}
Console.WriteLine(); //注意:绘制完第二行注意换行
//画第二列
for (int i = 65; i < 70; i++)
{
Console.WriteLine(getMapString(i));
}
//绘制第三行
for (int i = 70; i < 100; i++)
{
Console.Write(getMapString(i));
}
Console.WriteLine();
Console.ResetColor(); //绘制完地图,记得把颜色恢复到默认颜色
}
/// <summary>
/// 判断用户输入的整数是否越界
/// </summary>
/// <param name="min">最小值</param>
/// <param name="max">最大值</param>
/// <returns></returns>
static int ReadInt(int min, int max)
{
while (true)
{
try
{
int number = Convert.ToInt32(Console.ReadLine());
if (number < min || number > max)
{
Console.WriteLine("只能输入{0}--{1}之间的数,请重新输入",min,max);
continue; //走到这一步要跳出本次循环,进行下次判断
}
return number;
}
catch
{
Console.WriteLine("输入有误,请重新输入");
}
}
}
}