终极飞行棋地图实现和逻辑判断

            先看下面的这个图片,是不是看着都晕呢?制作飞行棋看着特别的麻烦,刚开始都不知道如何下手,通过分析,知道了要一步步来。制作飞行棋有两个难点,一个是画图,另一个是进行逻辑判断,把这两个问题搞明白了,其他的都不是问题。

画地图

终极飞行棋地图实现和逻辑判断_第1张图片


那么如何制作表头呢?

先写一个方法

        public static void showU()
        {
            Console.WriteLine("********************************************");
            Console.WriteLine("*                                                    *");
            Console.WriteLine("*    终极骑士飞行棋 10.18                         *");
            Console.WriteLine("*                                                    *");
            Console.WriteLine("*******************************************");
        }
然后在主函数中调用这个方法

 static void Main(string[] args)
        {
            //制作表头
            showU();
            Console.ReadKey();
        }

这样,一个飞行棋的表头就做好了,我们来运行一下,效果是这样的。


终极飞行棋地图实现和逻辑判断_第2张图片

我们在画图之前,先进行初始化地图,为画图做充分的准备,写一个方法。

        public static void InitMap()
        { 
         //初始化地图
        //用0表示普通,显示给用户就是□
        //用1.........幸运轮盘,显示给用户的就是◎
        //用2 .........地雷,显示给用户的就是☆
        //......3.........暂停,..........................................▲
        //......4..........时空隧道,...............................※
            int[] luckyturn = { 6, 23, 40, 55, 69, 83 };//幸运轮盘◎
            int[] landMine = { 5, 13, 17, 33, 47, 60, 80, 94 };//地雷☆
            int[] pause = { 9, 27, 66, 93 };//暂停▲
            int[] timelunnel = { 20, 25, 45, 72, 89, 92 };//时空隧道※
            for (int i = 0; i 

然后在主函数中调用,就一句代码,就不写了。

紧接着就是画第一行了,代码如下:

            if (PlayerPos[0] == PlayerPos[1] && PlayerPos[0] ==pos )
            {
                Console.Write("<>");
            }
            else if (PlayerPos[0] ==pos )//如果玩家A在地图上就画A
            {
                Console.Write("A");

            }
            else if (PlayerPos[1] ==pos)//如果玩家B在地图上就画B
            {
                Console.Write("B");
            }
            else
            {
                switch (Map[pos ])//如果玩家A和玩家B不在一起也不在这个坐标上哪就画该显示的地图图标
                {
                    case 0: Console.Write("□"); break;
                    case 1: Console.Write("◎"); break;
                    case 2: Console.Write("☆"); break;
                    case 3: Console.Write("▲"); break;
                    case 4: Console.Write("※"); break;

                }//end switch
            }//end else

效果展示

终极飞行棋地图实现和逻辑判断_第3张图片

       然后画第一列,由于画完第一行之后,其他的行和列都会用到第一行的逻辑,然后我们就可以把第一行的逻辑进行封装,这里就用到了一个逻辑封装方法,代码如下。

 public static void DrawStringMap(int pos)//将第一行的逻辑代码进行封装
        {
           这里填写上述实现地图第一行的代码
        }
下面就是再主函数中调用此方法
           Console.WriteLine();//换行,
            #region 画第一竖行
            for (int i = 30; i <=34; i++)
            {
                for (int j = 0; j <=28; j++)
                {
                    Console.Write("  ");//转换为隐形的字符
                }
                DrawStringMap(i);
               
                Console.WriteLine();//换行
            }  
            #endregion
效果展示

终极飞行棋地图实现和逻辑判断_第4张图片

第一行和第一列都画好之后,剩下的其余行和列就好说了,直接调用方法就行。

基本的图形就完成了


终极飞行棋地图实现和逻辑判断_第5张图片

为了让图形更家的美观,可以改变颜色,这里的代码就不往上添加了,感兴趣的自己研究研究。

逻辑判断

       地图画完了,接下来就是进行逻辑分析了,到底是怎么在图上运行的?

       玩家A和玩家B在地图上行走的思路基本上差不多,我们把它封装成一个方法,减少代码的冗余

       
        public static void RowTouZI(int  playerpos  )
        { 
          #region 掷骰子的代码,冗余的

            Random r = new Random();
            int num=r.Next (1,7);
		    string 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;//玩家A进4格
            CheckPos();
                if (PlayerPos[playerpos ]==PlayerPos[1-playerpos ])
                {
                    msg =string.Format ("玩家{0}踩到了玩家{1},玩家{2}退6格",playerNames [playerpos],playerNames [1-playerpos ],playerNames [1-playerpos ]);
                    PlayerPos[1-playerpos ] -= 6;//玩家B退6格
                    CheckPos();
                }
                else
                {
                    switch (Map [PlayerPos[playerpos]])
                    {
                        case 0: 
                            msg = "行动完了"; 
                            break;
                        case 1:
                            msg=string.Format ("{0}走到了幸运轮盘的身边,请选择1---交换位置,2---轰炸对方",playerNames [0]);
                            int number=ReadInt(msg,1,2);
                            if (number==1)
                            {
                                int temp = 0;
                                temp = PlayerPos[playerpos];
                                PlayerPos[playerpos] = PlayerPos[1-playerpos];
                                PlayerPos[1-playerpos] = temp;
                                msg=string.Format ("玩家{0}选择了与玩家{1}交换位置",playerNames [playerpos],playerNames [1-playerpos ]);
                            }
                            else
                            {
                                PlayerPos[1-playerpos] = 0;
                                msg=string.Format ("玩家{0}选择了轰炸玩家{1}",playerNames [playerpos],playerNames [1-playerpos]);

                            }
                            break;
                        case 2:
                            //踩到了地雷
                            msg="能踩到地雷,百年不遇,退6格";
                            PlayerPos[playerpos] -= 6;
                            CheckPos();
                            break;
                        case 3: 
                            msg="踩到暂停了";
                            flag[playerpos] = true;
                            break;
                        case 4:
                            msg="恭喜,获得穿越10步的机会";
                            PlayerPos[playerpos] += 10;
                            CheckPos();
                            break;
                    }
                }
                Console.Clear();//刷新
                DrawMap();//画地图
                Console.WriteLine(msg);
	#endregion     
        }
封装完了,要在主函数中进行调用,使这个方法得以实现


     #region 玩家A掷骰子
                if (flag [0]==false )
                {
                    RowTouZI (0);
                }
                else
                {
                    flag[0] = false;
                }
	#endregion

                if (PlayerPos [0]==99)
                {Console.WriteLine("恭喜玩家A胜利了");
                    break;
                }
        #region 玩家B掷骰子
                if (flag [1]==false )
                {
                    RowTouZI (1);
                }
                else
                {
                    flag[1] = false;
                }
	#endregion

                if (PlayerPos [1]==99)
                {
                    Console.WriteLine("恭喜玩家B胜利了 ");
                    break;
                }
                Console.WriteLine("行动完毕......");
            }
            Console.ReadKey();

代码进行优化,防止出现bug,也是封装成方法,进行调用。
 
  
public static void CheckPos()//判断坐标
        {
            //如果超出范围,放在最后一个位置上
            if (PlayerPos [0]> 99)
            {
                PlayerPos[0] = 99;
            }
            if (PlayerPos [1]> 99)
            {
                PlayerPos[1] = 99;
            }
            //如果小于最小的位置,放在开始的位置上
            if (PlayerPos [0]< 0)
            {
                PlayerPos[0] = 0;
            }
        }
到这里基本上就可以玩了,剩下的就是美化了,如果你想要更好看的界面,可以自己进行修改。

感受

        刚开始做这个飞行棋,感觉好麻烦,好多代码,好多的循环语句,查错语句,还有好多封装好的方法,看的晕乎乎的,中间也想着看看就行了,就不敲代码了,现在跟着老师的思路,敲完代码,中间有各种的冗余代码等等,都会想尽办法的去避免,让代码变的更加的简洁,完美,直到现在整个飞行棋可以运行,真的非常开心,收获也特别的多,要学习的还有很多很多,加油~~~



你可能感兴趣的:(C#和设计模式)