目錄

1.首先了解C#飛行棋的基本功能 飛行棋是一款非常簡單的雙人游戲,有點類似大富翁的玩法,別問我為什么像大富翁,問就是類似的我只玩過大富翁,玩家A、B通過擲骰子來在地圖上行走,如果走到關(guān)卡位置需要執(zhí)行相應(yīng)操作,比如交換位置、或者前進十步等,當某個玩家走到終點后,游戲結(jié)束,先到達終點的玩家獲得勝利。 2.實現(xiàn)飛行棋需要哪些準備 根據(jù)上述對飛行棋基本功能的描述,我們可以擇出幾個關(guān)鍵詞:雙人、擲骰子、地圖、位置、關(guān)卡、操作。如何用最簡單的代碼來實現(xiàn)這些看起來非常復(fù)雜的功能呢,最最重要的就是方法的使用。我們可以把每一個功能定義成為一個方法,在主函數(shù)中來調(diào)用,可以大大減少代碼量。所以我們在飛行棋的設(shè)計中定義了如下幾個方法,每個方法的作用和參數(shù)如下表所示:

方法名

參數(shù)

返回值類型

作用

()

顯示游戲頭

()

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不在一起也不在這個坐標上就畫該顯示的地圖圖標,根據(jù)索引值判斷該畫哪個圖案
                {
                        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.讀取用戶輸入值的()方法 該方法用來讀取用戶在位于幸運輪盤關(guān)卡時選擇的值,具體代碼和注釋如下:

public static int ReadInt(string msg,int min,int max)//定義一個方法,讀取用戶輸入的值
        {
            while (true)
            {
                try//進入try catch語句
                {
                    Console.WriteLine(msg);//在屏幕上輸出調(diào)用該方法的語句要輸出的內(nèi)容
                    int number = Convert.ToInt32(Console.ReadLine());//讀取用戶輸入的內(nèi)容,并強制轉(zhuǎn)換為整型,定義一個整型變量number來接受轉(zhuǎn)換后的值
                    if (number >=min && number <=max)//如果number的值處于min和max之間,那么返回number
                    {
                        return number;
                    }
                    else//證明number的值沒有在min和max之間
                    {
                        Console.WriteLine("你的輸入不合法,只能輸入{0}到{1}之間的數(shù)字!", min, max);//輸出提示
                        continue;
                    }
                }
                catch//如果強制轉(zhuǎn)換發(fā)生異常,進入catch語句
                {
                    Console.WriteLine("輸入有誤,請重新輸入!");//提示輸入有誤,請重新輸入
                }
            }
        }

6.擲骰子的()方法 該方法主要用來生成一個隨機數(shù),玩家根據(jù)擲出的數(shù)字移動,并產(chǎn)生相應(yīng)移動位置上的操作。具體代碼和注釋如下:

public static void RowTouZi(int playerPos)//定義一個擲骰子的方法,有一個整型參數(shù)playPos,無返回值
        {
            Random r = new Random();//實例化r為一個隨機數(shù)對象
            int num = r.Next(1, 7);//返回上下界之間的隨機數(shù),并且隨機數(shù)可取下界值,但不能取上界值,同時定義一個整型變量num來接受隨機數(shù)
            string msg = "";//定義一個字符串變量msg,并賦初值為空格
            Console.WriteLine("{0}按任意鍵開始擲骰子", PlayerNames[playerPos]);//輸出某玩家的姓名按任意鍵開始擲骰子
            Console.ReadKey(true);//當玩家按下任意鍵后繼續(xù)
            Console.WriteLine("{0}擲出了{1}", PlayerNames[playerPos],num);//輸出提示玩家誰誰誰擲出了某個數(shù)字
            Console.WriteLine("{0}按任意鍵開始行動......", PlayerNames[playerPos ]);//輸出提示誰誰誰可以按任意鍵開始行動
            Console.ReadKey(true);//當玩家按下任意鍵后繼續(xù)
            PlayerPos[playerPos] += num;//上述玩家的新位置值等于原位置加上num的值,即擲出來的值
            CheckPos();//調(diào)用CheckPos()方法,確保玩家位置還在地圖上
            if (PlayerPos[playerPos]==PlayerPos[1-playerPos ])//判斷玩家移動后的位置是否與另一位玩家位置相同,若相同,則繼續(xù)
            {
                msg = string.Format("玩家{0}踩到了玩家{1},玩家{2}退6格", PlayerNames[playerPos], PlayerNames[1 - playerPos], PlayerNames[1 - playerPos]);//走到這里,證明兩個玩家位置相同,即符合踩一腳規(guī)則,將字符串"玩家某踩到了玩家某,玩家某退6格"這個字符串賦給msg
                PlayerPos[1 - playerPos] -= 6;//被踩玩家的位置值-6
                CheckPos();//調(diào)用CheckPos()方法,確保被踩玩家位置還在地圖上
            }
            else//玩家移動后位置與另一位玩家位置不同,游戲繼續(xù)
            {
                switch (Map[PlayerPos[playerPos]])//判斷玩家此時的位置是否處在關(guān)卡位置
                {
                    case 0: //索引值為0,代表玩家沒有位于關(guān)卡位置
                        msg = "行動完了"; //msg的值為行動完了,即在屏幕輸出行動完了
                        break;//跳出switch
                    case 1://索引值為1,代表玩家位于幸運輪盤位置
                        msg = string.Format("{0}走到了幸運輪盤,請選擇1——交換位置,2——轟炸對方", PlayerNames[playerPos]);//輸出提示
                        int number = ReadInt(msg, 1, 2);//調(diào)用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();//調(diào)用CheckPos()方法,確保被踩玩家位置還在地圖上
                        break;//跳出switch
                    case 3://索引值為3,代表玩家處于暫停位置
                        msg = "踩到暫停了";//輸出提示
                        flag[playerPos] = true;//該玩家暫停狀態(tài)的值變?yōu)閠rue,代表處于暫停狀態(tài)
                        break;//跳出switch
                    case 4://索引值為4,代表玩家處于時空隧道位置
                        msg="恭喜你,這個猥瑣家伙居然穿越了10步";//輸出提示
                        PlayerPos[playerPos] += 10;//當前玩家位置+10
                        CheckPos();// 調(diào)用CheckPos()方法,確保被踩玩家位置還在地圖上
                        break;//跳出switch
                }
            }
            Console.Clear();//清除屏幕
            DrawMap();//調(diào)用畫地圖方法
            Console.WriteLine(msg);//輸出提示
        }

7.初始化地圖的()方法 該方法主要用在界面加載顯示游戲頭后,在玩家輸入姓名之前初始化地圖,主要代碼和注釋如下:

public static void InitMap()//定義一個方法初始化地圖
        {
            int[] luckturn = { 6, 23, 40, 55, 69, 83 };//定義幸運輪盤數(shù)組并賦初值,代表地圖上幸運輪盤所處的位置
            int[] landMine = { 5, 13, 17, 33, 38, 50, 64, 80, 94 };//定義地雷數(shù)組并賦初值,代表地圖上地雷所處的位置
            int[] pause = { 9, 27, 60, 93 };//定義暫停數(shù)組并賦初值,代表地圖上暫停所處的位置
            int[] timeTunnel = { 20, 25, 45, 63, 72, 88, 90 };//定義時空隧道數(shù)組并賦初值,代表地圖上時空隧道所處的位置
            for (int i = 0; i < luckturn.Length; i++)
            {
                Map[luckturn[i]] = 1;//改變Map數(shù)組里對應(yīng)幸運輪盤位置的索引對應(yīng)的值為1
            }
            for (int i = 0; i < landMine.Length; i++)
            {
                Map[landMine [i]] = 2;//改變Map數(shù)組里對應(yīng)地雷位置的索引對應(yīng)的值為2
            }
            for (int i = 0; i < pause.Length; i++)
            {
                Map[pause [i]] = 3;//改變Map數(shù)組里對應(yīng)暫停位置的索引對應(yīng)的值為3
            }
            for (int i = 0; i < timeTunnel.Length; i++)
            {
                Map[timeTunnel[i]] = 4;//改變Map數(shù)組里對應(yīng)時空隧道位置的索引對應(yīng)的值為4
            }
        }

8.畫地圖上橫行的方法ight() 該方法主要用來畫地圖上的第一橫行和第三橫行,具體代碼和注釋如下:

public static void DrawStringMapLeftToRight(int left, int right)//定義一個畫橫行的方法,有兩個整型參數(shù),left和right
        {
            for (int i = left; i <= right; i++)//在left和right之間開始畫地圖
            {
                Console.Write(DrawStringMap(i));//調(diào)用畫地圖的方法,并在屏幕上輸出,且該畫地圖無需換行
            }
        }

9.畫地圖的()方法 該方法主要用于畫出地圖,主要代碼和注釋如下所示:

public static void DrawMap()//定義畫地圖的方法
        {
            Console.WriteLine("圖例:幸運輪盤:⊙ 地雷:☆ 暫停:▲ 時空隧道:卐 ");//輸出在屏幕上
            DrawStringMapLeftToRight(0, 29);//調(diào)用畫橫行的方法畫第一橫行,參數(shù)為0和29
            //畫地圖第一豎行
            for (int i = 30; i <= 34; i++)
            {
                for (int j = 0; j <= 28; j++)//在第二豎行前面空余部分畫空格
                {
                    Console.Write("  ");
                }
                Console.WriteLine(DrawStringMap(i));//調(diào)用畫地圖的方法,并在屏幕上輸出
            }
            //畫地圖第二橫行
            for (int i=64;i>=35;i--)
            {
                Console.Write(DrawStringMap(i));//調(diào)用畫地圖的方法,并在屏幕上輸出,且該畫地圖無需換行
            }
            Console.WriteLine();//換行繼續(xù)畫
            //畫第二豎行
            for (int i=65;i<=69;i++)
            {
                Console.WriteLine(DrawStringMap(i)); //調(diào)用畫地圖的方法,并在屏幕上輸出
            }
            DrawStringMapLeftToRight(70, 99);//調(diào)用畫橫行的方法畫第三橫行,參數(shù)為70和99
            Console.WriteLine();//輸出在屏幕上
        }

10.表示勝利的Win()方法 該方法主要用在某一玩家到達終點后,提示勝利界面,主要代碼和注釋如下所示:(粘貼過來位置變了,但是無傷大雅,這個可直接復(fù)制老師的源碼)

public static void Win()//定義一個勝利的方法,用來在玩家勝利時提示勝利界面
        {
            Console.ForegroundColor = ConsoleColor.Red;//將輸出內(nèi)容的顏色改為紅色
            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();
        }