1. 程式人生 > >C# 騎士飛行棋

C# 騎士飛行棋

這是用C#做的第一個專案,用C#寫專案第一感覺就是這個開發工具功能好強大,比起VB來簡直就是一個天上一個地上。哈哈,不說了,直接看圖:

不管怎麼樣,看著還是挺好看的。其實這遊戲沒有多少程式碼,都是方法調方法。如圖:這就是這個遊戲的所有程式碼,C#讓你看著程式碼特別清晰簡潔。

 

下面說一下游戲製作流程:

首先遊戲上面有個遊戲頭,我們用一個ShowUI 方法來寫,方便以後呼叫

 public static void ShowUI()

        {
            Console.WriteLine("*************************************");
            Console.WriteLine("*                                   *");
            Console.WriteLine("*      終極騎士飛行棋 V1.0          *");
            Console.WriteLine("*                                   *");
            Console.WriteLine("*************************************");
        }     //遊戲頭

 

然後遊戲開始,我們輸入玩家A和玩家B,名字不能相等和為空

 Console.WriteLine("請輸入玩家A的姓名");
            PlayerNames[0] = Console.ReadLine();
            while (PlayerNames[0] == "")
            {
                Console.WriteLine("玩家A的姓名不能為空,請重新輸入");
                PlayerNames[0] = Console.ReadLine();
            }
            Console.WriteLine("請輸入玩家B的姓名");
            PlayerNames[1] = Console.ReadLine();

            while (PlayerNames[1] == PlayerNames[0] || PlayerNames[1] == "")
            {
                if (PlayerNames[1] == PlayerNames[0])
                {
                    Console.WriteLine("玩家B的姓名和玩家A的姓名[{0}]不能相同", PlayerNames[0]);
                }
                else
                {
                    Console.WriteLine("玩家B的名字為空,請重新輸入");
                }
                PlayerNames[1] = Console.ReadLine();

            }
            Console.Clear();
            ShowUI();
            Console.WriteLine("對戰開始.....");
            Console.WriteLine("{0}的士兵用A表示......", PlayerNames[0]);
            Console.WriteLine("{0}的士兵用B 表示......", PlayerNames[1]);

 

初始化地圖,地圖是由100個格子組成,上面有四種標誌,地雷、幸運轉盤、時空隧道、暫停四類,用四個陣列表示他們,只要玩家走到其中的每一個上,就做出相應的動作,定義InitMap()方法來寫。

