面向过程编程应用-骑士飞行棋
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
1、界面
2、程序代码
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
namespace_23.MyGames
{
class Program
{
//在下面Map数组中存储我们游戏地图各关卡信息,数组的下标为0的元素对应地图上的第1格,下标为1的元素对应第2格...下标为n的元素对应n+1格;
//在数组中用0:普通□ 1:幸运轮盘◎ 2:表地雷☆ 3:暂停▲ 4:时空隧道卐
static int[]Map = new int[100];
static int[]playerpos = { 0, 0 }; //playerpos[0]存一玩家A的下标,playerpos[1]存一玩家B的下标
static voidMain(string[] args)
{
Randomr = new Random(); //r为通过Random()方法产生的随机数
intstep = 0; //用于存放产生的随机数
stringmsg = ""; // 用于存储用户踩到某关卡输出相关信息
bool[]isStop = { false, false}; //isStop[0]表示A是否上一次走到了暂停;isStop[1]表示B是否上一次走到了暂停。如果走到暂停将其值更改为true.
string[]names = new string[2];//names[0]存放玩家A的姓名,names[1]存放玩家B的姓名。
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来表示 {1}用B来表示",names[0],names[1]);
Console.WriteLine("如果A和B在同一位置,用<>来表示");
InitialMap(); //初始化地图
DrawMap(); //绘制地图
Console.ResetColor();//将控制台的前景色及背景色恢复默认值
Console.WriteLine("开始游戏......");
//循环让玩家A和玩家B轮流掷骰子,当玩家A或B的坐标>=99时循环结束。
//产生一个m到n之间的随机数 Random r=new Random(); int i=r.Next(m,n+1);
while(playerpos[0] < 99 && playerpos[1] < 99)
{
if(isStop[0] == false)
{
#region 玩家A掷骰子
Console.WriteLine("{0}按任意键开始掷骰子......", names[0]);
ConsoleKeyInforec =Console.ReadKey(true);//ReadKey(true)不显示用户按下的键名
if(rec.Key ==ConsoleKey.Tab)
{
step = 20; //玩家A可用Tab键作弊
}
else
{
step = r.Next(1, 7); //产生一个1-6之间的整数
}
Console.WriteLine("{0}掷出了:{1}", names[0], step);
Console.WriteLine("按任意键开始行动......");
Console.ReadKey(true);
playerpos[0] += step; //注意,一旦坐标发生改变就要判断坐标值是否>99或<0
CheckPos(); //坐标越界的判断
if(playerpos[0] == playerpos[1])//玩家A踩到玩家B
{
playerpos[1] = 0;
msg = string.Format("{0}踩到了{1},{1}退回原点",names[0], names[1]);
}
else
{
//没踩到,要判断玩家A现在所在的位置是否有其他关卡
switch (Map[playerpos[0]])
{
case 1://走到幸运轮盘关卡
Console.Clear();
DrawMap();
Console.WriteLine("{0}走到了幸运轮盘,请选择运气?",names[0]);
Console.WriteLine("1-交换位置 2-轰炸对方");
int userSelect = ReadInt(1, 2);
if (userSelect == 1)
{
//与对方交换位置
int temp = playerpos[0];
playerpos[0] = playerpos[1];
playerpos[1] = temp;
msg = string.Format("{0}选择了与{1}交换位置!",names[0], names[1]);
}
else
{
//轰炸对方,退6格
playerpos[1] -= 6;
CheckPos();
msg = string.Format("{0}轰炸了{1},{1}退6格!",names[0], names[1]);
}
break;
case 2://踩到了地雷关卡
playerpos[0] -=6;
CheckPos();
msg = string.Format("{0}踩到了地雷,退6格!", names[0]);
break;
case 3://走到暂停一次关卡
isStop[0] = true;
msg = string.Format("{0}走到暂停,下次暂停一次!",names[0]);
break;
case 4://走到时空隧道关卡
playerpos[0] += 10; //穿越时空隧道,前进10格
CheckPos();
msg = string.Format("{0}进入时空隧道,前进10格!", names[0]);
break;
default://普通,没有效果
msg = "";
break;
}
}
Console.Clear();
DrawMap();
if(msg != "")
{
Console.WriteLine(msg);
}
Console.WriteLine("{0}掷出了{1},行动完成",names[0], step);
Console.WriteLine("**********玩家A与玩家B的位置如下**********");
Console.WriteLine("{0}的位置在第{1}格;",names[0], playerpos[0] + 1);
Console.WriteLine("{0}的位置在第{1}格;",names[1], playerpos[1] + 1);
#endregion
}
else
{
//说明isStop == true
isStop[0] = false;
}
if(playerpos[0] >= 99)
{
break;
}
if(isStop[1] == false)
{
#region 玩家B掷骰子
Console.WriteLine("{0}按任意键开始掷骰子......", names[1]);
Console.ReadKey(true);//不显示用户按下的键名
step = r.Next(1, 7); //产生一个1-6之间的整数
Console.WriteLine("{0}掷出了:{1}", names[1], step);
Console.WriteLine("按任意键开始行动......");
Console.ReadKey(true);
playerpos[1] += step; //注意,一旦坐标发生改变就要判断坐标值是否>99或<0
CheckPos(); //坐标越界的判断
if(playerpos[1] == playerpos[0])//玩家B踩到玩家A
{
playerpos[0] = 0;
msg = string.Format("{0}踩到了{1},{1}退回原点",names[1], names[0]);
}
else
{
//没踩到,要判断玩家A现在所在的位置是否有其他关卡
switch (Map[playerpos[1]])
{
case 1://走到幸运轮盘关卡
Console.Clear();
DrawMap();
Console.WriteLine("{0}走到了幸运轮盘,请选择运气?",names[1]);
Console.WriteLine("1-交换位置 2-轰炸对方");
int userSelect = ReadInt(1, 2);
if (userSelect == 1)
{
//与对方交换位置
int temp = playerpos[0];
playerpos[0] = playerpos[1];
playerpos[1] = temp;
msg = string.Format("{0}选择了与{1}交换位置!",names[1], names[0]);
}
else
{
//轰炸对方,退6格
playerpos[0] -= 6;
CheckPos();
msg = string.Format("{0}轰炸了{1},{1}退6格!",names[1], names[0]);
}
break;
case 2://踩到了地雷关卡
playerpos[1] -=6;
CheckPos();
msg = string.Format("{0}踩到了地雷,退6格!", names[1]);
break;
case 3://走到暂停一次关卡
isStop[0] = true;
msg = string.Format("{0}走到暂停,下次暂停一次!",names[1]);
break;
case 4://走到时空隧道关卡
playerpos[1] +=10; //穿越时空隧道,前进10格
CheckPos();
msg = string.Format("{0}进入时空隧道,前进10格!",names[1]);
break;
default://普通,没有效果
msg = "";
break;
}
}
Console.Clear();
DrawMap();
if(msg != "")
{
Console.WriteLine(msg);
}
Console.WriteLine("{0}掷出了{1},行动完成",names[1], step);
Console.WriteLine("**********玩家A与玩家B的位置如下**********");
Console.WriteLine("{0}的位置在第{1}格;",names[0], playerpos[0] + 1);
Console.WriteLine("{0}的位置在第{1}格;",names[1], playerpos[1] + 1);
#endregion
}
else
{
isStop[1] = false;
}
}
//判断胜利与失败
Console.Clear();
Console.ResetColor();//将控制台的前景色及背景色恢复默认值
ShowUI();
if(playerpos[0] >= 99)
{
Console.WriteLine("{0}胜利了!!!!!!!", names[0]);
}
else
{
Console.WriteLine("{0}胜利了!!!!!!!", names[1]);
}
Console.ReadKey();
}
///<summary>
///用于绘制飞行棋名称UI界面
///</summary>
static voidShowUI()
{
Console.WriteLine();
Console.WriteLine("************************************************************");
Console.WriteLine("* *");
Console.WriteLine("* 骑 士 飞 行 棋 *");
Console.WriteLine("* *");
Console.WriteLine("************************************************************");
}
///<summary>
///进行玩家A和玩家B坐标越界的判断
///</summary>
static voidCheckPos()
{
for(int i = 0; i < 2; i++)
{
if(playerpos[i] > 99)
{
playerpos[i] = 99;
}
if(playerpos[i] < 0)
{
playerpos[i] = 0;
}
}
}
///<summary>
///对地图中的关卡进行初始化
///</summary>
static voidInitialMap()
{
//用于存储在地图中为幸运轮盘的下标
int[]luckTurn = {6,23,40,55,69,83,98}; //幸运轮盘 1
for(int i = 0; i < luckTurn.Length; i++)
{
Map[luckTurn[i]] = 1;
}
//用于存储在地图中为地雷的下标
int[]landMine = {5,13,17,33,38,50,64,80,94};//地雷 2
for(int i = 0; i < landMine.Length; i++)
{
Map[landMine[i]] = 2;
}
//用于存储在地图中为暂停的下标
int[]pause = {9,27,60,93}; //暂停 3
for(int i = 0; i < pause.Length; i++)
{
Map[pause[i]] = 3;
}
//用于存储在地图中为时空隧道的下标
int[]timeTunnel = {20,25,45,63,72,88,90}; //时空隧道 4
for(int i = 0; i < timeTunnel.Length; i++)
{
Map[timeTunnel[i]] = 4;
}
}
///<summary>
///获得第pos坐标上应该绘制的图案
///</summary>
///<param name="pos">要绘制的坐标</param>
///<returns>result图案</returns>
static stringGetMapString(int pos)
{
stringresult = "";
//判断A和B是否在当前要画的第i格上
if(playerpos[0] == pos && playerpos[1] == pos)//A和B都在当前画的格上
{
Console.ForegroundColor=ConsoleColor.Yellow;//设置控制台的前景色,给图标添加颜色
result="<>";
}
elseif (playerpos[0] == pos)//A在当前画的格上
{
Console.ForegroundColor=ConsoleColor.DarkMagenta;
result="A";
}
elseif (playerpos[1] == pos)//B在当前画的格上
{
Console.ForegroundColor=ConsoleColor.Yellow;
result="B";
}
else
{
switch(Map[pos]) //根据下标画关卡
{
case0:
Console.ForegroundColor =ConsoleColor.White;//设置控制台的前景色,给图标添加颜色
result="□";
break;
case1:
Console.ForegroundColor =ConsoleColor.Red;
result="◎";
break;
case2:
Console.ForegroundColor =ConsoleColor.Green;
result="☆";
break;
case3:
Console.ForegroundColor =ConsoleColor.Blue;
result="▲";
break;
case4:
Console.ForegroundColor =ConsoleColor.Magenta;
result="卐";
break;
}
}
returnresult;
}
///<summary>
///绘制对战地图
///</summary>
static voidDrawMap()
{
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));
}
//画第二行,绘制下标35-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();//绘制完第三行光标换行
}
static intReadInt()
{
inti=ReadInt(int.MinValue,int.MaxValue);
returni;
}
static intReadInt(int min, intmax)
{
while(true)
{
try
{
intnumber = Convert.ToInt32(Console.ReadLine());
if(number < min || number > max)
{
Console.WriteLine("只能输入{0}-{1}之间的数",min, max);
continue;
}
returnnumber;
}
catch
{
Console.WriteLine("只能输入数字,请重新输入!");
}
}
}
}
}
--------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------