飞行棋控制台

声明:这是B站上面传智播客c#基础教程上面的一个小游戏,原视频地址:01_C#入门到精通】新手强烈推荐:C#开发课程,一整套课程

这是我第一次写这么长的文章,自我感觉有点不太好,如果有错误的内容,请在评论区中回复一下,谢谢

做游戏前的准备

需要你的耐心,好奇心
		static int[] Map = new int[100];//这个是地图
        static int[] PlayerPosi = new int[2];//存放玩家坐标的
        static bool[] flags = new bool[2];//
        static string[] PlayerNames = new string[2];//存放玩家姓名的数组
        //PlayerNames[0]表示玩家A的姓名,PlayerNames[1]表示玩家B的姓名    
        

函数图
函数图

游戏头

游戏头
关键问题:如何换颜色?我在学这个之前,看到的都是那种dos界面
关键语句:

Console.ForegroundColor = ConsoleColor.Red;//这个是将文字的前景色设置为红色的
Console.BackgroundColor = ConsoleColor.Gray;//设置背景色为灰色

玩家输入姓名

要求:玩家A输入的姓名不能为空,玩家B输入的姓名不能为空并且不能与玩家A的姓名相同

private string[] PlayNames=new string[2];
//PlayNames[0]是玩家A的名字
//PlayNames[1]是玩家B的名字
public static void InputName()
        {
            Console.WriteLine("请输入玩家A的姓名:");
            PlayerNames[0] = Console.ReadLine();
            while (PlayerNames[0] == "")
            {
                Console.WriteLine("输入错误,请重新输入");
                PlayerNames[0] = Console.ReadLine();
                if (PlayerNames[0] != "") break;
            }
            Console.WriteLine("请输入玩家B的姓名");
            PlayerNames[1] = Console.ReadLine();
            while (PlayerNames[1] == PlayerNames[0] || PlayerNames[1] == "")
            {
                if (PlayerNames[1] == PlayerNames[0])
                {
                    Console.WriteLine("玩家A的姓名不能与玩家B的姓名相同,请重新输入");
                    PlayerNames[1] = Console.ReadLine();
                    if (PlayerNames[1] != PlayerNames[0]) break;
                }
                else
                {
                    Console.WriteLine("姓名不能为空,请重新输入");
                    PlayerNames[1] = Console.ReadLine();
                    if (PlayerNames[1] != "") break;
                }
            }
            return;
        }

初始化地图

整个地图是存放在Maps数组里面的,人为规则一下

对应关系

       public static void Initialize()
        {
            int[] luckyturn = { 6, 23, 40, 55, 69, 83 };//幸运转盘
            int i = 0;
            for (i = 0; i < luckyturn.Length; i++) Map[luckyturn[i]] = 1;
            int[] landMine = { 5, 13, 17, 33, 38, 50, 64, 80, 94 };//地雷
            for (i = 0; i < landMine.Length; i++) Map[landMine[i]] = 2;
            int[] pause = { 9, 27, 60, 93 };//暂停
            for (i = 0; i < pause.Length; i++) Map[pause[i]] = 3;
            int[] timeTunnel = { 20, 25, 45, 63, 72, 88, 90 };//时空隧道
            for (i = 0; i < timeTunnel.Length; i++) Map[timeTunnel[i]] = 4;
            return;
        }

防止玩家被干出地图

当玩家A或玩家B的经过运算的坐标或者当前坐标是大于99或者小于0的,就把坐标校正一下

 public static void ChangePosi()
{
            if (PlayerPosi[0] < 0) PlayerPosi[0] = 0;
            if (PlayerPosi[0] > 99) PlayerPosi[0] = 99;
            if (PlayerPosi[1] < 0) PlayerPosi[1] = 0;
            if (PlayerPosi[1] > 99) PlayerPosi[1] = 99;
            return;
}

画地图

