0


飞行棋(C#)

文章目录

在这里插入图片描述

效果展示

在这里插入图片描述

主函数

staticvoidMain(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;}}}

场景类型枚举

enumE_SceneType{
        Begin,
        Game,
        End,}

控制台基础设置

staticvoidConsoleInit(int w,int h){//控制台设置
            Console.CursorVisible =false;
            Console.SetWindowSize(w, h);
            Console.SetBufferSize(w, h);}

开始及结束场景逻辑

staticvoidGameEndOrBegin(int w,int h,refE_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;}}

游戏场景逻辑

staticvoidGameScene(int w,int h,refE_SceneType nowSceneType){DrawWall(w, h);Map map =newMap(14,3,80);
            map.Draw();Player player =newPlayer(0, E_Player_Type.Player);Player computer =newPlayer(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;}}}staticboolPlayerRandomMove(int w,int h,refPlayer p,refPlayer otherP,Map map,refE_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;}

固定打印的信息

staticvoidDrawWall(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("◎:玩家电脑重合");}

格子类型枚举和格子结构体

enumE_Grid_Type{
        Normal,
        Boom,
        Pause,
        Tunnel,}/// <summary>/// 位置信息结构体/// </summary>structVector2{publicint x;publicint y;publicVector2(int x,int y){this.x = x;this.y = y;}}structGrid{//格子的类型publicE_Grid_Type _type;//格子的位置publicVector2 pos;//构造函数publicGrid(int x,int y,E_Grid_Type type){
            pos.x = x;
            pos.y = y;
            _type = type;}//画一个格子publicvoidDraw(){
            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;}}}

地图结构体

structMap{publicGrid[] grids;publicMap(int x,int y,int num){
            grids =newGrid[num];int indexX =0;int indexY =0;int stepNum =2;Random r =newRandom();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;}elseif(randomNum <90&& randomNum >=85){//炸弹
                    grids[i]._type = E_Grid_Type.Boom;}elseif(randomNum <95&& randomNum >=90){//暂停
                    grids[i]._type = E_Grid_Type.Pause;}else{//时空隧道
                    grids[i]._type = E_Grid_Type.Tunnel;}

                grids[i].pos =newVector2(x, y);if(indexX ==10){
                    y +=1;
                    indexY++;if(indexY ==2){
                        indexX =0;
                        indexY =0;
                        stepNum =-stepNum;}}else{
                    x += stepNum;
                    indexX++;}}}publicvoidDraw(){for(int i =0; i < grids.Length; i++){
                grids[i].Draw();}}}

玩家和电脑结构体

enumE_Player_Type{
        Player,
        Computer,}structPlayer{publicE_Player_Type type;publicint nowIndex;//是否暂停的标识publicbool isPause;publicPlayer(int index,E_Player_Type type){
            nowIndex = index;this.type = type;
            isPause =false;}publicvoidDraw(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;}}}

绘制玩家

staticvoidDrawPlayer(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);}}

扔骰子逻辑

//擦除提示的函数staticvoidClearInfo(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>staticboolRandomMove(int w,int h,refPlayer p,refPlayer 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;returnfalse;}//扔色子目的是改变玩家或电脑的位置 计算位置的变化//扔色子 随机一个1到6的数字,加上去Random r =newRandom();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("请按任意键结束");returntrue;}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格");}elseif(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;}}//默认没有结束returnfalse;}
标签: c# 前端

本文转载自: https://blog.csdn.net/mmz123_/article/details/122799932
版权归原作者 ymz123_ 所有, 如有侵权,请联系我们删除。

“飞行棋(C#)”的评论:

还没有评论