目录

1.首先了解C#飞行棋的基本功能 飞行棋是一款非常简单的双人游戏,有点类似大富翁的玩法,别问我为什么像大富翁,问就是类似的我只玩过大富翁,玩家A、B通过掷骰子来在地图上行走,如果走到关卡位置需要执行相应操作,比如交换位置、或者前进十步等,当某个玩家走到终点后,游戏结束,先到达终点的玩家获得胜利。 2.实现飞行棋需要哪些准备 根据上述对飞行棋基本功能的描述,我们可以择出几个关键词:双人、掷骰子、地图、位置、关卡、操作。如何用最简单的代码来实现这些看起来非常复杂的功能呢,最最重要的就是方法的使用。我们可以把每一个功能定义成为一个方法,在主函数中来调用,可以大大减少代码量。所以我们在飞行棋的设计中定义了如下几个方法,每个方法的作用和参数如下表所示:

方法名

参数

返回值类型

作用

()

显示游戏头

()

pos

画标识和玩家

()

msg,min,max

int

读取用户输入的值

()

掷骰子

()

初始化地图

ight()

left,

画地图横行

()

画地图

win()

提示用户胜利

3.显示游戏头的()方法 该方法主要用来在程序加载时显示出游戏头,主要用到了.()方法。具体代码和注释如下:

public static void ShowUI()//显示游戏头
        {
            Console.WriteLine("***********************************************");
            Console.WriteLine("*                                             *");
            Console.WriteLine("*            终极骑士飞行棋                   *");
            Console.WriteLine("*                                             *");
            Console.WriteLine("***********************************************");
        }

4.画标识和玩家的()方法 该方法主要用在画完地图后对地图上玩家和标识颜色进行补充,具体代码和注释如下:

public static string DrawStringMap(int pos)//定义一个画地图的方法
        {
            string temp = "";//定义一个字符串变量作为返回值
            if (PlayerPos[0] == PlayerPos[1] && PlayerPos[0] == pos)//如果玩家A和玩家B在一起并且在地图上就画<>
            {
                Console.ForegroundColor = ConsoleColor.Yellow;//图标颜色为黄色
                temp="<>";
            }
            else if (PlayerPos[0] == pos )//如果玩家A在地图上就画A
            {
                temp="A";
            }
            else if (PlayerPos[1] == pos )//如果玩家B在地图上就画B
            {
                temp="B";
            }
            else
            {
                switch (Map[pos])//如果玩家A和玩家B不在一起也不在这个坐标上就画该显示的地图图标,根据索引值判断该画哪个图案
                {
                        case 0:Console.ForegroundColor = ConsoleColor.Gray;//如果索引值为0,那么就画灰色的□
                        temp ="□"; 
                            break;//跳出switch case
                        case 1:Console.ForegroundColor = ConsoleColor.Red;//如果索引值为1,那么就画红色的⊙
                        temp ="⊙"; 
                        break;//跳出switch case
                    case 2:Console.ForegroundColor = ConsoleColor.Blue;//如果索引值为2,那么就画蓝色的☆
                        temp ="☆";
                            break;//跳出switch case
                    case 3:Console.ForegroundColor = ConsoleColor.Green;//如果索引值为3,那么就画绿色的▲
                        temp ="▲";
                            break;//跳出switch case
                        case 4:Console.ForegroundColor = ConsoleColor.Magenta;//如果索引值为4,那么就画紫红色的卐
                        temp ="卐";
                            break;//跳出switch case
                }// end switch
            }// end if
            return temp;//返回temp的值
        }

5.读取用户输入值的()方法 该方法用来读取用户在位于幸运轮盘关卡时选择的值,具体代码和注释如下:

public static int ReadInt(string msg,int min,int max)//定义一个方法,读取用户输入的值
        {
            while (true)
            {
                try//进入try catch语句
                {
                    Console.WriteLine(msg);//在屏幕上输出调用该方法的语句要输出的内容
                    int number = Convert.ToInt32(Console.ReadLine());//读取用户输入的内容,并强制转换为整型,定义一个整型变量number来接受转换后的值
                    if (number >=min && number <=max)//如果number的值处于min和max之间,那么返回number
                    {
                        return number;
                    }
                    else//证明number的值没有在min和max之间
                    {
                        Console.WriteLine("你的输入不合法,只能输入{0}到{1}之间的数字!", min, max);//输出提示
                        continue;
                    }
                }
                catch//如果强制转换发生异常,进入catch语句
                {
                    Console.WriteLine("输入有误,请重新输入!");//提示输入有误,请重新输入
                }
            }
        }