整个地图是一个int类型的数组,那么问题来了,如何将数字转换成字符呢?很简单,人为规定一下0代表什么字符,1代表什么字符,以此类推。
也就是在画地图之前首先要初始化地图,初始化地图就是将int类型数组进行赋值。
特殊关卡的坐标我们有,关卡也在地图上面,我们可以把关卡在地图上面的坐标作为特殊关卡的标记。例如

  int[] timeTunnel = { 20, 25, 45, 63, 72, 88, 90 };//时空隧道
        for (i = 0; i < timeTunnel.Length; i++) Map[timeTunnel[i]] = 4;`

进入画地图阶段
首先要判断玩家是否还在地图上面,如果还在地图上面就继续画,不在就执行其他的方法。如果两个玩家位置重合该画什么?如果玩家在关卡上面但是两个玩家位置没有重新该画什么
就是这个意思

		/// <summary>
        /// 判断玩家位置,并画地图
        /// </summary>
        /// <param name="i"></param>
public static void DrawMapString(int i)
        {
            if (PlayerPosi[0] == PlayerPosi[1] && PlayerPosi[0] == i)
            {
                Console.Write("<>");
            }
            else if (PlayerPosi[0] == i) Console.Write("A");
            else if (PlayerPosi[1] == i) Console.Write("B");
            switch (Map[i])
            {
                case 0:
                    Console.Write("□");
                    Console.ForegroundColor = ConsoleColor.Red;
                    break;
                case 1:
                    Console.Write("○");
                    Console.ForegroundColor = ConsoleColor.Yellow;
                    break;
                case 2:
                    Console.Write("☆");
                    Console.ForegroundColor = ConsoleColor.Gray;
                    break;
                case 3:
                    Console.Write("△");
                    Console.ForegroundColor = ConsoleColor.Green;
                    break;
                case 4:
                    Console.Write("卐");
                    Console.ForegroundColor = ConsoleColor.Magenta;
                    break;
            }
            return;
        }
 public static void DrawMap()
  {
        Console.Write("{0}用A来表示\n{1}用B来表示\t", PlayerNames[0], PlayerNames[1]);
            Console.WriteLine("图例:幸运轮盘:○\t地雷:☆\t暂停:△\t时空隧道:卐");
            int i;
            //第一横行
            for (i = 0; i < 30; i++)
            {
                DrawMapString(i);
            }
            Console.WriteLine();
            //第一竖行
            for (i = 30; i < 36; i++)
            {
                for (int j = 0; j < 29; j++)
                {
                    Console.Write("  ");
                }
                DrawMapString(i);
                Console.WriteLine();
            }
            //第二横行
            for (i = 64; i >= 35; i--)
            {
                DrawMapString(i);
            }
            Console.WriteLine();
            // 第二竖行
            for (i = 65; i < 70; i++)
            {
                DrawMapString(i);
                Console.WriteLine();
            }
            //第三横行
            for (i = 70; i < 100; i++) DrawMapString(i);
            Console.WriteLine();
            return;
        }
}

让玩家的坐标动起来

就是把当前屏幕的内容清空,重新打印一遍新的地图
清空屏幕,Console.Clear();

玩游戏

生成随机数

C#中生成随机数的语句

Random r=new Random();
int number=r.Next(0,9);//生成0到8的之间的整数;

掷骰子的时候,将玩家坐标加上随机数就行

当两个玩家踩到了对方,如何判断谁被踩?
也就是正在玩的人踩到了另外一个人,代码来表示就是这样的

if(PlayerPosi[RoleCode]==PlayerPosi[1-RoleCode])
            {
                Console.WriteLine("玩家{0}踩到了玩家{1},玩家{2}后退6格",PlayerNames[RoleCode],PlayerNames[1-RoleCode],PlayerNames[1-RoleCode]);
                PlayerPosi[1 - RoleCode] -= 5;
                ChangePosi();//防止玩家在玩游戏的时候被干出地图了,就是每个玩家的坐标不能小于0,也不能大于99
                Console.ReadKey(true);//等待用户按下一个键,并在屏幕上删除用户按下的键
            }

暂停怎么做?

可以声明一个有两个元素的bool类型的数组,当玩家踩到了暂停的时候就将对应的元素的值改为true,每次执行玩游戏方法的时候判断玩家对应的元素的值是否为false,如果是false就表明正常,如果是true,那就说明踩到了暂停,就将对应元素的值改为false,让踩到了暂停的玩家能进行下一次游戏

其他的都是类似的

交互玩起来

也就是这个顺序
玩家A玩 用1来代表玩家A,也就是在调用玩游戏的方法的时候把1传给玩游戏的方法
玩家B玩 用0来代表玩家B
玩家A玩 1
玩家B玩 0
也就是1-RoleCode

游戏胜利

就是输入文字,转换成点阵式就行了,附上网址
文字转点阵式
也可以复制下面的东西

public static void Victory()
        {
            Console.ForegroundColor = ConsoleColor.Green;
            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.WriteLine("■■ ■■               ■■     ■■");
            Console.ReadKey();
            return;
        }

最终代码

using System;

namespace 飞行棋第二次查
{
    class Program
    {
        static int[] Map = new int[100];
        static int[] PlayerPosi = new int[2];
        static bool[] flags = new bool[2];
        static string[] PlayerNames = new string[2];
        //PlayerNames[0]表示玩家A的姓名,PlayerNames[1]表示玩家B的姓名    
       
        static void Main(string[] args)
        {
            GameShow();
            InputName();
            Console.Clear();
            GameShow();
            Initialize();
            DrawMap();
            while (PlayerPosi[0] < 99 || PlayerPosi[1] < 99)
            {
                if (flags[0] == false)
                {
                    PlayGame(0);

                }
                else flags[0] = false;
                if (flags[1] == false) PlayGame(1);
                else flags[1] = false;
            }
            Victory();
            Console.ReadKey(true);
            Console.ReadKey(true);
        }
        /// <summary>
        /// 玩家输入姓名
        /// </summary>
        public static void InputName()
        {
            Console.WriteLine("请输入玩家A的姓名:");
            PlayerNames[0] = Console.ReadLine();
            while (PlayerNames[0] == "")
            {
                Console.WriteLine("输入错误,请重新输入");
                PlayerNames[0] = Console.ReadLine();
                if (PlayerNames[0] != "") break;
            }
            Console.WriteLine("请输入玩家B的姓名");
            PlayerNames[1] = Console.ReadLine();
            while (PlayerNames[1] == PlayerNames[0] || PlayerNames[1] == "")
            {
                if (PlayerNames[1] == PlayerNames[0])
                {
                    Console.WriteLine("玩家A的姓名不能与玩家B的姓名相同,请重新输入");
                    PlayerNames[1] = Console.ReadLine();
                    if (PlayerNames[1] != PlayerNames[0]) break;
                }
                else
                {
                    Console.WriteLine("姓名不能为空,请重新输入");
                    PlayerNames[1] = Console.ReadLine();
                    if (PlayerNames[1] != "") break;
                }
            }
            return;
        }
        /// <summary>
        /// 游戏头
        /// </summary>
        public static void GameShow()
        {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine("***********************");
            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.WriteLine("***********************");
            Console.ForegroundColor = ConsoleColor.DarkGray;
            Console.WriteLine("***********************");
            Console.ForegroundColor = ConsoleColor.Blue;
            Console.BackgroundColor = ConsoleColor.Gray;
            Console.WriteLine("*******飞行棋**********");
            Console.ForegroundColor = ConsoleColor.Cyan;
            Console.WriteLine("***********************");
            Console.ForegroundColor = ConsoleColor.Magenta;
            Console.WriteLine("***********************");
            Console.ForegroundColor = ConsoleColor.DarkGreen;
            Console.WriteLine("***********************");
            Console.ForegroundColor = ConsoleColor.DarkRed;
            return;
        }
        /// <summary>
        /// 初始化游戏地图
        /// </summary>
        public static void Initialize()
        {
            int[] luckyturn = { 6, 23, 40, 55, 69, 83 };//幸运转盘
            int i = 0;
            for (i = 0; i < luckyturn.Length; i++) Map[luckyturn[i]] = 1;
            int[] landMine = { 5, 13, 17, 33, 38, 50, 64, 80, 94 };//地雷
            for (i = 0; i < landMine.Length; i++) Map[landMine[i]] = 2;
            int[] pause = { 9, 27, 60, 93 };//暂停
            for (i = 0; i < pause.Length; i++) Map[pause[i]] = 3;
            int[] timeTunnel = { 20, 25, 45, 63, 72, 88, 90 };//时空隧道
            for (i = 0; i < timeTunnel.Length; i++) Map[timeTunnel[i]] = 4;
            return;
        }
        /// <summary>
        /// 判断玩家位置,并画地图
        /// </summary>
        /// <param name="i"></param>
        public static void DrawMapString(int i)
        {
            if (PlayerPosi[0] == PlayerPosi[1] && PlayerPosi[0] == i)
            {
                Console.Write("<>");
            }
            else if (PlayerPosi[0] == i) Console.Write("A");
            else if (PlayerPosi[1] == i) Console.Write("B");
            switch (Map[i])
            {
                case 0:
                    Console.Write("□");
                    Console.ForegroundColor = ConsoleColor.Red;
                    break;
                case 1:
                    Console.Write("○");
                    Console.ForegroundColor = ConsoleColor.Yellow;
                    break;
                case 2:
                    Console.Write("☆");
                    Console.ForegroundColor = ConsoleColor.Gray;
                    break;
                case 3:
                    Console.Write("△");
                    Console.ForegroundColor = ConsoleColor.Green;
                    break;
                case 4:
                    Console.Write("卐");
                    Console.ForegroundColor = ConsoleColor.Magenta;
                    break;
            }
            return;
        }
        /// <summary>
        /// 用来检测玩家是否还在地图中
        /// </summary>
        public static void ChangePosi()
        {
            if (PlayerPosi[0] < 0) PlayerPosi[0] = 0;
            if (PlayerPosi[0] > 99) PlayerPosi[0] = 99;
            if (PlayerPosi[1] < 0) PlayerPosi[1] = 0;
            if (PlayerPosi[1] > 99) PlayerPosi[1] = 99;
            return;
        }
        /// <summary>
        /// 画地图
        /// </summary>
        public static void DrawMap()
        {
            Console.Write("{0}用A来表示\n{1}用B来表示\t", PlayerNames[0], PlayerNames[1]);
            Console.WriteLine("图例:幸运轮盘:○\t地雷:☆\t暂停:△\t时空隧道:卐");
            int i;
            #region 第一横行
            for (i = 0; i < 30; i++)
            {
                DrawMapString(i);
            }
            #endregion
            Console.WriteLine();
            #region 第一竖行
            for (i = 30; i < 36; i++)
            {
                for (int j = 0; j < 29; j++)
                {
                    Console.Write("  ");
                }
                DrawMapString(i);
                Console.WriteLine();
            }
            #endregion
            #region 第二横行
            for (i = 64; i >= 35; i--)
            {
                DrawMapString(i);
            }
            #endregion
            Console.WriteLine();
            #region 第二竖行
            for (i = 65; i < 70; i++)
            {
                DrawMapString(i);
                Console.WriteLine();
            }
            #endregion
            #region 第三横行
            for (i = 70; i < 100; i++) DrawMapString(i);
            Console.WriteLine();
            #endregion
            return;
        }
        public static void PlayGame(int RoleCode)
        {
            Console.WriteLine("玩家{0}按任意键开始掷骰子", PlayerNames[RoleCode]);
            Console.ReadKey(true);
            Random r = new Random();
            int number = r.Next(1, 7);
            Console.WriteLine("玩家{0}掷出了{1}", PlayerNames[RoleCode], number);
            PlayerPosi[RoleCode] += number;
            Console.ReadKey(true);
            Console.WriteLine("玩家{0}按任意键1开始行动", PlayerNames[RoleCode]);
            Console.ReadKey(true);
            Console.WriteLine("玩家{0}行动完了", PlayerNames[RoleCode]);
            Console.ReadKey(true);
            if (PlayerPosi[RoleCode] == PlayerPosi[1 - RoleCode])
            {
                Console.WriteLine("玩家{0}踩到了玩家{1},玩家{2}后退6格", PlayerNames[RoleCode], PlayerNames[1 - RoleCode], PlayerNames[1 - RoleCode]);
                PlayerPosi[1 - RoleCode] -= 5;
                ChangePosi();
                Console.ReadKey(true);
            }
            else
            {
                ChangePosi();


                switch (Map[PlayerPosi[RoleCode]])
                {
                    case 0:
                        Console.WriteLine("玩家{0}踩到了方块,暂时安全", PlayerNames[RoleCode]);
                        Console.ReadKey(true);
                        break;
                    case 1:
                        Console.WriteLine("玩家{0}踩到了幸运轮盘,1交换位置,2轰炸对方,使对方回退6格,请输入:", PlayerNames[RoleCode]);
                        int n;
                        bool x = int.TryParse(Console.ReadLine(), out n);
                        while (x == false || (n != 1 && n != 2))
                        {
                            Console.WriteLine("输入错误,请重新输入");
                            x = int.TryParse(Console.ReadLine(), out n);
                            if (n == 1 || n == 2) break;
                        }
                        switch (n)
                        {
                            case 1:
                                Console.WriteLine("玩家{0}输入了1,正在与玩家{1}互换位置中", PlayerNames[RoleCode], PlayerNames[1 - RoleCode]);
                                Console.ReadKey(true);
                                int t = PlayerPosi[RoleCode];
                                PlayerPosi[RoleCode] = PlayerPosi[1 - RoleCode];
                                PlayerPosi[1 - RoleCode] = t;
                                Console.WriteLine("互换完毕");
                                Console.ReadKey(true);
                                break;
                            case 2:
                                Console.WriteLine("玩家{0}输入了2,玩家{1}后退6格", PlayerNames[RoleCode], PlayerNames[1 - RoleCode]);
                                Console.ReadKey();
                                PlayerPosi[RoleCode] -= 6;
                                break;
                        }
                        break;
                    case 2:
                        Console.WriteLine("玩家{0}踩到了地雷,后退6格", PlayerNames[RoleCode]);
                        Console.ReadKey(true);
                        PlayerPosi[RoleCode] -= 6;
                        break;
                    case 3:
                        Console.WriteLine("玩家{0}猜了暂停,暂停一回合");
                        flags[RoleCode] = true;
                        Console.ReadKey(true);
                        break;
                    case 4:
                        Console.WriteLine("玩家{0}进入时空隧道,前进10格", PlayerNames[RoleCode]);
                        PlayerPosi[RoleCode] += 10;
                        Console.ReadKey();
                        break;
                }

            }
            ChangePosi();
            Console.Clear();
            Initialize();
            DrawMap();
            return;
        }
        public static void Victory()
        {
            Console.ForegroundColor = ConsoleColor.Green;
            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.WriteLine("■■ ■■               ■■     ■■");
            Console.ReadKey();
            return;
        }
    }
}

最后

小白一个,若有错误,请大佬指出,看到就会更改哈,希望我们可以在这条路上走得更远

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值