C#实现经典飞行棋游戏的示例代码

目录

  • 效果展示
  • 主函数
  • 场景类型枚举
  • 控制台基础设置
  • 开始及结束场景逻辑
  • 游戏场景逻辑
    • 固定打印的信息
    • 格子类型枚举和格子结构体
    • 地图结构体
    • 玩家和电脑结构体
    • 绘制玩家
    • 扔骰子逻辑

效果展示 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; }

【C#实现经典飞行棋游戏的示例代码】
固定打印的信息
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,}/// /// 位置信息结构体/// 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(""); }/// /// 扔色子函数/// >/// 窗口的宽/// 窗口的高/// 扔色子的对象/// 地图信息/// 默认返回false 代表没有结束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#实现经典飞行棋游戏的示例代码的详细内容,更多关于C#飞行棋的资料请关注脚本之家其它相关文章!

    推荐阅读