------- Windows Phone 7手机开发、.Net培训、期待与您交流! -------
这里就不多做说明了,很简单的一个小游戏—飞行棋,控制台输出的有点丑,不过逻辑才是最重要的
有兴趣的自己往下看,写程序喜欢写注释,下面代码中注释很多而且也很简单,很容易看懂!
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 骑士飞行棋 { class Program { //在下面的数组存储游戏地图各个关卡 //数组的下表为0的元素对应的地图上的第一格 下表为2的对应第二格 下标n的对应n+1格 //在数组中: 1:表示幸运轮盘◎ // 2:地雷☆ // 3:暂停▲ // 4:时空隧道# // 0:普通□ static int[] Map = new int[100]; //数组声明好默认初始化0,0表示普通最省事 // 静态方法,字段前加static才能访问 static int[] palyerpos = { 0, 0, }; //playerpos[0]存玩家A的下标,playerpos[1]存玩家B的位置; static string[] names = new string[2];//names[0]存玩家A的名字, names[1]存玩家B的名字 static bool[] isShop = { false, false };//isShop[0]表示玩家A是否走到暂停,isShop[1]表示玩家B是否走到暂停; //走到暂停就设置为true 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来表示,{1}用B来表示!",names[0],names[1]); Console.WriteLine("如果AB在同以位置就用<>表示"); InitialMap(); //初始化地图 DramMap(); // 绘制地图 Console.WriteLine("开始游戏....."); //这个循环让玩家AB轮流掷骰子 当玩家A或者B的坐标大于等于99,循环结束 while (palyerpos[0] < 99 && palyerpos[1] < 99) { if (isShop[0] == false) { Action(0); // 把掷骰子写成方法 #region 玩家A掷骰子 //Console.WriteLine("{0}按任意键掷骰子", names[0]); //ConsoleKeyInfo rec = Console.ReadKey(true); // 用Console.ReadKey();将显示按下的键,所以用重载Console.ReadKey(boolean); //if (rec.Key == ConsoleKey.Tab) // 玩赖! //{ // step = 20; //设置后门,用console.Readkey()返回结构类型的返回值rec //} //rec的Key属性是一个枚举 存着用户输入的键 //else //rec.Modifiers 属性存储按键组合 //{ //rec.Key == ConsoleKey.Tab&& // step = r.Next(1, 7); //产生一个1—6之间的随机数 //} //Console.WriteLine("{0}掷出了:{1}", names[0], step); //Console.WriteLine("按任意键开始行动......"); //Console.ReadKey(true); //palyerpos[0] += step; //一旦坐标发生改变就要判断坐标是否大于99,或者小于0 //Checkpos(); //检测坐标是否越界 //if (palyerpos[0] == palyerpos[1])//玩家A踩到B //{ // palyerpos[1] = 0; // msg = string.Format("{0}掷出了{1},踩到了{2},{2}退回远点", names[0],step, names[1]); //} //else //没踩到,判断玩家A是否踩到关卡 //{ // switch (Map[palyerpos[0]]) // { // case 0: // //没有效果; // msg = ""; // break; // case 1: // //走到 幸运轮盘 // Console.Clear(); // DramMap(); // Console.WriteLine("{0}掷出了{1},走到了幸运罗盘,请选择", names[0],step); // Console.WriteLine("1---交换位置 2---轰炸对方"); // int userSelect = ReadInt(1, 2); // if (userSelect == 1) // { // int temp = palyerpos[0]; // palyerpos[0] = palyerpos[1]; //交换位置 // palyerpos[1] = temp; // msg = string.Format("{0}掷出了{1},走到幸运罗盘,{0}选择了与对方交换位置", names[0],step); // } // else // { // palyerpos[1] -= 6; // Checkpos(); // msg = string.Format("{0}掷出了{1},走到了幸运罗盘,{0}选择轰炸{2},{2}退6格!", names[0],step, names[1]); // } // break; // case 2: // //踩到地雷 // palyerpos[0] -= 6; // Checkpos(); // msg = string.Format("{0}掷出了{1},踩到了地雷,退6格!", names[0],step); // break; // case 3: // //暂停一次 // isShop[0] = true; // msg = string.Format("{0}掷出了{1},踩到静止陷阱,暂停一次", names[0],step); // break; // case 4: // //时空隧道 // palyerpos[0] += 10; // Checkpos(); // msg = string.Format("{0}掷出了{1},进入时空隧道,爽死了,前进10格!", names[0],step); // break; // } //} //Console.Clear(); //DramMap(); //if (msg != "") //{ // Console.WriteLine("{0}.....行动完成", msg); //} //else //{ // Console.WriteLine("{0}掷出了{1},前进{1}格,行动完成!", names[0], step); //} //Console.WriteLine("*******************玩家A和玩家B位置如下*****************"); //Console.WriteLine("{0}的位置为{1}", names[0], palyerpos[0] + 1); //Console.WriteLine("{0}的位置为{1}", names[1], palyerpos[1] + 1); #endregion } else { isShop[0] = false; } if (palyerpos[0] >= 99) { break; } if (isShop[1] == false) { Action(1); #region 玩家B掷骰子 //Console.WriteLine("{0}按任意键掷骰子", names[1]); //ConsoleKeyInfo rec=Console.ReadKey(true); // 用Console.ReadKey();将显示按下的键,所以用重载Console.ReadKey(boolean); //if (rec.Key == ConsoleKey.Tab && rec.Modifiers == (ConsoleModifiers.Control | ConsoleModifiers.Shift)) //{ // ConsoleKeyInfo rrc = Console.ReadKey(true); // if (rrc.Key == ConsoleKey.F1) // { // step = r.Next(10, 100); // } // else // { // step = r.Next(1, 7); // } //} //不要两个else 把step=r.Next(1,7);写到if前面 //else //{ // step = r.Next(1, 7); //} //Console.WriteLine("{0}掷出了:{1}", names[1], step); //Console.WriteLine("按任意键开始行动......"); //Console.ReadKey(true); //palyerpos[1] += step; //一旦坐标发生改变就要判断坐标是否大于99,或者小于0 //Checkpos(); //检测坐标是否越界 //if (palyerpos[1] == palyerpos[0])//玩家A踩到B //{ // palyerpos[0] = 0; // msg = string.Format("{0}掷出了{1},踩到了{2},{2}退回远点", names[1],step, names[0]); //} //else //没踩到,判断玩家A是否踩到关卡 //{ // switch (Map[palyerpos[1]]) // { // case 0: // //没有效果; // msg = ""; // break; // case 1: // //走到 幸运轮盘 // Console.Clear(); // DramMap(); // Console.WriteLine("{0}掷出了{1},走到了幸运罗盘,请选择", names[1],step); // Console.WriteLine("1---交换位置 2---轰炸对方"); // int userSelect = ReadInt(1, 2); // if (userSelect == 1) // { // int temp = palyerpos[0]; // palyerpos[0] = palyerpos[1]; //交换位置 // palyerpos[1] = temp; // msg = string.Format("{0}掷出了{1},走到了幸运罗盘,{0}选择了与对方交换位置", names[1],step); // } // else // { // palyerpos[0] -= 6; // Checkpos(); // msg = string.Format("{0}掷出了{1},走到了幸运罗盘,{0}选择轰炸了{2},{2}退6格!", names[1],step, names[0]); // } // break; // case 2: // //踩到地雷 // palyerpos[1] -= 6; // Checkpos(); // msg = string.Format("{0}掷出了{1},踩到了地雷,退6格!", names[1],step); // break; // case 3: // //暂停一次 // isShop[1] = true; // msg = string.Format("{0}掷出了{1},踩到了静止陷阱,暂停一次", names[1],step); // break; // case 4: // //时空隧道 // palyerpos[1] += 10; // Checkpos(); // msg = string.Format("{0}掷出了{1},进入时空隧道,爽死了,前进10格!", names[1],step); // break; // } //} //Console.Clear(); //DramMap(); //if (msg != "") //{ // Console.WriteLine("{0}.....行动完成!", msg); //} //else //{ // Console.WriteLine("{0}掷出了{1},前进{1}格,行动完成!", names[1], step); //} //Console.WriteLine("*******************玩家A和玩家B位置如下*****************"); //Console.WriteLine("{0}的位置为{1}", names[0], palyerpos[0] + 1); //Console.WriteLine("{0}的位置为{1}", names[1], palyerpos[1] + 1); #endregion // 写成 //把掷骰子写成方法 } else { isShop[1] = false; } if (palyerpos[1] >= 99) { break; } } //判断谁胜利,谁失败 Console.Clear(); ShowUI(); if (palyerpos[0] >= 99) { Console.WriteLine("{0}胜利了!!!!!!!!!!!!", names[0]); } else { Console.WriteLine("{0}胜利了!!!!!!!!!!!!", names[1]); } Console.ReadKey(); } /// <summary> /// 进行玩家AB的坐标越界判断 /// </summary> static void Checkpos() { for (int i = 0; i < 2; i++) { if (palyerpos[i] > 99) { palyerpos[i] = 99; } if (palyerpos[i] < 0) { palyerpos[i] = 0; } } } /// <summary> /// 用于绘制飞行棋的名称; /// </summary> static void ShowUI() { Console.WriteLine("********************************************************"); Console.WriteLine("* *"); Console.WriteLine("* 骑士飞行棋 *"); Console.WriteLine("* *"); Console.WriteLine("********************************************************"); } /// <summary> /// 对图中的关卡进行初始化! /// </summary> static void InitialMap() //初始化地图关卡 { //用于存储地图中各个关卡的在数组中的下标 int[] luckyTurn = { 6, 13, 25, 29, 55, 63, 72, 85, 91 };//幸运轮盘 int[] landMilne = { 5, 16, 28, 48, 39, 58, 76, 60, 90, 81, 88 };//地雷 int[] pause = { 8, 19, 22, 40, 66, 80 }; //暂停坐标 int[] timeTunnel = { 20, 27, 30, 50, 70, 87 };//时空隧道 for (int i = 0; i < luckyTurn.Length; i++) { int pos= luckyTurn[i]; Map[pos] = 1; } for (int i = 0; i < landMilne.Length; i++) { int pos = landMilne[i]; Map[pos] = 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; } } /// <summary> /// 获得第pos坐标上应该绘制的图案 /// </summary> static string GetMapString(int pos) { string result = ""; //判断A和B是否在当前要画的第i格上 if (palyerpos[0] == pos && palyerpos[1] == pos) { Console.ForegroundColor = ConsoleColor.Yellow; result = "<>"; } else if (palyerpos[0] == pos) { Console.ForegroundColor = ConsoleColor.Yellow; result = "A"; //画全角A,才能占满位置 } else if (palyerpos[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.Blue; result = "☆"; break; case 3: Console.ForegroundColor=ConsoleColor.Green; result = "▲"; break; case 4: Console.ForegroundColor=ConsoleColor.Magenta; result = "#"; break; } } return result; } /// <summary> /// 绘制地图,三行三十格,两列5格的地图 /// </summary> static void DramMap() { Console.WriteLine("图例:幸运轮盘:◎ 地雷:☆ 暂停:▲ 时空隧道:#"); //画第一行; 第一行三十格 for (int i = 0; i <= 29; i++) { Console.Write(GetMapString(i)); } //第一行绘制完毕 换行!! Console.WriteLine(); //绘制第一列 for (int i = 30; i < 34; i++) { //绘制29个双空格,全角符号占两个空格 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.ForegroundColor = ConsoleColor.White; //或者使用Console类里的resetcolor方法 //Console.ResetColor(); } /// <summary> /// 判断走到幸运轮盘必须输入1-2之间的数字 /// </summary> /// <returns></returns> static int ReadInt() { int i = ReadInt(int.MinValue, int.MaxValue);//调用ReadInt(int int)方法 返回任意int值 return i; } 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("只能输入数字,请重新输入!"); } } } /// <summary> /// A或B掷骰子的方法 /// </summary> /// <param name="playernumber">A掷骰子传0,B掷骰子传1</param> static void Action(int playernumber) { //playernumber中存当前玩家 姓名 地图坐标 是否暂停 三个数组的下标 //当前玩家0 对方1 当前 1 对方0 //1-playernumber就是对方的姓名 地图坐标 是否暂停 的下标 Random r = new Random();//用于产生随机数 int step = 0; //用于存储产生的随机数 string msg = ""; //用于存储用户踩到某关卡输出的话 Console.WriteLine("{0}按任意键掷骰子", names[playernumber]); ConsoleKeyInfo rec = Console.ReadKey(true); // 用Console.ReadKey();将显示按下的键,所以用重载Console.ReadKey(boolean);
// boolean选为true为不显示 step = r.Next(1, 7); //产生一个1—6之间的随机数,包含下限 不包含上限!! if (rec.Key == ConsoleKey.Tab) // 玩赖! { step = 20; //设置后门,用console.Readkey()返回结构类型的返回值rec } //rec的Key属性是一个枚举 存着用户输入的键 rec.Modifiers 属性存储按键组合 if (rec.Key == ConsoleKey.Tab && rec.Modifiers == (ConsoleModifiers.Control | ConsoleModifiers.Shift)) { ConsoleKeyInfo rrc=Console.ReadKey(true); if (rrc.Key == ConsoleKey.F1) { step = ReadInt(1, 100); } } Console.WriteLine("{0}掷出了:{1}", names[playernumber], step); Console.WriteLine("按任意键开始行动......"); Console.ReadKey(true); palyerpos[playernumber] += step; //一旦坐标发生改变就要判断坐标是否大于99,或者小于0 Checkpos(); //检测坐标是否越界 if (palyerpos[playernumber] == palyerpos[1 - playernumber])//玩家A踩到B { palyerpos[1 - playernumber] = 0; msg = string.Format("{0}掷出了{1},踩到了{2},{2}退回远点", names[playernumber], step, names[1 - playernumber]); } else //没踩到,判断玩家A是否踩到关卡 { switch (Map[palyerpos[playernumber]]) { case 0: //没有效果; msg = ""; break; case 1: //走到 幸运轮盘 Console.Clear(); DramMap(); Console.WriteLine("{0}掷出了{1},走到了幸运罗盘,请选择", names[playernumber], step); Console.WriteLine("1---交换位置 2---轰炸对方"); int userSelect = ReadInt(1, 2); if (userSelect == 1) { int temp = palyerpos[playernumber]; palyerpos[playernumber] = palyerpos[1 - playernumber]; //交换位置 palyerpos[1 - playernumber] = temp; msg = string.Format("{0}掷出了{1},走到幸运罗盘,{0}选择了与对方交换位置", names[playernumber], step); } else { palyerpos[1 - playernumber] -= 6; Checkpos(); msg = string.Format("{0}掷出了{1},走到了幸运罗盘,{0}选择轰炸{2},{2}退6格!", names[playernumber], step, names[1 - playernumber]); } break; case 2: //踩到地雷 palyerpos[playernumber] -= 6; Checkpos(); msg = string.Format("{0}掷出了{1},踩到了地雷,退6格!", names[playernumber], step); break; case 3: //暂停一次 isShop[playernumber] = true; msg = string.Format("{0}掷出了{1},踩到静止陷阱,暂停一次", names[playernumber], step); break; case 4: //时空隧道 palyerpos[playernumber] += 10; Checkpos(); msg = string.Format("{0}掷出了{1},进入时空隧道,爽死了,前进10格!", names[playernumber], step); break; } } Console.Clear(); DramMap(); if (msg != "") { Console.WriteLine("{0}.....行动完成", msg); } else { Console.WriteLine("{0}掷出了{1},前进{1}格,行动完成!", names[playernumber], step); } Console.WriteLine("*******************玩家A和玩家B位置如下*****************"); Console.WriteLine("{0}的位置为{1}", names[playernumber], palyerpos[playernumber] + 1); Console.WriteLine("{0}的位置为{1}", names[1 - playernumber], palyerpos[1 - playernumber] + 1); } } }