6.掷骰子的()方法 该方法主要用来生成一个随机数,玩家根据掷出的数字移动,并产生相应移动位置上的操作。具体代码和注释如下:

public static void RowTouZi(int playerPos)//定义一个掷骰子的方法,有一个整型参数playPos,无返回值
        {
            Random r = new Random();//实例化r为一个随机数对象
            int num = r.Next(1, 7);//返回上下界之间的随机数,并且随机数可取下界值,但不能取上界值,同时定义一个整型变量num来接受随机数
            string msg = "";//定义一个字符串变量msg,并赋初值为空格
            Console.WriteLine("{0}按任意键开始掷骰子", PlayerNames[playerPos]);//输出某玩家的姓名按任意键开始掷骰子
            Console.ReadKey(true);//当玩家按下任意键后继续
            Console.WriteLine("{0}掷出了{1}", PlayerNames[playerPos],num);//输出提示玩家谁谁谁掷出了某个数字
            Console.WriteLine("{0}按任意键开始行动......", PlayerNames[playerPos ]);//输出提示谁谁谁可以按任意键开始行动
            Console.ReadKey(true);//当玩家按下任意键后继续
            PlayerPos[playerPos] += num;//上述玩家的新位置值等于原位置加上num的值,即掷出来的值
            CheckPos();//调用CheckPos()方法,确保玩家位置还在地图上
            if (PlayerPos[playerPos]==PlayerPos[1-playerPos ])//判断玩家移动后的位置是否与另一位玩家位置相同,若相同,则继续
            {
                msg = string.Format("玩家{0}踩到了玩家{1},玩家{2}退6格", PlayerNames[playerPos], PlayerNames[1 - playerPos], PlayerNames[1 - playerPos]);//走到这里,证明两个玩家位置相同,即符合踩一脚规则,将字符串"玩家某踩到了玩家某,玩家某退6格"这个字符串赋给msg
                PlayerPos[1 - playerPos] -= 6;//被踩玩家的位置值-6
                CheckPos();//调用CheckPos()方法,确保被踩玩家位置还在地图上
            }
            else//玩家移动后位置与另一位玩家位置不同,游戏继续
            {
                switch (Map[PlayerPos[playerPos]])//判断玩家此时的位置是否处在关卡位置
                {
                    case 0: //索引值为0,代表玩家没有位于关卡位置
                        msg = "行动完了"; //msg的值为行动完了,即在屏幕输出行动完了
                        break;//跳出switch
                    case 1://索引值为1,代表玩家位于幸运轮盘位置
                        msg = string.Format("{0}走到了幸运轮盘,请选择1——交换位置,2——轰炸对方", PlayerNames[playerPos]);//输出提示
                        int number = ReadInt(msg, 1, 2);//调用ReadInt方法,读取用户输入的值,并定义一个整型变量number来接受该方法的返回值
                        if (number == 1)//如果返回值为1
                        {
                            //下面四行代码的功能就是来交换两位玩家的位置,原理就是定义一个第三方变量
                            int temp = 0;//定义一个整型变量temp,并赋初值为0
                            temp = PlayerPos[playerPos];//将当前玩家的位置赋给temp
                            PlayerPos[playerPos] = PlayerPos[1 - playerPos];//将另一位玩家的位置赋给当前玩家
                            PlayerPos[1 - playerPos] = temp;//将temp的值赋给另一位玩家
                            msg = string.Format("玩家{0}选择了与玩家{1}交换位置", PlayerNames[playerPos], PlayerNames[1 - playerPos]);//输出提示
                        }
                        else//返回值不为1,即代表当前玩家选择了轰炸对方
                        {
                            PlayerPos[1 - playerPos] = 0;//另一位玩家的位置为0
                            msg = string.Format("玩家{0}选择轰炸玩家{1}", PlayerNames[playerPos], PlayerNames[1 - playerPos]);//输出提示
                        }
                        break;//跳出switch
                    case 2://索引值为2,代表玩家处于地雷位置
                        msg = "恭喜你,能踩到地雷,百年不遇,退6格";//输出提示
                        PlayerPos[playerPos] -= 6;//当前玩家位置-6
                        CheckPos();//调用CheckPos()方法,确保被踩玩家位置还在地图上
                        break;//跳出switch
                    case 3://索引值为3,代表玩家处于暂停位置
                        msg = "踩到暂停了";//输出提示
                        flag[playerPos] = true;//该玩家暂停状态的值变为true,代表处于暂停状态
                        break;//跳出switch
                    case 4://索引值为4,代表玩家处于时空隧道位置
                        msg="恭喜你,这个猥琐家伙居然穿越了10步";//输出提示
                        PlayerPos[playerPos] += 10;//当前玩家位置+10
                        CheckPos();// 调用CheckPos()方法,确保被踩玩家位置还在地图上
                        break;//跳出switch
                }
            }
            Console.Clear();//清除屏幕
            DrawMap();//调用画地图方法
            Console.WriteLine(msg);//输出提示
        }

