C#基础——(飞行棋下)

上一篇博客已经说到了信息录入后,初始地图的显示。下面就是开始游戏后的了。

1、掷筛子过程流程图

2、通过上面的流程图,可以写出2个方法

(1)方法6:判断是否在地图上,如果不在更改下标,使其玩家在地图上

public static void CheckPos()//判断玩家的坐标范围,超过99让其等于99,小于0,让其等于0
{
    if (PlayeraPos[0]>99)
    {
        PlayeraPos[0] = 99;
    }
    if (PlayeraPos[1] > 99)
    {
        PlayeraPos[1] = 99;
    }
    if (PlayeraPos[0] < 0)
    {
        PlayeraPos[0] = 0;
    }
    if (PlayeraPos[1] < 0)
    {
        PlayeraPos[1] = 0;
    }
}

(2)方法7:提示玩家胜利,显示方法

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

(3)、设置一个含有2个元素的bool类型的变量来判断是2个玩家是否需要暂停一次掷筛子

public static bool[] flag = new bool[] { false, false };//声明一个变量来判断中间是否需要暂停一次掷筛子

3、通过上一个流程图可以看出,玩家掷筛子结束,要行动,那么行动到指定的位置,有可能碰上6种点,其流程图为

从上面的流程图可以看出2个方法

(1)方法8:当玩家移动到幸运轮盘时,输入的数字是否符合要求

public static int ReadInt (string msg,int min,int max)
{
    while(true)
    {
        try
        {
            Console.WriteLine(msg);
            int number = Convert.ToInt32(Console.ReadLine());
            if(number>=min && number<=max)
            {
                return number;
            }
            else
            {
                Console.WriteLine("你的输入不合法!只能输入{0}到{1}之间的数字!", min, max);
                continue;
            }
        }
        catch
        {
            Console.WriteLine("输入有误,请重新输入!");
        }
    }
}

(2)方法9:掷筛子的方法为:

public static void RowTouZ(int playerPos)//掷筛子的方法
{
    //定义掷筛子的随机数
    Random r = new Random();
    int num = r.Next(1,7);

    string msg = "";//显示掷筛子之后行动提示
    Console.WriteLine("{0}按任意键掷筛子", PlayerNames[playerPos]);
    Console.ReadKey(true);//为true时,不显示输入的内容
    Console.WriteLine("{0}掷出了{1}", PlayerNames[playerPos], num);
    Console.WriteLine("{0}按任意键开始行动......", PlayerNames[playerPos]);
    Console.ReadKey(true);//按任意键,下一步
    PlayeraPos[playerPos] += num;
    CheckPos();//调用判断坐标范围方法
    if (PlayeraPos[playerPos] == PlayeraPos[1 - playerPos])
    {
        msg=string.Format("玩家{0}踩到玩家{1},玩家{2}退6格", PlayeraPos[playerPos], PlayeraPos[1 - playerPos], PlayeraPos[1 - playerPos]);
        PlayeraPos[1 - playerPos] -= 6;
        CheckPos();//调用判断坐标范围方法

    }
    else
    {
        switch (Map[PlayeraPos[playerPos]])
        {
            case 0:msg="行动完了"; break;
            case 1:
                msg = string.Format("{0}走到幸运轮盘,请选择 1--交换位置,2--轰炸对方", PlayerNames[playerPos]);
                int number = ReadInt(msg, 1, 2);
                if (number == 1)
                {
                    int temp = 0;
                    temp = PlayeraPos[playerPos];
                    PlayeraPos[playerPos] = PlayeraPos[1 - playerPos];
                    PlayeraPos[1 - playerPos] = temp;
                    msg=string.Format("玩家{0}选择了与玩家{1}交换位置", PlayerNames[playerPos], PlayerNames[1 - playerPos]);
                }
                else
                {
                    PlayeraPos[1 - playerPos] = 0;
                    msg = string.Format("玩家{0}选择轰炸玩家{1}", PlayerNames[playerPos], PlayerNames[1 - playerPos]);
                }
                break;
            case 2:
                msg = "恭喜你,能踩到地雷,百年不遇,退6格";
                PlayeraPos[playerPos] -= 6;
                CheckPos();//调用判断坐标范围方法
                break;
            case 3:
                msg = "踩到暂停了";
                flag[playerPos] = true;
                break;
            case 4:
                msg = "恭喜你,元芳让我告诉你将会穿越10步";
                PlayeraPos[playerPos] += 10;
                CheckPos();//调用判断坐标范围方法
                break;
        }
    }
    Console.Clear();//清空屏幕
    DrawMap();//更新地图
    Console.WriteLine(msg);//显示内容
}

4、第二部分代码:整体游戏过程代码

while(PlayeraPos[0] <=99 && PlayeraPos[1]<=99)
{
    //玩家A掷筛子
    if (flag[0]==false)
    {
        RowTouZ(0);
    }
    else
    {
        flag[0] = false;
    }
    //判断玩家A是否到达终点
    if (PlayeraPos[0]==99)
    {
        Console.WriteLine("恭喜{0}胜利了!", PlayerNames[0]);
        break;
    }
    //玩家B掷筛子
    if (flag[1] == false)
    {
        RowTouZ(1);
    }
    else
    {
        flag[1] = false;
    }
    //判断玩家B是否到达终点
    if (PlayeraPos[1] == 99)
    {
        Console.WriteLine("恭喜{0}胜利了!", PlayerNames[1]);
        break;
    }
    Console.WriteLine("行动完毕...");
}
Win();
Console.ReadKey();

全部的整体部分的代码我就不再写了,逻辑只要屡清楚,那些不是问题

但其实整个飞行棋问题存在: 当踩到地雷,或者走到另外一个玩家的位置是,退回6步,那退回后的位置没有进过判断,如果继续踩到地雷应该再次退

猜你喜欢

转载自blog.csdn.net/make_1998/article/details/88814001