代码如下
using System; namespace ConsoleApp1 { enum E_Gezi { Simple, Boom, Pause, TimeTravel, } enum E_PlayerType { MianPlayer, Computer, } enum E_SceneType { Begin, Game, End, } struct Vector2 { public int x; public int y; public Vector2(int x, int y) { this.x = x; this.y = y; } } struct Gezi { public E_Gezi type; public Vector2 pos; public Gezi(int x, int y, E_Gezi gezi) { pos = new Vector2(x, y); type = gezi; } public void Draw() { Console.SetCursorPosition(pos.x, pos.y); switch (type) { case E_Gezi.Simple: Console.ForegroundColor = ConsoleColor.White; Console.Write("□"); break; case E_Gezi.Boom: Console.ForegroundColor = ConsoleColor.Red; Console.Write("●"); break; case E_Gezi.Pause: Console.ForegroundColor = ConsoleColor.DarkBlue; Console.Write("Ⅱ"); break; case E_Gezi.TimeTravel: Console.ForegroundColor = ConsoleColor.White; Console.Write("D "); break; } } } struct Map { public Gezi[] gezis; public Map(int x, int y, int num) { this.gezis = new Gezi[num]; Random r = new(); int ra; int stepNum = 2; int indexX = 0; int indexY = 0; for (int i = 0; i < gezis.Length; i++) { //随机有物体生成 ra = r.Next(1, 101); if (ra >= 1 && ra < 85 || i == 0 || i == gezis.Length - 1) { gezis[i].type = E_Gezi.Simple; } else if (ra >= 85 && ra < 90) { gezis[i].type = E_Gezi.Pause; } else if (ra >= 90 && ra < 95) { gezis[i].type = E_Gezi.Boom; } else { gezis[i].type = E_Gezi.TimeTravel; } gezis[i].pos = new Vector2(x, y); //一行有十个 然后让y加2次 if (indexX == 10) { y += 1; ++indexY; if (indexY == 2) { indexX = 0; indexY = 0; stepNum = -stepNum; } } else { //奇数次步长反向 x += stepNum; ++indexX; } } } public void Draw() { for (int i = 0; i < gezis.Length; i++) { gezis[i].Draw(); } } } struct Player { public E_PlayerType type; public int indexStep; //这里有一种优化方案 就是直接把坐标变成索引 并且内置一个bool变量判断玩家是否被暂停 //之后用索引配合map来绘制地图 public bool isPause; public Player(int index, E_PlayerType type) { indexStep = index; this.type = type; isPause = false; } public void Draw(Map map) { Console.SetCursorPosition(map.gezis[indexStep].pos.x, map.gezis[indexStep].pos.y); switch (type) { case E_PlayerType.MianPlayer: Console.ForegroundColor = ConsoleColor.Blue; Console.Write("★"); break; case E_PlayerType.Computer: Console.ForegroundColor = ConsoleColor.DarkRed; Console.Write("▲"); break; } } } class Program { static void Main() { //初始化设置 Console.SetWindowSize(50, 40); Console.SetBufferSize(50, 40); Console.CursorVisible = false; E_SceneType type = E_SceneType.Begin; while (true) { switch (type) { case E_SceneType.Begin: Console.Clear(); GameScence(ref type); break; case E_SceneType.Game: Console.Clear(); DrawWall(); Map map = new(12, 3, 80); map.Draw(); //绘制玩家相关 Player player = new(0, E_PlayerType.MianPlayer); Player computer = new(0, E_PlayerType.Computer); DrawPlayer( player, computer, map); while (true) { if(!InputSelection(ref player,ref computer,map,ref type)) { break; } if(!InputSelection(ref computer, ref player, map, ref type)) { break; } } break; case E_SceneType.End: Console.Clear(); GameOverScence(ref type); break; } } } static void GameScence(ref E_SceneType type) { //标题 string title = "飞行棋"; string startGame = "开始游戏"; string quitGame = "结束游戏"; //选择的索引 int selectIndex = 0; //选择 Console.SetCursorPosition(25 - title.Length, 10); Console.Write(title); //跳出while bool isquit = false; while (true) { if (isquit) { break; } Console.SetCursorPosition(25 - startGame.Length, 13); Console.ForegroundColor = selectIndex == 0 ? ConsoleColor.Red : ConsoleColor.White; Console.Write(startGame); Console.SetCursorPosition(25 - quitGame.Length, 15); Console.ForegroundColor = selectIndex == 1 ? ConsoleColor.Red : ConsoleColor.White; Console.Write(quitGame); switch (Console.ReadKey(true).Key) { case ConsoleKey.W: selectIndex = 0; break; case ConsoleKey.S: selectIndex = 1; break; case ConsoleKey.J: if (selectIndex == 0) { type = E_SceneType.Game; isquit = true; } else if (selectIndex == 1) { Environment.Exit(0); } break; } } } static void GameOverScence(ref E_SceneType type) { //标题 string Endtitle = "游戏结束"; string returnMain = "回到主菜单"; string quitGame1 = "结束游戏"; //选择的索引 int selectIndex = 0; Console.SetCursorPosition(25 - Endtitle.Length, 10); Console.Write(Endtitle); //跳出while bool isquit = false; while (true) { if (isquit) { break; } Console.SetCursorPosition(25 - returnMain.Length, 13); Console.ForegroundColor = selectIndex == 0 ? ConsoleColor.Red : ConsoleColor.White; Console.Write(returnMain); Console.SetCursorPosition(25 - quitGame1.Length, 15); Console.ForegroundColor = selectIndex == 1 ? ConsoleColor.Red : ConsoleColor.White; Console.Write(quitGame1); switch (Console.ReadKey(true).Key) { case ConsoleKey.W: selectIndex = 0; break; case ConsoleKey.S: selectIndex = 1; break; case ConsoleKey.J: if (selectIndex == 0) { type = E_SceneType.Begin; isquit = true; } else if (selectIndex == 1) { Environment.Exit(0); } break; } } } static void DrawWall() { Console.ForegroundColor = ConsoleColor.Red; for (int i = 0; i < 50 - 2; i += 2) { Console.SetCursorPosition(i, 0); Console.Write("■"); } for (int i = 0; i < 50 - 2; i += 2) { Console.SetCursorPosition(i, 39); Console.Write("■"); } for (int i = 0; i < 50 - 2; i += 2) { Console.SetCursorPosition(i, 34); Console.Write("■"); } for (int i = 0; i < 50 - 2; i += 2) { Console.SetCursorPosition(i, 29); Console.Write("■"); } for (int i = 0; i < 40; i++) { Console.SetCursorPosition(0, i); Console.Write("■"); } for (int i = 0; i < 40; i++) { Console.SetCursorPosition(46, i); Console.Write("■"); } Console.SetCursorPosition(2, 30); Console.ForegroundColor = ConsoleColor.White; Console.Write("□: 普通格子"); Console.SetCursorPosition(2, 31); Console.ForegroundColor = ConsoleColor.DarkBlue; Console.Write("Ⅱ: 暂停,一回合不动"); Console.SetCursorPosition(24, 31); Console.ForegroundColor = ConsoleColor.Red; Console.Write("●: 炸弹,倒退5格"); Console.SetCursorPosition(2, 32); Console.ForegroundColor = ConsoleColor.White; Console.Write("D : 时空隧道,随机倒退,暂停,换位置"); Console.SetCursorPosition(2, 33); Console.ForegroundColor = ConsoleColor.Blue; Console.Write("★:玩家"); Console.SetCursorPosition(10, 33); Console.ForegroundColor = ConsoleColor.DarkRed; Console.Write("▲:电脑"); Console.SetCursorPosition(18, 33); Console.ForegroundColor = ConsoleColor.Green; Console.Write("C :电脑玩家重合"); Console.SetCursorPosition(2, 35); Console.ForegroundColor = ConsoleColor.White; Console.Write("按任意键开始扔筛子"); } //优化二 专门写一个函数 绘制玩家 //重合的时候 和 不重合的时候分别画 static void DrawPlayer(Player player, Player player1,Map map) { if(player.indexStep == player1.indexStep) { Console.SetCursorPosition(map.gezis[player.indexStep].pos.x, map.gezis[player.indexStep].pos.y); Console.ForegroundColor = ConsoleColor.Green; Console.Write("C "); } else { Console.SetCursorPosition(map.gezis[player.indexStep].pos.x, map.gezis[player.indexStep].pos.y); Console.ForegroundColor = ConsoleColor.Blue; Console.Write("★"); Console.SetCursorPosition(map.gezis[player1.indexStep].pos.x, map.gezis[player1.indexStep].pos.y); Console.ForegroundColor = ConsoleColor.DarkRed; Console.Write("▲"); } } //优化3 扔色子函数判断是否游戏结束 //优化4 通过函数包裹来重用玩家输入和电脑输入 static bool InputSelection(ref Player player,ref Player player1, Map map,ref E_SceneType type) { if (player.isPause) { player.isPause = false; } else { switch (Console.ReadKey(true).Key) { case ConsoleKey.A: case ConsoleKey.B: case ConsoleKey.C: case ConsoleKey.D: case ConsoleKey.E: case ConsoleKey.F: case ConsoleKey.G: case ConsoleKey.H: case ConsoleKey.I: case ConsoleKey.J: case ConsoleKey.K: case ConsoleKey.L: case ConsoleKey.M: case ConsoleKey.N: case ConsoleKey.O: case ConsoleKey.P: case ConsoleKey.Q: case ConsoleKey.R: case ConsoleKey.S: case ConsoleKey.T: case ConsoleKey.U: case ConsoleKey.V: case ConsoleKey.W: case ConsoleKey.X: case ConsoleKey.Y: case ConsoleKey.Z: ThrowShaiZi(ref player, ref player1, map, ref type); break; } } if(type == E_SceneType.End) { return false; } return true; } static void ThrowShaiZi(ref Player player, ref Player computer, Map map,ref E_SceneType type) { Random r = new(); player.indexStep += r.Next(1, 7); for (int i = 0; i < map.gezis.Length; i++) { if(player.indexStep >= map.gezis.Length - 1) { player.indexStep = map.gezis.Length - 1; type = E_SceneType.End; } if (player.indexStep == i) { switch (map.gezis[i].type) { case E_Gezi.Simple: break; case E_Gezi.Boom: player.indexStep -= 5; break; case E_Gezi.Pause: player.isPause = true; break; case E_Gezi.TimeTravel: if(r.Next(1,4) == 1) { player.indexStep -= 5; } else if(r.Next(1, 4) == 2) { player.isPause = true; } else if(r.Next(1, 4) == 3) { int temp = computer.indexStep; computer.indexStep = player.indexStep; player.indexStep = temp; } break; } break; } } } } }