飞行棋业务:
我们要能够让2个玩家 在地图上 按照游戏规则 进行游戏玩家类
变量:玩家位置,玩家名称,玩家标识,玩家是否在陷阱中 方法:投骰子,移动地图类 变量:地图数据数组 方法:初始化地图数据,绘制地图,显示Logo游戏规则类 变量: 方法:第一次游戏说明,判断玩家位置是否有障碍物,根据不同障碍物执行不同操作,判断游戏是否结束using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace P03FlyQi{ class Program { #region ----------------1.全局变量 mapData/playerMark/palyerNames/playerPosition/playerIsInTrap------------------- //1.全局变量----------------------------- //--------1.1 地图数据----------------- ////// 地图数据 数组 /// static string[] mapData = new string[100]; //--------1.2 玩家数据----------------- ////// 玩家标识 A / B /// static string[] playerMark = new string[2]; ////// 玩家名字 /// static string[] playerNames = new string[2]; ////// 玩家位置 /// static int[] playerPosition = new int[2]; ////// 玩家是否在陷阱中 /// static bool[] playerIsInTrap = new bool[2]; #endregion static void Main(string[] args) { StartGame(); Console.ReadLine(); } #region 0.0 游戏开始 void StartGame() ////// 0.0 游戏开始 /// static void StartGame() { //0.1 初始化数据 InitData(); //0.2 显示 Logo ShowLogo(); //0.3 游戏进行 Playing(); } #endregion #region 1.0 初始化数据方法 void InitData() ////// 1.0 初始化数据方法 /// static void InitData() { //1.初始化 地图数据 InitMapData(); //2.初始化 玩家数据 InitPlayerData(); } #endregion #region 1.1 初始化 地图数据 void InitMapData() ////// 1.1 初始化 地图数据 /// static void InitMapData() { //a.为地图里所有单元 都默认 赋值为 "普通" for (int i = 0; i < mapData.Length; i++) { mapData[i] = "普通"; } //b.设置 障碍物 mapData[5] = "地雷"; mapData[25] = "地雷"; mapData[45] = "地雷"; mapData[85] = "地雷"; mapData[15] = "陷阱"; mapData[33] = "陷阱"; mapData[65] = "陷阱"; mapData[95] = "陷阱"; mapData[12] = "时空隧道"; mapData[28] = "时空隧道"; mapData[54] = "时空隧道"; mapData[79] = "时空隧道"; mapData[7] = "幸运轮盘"; mapData[37] = "幸运轮盘"; mapData[47] = "幸运轮盘"; mapData[69] = "幸运轮盘"; } #endregion #region 1.2 初始化 玩家数据 void InitPlayerData() ////// 1.2 初始化 玩家数据 /// static void InitPlayerData() { playerMark[0] = "A"; playerMark[1] = "B"; playerNames[0] = ReadString("请输入玩家A的姓名:"); Console.WriteLine("玩家{0}的名字设置成功啦~~~:)\n", playerMark[0]); do { playerNames[1] = ReadString("请输入玩家B的姓名:"); if (playerNames[1] == playerNames[0]) { Console.WriteLine("两个名字不能一样~~~"); } else { Console.WriteLine("玩家{0}的名字设置成功啦~~~:)\n", playerMark[1]); break; } } while (true); } #endregion #region 2.0 显示游戏Logo void ShowLogo() ////// 2.0 显示游戏Logo /// static void ShowLogo() { Console.WriteLine("********************************************"); Console.WriteLine("* *"); Console.WriteLine("* 牛 B 的 骑 士 飞 行 棋 *"); Console.WriteLine("* *"); Console.WriteLine("********************************************"); } #endregion #region 3.0 游戏进行中 void Playing() ////// 3.0 游戏进行中 /// static void Playing() { //3.1清屏 Console.Clear(); //3.2显示Logo ShowLogo(); //3.3显示第一次运行游戏的 说明消息 ShowFirstRoundMsg(); //3.4游戏轮流进行 PlayRounds(); } #endregion #region 3.1 显示第一次运行游戏的 说明消息 void ShowFirstRoundMsg() ////// 3.1 显示第一次运行游戏的 说明消息 /// static void ShowFirstRoundMsg() { Console.WriteLine("{0} 和 {1} 两个好基友将在此次游戏中一决雌雄~~!", playerNames[0], playerNames[1]); Console.WriteLine("玩家【{0}】用【A】表示~~", playerNames[0]); Console.WriteLine("玩家【{0}】用【B】表示~~", playerNames[1]); Console.WriteLine("如果两个玩家位置相同,则用 <> 表示~!"); Console.WriteLine("游戏开始~~~"); } #endregion ////// 游戏结束 标识 /// static bool isGameOver = false; #region 3.2 游戏轮流进行 void PlayRound() ////// 3.2 游戏轮流进行 /// static void PlayRounds() { //3.2.1绘制地图 ShowMap(); while (!isGameOver) { //3.2.2玩家开始玩~~ PlayAnRound(); } } #endregion #region 3.2.1 绘制地图 void ShowMap() ////// 3.2.1 绘制地图 /// static void ShowMap() { //1.绘制 第一部分:第1个横杠(从左到右) for (int i = 0; i < 30; i++) { string unitIcon = GetMapUnitIconByType(i); Console.Write(unitIcon); } Console.WriteLine(); //2.绘制 第二部分:第1个竖线(右竖线) for (int i = 30; i < 35; i++) { string unitIcon = GetMapUnitIconByType(i); for (int j = 0; j < 29; j++) { Console.Write(" "); } Console.WriteLine(unitIcon); } //3.绘制 第三部分:第2个横杠(从右到左) for (int i = 64; i>=35; i--) { string unitIcon = GetMapUnitIconByType(i); Console.Write(unitIcon); } Console.WriteLine(); //4.绘制 第四部分:第2个竖线(左竖线) for (int i = 65; i < 70; i++) { string unitIcon = GetMapUnitIconByType(i); Console.WriteLine(unitIcon); } //5.绘制 第五部分:第3个横杠(从左到右) for (int i = 70; i < 100; i++) { string unitIcon = GetMapUnitIconByType(i); Console.Write(unitIcon); } Console.WriteLine(); //绘制地图后,恢复 原来的 字体颜色 Console.ResetColor(); } #endregion #region 3.2.1.1 根据 地图下标,返回 地图图标 或者 玩家标识 string GetMapUnitIconByType(int mapIndex) ////// 3.2.1.1 根据 地图下标,返回 地图图标 或者 玩家标识 /// 获取地图 下标对应的 地图单元类型(普通、地雷、陷阱...),返回对应的符号! /// /// 地图单元下标 static string GetMapUnitIconByType(int mapIndex) { string strUnitIcon = ""; //1.判断 地图位置 是否有玩家 if (mapIndex == playerPosition[0])//玩家A的位置 { //如果两个玩家的位置相同,则需要 返回 <> if (playerPosition[0] == playerPosition[1]) { Console.ForegroundColor = ConsoleColor.Gray; strUnitIcon = "<>"; } else { Console.ForegroundColor = ConsoleColor.White; strUnitIcon = playerMark[0]; } } else if (mapIndex == playerPosition[1])//玩家B的位置 { Console.ForegroundColor = ConsoleColor.White; strUnitIcon = playerMark[1]; } else//地图 符号 { switch (mapData[mapIndex]) { case "普通": Console.ForegroundColor = ConsoleColor.White; strUnitIcon = "□"; break; case "地雷": Console.ForegroundColor = ConsoleColor.Red; strUnitIcon = "◎"; break; case "幸运轮盘": Console.ForegroundColor = ConsoleColor.Yellow; strUnitIcon = "卐"; break; case "时空隧道": Console.ForegroundColor = ConsoleColor.Magenta; strUnitIcon = "○"; break; case "陷阱": Console.ForegroundColor = ConsoleColor.Green; strUnitIcon = "井"; break; } } return strUnitIcon; } #endregion #region 3.2.2 两个玩家各投一次骰子 void PlayAnRound() ////// 3.2.2 两个玩家各投一次骰子 /// static void PlayAnRound() { int playNum = 0; //1.玩家A投骰子-------------------------- //0.判断玩家A是否在陷阱中 if (playerIsInTrap[0] == true)//如果在陷阱中,则停止一轮 { Console.WriteLine("玩家【A】正艰难的向陷阱外攀爬~~~~按回车继续"); playerIsInTrap[0] = false;//将玩家B的陷阱标识 改成 false(已经停了一轮) Console.ReadLine(); } else//否则,进行 投骰子 { playNum = GetAnRandomNum(); //1.1修改玩家A的位置 playerPosition[0] += playNum; Console.WriteLine("玩家【A】投了一个数字:{0},按回车继续...", playNum); Console.ReadLine(); //1.2重新绘制地图 Console.Clear(); ShowLogo(); ShowMap(); //1.3判断玩家A新的位置 上 是否 结束 或 有障碍物!,如果有,则进行相应处理 JudgePosition(true); } //2.玩家B投骰子----------------------------- //0.判断玩家A是否在陷阱中 if (playerIsInTrap[1] == true)//如果在陷阱中,则停止一轮 { Console.WriteLine("玩家【B】正艰难的向陷阱外攀爬~~~~按回车继续"); playerIsInTrap[1] = false;//将玩家B的陷阱标识 改成 false(已经停了一轮) Console.ReadLine(); } else { playNum = GetAnRandomNum(); //2.1修改玩家B的位置 playerPosition[1] += playNum; Console.WriteLine("玩家【B】投了一个数字:{0},按回车继续...", playNum); Console.ReadLine(); //2.2重新绘制地图 Console.Clear(); ShowLogo(); ShowMap(); //2.3判断玩家B新的位置 上 是否 结束 或 有障碍物!,如果有,则进行相应处理 JudgePosition(false); } } #endregion #region 3.2.2.1 获取一个 骰子 数(1-6) ////// 3.2.2.1 获取一个 骰子 数(1-6) /// static int GetAnRandomNum() { Random ran = new Random(); return ran.Next(1, 7); } #endregion #region 3.2.2.2 判断玩家在地图上是否有障碍物,如果有则执行对应操作 void JudgePosition(bool isPlayerA) ////// 3.2.2.2 判断玩家在地图上是否有障碍物,如果有则执行对应操作 /// /// static void JudgePosition(bool isPlayerA) { //0.判断两个玩家的新位置 是否 已经超过地图,如果超过,则结束游戏 if (playerPosition[0] >= 99) { Console.WriteLine("游戏结束~~~玩家{0}赢了~~", playerMark[0]); isGameOver = true; } else if (playerPosition[1] >= 99) { Console.WriteLine("游戏结束~~~玩家{0}赢了~~", playerMark[1]); isGameOver = true; } else { //1.玩家的位置 int playerIndex = isPlayerA ? playerPosition[0] : playerPosition[1]; //2.根据玩家所在地图 的障碍物 执行不同的操作 switch (mapData[playerIndex]) { case "地雷": { MeetBomb(isPlayerA); break; } case "幸运轮盘": { MeetLuckyCircle(isPlayerA); break; } case "时空隧道": { MeetTimeTunnuel(isPlayerA); break; } case "陷阱": { MeetTrap(isPlayerA); break; } } } } #endregion #region 3.2.2.2.1 遇到地雷 void MeetBomb(bool isPlayerA) ////// 3.2.2.2.1 遇到地雷 /// /// 是否为玩家A,或者玩家B static void MeetBomb(bool isPlayerA) { //1.如果是地雷,则提示 要后退 6 格 Console.WriteLine("真倒霉~~【{0}】踩到了 地雷了~~!后退6格~~!按回车继续...", (isPlayerA ? playerMark[0] : playerMark[1])); //2.玩家退后 6 格 if (isPlayerA) { playerPosition[0] -= 6; } else { playerPosition[1] -= 6; } CheckPosition(); Console.ReadLine(); Console.Clear(); ShowLogo(); ShowMap(); } #endregion #region 3.2.2.2.2 遇到时空隧道 void MeetTimeTunnuel(bool isPlayerA) ////// 3.2.2.2.2 遇到时空隧道 /// /// 是否为玩家A,或者玩家B static void MeetTimeTunnuel(bool isPlayerA) { //1.如果是地雷,则提示 要后退 6 格 Console.WriteLine("真幸运~~【{0}】进入时空隧道了~~ !前进6格子~~!按回车继续...", (isPlayerA ? playerMark[0] : playerMark[1])); //2.玩家退后 6 格 if (isPlayerA) { playerPosition[0] += 6; } else { playerPosition[1] += 6; } CheckPosition(); Console.ReadLine(); Console.Clear(); ShowLogo(); ShowMap(); } #endregion #region 3.3.2.2.3 遇到陷阱 void MeetTrap(bool isPlayerA) ////// 3.3.2.2.3 遇到陷阱 /// /// static void MeetTrap(bool isPlayerA) { //1.如果是地雷,则提示 要后退 6 格 Console.WriteLine("啊~~【{0}】掉进陷阱了~~ !暂停一局!按回车继续...", (isPlayerA ? playerMark[0] : playerMark[1])); //2.玩家进入陷阱 if (isPlayerA) { playerIsInTrap[0] = true; } else { playerIsInTrap[1] = true; } Console.ReadLine(); } #endregion #region 3.3.2.4 遇到幸运轮盘 void MeetLuckyCircle() ////// 3.3.2.4 遇到幸运轮盘 /// static void MeetLuckyCircle(bool isPlayerA) { //1.如果是地雷,则提示 要后退 6 格 string strPalyerMark = isPlayerA ? playerMark[0] : playerMark[1]; int num = ReadANum("啊~~【" + strPalyerMark + "】被幸运之神遭砸了~~,请选择一个愿望:1.轰炸对方,对方后退6格;2.乾坤大挪移,和对方交换位置:"); switch (num) { case 1://轰炸对方,对方后退6格 { //如果是玩家A,那么 玩家B的位置后退6格 if (isPlayerA) { playerPosition[1] -= 6; Console.WriteLine("您选择轰炸对方,玩家【B】将后退6格~!"); } else//如果是玩家B,那么 玩家A的位置后退6格 { playerPosition[0] -= 6; Console.WriteLine("您选择轰炸对方,玩家【A】将后退6格~!"); } break; } case 2://乾坤大挪移,和对方交换位置 { //playerPosition[0] = playerPosition[0] + playerPosition[1]; //playerPosition[1] = playerPosition[0] - playerPosition[1]; //playerPosition[0] = playerPosition[0] - playerPosition[1]; int temp = playerPosition[0]; playerPosition[0] = playerPosition[1]; playerPosition[1] = temp; Console.WriteLine("您选择了乾坤大挪移,和对方交换位置~!"); break; } } CheckPosition(); Console.ReadLine(); Console.Clear(); ShowLogo(); ShowMap(); } #endregion #region 4.检查玩家位置,一旦出现越界,则设置临界值 void CheckPosition() ////// 4.检查玩家位置,一旦出现越界,则设置临界值 /// static void CheckPosition() { if (playerPosition[0] < 0) playerPosition[0] = 0; if (playerPosition[1] < 0) playerPosition[1] = 0; if (playerPosition[0] > 99) playerPosition[0] = 99; if (playerPosition[1] > 99) playerPosition[1] = 99; } #endregion //-----------------------工具方法------------------------------- //------------------------------------------------------------- #region 0.0 读取一个非空字符串 string ReadString(string strMsg) ////// 0.0 读取一个非空字符串 /// ///static string ReadString(string strMsg) { string strMsgBack=""; while (true) { Console.Write(strMsg); strMsgBack = Console.ReadLine().Trim(); if (string.IsNullOrEmpty(strMsgBack)) { Console.WriteLine("您输入的字符串不能为空~~"); } else { break; } } return strMsgBack;//返回 接收到的 非空字符串 //Trim方法用来去掉 字符串两边的 空格 ,如:" aaa aaa " => "aaa aaa" //string.IsNullOrEmpty 判断字符串是否为空,如果为空,则返回 true;否则返回 false } #endregion #region 0.0 读取一个数值 int ReadANum(string strMsg) /// /// 0.0 读取一个数值 /// ///static int ReadANum(string strMsg) { int num = -1; while (true) { string strMsgBack = ReadString(strMsg); if (int.TryParse(strMsgBack, out num) && (num > 0 && num<3)) { break; } else { Console.WriteLine("请输入 1-2 之间的一个数值!"); } } return num; } #endregion }}