C#實現飛行棋優化版
本文實例為大傢分享瞭C#實現飛行棋優化版的具體代碼,供大傢參考,具體內容如下
代碼如下
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; } } } } }
以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。