C#基础篇六飞行棋
飞行棋业务:
我们要能够让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 地图数据----------------- /// <summary> /// 地图数据 数组 /// </summary> static string[] mapData = new string[100]; //--------1.2 玩家数据----------------- /// <summary> /// 玩家标识 A / B /// </summary> static string[] playerMark = new string[2]; /// <summary> /// 玩家名字 /// </summary> static string[] playerNames = new string[2]; /// <summary> /// 玩家位置 /// </summary> static int[] playerPosition = new int[2]; /// <summary> /// 玩家是否在陷阱中 /// </summary> static bool[] playerIsInTrap = new bool[2]; #endregion static void Main(string[] args) { StartGame(); Console.ReadLine(); } #region 0.0 游戏开始 void StartGame() /// <summary> /// 0.0 游戏开始 /// </summary> static void StartGame() { //0.1 初始化数据 InitData(); //0.2 显示 Logo ShowLogo(); //0.3 游戏进行 Playing(); } #endregion #region 1.0 初始化数据方法 void InitData() /// <summary> /// 1.0 初始化数据方法 /// </summary> static void InitData() { //1.初始化 地图数据 InitMapData(); //2.初始化 玩家数据 InitPlayerData(); } #endregion #region 1.1 初始化 地图数据 void InitMapData() /// <summary> /// 1.1 初始化 地图数据 /// </summary> 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() /// <summary> /// 1.2 初始化 玩家数据 /// </summary> 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() /// <summary> /// 2.0 显示游戏Logo /// </summary> static void ShowLogo() { Console.WriteLine("********************************************"); Console.WriteLine("* *"); Console.WriteLine("* 牛 B 的 骑 士 飞 行 棋 *"); Console.WriteLine("* *"); Console.WriteLine("********************************************"); } #endregion #region 3.0 游戏进行中 void Playing() /// <summary> /// 3.0 游戏进行中 /// </summary> static void Playing() { //3.1清屏 Console.Clear(); //3.2显示Logo ShowLogo(); //3.3显示第一次运行游戏的 说明消息 ShowFirstRoundMsg(); //3.4游戏轮流进行 PlayRounds(); } #endregion #region 3.1 显示第一次运行游戏的 说明消息 void ShowFirstRoundMsg() /// <summary> /// 3.1 显示第一次运行游戏的 说明消息 /// </summary> 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 /// <summary> /// 游戏结束 标识 /// </summary> static bool isGameOver = false; #region 3.2 游戏轮流进行 void PlayRound() /// <summary> /// 3.2 游戏轮流进行 /// </summary> static void PlayRounds() { //3.2.1绘制地图 ShowMap(); while (!isGameOver) { //3.2.2玩家开始玩~~ PlayAnRound(); } } #endregion #region 3.2.1 绘制地图 void ShowMap() /// <summary> /// 3.2.1 绘制地图 /// </summary> 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) /// <summary> /// 3.2.1.1 根据 地图下标,返回 地图图标 或者 玩家标识 /// 获取地图 下标对应的 地图单元类型(普通、地雷、陷阱...),返回对应的符号! /// </summary> /// <param name="mapIndex">地图单元下标</param> 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() /// <summary> /// 3.2.2 两个玩家各投一次骰子 /// </summary> 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) /// <summary> /// 3.2.2.1 获取一个 骰子 数(1-6) /// </summary> static int GetAnRandomNum() { Random ran = new Random(); return ran.Next(1, 7); } #endregion #region 3.2.2.2 判断玩家在地图上是否有障碍物,如果有则执行对应操作 void JudgePosition(bool isPlayerA) /// <summary> /// 3.2.2.2 判断玩家在地图上是否有障碍物,如果有则执行对应操作 /// </summary> /// <param name="index"></param> 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) /// <summary> /// 3.2.2.2.1 遇到地雷 /// </summary> /// <param name="isPlayerA">是否为玩家A,或者玩家B</param> 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) /// <summary> /// 3.2.2.2.2 遇到时空隧道 /// </summary> /// <param name="isPlayerA">是否为玩家A,或者玩家B</param> 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) /// <summary> /// 3.3.2.2.3 遇到陷阱 /// </summary> /// <param name="isPlayerA"></param> 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() /// <summary> /// 3.3.2.4 遇到幸运轮盘 /// </summary> 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() /// <summary> /// 4.检查玩家位置,一旦出现越界,则设置临界值 /// </summary> 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) /// <summary> /// 0.0 读取一个非空字符串 /// </summary> /// <returns></returns> 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) /// <summary> /// 0.0 读取一个数值 /// </summary> /// <returns></returns> 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 } }