前段时间用C#写了一个骑士飞行棋的练习,现在想起了把他贴出来,用来练习基础知识非常好,如果需要完整的项目源码可以到这来去下载:完整项目代码下载
先来看看游戏规则:
图例说明:
幸运轮盘:◎ 地雷:☆ 暂停:▲ 时空隧道:卐 普通:□
玩家“张三”和“李四”的士兵分别用“ Α 和 Β ”来标识
如果Α与Β在同一个位置上时,那我们用“<>”来标识!
///1踩到幸运轮盘◎:可请选择下面两项进行操作【1】:交换位置 【2】:进行轰炸(对方回退6步)
///2踩到地雷☆ 将会被打回起点!按任意键撤回
///3踩到暂停▲ 对方可以进行连续走两次
///4踩到时空隧道卐 前进10步
谁先到达终点谁去的最后的胜利。
具体的实现代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace chess { class Chess { /// <summary> /// 存储玩家姓名 /// </summary> private static String[] name = new String[2]; /// <summary> /// 在数组map中 ///1标识幸运轮盘◎ ///2标识地雷☆ ///3标识暂停▲ ///4标识时空隧道卐 ///0标识普通□ /// </summary> private static int[] map = new int[100]; /// <summary> /// 存储玩家士兵在地铁上的位置 /// </summary> private static int[] ab_pos = { 0, 0 }; /// <summary> /// 初始化一个全局的随机产生器 /// </summary> private static Random random = new Random(); public Chess() { showUI(); Console.WriteLine("请输入玩家Α的姓名"); setName(out name[0],0); Console.WriteLine("请输入玩家Β的姓名"); setName(out name[1],1); Console.Clear(); showUI(); drawMap(); Console.WriteLine("开始游戏......"); while (true) { Boolean isWin; action(0, out isWin); if (isWin) { Console.WriteLine("\n恭喜玩家 {0} 取得胜利!", name[0]); break; } action(1, out isWin); if (isWin) { Console.WriteLine("\n恭喜玩家 {0} 取得胜利!", name[1]); break; } } } /// <summary> /// 显示初始UI /// </summary> private void showUI() { Console.ForegroundColor = ConsoleColor.DarkRed; Console.WriteLine("************************************************************"); Console.WriteLine("* *"); Console.WriteLine("* 骑 士 飞 行 棋 *"); Console.WriteLine("* *"); Console.WriteLine("************************************************************"); Console.ResetColor(); } /// <summary> /// 用于设置玩家姓名 /// </summary> /// <param name="iName"></param> /// <param name="i"></param> private void setName(out String iName,int i) { while (true) { iName = Console.ReadLine(); //输入玩家A的姓名 if (i == 1) { if (iName.Equals(name[0])) { Console.WriteLine("玩家Α和Β的姓名不能相同,请在重新输入!"); continue; //继续输入 } } if (iName == null || iName.Equals("")) { Console.WriteLine("玩家姓名不能为空,请在重新输入!"); continue; //继续输入 } else { break; //输入合理,退出循环 } } } /// <summary> /// 游戏说明 /// </summary> private void introduce() { Console.WriteLine("\n图例说明:"); Console.Write("\t幸运轮盘:"); Console.ForegroundColor = ConsoleColor.Red; Console.Write("◎"); Console.ResetColor(); Console.Write(" 地雷:"); Console.ForegroundColor = ConsoleColor.Blue; Console.Write("☆"); Console.ResetColor(); Console.Write(" 暂停:"); Console.ForegroundColor = ConsoleColor.Green; Console.Write("▲"); Console.ResetColor(); Console.Write(" 时空隧道:"); Console.ForegroundColor = ConsoleColor.Yellow; Console.Write("卐"); Console.ResetColor(); Console.Write(" 普通:"); Console.ForegroundColor = ConsoleColor.Gray; Console.WriteLine("□ "); Console.ResetColor(); Console.Write("\t玩家“{0}”和“{1}”的士兵分别用“", name[0], name[1]); Console.ForegroundColor = ConsoleColor.DarkRed; Console.Write(" Α "); Console.ResetColor(); Console.Write("和"); Console.ForegroundColor = ConsoleColor.DarkRed; Console.Write(" Β "); Console.ResetColor(); Console.WriteLine("”来标识!"); Console.Write("\t如果Α与Β在同一个位置上时,那我们用“"); Console.ForegroundColor = ConsoleColor.Magenta; Console.Write("<>"); Console.ResetColor(); Console.WriteLine("”来标识!"); Console.WriteLine(); } /// <summary> /// 初始化参数设置 /// </summary> private void intializeMapParams() { //用于存储在地图中的下标 int[] luckTurn = { 6, 23, 40, 55, 69, 83 };//幸运轮盘 int[] landMine = { 5, 13, 17, 33, 38, 50, 64, 80, 94 };//地雷 int[] pause = { 9, 27, 60, 93 };//暂停 int[] timeTunnel = { 20, 25, 45, 63, 72, 88, 90 };//时空隧道 //幸运轮盘 for (int i = 0; i < luckTurn.Length; i++) { int pos = luckTurn[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; } } private void action(int i,out Boolean flag) { int step = 0; Boolean isChange = false; Console.WriteLine("{0}请按任意键投掷骰子......", name[i]); Console.ReadKey(); step = random.Next(1, 6); Console.Write("{0}投掷出了 {1} 点,", name[i], step); Console.WriteLine("按任意键开始行动!"); Console.ReadKey(); ab_pos[i] += step; //修改玩家的位置 if (ab_pos[i] >= 0 && ab_pos[i] < 99) { if (map[ab_pos[i]] != 0) { Console.Clear(); showUI(); drawMap(); } switch (map[ab_pos[i]]) { case 1: { Console.WriteLine("恭喜“{0}”捡到一个幸运轮盘!请选择下面两项进行操作!",name[i]); Console.WriteLine("\t【1】:交换位置\t【2】:进行轰炸"); int intSelect = 0; while (true) { try { Console.Write("请选择:"); intSelect = Convert.ToInt32(Console.ReadLine()); //进行选择 if (intSelect > 2 || intSelect < 0) { Console.WriteLine("选择有误,请重新输入!"); continue; } else { break; } } catch { Console.WriteLine("选择有误,请重新输入!"); continue; } } if (intSelect == 1) { isChange = true; {//进行交换 int temp = 0; temp = ab_pos[0]; ab_pos[0] = ab_pos[1]; ab_pos[1] = temp; } Console.WriteLine("您选择的是交换位置,按任意键进行交换!"); Console.ReadKey(); } else { {//先得到对方的下标 if (i == 0) { i = 1; } else { i = 0; } } if (ab_pos[i] >= 6)//对方的位置够六步就后退六步 { step = -6; } else//不够六步,则则回到起点 { step = -ab_pos[i]; } ab_pos[i] += step; Console.WriteLine("您选择对对方进行轰炸,对方将会被打退{0}步,按任意键开炮!", -step); Console.ReadKey(); } break; } case 2: { step = -ab_pos[i]; ab_pos[i] += step; Console.WriteLine("很不幸,{0}踩到了地雷将会被打回起点!按任意键撤回!",name[i]); Console.ReadKey(); break; } case 3: { Console.WriteLine("不好意思,您可能违规被暂停了一次!"); {//先得到对方的下标 if (i == 0) { i = 1; } else { i = 0; } } Console.WriteLine("现在“{0}”可以连续掷两次!按任意键开始!",name[i]); Console.ReadKey(); action(i, out flag); break; } case 4: { step = 10; ab_pos[i] += step; Console.WriteLine("[0]进入了时空隧道,按任意键可以前进10步哦!",name[i]); Console.ReadKey(); break; } case 0: break; } flag = false; } else { if (ab_pos[i] >= 99) { ab_pos[i] = 99; flag = true; } else { ab_pos[i] = 0; flag = false; } } Console.Clear(); showUI(); drawMap(); if (step >= 0&&!isChange) { Console.WriteLine("玩家“{0}”前进了‘{1}’步,行动已完成!", name[i], step); } else if (step < 0 && !isChange) { Console.WriteLine("玩家“{0}”后退了‘{1}’步,行动已完成!", name[i], -step); } else if(isChange) { Console.WriteLine("玩家“{0}”和“{1}”的士兵在位置上进行了交换,行动已完成!", name[0], name[1]); } } private String getStringMap(int pos) { String result = null; if (ab_pos[0] == pos && ab_pos[1] == pos) { //A与B的位置重复了 Console.ForegroundColor = ConsoleColor.DarkYellow; result = "<>"; } else { Console.ForegroundColor = ConsoleColor.DarkRed; if (ab_pos[0] == pos) { //如果是玩家A result = "Α"; } else if (ab_pos[1] == pos) { //如果是玩家B result = "Β"; } else { switch (map[pos]) { 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.Yellow; result = "卐"; break; case 0: Console.ForegroundColor = ConsoleColor.Gray; result = "□"; break; } } } return result; } /// <summary> /// 绘制地图 /// </summary> private void drawMap() { introduce(); intializeMapParams(); //显示第一行0-29 for (int i = 0; i <= 29; i++) { Console.Write(getStringMap(i)); if (i == 29) { Console.WriteLine(); } } //显示第一列 for (int i = 30; i <= 34; i++) { for (int j = 0; j < 29; j++) { Console.Write(" "); } Console.WriteLine(getStringMap(i)); } //显示第二行 for (int i = 64; i >= 35; i--) { Console.Write(getStringMap(i)); if (i == 35) { Console.WriteLine(); } } //显示第二列 for (int i = 65; i <= 69; i++) { Console.WriteLine(getStringMap(i)); } //显示第三行 for (int i = 70; i <= 99; i++) { Console.Write(getStringMap(i)); if (i == 99) { Console.WriteLine(); } } Console.ResetColor(); Console.WriteLine();//换行 Console.WriteLine("******************玩家的当前位置分别如下********************"); Console.WriteLine("玩家{0}的位置为:{1}", name[0], ab_pos[0]); Console.WriteLine("玩家{0}的位置为:{1}", name[1], ab_pos[1]); } } }
实现之后的效果如下:
设置好两个玩家之后,按任意键继续:
继续进行中: