小游戏:《飞行棋》

181 阅读9分钟

咳咳!24K月亮又回来了!今天我想着给大家带一个有趣的小游戏,这个游戏我相信90后、00后的人们都会接触它!没错啦!我直接点明主题《飞行棋》。

制作这个游戏首先我们必须得把我们的思维整理一下。

1、控制台打印游戏界面

在控制台当中打印出来我们的游戏界面,当然啦,肯定不止出现一次的。每一次操作完成以后都需要将界面中的内容清空,然后重新打印一次。每当控制台闪烁一遍其实就是清空控制台,然后重新打印游戏界面的过程。界面中的内容需要不停的打印,所以我们要将对应的操作放到方法中,以便于我们重复使用。

2、初始化地图(也就是地图中所需要的资源)

初始化地图的操作十分的常见,每次在读档的时候,会进行资源加载提示表示正在初始化地图 ; 比如CF、英雄联盟等这些都是为了加载游戏中所需要的资源(其他玩家的信息、你的游戏进度等等)。

因为我们最终要精确到每一个关卡上面,所以不能使用字符串进行储存,使用数组比较方便。

为什么??

因为通过下标我们可以精确的访问到地图中的每一个关卡,在这个游戏中初始化地图的过程就是将int类型或者是string类型的数组,int类型会简单很多。

在这个游戏中初始化地图的过程中就是将int类型的数组中的数字变成控制台中显示特殊的字符串的过程。

3、打印地图

在玩地图之前要先将整张地图画出来,但在玩地图的时候,有一个非常关键的额操作,就是要先初始化地图。

4、玩游戏

