---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
这是我第一次完成骑士飞行棋的代码,贴上来咯!
namespace 飞行棋
{
class Program
{
//在下面的数组存储我们游戏地图的各个关卡
//在数组中的值中用 0表示普通□
// 1表示幸运轮盘○
// 2表示地雷☆
// 3表示暂停▲
// 4表示时空隧道卐
static int[] Map = new int[100];
//代表用户AB当前位置的下标 ,namesPost[0]代表A的当前位置的下标,namesPost[1]代表B当前位置的下标
static int[] namesPost = {0,0};
static string[] names = new string[2];//存放两个玩家的姓名,names[0]表示玩家A,names[1]表示玩家B
static bool[] isStop = { false, false };//判断两个玩家是否上一次踩到地雷,暂停掷骰子一次,isStop[0]表示玩家A,isStop[1]表示玩家B ,true表示踩到地雷,暂停一次
static void Main(string[] args)
{
ShowUI();
Console.WriteLine("请输入玩家A的姓名?");
names[0] = Console.ReadLine();
while(names[0]=="")
{
Console.WriteLine("姓名不能为空,请重新输入!");
names[0]=Console.ReadLine();
}
Console.WriteLine("请输入玩家B的姓名?");
names[1] = Console.ReadLine();
while(names[1]=="" || names[1]==names[0])
{
if (names[1] == "")
{
Console.WriteLine("姓名不能为空,请重新输入!");
names[1] = Console.ReadLine();
}
else
{
Console.WriteLine("该用户名已存在,请重新输入!");
names[1] = Console.ReadLine();
}
}
Console.Clear();
ShowUI();
Console.WriteLine("对战开始:");
Console.WriteLine("{0}的士兵用A表示",names[0]);
Console.WriteLine("{0}的士兵用B表示",names[1]);
Console.WriteLine("如果AB在同一位置,则用<>来表示");
IntialMap();
DrawMap();
Console.WriteLine("游戏开始.....");
//游戏开始,请玩家开始掷骰子
while (namesPost[0] < 99 && namesPost[1] < 99)
{
//玩家A投掷骰子
Action(0);
if (namesPost[0] > 99)//判断玩家A是否走到终点,如果走到终点,则跳出循环
{
break;
}
// 玩家B投掷骰子
Action(1);
}
//游戏结束,宣布游戏结果
ShowUI();
if (namesPost[0] >= 99)
{
Console.WriteLine("{0}赢了!!!", names[0]);
}
else
{
Console.WriteLine("{0}赢了!!!",names[1]);
}
Console.WriteLine("游戏结束!");
Console.ReadKey();
}
/// <summary>
/// 掷骰子
/// </summary>
/// <param name="playerNumber">如果playerNumber传入的是0则表示当前玩家是A玩家,如果playerNumber传入的是1则表示当前玩家是B玩家</param>
static void Action(int playerNumber)
{
//如果playerNumber表示当前玩家,那么对方玩家用1-playerNumber
//如果当前玩家是0,则对方玩家1-0=1; 如果当前玩家是1,则对方玩家是1-1=0;
Random r = new Random();//随机数
string msg = "";//用来存放玩家遇到的关卡的提示
int step = 0;//用户存放随机产生的随机数
if (isStop[playerNumber] == false)//判断玩家是否在上一次掷骰子中走到了地雷
{
Console.WriteLine("请玩家{0}按任意键开始掷骰子......", names[playerNumber]);
ConsoleKeyInfo rec = Console.ReadKey(true);
step = r.Next(1, 7);//产生一个>=1并且<7的随机数
if (rec.Key == ConsoleKey.Tab && rec.Modifiers == ConsoleModifiers.Control | rec.Modifiers == ConsoleModifiers.Alt)//如果用户按下的是Tab键,则就相当于这个骰子的点数是20
{
if (rec.Key == ConsoleKey.F1)
{
step = ReadInt(1, 100);
}
}
Console.WriteLine("{0}掷了{1}", names[playerNumber], step);
Console.WriteLine("按任意键行动......");
Console.ReadKey(true);
namesPost[playerNumber] = namesPost[playerNumber] + step;//重新对下标进行赋值
//每一次下标的改变都要判断这个下标是否已经超出界限
CheckPos();
//判断玩家A是否踩到了玩家B
if (namesPost[0] == namesPost[1])
{
msg = string.Format("{0}踩到了{1},{1}被遣返至起点......", names[playerNumber], names[1 - playerNumber]);
namesPost[1 - playerNumber] = 0;
}
else
{
//判断玩家A是否遇到其他关卡
switch (Map[namesPost[playerNumber]])
{
case 0://普通
msg = "";
break;
case 1://幸运轮盘 1、轰炸对方 2、与对方交换位置
Console.WriteLine("恭喜您到达幸运轮盘,请输入1或者2选择幸运服务:");
Console.WriteLine("1、轰炸对方 2、与对方交换位置");
int choice = ReadInt(1, 2);
if (choice == 1)
{
msg = string.Format("{0}走到了幸运轮盘,选择了轰炸对方!", names[playerNumber]);
namesPost[1] = 0;
}
else
{
msg = string.Format("{0}走到了幸运轮盘,选择了与对方交换位置!", names[playerNumber]);
int stemp = namesPost[0];
namesPost[0] = namesPost[1];
namesPost[1] = stemp;
}
break;
case 2://地雷 向后退8格
msg = string.Format("很不幸{0}踩到了地雷,向后退8格", names[playerNumber]);
namesPost[playerNumber] = namesPost[playerNumber] - 8;
CheckPos();
break;
case 3://暂停一次
msg = string.Format("{0}走到红灯,暂停掷骰子一次!", names[playerNumber]);
isStop[0] = true;
break;
case 4://时空隧道 向前进10格
msg = string.Format("{0}到达时空隧道,前进10格!", names[playerNumber]);
namesPost[playerNumber] = namesPost[playerNumber] + 10;
CheckPos();
break;
}
}
//清屏
Console.Clear();
//绘制地图
DrawMap();
Console.WriteLine(msg);
Console.WriteLine("{0}刚刚投掷了{1}", names[playerNumber], step);
Console.WriteLine("***********************玩家A和玩家B的当前位置如下***********************");
Console.WriteLine("{0}的位置是{1}", names[0], namesPost[0] + 1);
Console.WriteLine("{0}的位置是{1}", names[1], namesPost[1] + 1);
}
else
{
isStop[playerNumber] = false;
}
}
/// <summary>
/// 用于获取当前输入的数据是否是整数的方法
/// 并且当前的整数必须大于最小值,小于最大值
/// </summary>
/// <param name="min">最小值</param>
/// <param name="max">最大值</param>
/// <returns></returns>
static int ReadInt(int min ,int max)
{
int result;
while (true)
{
try
{
result = Convert.ToInt32(Console.ReadLine());
if (result > max)
{
Console.WriteLine("您输入的数据不正确,请重新输入!");
}
else if (result < min)
{
Console.WriteLine("您输入的数据格式不正确,请重新输入!");
}
else
{
break;
}
}
catch
{
Console.WriteLine("输入的数据格式不正确,请重新输入!");
}
}
return result;
}
/// <summary>
/// 用于检测下标是否越界的方法
/// </summary>
static void CheckPos()
{
for (int i = 0; i <= 1; i++)
{
if (namesPost[i] > 99)
{
namesPost[i] = 99;
}
if (namesPost[i] < 0)
{
namesPost[i] = 0;
}
}
}
/// <summary>
/// 显示飞行棋的名称
/// </summary>
static void ShowUI()
{
Console.WriteLine("********************************************************");
Console.WriteLine("* *");
Console.WriteLine("* 骑 士 飞 行 棋 *");
Console.WriteLine("* *");
Console.WriteLine("********************************************************");
}
/// <summary>
/// 对飞行棋地图进行初始化
/// </summary>
static void IntialMap()
{
for (int i = 0; i < Map.Length; i++)
{
Map[i] =0;
}
//用于存储在地图中关卡的下标
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[] timeTunnet = { 20,25,45,63,72,88,90,99};//时空隧道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 < timeTunnet.Length; i++)
{
Map[timeTunnet[i]] = 4;
}
}
/// <summary>
/// 绘制地图
/// </summary>
static void DrawMap()
{
Console.WriteLine("图例:幸运轮盘:○ 地雷:☆ 暂停:▲ 时空隧道:卐 ");
//绘制第一行地图 下标0-29
for (int i = 0; i <=29; i++)
{
Console.Write(GetMapString(i));
}
//第一行绘制完成后换行
Console.WriteLine();
//绘制紧跟着第一行后面一竖行的地图 下标30-34
for (int i = 30; i <= 34; i++)
{
//绘制29个双空格(因为这里的其他字符都是全角字符,一个全角字符=两个半角字符)
for (int j = 0; j < 29; j++)
{
Console.Write(" ");
}
Console.WriteLine(GetMapString(i));
}
//绘制第2个横行的地图,下标为36-64
for (int i = 64; i >= 35; i--)
{
Console.Write(GetMapString(i));
}
//换行
Console.WriteLine();
//绘制竖行的地图 下标65-69
for (int i = 65; i <= 69; i++)
{
Console.WriteLine(GetMapString(i));
}
//绘制最后一横行的地图 下标70-99
for (int i = 70; i <= 99; i++)
{
Console.Write(GetMapString(i));
}
Console.WriteLine();
//绘制完地图后要将控制台的前景色修改成白色
Console.ForegroundColor = ConsoleColor.White;
//将控制太的前景色和背景色都修改成默认
//Console.ResetColor();
}
/// <summary>
/// 获取当前下标要绘制的图案
/// </summary>
/// <param name="pos">当前下标</param>
/// <returns></returns>
static string GetMapString(int pos)
{
string result="";
if (namesPost[0] == pos && namesPost[1] == pos)//首先判断AB是否在当前位置
{
result="<>";
}
else if (namesPost[0] == pos)//然后判断A是否在当前位置
{
result="A";
}
else if (namesPost[1] == pos) //再判断B是否在当前位置
{
result="B";
}
else//最后再根据当前位置的下标来显示地图信息
{
switch (Map[pos])
{
case 0:
Console.ForegroundColor = ConsoleColor.White;
result="□";
break;
case 1:
Console.ForegroundColor = ConsoleColor.Green;
result="○";
break;
case 2:
Console.ForegroundColor = ConsoleColor.Yellow;
result="☆";
break;
case 3:
Console.ForegroundColor = ConsoleColor.Cyan;
result="▲";
break;
case 4:
Console.ForegroundColor = ConsoleColor.Magenta;
result="卐";
break;
}
}
return result;
}
}
}
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
详细请查看:www.itheima.com