1. 程式人生 > >終極飛行棋地圖實現和邏輯判斷

終極飛行棋地圖實現和邏輯判斷

            先看下面的這個圖片,是不是看著都暈呢?製作飛行棋看著特別的麻煩,剛開始都不知道如何下手,通過分析,知道了要一步步來。製作飛行棋有兩個難點,一個是畫圖,另一個是進行邏輯判斷,把這兩個問題搞明白了,其他的都不是問題。

畫地圖


那麼如何製作表頭呢?

先寫一個方法

        public static void showU()
        {
            Console.WriteLine("********************************************");
            Console.WriteLine("*                                                    *");
            Console.WriteLine("*    終極騎士飛行棋 10.18                         *");
            Console.WriteLine("*                                                    *");
            Console.WriteLine("*******************************************");
        }
<span style="font-family: Arial, Helvetica, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);">然後在主函式中呼叫這個方法</span>
 static void Main(string[] args)
        {
            //製作表頭
            showU();
            Console.ReadKey();
        }

這樣,一個飛行棋的表頭就做好了,我們來執行一下,效果是這樣的。


我們在畫圖之前,先進行初始化地圖,為畫圖做充分的準備,寫一個方法。

        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 <luckyturn .Length ; i++)
            {
                Map[ luckyturn[i]] = 1;
            }
            for (int i = 0; i < landMine .Length ; i++)
            {
                Map[ landMine [i]] = 2;
            }
            for (int i = 0; i < pause .Length ; i++)
            {
                Map[pause[i]] = 3;
            }
            for (int i = 0; i < timelunnel.Length ; i++)
            {
               Map[timelunnel [i]] =4;
            }
        }

然後在主函式中呼叫,就一句程式碼,就不寫了。

緊接著就是畫第一行了,程式碼如下:

            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

效果展示


       然後畫第一列,由於畫完第一行之後,其他的行和列都會用到第一行的邏輯,然後我們就可以把第一行的邏輯進行封裝,這裡就用到了一個邏輯封裝方法,程式碼如下。

 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
效果展示

第一行和第一列都畫好之後,剩下的其餘行和列就好說了,直接呼叫方法就行。

基本的圖形就完成了


為了讓圖形更家的美觀,可以改變顏色,這裡的程式碼就不往上添加了,感興趣的自己研究研究。

邏輯判斷

       地圖畫完了,接下來就是進行邏輯分析了,到底是怎麼在圖上執行的?

       玩家A和玩家B在地圖上行走的思路基本上差不多,我們把它封裝成一個方法,減少程式碼的冗餘

       <pre name="code" class="csharp">        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     
        }
</pre><span style="font-size:18px"> 封裝完了,要在主函式中進行呼叫,使這個方法得以實現</span><p></p><pre>
<span style="font-size:18px;">
</span>
<pre name="code" class="csharp">     #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,也是封裝成方法,進行呼叫。
<pre name="code" class="csharp">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;
            }
        }
</pre><span style="font-size:18px">到這裡基本上就可以玩了,剩下的就是美化了,如果你想要更好看的介面,可以自己進行修改。</span><pre>

感受

        剛開始做這個飛行棋,感覺好麻煩,好多程式碼,好多的迴圈語句,查錯語句,還有好多封裝好的方法,看的暈乎乎的,中間也想著看看就行了,就不敲程式碼了,現在跟著老師的思路,敲完程式碼,中間有各種的冗餘程式碼等等,都會想盡辦法的去避免,讓程式碼變的更加的簡潔,完美,直到現在整個飛行棋可以執行,真的非常開心,收穫也特別的多,要學習的還有很多很多,加油~~~