投骰子(随机数1~6) 打印玩家在地图上中的显示,遇到特殊的位置特殊处理,判定玩家的输赢。

    namespce 飞行棋
    {
        internal class program
        {
        //因为游戏地图的格数共100格
        //所以定义int类型的变量
        public static int[] Map=new int[100];
        
        //声明一个静态数组用来储存两个玩家的名字
        public static string[] playerName = new string[2];
        
        //声明一个静态数组用来储存两个玩家的名字
        public static int[] playerPos = new int[2];
        
        //声明一个用于标记两个玩家状态的静态数组 fasle表示正常 true表示休息(被暂停)
         public static bool[] flags = new bool[2];
         
          //主方法
        static void Main(string[] args)
        {
            GameShow();
             Console.WriteLine("请输入玩家A的名字:");
         playerNames[0] = Console.ReadLine();
         while (playerNames[0] == "")
         {
             Console.WriteLine("玩家A的名字不能为空,请重新输入!!!");
             playerNames[0] = Console.ReadLine();
         }
         Console.WriteLine("请输入玩家B的名字:");
         playerNames[1] = Console.ReadLine();
         while (playerNames[1] == "" || playerNames[1] == playerNames[0])
         {
             if (playerNames[1] == "")
             {
                 Console.WriteLine("玩家B的名字不能为空,请重新输入!!!");
                 playerNames[1] = Console.ReadLine();
             }
             else
             {
                 Console.WriteLine("玩家B的名字不能与玩家A的名字相同,请重新输入!!!");
                 playerNames[1] = Console.ReadLine();
             }
         }
     #endregion
     // 玩家输入名字完成以后,要先清空控制台中的内容
     Console.Clear();  // 清屏
    
    
     GameShow();   // 重新绘制游戏头
     // 打印出玩家信息
     Console.WriteLine("{0}的飞机使用A进行表示\n{1}的飞机使用B进行表示", playerNames[0], playerNames[1]);
    
     // 初始化地图     这一步操作一定要在绘制地图之前进行
     InitailMap();
    
     //  绘制地图
     DrawMap();
    
    
     // 进行游戏规则判定   只要当其中有一个玩家到达终点,游戏就结束    都没到,持续玩游戏
     while (playerPos[0]<99&& playerPos[1]<99)
     {
         //  判断玩家的状态    false状态正常  正常玩游戏
         if (flags[0]==false)
         {
             PlayGame(0);
         }
         else
         {
             // 不正常不操作   但是需要将其状态修改为正常
             flags[0] = false;
         }
    
         // 当到达终点,提示玩家胜利
         if (playerPos[0]>=99)
         {
             Console.WriteLine("玩家{0}无耻的战胜了玩家{1}", playerNames[0], playerNames[1]);
             break;
         }
    
    
         //  判断玩家的状态    false状态正常  正常玩游戏
         if (flags[1] == false)
         {
             PlayGame(1);
         }
         else
         {
             // 不正常不操作   但是需要将其状态修改为正常
             flags[1] = false;
         }
    
         // 当到达终点,提示玩家胜利
         if (playerPos[1] >= 99)
         {
             Console.WriteLine("玩家{0}无耻的战胜了玩家{1}", playerNames[1], playerNames[0]);
             break;
         }

     }

     // 打印胜利图案
     Win();

     Console.ReadKey(true);
        }
        
        
        //在主方法外面另外定义方法
        //1、打印初始化游戏的界面
        public static void GameShow()
        {
            //在控制台中给输出的文本添加颜色
            //利用Console类的属性来进行设置文本的颜色   ForegroundColor   前景颜色   会改变控制台中的文本颜色
            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.WriteLine("***************************")
            Console.ForegroundColor = ConsoleColor.Green;
             Console.WriteLine("***************************")
              Console.ForegroundColor = ConsoleColor.Blue;
             Console.WriteLine("***********************************");
             Console.ForegroundColor = ConsoleColor.Red;
             Console.WriteLine("*** --202304班基础飞行棋 V1.0-- ***");
             Console.ForegroundColor = ConsoleColor.Cyan;
             Console.WriteLine("***********************************");
             Console.ForegroundColor = ConsoleColor.DarkBlue;
             Console.WriteLine("***********************************");
             Console.ForegroundColor = ConsoleColor.DarkYellow;
             Console.WriteLine("***********************************");
            
            
        
        }
        
        
        
        //开始初始化地图
        public static void InitailMap()
        {
            //我使用0表示普通,显示给用户的就是□
            //....1...幸运轮盘,显示组用户就◎ 
            //....2...地雷,显示给用户就是 ☆
            //....3...暂停,显示给用户就是 ▲
            //....4...时空隧道,显示组用户就 卐
            
            //幸运轮盘
            int[] luckyturn ={6,23,40,55,78,96};
            //使用for循环循环打印
            for(int i = 0 ;i<luckyturn.Length;i++)
            {
                //把对应的位置替换成表示幸运轮盘的值
                Maps[luckytrun[i]]=1;
            }
            
            //地雷
            int[] landMine = {5,56,74,75,45,36,93};
            for(int i =0;i<lnadMine.Length;i++)
            {
                Maps[landMine[i]]=2;
            
            }
            
            //暂停
            int[] pause = {9,29,60,98};
            for(int i = 0 :i<pause.Length;i++)
            {
                Maps[pause[i]]=3;
            
            }
            
            //时空隧道
            int[] timeTunnel = {20,26,49,88,66};
            for(int i = 0;i<timeTunnel.Length;i++)
            {
                Maps[timeTunnel[i]]=4;
            
            }
            
            
        
        }
        
        
        
        //绘制地图(打印游戏地图)
        public static void DrawMap()
        {
            Console.WriteLine("图例:幸运轮盘:◎   地雷:☆   暂停:▲   时空隧道:卐")
        }
        
        //横着第一排 打印前三十个位置所在的特殊符号
        for(int i = 0;i<30;i++)
        {
            //调用将数组中的 值转换为特殊符号的方法
            Console.WriteLine(DrawStringMap(i));
        }
        //换行打印
        Console.WriteLine();
        
        //竖着第一列 打印31-35位置所在的特殊符号
        for(int i =30;i<35;i++)
        {
            //给特殊符号前面加空格 注意:如果位置对不齐的话多敲个空格
            for(int j=0;j<29;j++)
            {
                Console.Write(" ");
            }
            Console.Write(DrawStringMap(i));
            //换行
            Console.WriteLine();
        
        }
        
        //横着第二排 打印36-65位置所在的特殊符号 倒着打印
        for(int i = 64;i>= 35;i--)
        {
            Console.Write(DrawStringMap(i));
        
        }
        
        //竖着第二列
        for(int  i = 65;i<70;i++)
        {
            //注意每一行直接换行
            Console.WriteLine(DrawStringMap(i));
        }
        
        //横着第三行
        for(int i = 0; i<100;i++)
        {
            Console.Write(DrawStringMap(i))
        }
        //换行
        Console.WriteLine();
         public static string DrawStringMap(int i)
     {
         string str = "";
         #region   将数字转换为对应的特殊符号
         // 如果玩家A与玩家B坐标相同且都在地图中,绘制出尖括号
         if (playerPos[0] == playerPos[1] && playerPos[0] == i)
         {
             Console.ForegroundColor = ConsoleColor.Blue;
             str = "<>";
         }
         else if (playerPos[0] == i)
         {
             // 把对应位置的字符替换为A 表示玩家A所在的位置
             str = "A";
         }
         else if (playerPos[1] == i)
         {
             // 把对应位置的字符替换为B 表示玩家A所在的位置
             str = "B";
         }
         else
         {
             // 把除了玩家A和玩家B所在的位置以外的所有位置使用对应的字符绘制出来
             switch (Maps[i])
             {
                 // 将int类型数组Maps中存储的数据0对应的位置绘制为□,表示普通区域
                 case 0:
                     Console.ForegroundColor = ConsoleColor.DarkYellow;
                     str = "□";
                     break;
                 // 将int类型数组Maps中存储的数据1对应的位置绘制为◎,表示幸运轮盘
                 case 1:
                     Console.ForegroundColor = ConsoleColor.Red;
                     str = "◎";
                     break;
                 // 将int类型数组Maps中存储的数据2对应的位置绘制为☆,表示地雷
                 case 2:
                     Console.ForegroundColor = ConsoleColor.Yellow;
                     str = "☆";
                     break;
                 // 将int类型数组Maps中存储的数据3对应的位置绘制为▲,表示暂停
                 case 3:
                     Console.ForegroundColor = ConsoleColor.DarkBlue;
                     str = "▲";
                     break;
                 // 将int类型数组Maps中存储的数据4对应的位置绘制为卐,表示时空隧道
                 case 4:
                     Console.ForegroundColor = ConsoleColor.Green;
                     str = "卐";
                     break;
             }
         }
    
         // 返回对应位置应该绘制出的符号
         return str;
       
     }
              public static void PlayGame(int playerNumber)
     {
         // 创建一个随机数,用于随机骰子
         Random rd = new Random();
         int num = rd.Next(1, 7);  // 取到>=1   <7
         // 提示谁开始投骰子
         Console.WriteLine("{0}按下任意键开始抛骰子", playerNames[playerNumber]);
         Console.ReadKey(true);   //  确认用户已经按下了任意键   然后才会继续往下执行代码
         Console.WriteLine("{0}投的骰子数为{1}", playerNames[playerNumber], num);
         // 改变玩家在地图中的位置   要注意使用累加保存玩家的进度
         playerPos[playerNumber] += num;
         //改变玩家的坐标
         ChangePos();
         Console.ReadKey(true);
         Console.WriteLine("{0}按任意键开始行动", playerNames[playerNumber]);
         Console.ReadKey(true);
         Console.WriteLine("{0}行动完了", playerNames[playerNumber]);
         Console.ReadKey(true);
    
         // 判断玩家的行动  
         // 可能踩到另一个玩家   方块  地雷   幸运轮盘  暂停  时空隧道
         if (playerPos[playerNumber] == playerPos[1 - playerNumber])
         {
             Console.WriteLine("玩家{0}踩到了玩家{1},玩家{2}后退6格", playerNames[playerNumber], playerNames[1 - playerNumber], playerNames[1 - playerNumber]);
             //  被踩的玩家要改变坐标
             playerPos[1 - playerNumber] -= 6;
             //  只要改变坐标,就需要规则判定
             ChangePos();
             Console.ReadKey(true);
         }
         else
         {
             // 踩到关卡后的处理
    
             // 使用玩家的坐标去匹配对应的情况
             switch (Maps[playerPos[playerNumber]])   //  0   1   2   3  4
             {
                 // 普通方块
                 case 0:
                     Console.WriteLine("玩家{0}踩到了方块,无事发生", playerNames[playerNumber]);
                     Console.ReadKey(true);
                     break;
                 // 幸运轮盘
                 case 1:
                     Console.WriteLine("玩家{0}踩到了幸运轮盘,请选择 1--与对方交换位置  2--轰炸对方", playerNames[playerNumber]);
                     // 输选择的内容    只能输入指定的内容,否则需要重新输入
                     string choose = Console.ReadLine();
                     while (true)
                     {
                         // 判断输入的内容
                         if (choose == "1")
                         {
                             Console.WriteLine("玩家{0}选择与玩家{1}进行位置交换", playerNames[playerNumber], playerNames[1 - playerNumber]);
                             Console.ReadKey(true);
                             // 改变双方的位置  使用交换算法
                             int temp = playerPos[playerNumber];
                             playerPos[playerNumber] = playerPos[1 - playerNumber];
                             playerPos[1 - playerNumber] = temp;
                             // 提示交换完成
                             Console.WriteLine("交换完成!按任意键继续游戏!!!");
                             Console.ReadKey(true);
                             // 跳出循环
                             break;
                         }
                         else if (choose == "2")
                         {
                             Console.WriteLine("玩家{0}选择轰炸玩家{1},玩家{2}后退6格", playerNames[playerNumber], playerNames[1 - playerNumber], playerNames[1 - playerNumber]);
                             Console.ReadKey(true);
                             // 改变被轰炸的玩家的坐标
                             playerPos[1 - playerNumber] -= 6;
                             //  只要改变坐标,就需要规则判定
                             ChangePos();
                             // 提示轰炸的结果
                             Console.WriteLine("轰炸完成!玩家{0}后退了6格", playerNames[1 - playerNumber]);
                             Console.ReadKey(true);
                             // 跳出循环
                             break;
                         }
                         else
                         {
                             // 输入的不合法   提示重新输入,直到输入正确
                             Console.WriteLine("只能输入1或者2   1--与对方交换位置  2--轰炸对方");
                             choose = Console.ReadLine();
                         }
                     }
                     break;
                 // 地雷
                 case 2:
                     Console.WriteLine("玩家{0}踩到地雷,后退6格", playerNames[playerNumber]);
                     Console.ReadKey(true);
                     // 改变玩家的坐标
                     playerPos[playerNumber] -= 6;
                     //  只要改变坐标,就需要规则判定
                     ChangePos();
                     Console.ReadKey(true);
                     break;
                 // 暂停
                 case 3:
                     Console.WriteLine("玩家{0}踩到了暂停,休息一回合", playerNames[playerNumber]);
                     // 改变玩家的状态
                     flags[playerNumber] = true;
                     Console.ReadKey(true);
                     break;
                 // 时空隧道
                 case 4:
                     Console.WriteLine("玩家{0}踩到了时空隧道,前进10格", playerNames[playerNumber]);
                     // 改变玩家坐标
                     playerPos[playerNumber] += 10;
                     //  只要改变坐标,就需要规则判定
                     ChangePos();
                     Console.ReadKey(true);
                     break;
             }
         }
    
         //  每完成一步操作,需要判定改变坐标的规则  清空控制台中的所有内容  重新绘制资源
         // 改变玩家的坐标  判断规则
         ChangePos();
    
         // 清空控制台
         Console.Clear();
    
         // 重新绘制资源
         DrawMap();
     }

      public static void ChangePos()
      {
          // 判断是哪个玩家    玩家必须在地图中
          if (playerPos[0] < 0)
          {
              playerPos[0] = 0;
          }
          if (playerPos[0] >= 99)
          {
              playerPos[0] = 99;
          }

          if (playerPos[1] < 0)
          {
              playerPos[1] = 0;
          }
          if (playerPos[1] >= 99)
          {
              playerPos[1] = 99;
          }

      }
        
             public static void Win()
 {
     Console.ForegroundColor = ConsoleColor.Yellow;
     Console.WriteLine("                                          ◆                       ");
     Console.WriteLine("                    ■                  ◆               ■        ");
     Console.WriteLine("      ■■■■  ■  ■                ◆■         ■    ■        ");
     Console.WriteLine("      ■    ■  ■  ■              ◆  ■         ■    ■        ");
     Console.WriteLine("      ■    ■ ■■■■■■       ■■■■■■■   ■    ■        ");
     Console.WriteLine("      ■■■■ ■   ■                ●■●       ■    ■        ");
     Console.WriteLine("      ■    ■      ■               ● ■ ●      ■    ■        ");
     Console.WriteLine("      ■    ■ ■■■■■■         ●  ■  ●     ■    ■        ");
     Console.WriteLine("      ■■■■      ■             ●   ■   ■    ■    ■        ");
     Console.WriteLine("      ■    ■      ■            ■    ■         ■    ■        ");
     Console.WriteLine("      ■    ■      ■                  ■               ■        ");
     Console.WriteLine("     ■     ■      ■                  ■           ●  ■        ");
     Console.WriteLine("    ■    ■■ ■■■■■■             ■              ●         ");
     Console.ResetColor();
 }

          
        
    }
        }