public static void InitMap()

        {
            
            int[] luckyturn = { 6, 23, 40, 55, 69, 83 };
            int[] landMine = { 5, 13, 17, 33, 50, 64, 80, 94 };
            int[] pause = { 9, 27, 60, 93 };
            int[] timeTunnel = { 20, 25, 45, 63, 72, 88, 90 };
            for (int i = 0; i < luckyturn.Length; i++)
            {
                //int temp = luckyturn[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 < timeTunnel.Length; i++)
            {
                Map[timeTunnel[i]] = 4;
            }

        }    //初始化地圖

地圖初始化好,判斷玩家的位置,如果兩個人同時在一起,圖形為<> ,否則為A和B,如果玩家A和玩家B不在一起也不在這個座標上就畫該畫的地圖圖示。

        public static int[] PlayerPos = new int[] { 0, 0 };   //宣告一個數組用來存玩家A和玩家B
        public static string[] PlayerNames = new string[2];
        public static string DrawStringMap(int pos)
        {
            
        string temp = "";
            #region 畫第一行邏輯
            if (PlayerPos[0] == PlayerPos[1] && PlayerPos[0] == pos)
            {
                Console.ForegroundColor = ConsoleColor.Yellow;

                temp = "<>";
            }
            else if (PlayerPos[0] == pos)   //玩家A在地圖上就畫A
            {
                Console.ForegroundColor = ConsoleColor.Yellow;
                temp = "A";
            }
            else if (PlayerPos[1] == pos)   //玩家B在地圖上就畫B
            {
                Console.ForegroundColor = ConsoleColor.Yellow;
                temp = "B";
            }
            else
            {
                switch (Map[pos]) //如果玩家A和玩家B不在一起也不在這個座標上就畫該畫的地圖圖示
                {


                    case 0:
                        Console.ForegroundColor = ConsoleColor.White;
                        temp = "□";
                        break;
                    case 1:
                        Console.ForegroundColor = ConsoleColor.Red;
                        temp = "●";
                        break;
                    case 2:
                        Console.ForegroundColor = ConsoleColor.Blue;
                        temp = "★";
                        break;
                    case 3:
                        Console.ForegroundColor = ConsoleColor.Green;
                        temp = "▲";
                        break;
                    case 4:
                        Console.ForegroundColor = ConsoleColor.Magenta;
                        temp = "卍";
                        break;

                }//end switch
            }//end else
            return temp;

            #endregion
        }     //畫第一行邏輯

畫地圖,定義DrawMap()方法

    public static void DrawMap()
        {
            Console.WriteLine("圖例:幸運輪盤:● 地雷:★ 暫停:▲ 時空隧道:卍");

            #region 畫第一橫行

            DrawMapLeftToRight(0, 30);

            #endregion
            Console.WriteLine();
            #region 畫地圖第一豎行
            for (int i = 30; i <= 34; i++)
            {
                for (int j = 0; j <= 28; j++)
                {
                    Console.Write("  ");
                }

                Console.WriteLine(DrawStringMap(i));
            }
            #endregion
            #region 畫第二橫行
            for (int i = 64; i >= 35; i--)
            {
                Console.Write(DrawStringMap(i));
            }
            #endregion
            Console.WriteLine();
            #region 畫第二豎行
            for (int i = 65; i <= 69; i++)
            {

                Console.WriteLine(DrawStringMap(i));
            }
            #endregion
            #region 畫第三橫行
            DrawMapLeftToRight(70, 100);
            #endregion
            Console.WriteLine();
        }    //畫地圖

畫完地圖,我們就要擲骰子,我們都知道骰子都是1-6個數,我們產生一個隨機數在1-6之內。然後做出相應的動作。

        public static void RowTouZi(int playerPos)
        {
            Random r = new Random();
            int num = r.Next(1, 7);

            string msg = "";
            Console.WriteLine("{0}按任意鍵開始擲骰子", PlayerNames[playerPos]);
            ConsoleKeyInfo coninfo = Console.ReadKey(true);
            if (coninfo.Key == ConsoleKey.Q)
            {
                coninfo = Console.ReadKey(true);
                if (coninfo.Key == ConsoleKey.A)
                {
                    coninfo = Console.ReadKey(true);
                    if (coninfo.Key == ConsoleKey.Z)
                    {
                        num = 50;
                    }
                }
            }
            //Console.ReadKey(true);
            Console.WriteLine("{0}擲出了{1}", PlayerNames[playerPos], num);
            Console.WriteLine("{0}按任意鍵開始行動.....", PlayerNames[playerPos]);
            Console.ReadKey(true);
            PlayerPos[playerPos] += num;
            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;
                CheckPos();

            }
            else
            {
                switch (Map[PlayerPos[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 = 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);
        }  //擲骰子

在擲骰子的過程中,誰先走到最後,誰就勝利,不能超範圍,所以定義一個方法來判斷是否越界。

     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;
            }
            if (PlayerPos[1] < 0)
            {
                PlayerPos[1] = 0;
            }
        }  //判斷遊戲是否越界

當我們踩到幸運輪盤的時候,我們需要輸入1和2來讓使用者做出相應的動作:

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 (Exception)
                {
                    Console.WriteLine("輸入有誤,請重新輸入");
                    
                }
            }
        }

好了,飛行棋就這麼做完了,其實分開做,一步一步的,只要邏輯搞清了,就可以了,想要提前體驗一把的,可以來找我。哈哈。