7.初始化地图的()方法 该方法主要用在界面加载显示游戏头后,在玩家输入姓名之前初始化地图,主要代码和注释如下:

public static void InitMap()//定义一个方法初始化地图
        {
            int[] luckturn = { 6, 23, 40, 55, 69, 83 };//定义幸运轮盘数组并赋初值,代表地图上幸运轮盘所处的位置
            int[] landMine = { 5, 13, 17, 33, 38, 50, 64, 80, 94 };//定义地雷数组并赋初值,代表地图上地雷所处的位置
            int[] pause = { 9, 27, 60, 93 };//定义暂停数组并赋初值,代表地图上暂停所处的位置
            int[] timeTunnel = { 20, 25, 45, 63, 72, 88, 90 };//定义时空隧道数组并赋初值,代表地图上时空隧道所处的位置
            for (int i = 0; i < luckturn.Length; i++)
            {
                Map[luckturn[i]] = 1;//改变Map数组里对应幸运轮盘位置的索引对应的值为1
            }
            for (int i = 0; i < landMine.Length; i++)
            {
                Map[landMine [i]] = 2;//改变Map数组里对应地雷位置的索引对应的值为2
            }
            for (int i = 0; i < pause.Length; i++)
            {
                Map[pause [i]] = 3;//改变Map数组里对应暂停位置的索引对应的值为3
            }
            for (int i = 0; i < timeTunnel.Length; i++)
            {
                Map[timeTunnel[i]] = 4;//改变Map数组里对应时空隧道位置的索引对应的值为4
            }
        }

8.画地图上横行的方法ight() 该方法主要用来画地图上的第一横行和第三横行,具体代码和注释如下:

public static void DrawStringMapLeftToRight(int left, int right)//定义一个画横行的方法,有两个整型参数,left和right
        {
            for (int i = left; i <= right; i++)//在left和right之间开始画地图
            {
                Console.Write(DrawStringMap(i));//调用画地图的方法,并在屏幕上输出,且该画地图无需换行
            }
        }

9.画地图的()方法 该方法主要用于画出地图,主要代码和注释如下所示:

public static void DrawMap()//定义画地图的方法
        {
            Console.WriteLine("图例:幸运轮盘:⊙ 地雷:☆ 暂停:▲ 时空隧道:卐 ");//输出在屏幕上
            DrawStringMapLeftToRight(0, 29);//调用画横行的方法画第一横行,参数为0和29
            //画地图第一竖行
            for (int i = 30; i <= 34; i++)
            {
                for (int j = 0; j <= 28; j++)//在第二竖行前面空余部分画空格
                {
                    Console.Write("  ");
                }
                Console.WriteLine(DrawStringMap(i));//调用画地图的方法,并在屏幕上输出
            }
            //画地图第二横行
            for (int i=64;i>=35;i--)
            {
                Console.Write(DrawStringMap(i));//调用画地图的方法,并在屏幕上输出,且该画地图无需换行
            }
            Console.WriteLine();//换行继续画
            //画第二竖行
            for (int i=65;i<=69;i++)
            {
                Console.WriteLine(DrawStringMap(i)); //调用画地图的方法,并在屏幕上输出
            }
            DrawStringMapLeftToRight(70, 99);//调用画横行的方法画第三横行,参数为70和99
            Console.WriteLine();//输出在屏幕上
        }

10.表示胜利的Win()方法 该方法主要用在某一玩家到达终点后,提示胜利界面,主要代码和注释如下所示:(粘贴过来位置变了,但是无伤大雅,这个可直接复制老师的源码)

public static void Win()//定义一个胜利的方法,用来在玩家胜利时提示胜利界面
        {
            Console.ForegroundColor = ConsoleColor.Red;//将输出内容的颜色改为红色
            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();
        }