您好,登錄后才能下訂單哦!
今天小編給大家分享一下C#實現經典飛行棋游戲的腳本怎么寫的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
static void Main(string[] args) { int w = 50; int h = 30; ConsoleInit(w, h); E_SceneType nowSceneType = E_SceneType.Begin; while (true) { switch (nowSceneType) { case E_SceneType.Begin: Console.Clear(); GameEndOrBegin(w, h, ref nowSceneType); break; case E_SceneType.Game: Console.Clear(); GameScene(w, h, ref nowSceneType); break; case E_SceneType.End: Console.Clear(); GameEndOrBegin(w, h, ref nowSceneType); break; default: break; } } }
enum E_SceneType { Begin, Game, End, }
static void ConsoleInit(int w, int h) { //控制臺設置 Console.CursorVisible = false; Console.SetWindowSize(w, h); Console.SetBufferSize(w, h); }
static void GameEndOrBegin(int w, int h, ref E_SceneType nowSceneType) { Console.ForegroundColor = ConsoleColor.White; Console.SetCursorPosition(nowSceneType == E_SceneType.Begin ? w / 2 - 3 : w / 2 - 4, 8); Console.Write(nowSceneType == E_SceneType.Begin ? "飛行棋" : "游戲結束"); //當前選項的編號 int count = 0; bool IsOver = false; while (true) { Console.SetCursorPosition(nowSceneType ==E_SceneType.Begin? w/2-4:w/2-5, 11); Console.ForegroundColor = count == 0 ? ConsoleColor.Red : ConsoleColor.White; Console.Write(nowSceneType == E_SceneType.Begin? "游戲開始":"回到主菜單"); Console.SetCursorPosition(w/2-4, 13); Console.ForegroundColor = count == 1 ? ConsoleColor.Red : ConsoleColor.White; Console.Write("退出游戲"); switch (Console.ReadKey(true).Key) { case ConsoleKey.W: --count; if (count < 0) { count = 0; } break; case ConsoleKey.S: ++count; if (count > 1) { count = 1; } break; case ConsoleKey.J: if(count == 0) { nowSceneType = nowSceneType ==E_SceneType.Begin? E_SceneType.Game:E_SceneType.Begin; IsOver = true; } else { Environment.Exit(0); } break; } if (IsOver) break; } }
static void GameScene(int w, int h, ref E_SceneType nowSceneType) { DrawWall(w, h); Map map = new Map(14, 3, 80); map.Draw(); Player player = new Player(0, E_Player_Type.Player); Player computer = new Player(0, E_Player_Type.Computer); DrawPlayer(map, player, computer); while (true) { if (PlayerRandomMove(w, h, ref player, ref computer, map, ref nowSceneType)) { break; } if (PlayerRandomMove(w, h, ref computer, ref player, map, ref nowSceneType)) { break; } } } static bool PlayerRandomMove(int w, int h, ref Player p, ref Player otherP, Map map, ref E_SceneType nowSceneType) { //之后的游戲邏輯 //玩家扔色子邏輯 //檢測輸入 Console.ReadKey(true); //扔色子的邏輯 bool isGameOver = RandomMove(w, h, ref p, ref otherP, map); //繪制地圖 map.Draw(); //繪制玩家 DrawPlayer(map, p, otherP); //判斷是否要結束游戲 if(isGameOver) { //卡住程序 讓玩家按任意鍵 Console.ReadKey(true); nowSceneType = E_SceneType.End; } return isGameOver; }
static void DrawWall(int w, int h) { Console.ForegroundColor = ConsoleColor.Red; //橫著的墻 for (int i = 0; i < w; i+=2) { //最上面一行 Console.SetCursorPosition(i, 0); Console.Write("■"); //中間一行 Console.SetCursorPosition(i, h-6); Console.Write("■"); Console.SetCursorPosition(i, h - 11); Console.Write("■"); //最下面一行 Console.SetCursorPosition(i, h-1); Console.Write("■"); } //豎著的墻 for(int i = 0; i < h; i++) { //左邊的墻 Console.SetCursorPosition(0, i); Console.Write("■"); //右邊的墻 Console.SetCursorPosition(w-2, i); Console.Write("■"); } Console.SetCursorPosition(2, h - 5); Console.ForegroundColor = ConsoleColor.White; Console.Write("按任意鍵開始扔色子"); Console.SetCursorPosition(2, h - 10); Console.Write("□:普通格子"); Console.SetCursorPosition(2, h - 9); Console.ForegroundColor = ConsoleColor.Blue; Console.Write("■:暫停,一回合不動"); Console.SetCursorPosition(22,h - 9); Console.ForegroundColor = ConsoleColor.Red; Console.Write("●:炸彈,倒退5格"); Console.SetCursorPosition(2, h - 8); Console.ForegroundColor = ConsoleColor.White; Console.Write("×:時空隧道,隨機倒退,暫停,交換位置"); Console.SetCursorPosition(2, h - 7); Console.ForegroundColor = ConsoleColor.Cyan; Console.Write("★:玩家 "); Console.SetCursorPosition(11, h - 7); Console.ForegroundColor = ConsoleColor.Magenta; Console.Write("▲:電腦 "); Console.SetCursorPosition(20, h - 7); Console.ForegroundColor = ConsoleColor.Blue; Console.Write("◎:玩家電腦重合"); }
enum E_Grid_Type { Normal, Boom, Pause, Tunnel, } /// <summary> /// 位置信息結構體 /// </summary> struct Vector2 { public int x; public int y; public Vector2(int x, int y) { this.x = x; this.y = y; } } struct Grid { //格子的類型 public E_Grid_Type _type; //格子的位置 public Vector2 pos; //構造函數 public Grid(int x, int y, E_Grid_Type type) { pos.x = x; pos.y = y; _type = type; } //畫一個格子 public void Draw() { Console.SetCursorPosition(pos.x, pos.y); switch(_type) { case E_Grid_Type.Normal: Console.ForegroundColor = ConsoleColor.White; Console.Write("□"); break; case E_Grid_Type.Boom: Console.ForegroundColor = ConsoleColor.Red; Console.Write("●"); break; case E_Grid_Type.Pause: Console.ForegroundColor = ConsoleColor.Blue; Console.Write("■"); break; case E_Grid_Type.Tunnel: Console.ForegroundColor = ConsoleColor.White; Console.Write("×"); break; } } }
struct Map { public Grid[] grids; public Map(int x, int y, int num) { grids = new Grid[num]; int indexX = 0; int indexY = 0; int stepNum = 2; Random r = new Random(); int randomNum; for(int i = 0; i < num; i++) { randomNum = r.Next(0, 101); if(randomNum < 85 || i == 0 || i == num - 1) { //普通格子 grids[i]._type = E_Grid_Type.Normal; } else if(randomNum < 90 && randomNum >=85) { //炸彈 grids[i]._type = E_Grid_Type.Boom; } else if(randomNum < 95 && randomNum >=90) { //暫停 grids[i]._type = E_Grid_Type.Pause; } else { //時空隧道 grids[i]._type = E_Grid_Type.Tunnel; } grids[i].pos = new Vector2(x, y); 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 < grids.Length; i++) { grids[i].Draw(); } } }
enum E_Player_Type { Player, Computer, } struct Player { public E_Player_Type type; public int nowIndex; //是否暫停的標識 public bool isPause; public Player(int index, E_Player_Type type) { nowIndex = index; this.type = type; isPause = false; } public void Draw(Map mapInfo) { //從傳入的地圖中得到格子信息 Grid grid = mapInfo.grids[nowIndex]; Console.SetCursorPosition(grid.pos.x, grid.pos.y); switch(type) { case E_Player_Type.Player: Console.ForegroundColor = ConsoleColor.Cyan; Console.Write("★"); break; case E_Player_Type.Computer: Console.ForegroundColor = ConsoleColor.Magenta; Console.Write("▲"); break; } } }
static void DrawPlayer(Map map, Player player, Player computer) { //重合時 if(player.nowIndex == computer.nowIndex) { //得到重合的位置 Grid grid = map.grids[player.nowIndex]; Console.SetCursorPosition(grid.pos.x, grid.pos.y); Console.ForegroundColor = ConsoleColor.DarkGreen; Console.Write("◎"); } //不重合時 else { player.Draw(map); computer.Draw(map); } }
//擦除提示的函數 static void ClearInfo(int h) { Console.SetCursorPosition(2, h - 5); Console.Write(" "); Console.SetCursorPosition(2, h - 4); Console.Write(" "); Console.SetCursorPosition(2, h - 3); Console.Write(" "); Console.SetCursorPosition(2, h - 2); Console.Write(" "); } /// <summary> /// 扔色子函數 /// </summary>> /// <param name="w">窗口的寬</param> /// <param name="h">窗口的高</param> /// <param name="p">扔色子的對象</param> /// <param name="map">地圖信息</param> /// <returns>默認返回false 代表沒有結束</returns> static bool RandomMove(int w, int h, ref Player p, ref Player otherP, Map map) { //擦除之前顯示的提示信息 ClearInfo(h); //根據扔色子的玩家類型,決定信息的顏色 Console.ForegroundColor = p.type == E_Player_Type.Player ? ConsoleColor.Cyan : ConsoleColor.Magenta; //扔色子之前判斷玩家是否處于暫停狀態 if(p.isPause) { Console.SetCursorPosition(2, h - 5); Console.Write("處于暫停狀態,{0}需要暫停一回合", p.type == E_Player_Type.Player ? "你" : "電腦"); Console.SetCursorPosition(2, h - 4); Console.Write("請按任意鍵,讓{0}開始扔色子", p.type == E_Player_Type.Player ? "電腦" : "你"); //停止暫停 p.isPause = false; return false; } //扔色子目的是改變玩家或電腦的位置 計算位置的變化 //扔色子 隨機一個1到6的數字,加上去 Random r = new Random(); int randomNum = r.Next(1, 7); p.nowIndex += randomNum; //打印扔的點數 Console.SetCursorPosition(2, h - 5); Console.Write("{0}扔出的點數為:{1}", p.type == E_Player_Type.Player ? "你" : "電腦", randomNum); //首先判斷是否到終點了 if(p.nowIndex >= map.grids.Length - 1) { p.nowIndex = map.grids.Length - 1; Console.SetCursorPosition(2, h - 4); if(p.type == E_Player_Type.Player) { Console.Write("恭喜你,率先到達了終點"); } else { Console.Write("很遺憾,電腦率先到達了終點"); } Console.SetCursorPosition(2, h - 3); Console.Write("請按任意鍵結束"); return true; } else { //沒有到終點 就判斷當前對象到了一個什么類型的格子 Grid grid = map.grids[p.nowIndex]; switch(grid._type) { case E_Grid_Type.Normal: Console.SetCursorPosition(2, h - 4); Console.Write("{0}到達了一個安全位置", p.type == E_Player_Type.Player ? "你" : "電腦"); Console.SetCursorPosition(2, h - 3); Console.Write("請按任意鍵,讓{0}開始扔色子", p.type == E_Player_Type.Player ? "電腦" : "你"); break; case E_Grid_Type.Boom: p.nowIndex -= 5; if(p.nowIndex < 0) { p.nowIndex = 0; } Console.SetCursorPosition(2, h - 4); Console.Write("{0}踩到了炸彈,退后5格", p.type == E_Player_Type.Player ? "你" : "電腦"); Console.SetCursorPosition(2, h - 3); Console.Write("請按任意鍵,讓{0}開始扔色子", p.type == E_Player_Type.Player ? "電腦" : "你"); break; case E_Grid_Type.Pause: p.isPause = true; Console.SetCursorPosition(2, h - 4); Console.Write("{0}到達了暫停點,你需要暫停一回合", p.type == E_Player_Type.Player ? "你" : "電腦"); Console.SetCursorPosition(2, h - 3); Console.Write("請按任意鍵,讓{0}開始扔色子", p.type == E_Player_Type.Player ? "電腦" : "你"); break; case E_Grid_Type.Tunnel: Console.SetCursorPosition(2, h - 4); Console.Write("{0}踩到了時空隧道", p.type == E_Player_Type.Player ? "你" : "電腦"); //隨機 randomNum = r.Next(1, 91); if(randomNum <= 30) { //倒退 p.nowIndex -= 5; if(p.nowIndex < 0) { p.nowIndex = 0; } Console.SetCursorPosition(2, h - 5); Console.Write("觸發倒退5格"); } else if(randomNum <= 60) { p.isPause = true; Console.SetCursorPosition(2, h - 3); Console.Write("觸發暫停一回合"); } else { int tmp = p.nowIndex; p.nowIndex = otherP.nowIndex; otherP.nowIndex = tmp; Console.SetCursorPosition(2, h - 3); Console.Write("驚喜,雙方交換位置"); } Console.SetCursorPosition(2, h - 2); Console.Write("請按任意鍵,讓{0}開始扔色子", p.type == E_Player_Type.Player ? "電腦" : "你"); break; } } //默認沒有結束 return false; }
以上就是“C#實現經典飛行棋游戲的腳本怎么寫”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。