您好,登錄后才能下訂單哦!
今天小編給大家分享一下C#實(shí)現(xiàn)經(jīng)典飛行棋游戲的腳本怎么寫的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來(lái)了解一下吧。
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) { //控制臺(tái)設(shè)置 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 ? "飛行棋" : "游戲結(jié)束"); //當(dāng)前選項(xiàng)的編號(hào) 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) { //之后的游戲邏輯 //玩家扔色子邏輯 //檢測(cè)輸入 Console.ReadKey(true); //扔色子的邏輯 bool isGameOver = RandomMove(w, h, ref p, ref otherP, map); //繪制地圖 map.Draw(); //繪制玩家 DrawPlayer(map, p, otherP); //判斷是否要結(jié)束游戲 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("■:暫停,一回合不動(dòng)"); Console.SetCursorPosition(22,h - 9); Console.ForegroundColor = ConsoleColor.Red; Console.Write("●:炸彈,倒退5格"); Console.SetCursorPosition(2, h - 8); Console.ForegroundColor = ConsoleColor.White; Console.Write("×:時(shí)空隧道,隨機(jī)倒退,暫停,交換位置"); 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> /// 位置信息結(jié)構(gòu)體 /// </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; //構(gòu)造函數(shù) public Grid(int x, int y, E_Grid_Type type) { pos.x = x; pos.y = y; _type = type; } //畫一個(gè)格子 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 { //時(shí)空隧道 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; //是否暫停的標(biāo)識(shí) 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) { //重合時(shí) 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("◎"); } //不重合時(shí) else { player.Draw(map); computer.Draw(map); } }
//擦除提示的函數(shù) 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> /// 扔色子函數(shù) /// </summary>> /// <param name="w">窗口的寬</param> /// <param name="h">窗口的高</param> /// <param name="p">扔色子的對(duì)象</param> /// <param name="map">地圖信息</param> /// <returns>默認(rèn)返回false 代表沒(méi)有結(jié)束</returns> static bool RandomMove(int w, int h, ref Player p, ref Player otherP, Map map) { //擦除之前顯示的提示信息 ClearInfo(h); //根據(jù)扔色子的玩家類型,決定信息的顏色 Console.ForegroundColor = p.type == E_Player_Type.Player ? ConsoleColor.Cyan : ConsoleColor.Magenta; //扔色子之前判斷玩家是否處于暫停狀態(tài) if(p.isPause) { Console.SetCursorPosition(2, h - 5); Console.Write("處于暫停狀態(tài),{0}需要暫停一回合", p.type == E_Player_Type.Player ? "你" : "電腦"); Console.SetCursorPosition(2, h - 4); Console.Write("請(qǐng)按任意鍵,讓{0}開始扔色子", p.type == E_Player_Type.Player ? "電腦" : "你"); //停止暫停 p.isPause = false; return false; } //扔色子目的是改變玩家或電腦的位置 計(jì)算位置的變化 //扔色子 隨機(jī)一個(gè)1到6的數(shù)字,加上去 Random r = new Random(); int randomNum = r.Next(1, 7); p.nowIndex += randomNum; //打印扔的點(diǎn)數(shù) Console.SetCursorPosition(2, h - 5); Console.Write("{0}扔出的點(diǎn)數(shù)為:{1}", p.type == E_Player_Type.Player ? "你" : "電腦", randomNum); //首先判斷是否到終點(diǎn)了 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("恭喜你,率先到達(dá)了終點(diǎn)"); } else { Console.Write("很遺憾,電腦率先到達(dá)了終點(diǎn)"); } Console.SetCursorPosition(2, h - 3); Console.Write("請(qǐng)按任意鍵結(jié)束"); return true; } else { //沒(méi)有到終點(diǎn) 就判斷當(dāng)前對(duì)象到了一個(gè)什么類型的格子 Grid grid = map.grids[p.nowIndex]; switch(grid._type) { case E_Grid_Type.Normal: Console.SetCursorPosition(2, h - 4); Console.Write("{0}到達(dá)了一個(gè)安全位置", p.type == E_Player_Type.Player ? "你" : "電腦"); Console.SetCursorPosition(2, h - 3); Console.Write("請(qǐng)按任意鍵,讓{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("請(qǐng)按任意鍵,讓{0}開始扔色子", p.type == E_Player_Type.Player ? "電腦" : "你"); break; case E_Grid_Type.Pause: p.isPause = true; Console.SetCursorPosition(2, h - 4); Console.Write("{0}到達(dá)了暫停點(diǎn),你需要暫停一回合", p.type == E_Player_Type.Player ? "你" : "電腦"); Console.SetCursorPosition(2, h - 3); Console.Write("請(qǐng)按任意鍵,讓{0}開始扔色子", p.type == E_Player_Type.Player ? "電腦" : "你"); break; case E_Grid_Type.Tunnel: Console.SetCursorPosition(2, h - 4); Console.Write("{0}踩到了時(shí)空隧道", p.type == E_Player_Type.Player ? "你" : "電腦"); //隨機(jī) 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("觸發(fā)倒退5格"); } else if(randomNum <= 60) { p.isPause = true; Console.SetCursorPosition(2, h - 3); Console.Write("觸發(fā)暫停一回合"); } 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("請(qǐng)按任意鍵,讓{0}開始扔色子", p.type == E_Player_Type.Player ? "電腦" : "你"); break; } } //默認(rèn)沒(méi)有結(jié)束 return false; }
以上就是“C#實(shí)現(xiàn)經(jīng)典飛行棋游戲的腳本怎么寫”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。