[C#]控制檯小遊戲:騎士飛行棋

 一個控制檯的小遊戲,看了傳智播客的視頻製作的,增加一些功能,最多支持4人同時玩。(作弊程序:擲骰子時使用(Ctrl+F12)可以輸入1至100步。)

自己第一個編寫的作品,花了很多時間調試,可能還有bug。

感覺就是編程確實不容易(對於我這樣的零基礎菜鳥,哈哈)。

附件是遊戲的可執行文件,雙擊運行就可以玩了。代碼也貼出來。

  1. using System; 
  2.  
  3. namespace FlightGame 
  4.     /// <summary> 
  5.     /// ************************************************ 
  6.     /// 
  7.     /// 飛行棋遊戲 v1.0 
  8.     ///  
  9.     /// 編寫:五子連星(http://stwzlx.blog.51cto.com) 
  10.     /// 
  11.     /// ************************************************ 
  12.     /// </summary> 
  13.     internal class Program 
  14.     { 
  15.         //數組的下標爲0的元素對應地圖上的第1格,下標爲1的元素對應第2格…下標爲n的元素對應第n+1格 
  16.  
  17.         /// <summary> 
  18.         /// Map數組用來存放地圖的格數 
  19.         /// </summary> 
  20.         private static int[] Map = new int[100]; 
  21.  
  22.         /// <summary> 
  23.         /// playerPos數組存放玩家的座標 
  24.         /// </summary> 
  25.         private static int[] playerPos; 
  26.  
  27.         /// <summary> 
  28.         /// playerIco數組用來存放玩家的標識字符(不能小於玩家人數) 
  29.         /// </summary> 
  30.         private static string[] playerIco = { "A""B""C""D" }; 
  31.  
  32.         /// <summary> 
  33.         /// playerNum變量用來存放玩家的人數 
  34.         /// </summary> 
  35.         private static int playerNum = 0; 
  36.  
  37.         private static void Main(string[] args) 
  38.         { 
  39.             Random r = new Random();    //產生一個隨機數 
  40.             int step = 0;   //用於存放臨時產生的隨機數 
  41.  
  42.             string msg = "";    //設置msg變量用來接收玩家擲骰子後的信息 
  43.  
  44.             bool win = false;   //設置win變量來存放是否有玩家獲勝 
  45.  
  46.             ShowUI(); 
  47.  
  48.             playerNum = PlayerNum();    //調用PlayerNum()方法獲得用戶輸入的人數 
  49.  
  50.             playerPos = new int[playerNum];     //根據玩家人數產生初始座標 
  51.  
  52.             string[] name = PlayerName(playerNum);  //調用PlayerName()方法得到每一個玩家的暱稱 
  53.  
  54.             bool[] isStop = new bool[playerNum];  //根據玩家人數產生一個數組,存放玩家是否處於暫停狀態 
  55.  
  56.             Console.Clear(); 
  57.  
  58.             ShowUI(); 
  59.  
  60.             //初始化地圖數據 
  61.             InitialMap(); 
  62.  
  63.             //繪製地圖 
  64.             DrawMap(); 
  65.  
  66.             Console.WriteLine("開始遊戲……"); 
  67.  
  68.             while (win == false)    //判斷是否有人勝出 
  69.             { 
  70.                 for (int i = 0; i < playerNum; i++)     //根據玩家人數循環遊戲 
  71.                 { 
  72.                     if (isStop[i] == true)      //當前玩家是否暫停一次 
  73.                     { 
  74.                         isStop[i] = false;      //恢復暫停標記爲未暫停 
  75.                         Console.WriteLine("{0}暫停一次!", name[i]); 
  76.                         Console.WriteLine("*****************************"); 
  77.                         continue;  //當前玩家暫停一次,繼續循環 
  78.                     } 
  79.                     else 
  80.                     { 
  81.                         Console.WriteLine("{0}按任意鍵開始擲骰子……", name[i]); 
  82.  
  83.                         //取得用戶按下的鍵 
  84.                         ConsoleKeyInfo rec = Console.ReadKey(true);    //Console.ReadKey(true)不顯示用戶按下的鍵 
  85.  
  86.                         //作弊鍵 
  87.                         if (rec.Key == ConsoleKey.F12 && rec.Modifiers==ConsoleModifiers.Control)  //按下 Ctrl + F12 鍵 
  88.                         { 
  89.                             step = Num(1, 100); 
  90.                         } 
  91.                         else 
  92.                         { 
  93.                             step = r.Next(1, 7);    //得到一個1到6之間的隨機數 
  94.                         } 
  95.  
  96.                         Console.WriteLine("{0}擲出了:{1}", name[i], step); 
  97.  
  98.                         Console.WriteLine("按任意鍵開始行動……"); 
  99.  
  100.                         Console.ReadKey(true); 
  101.  
  102.                         playerPos[i] += step;   //玩家向前走了擲出點數的格數 
  103.                         CheckPos(); //判斷玩家走動後的格數是否超界 
  104.  
  105.                         bool encounter = false;     //用來存儲是否有玩家被踩到 
  106.  
  107.                         //判斷當前玩家是否踩到某一位玩家 
  108.                         for (int j = 0; j < playerNum; j++) 
  109.                         { 
  110.                             if (i != j && playerPos[i] == playerPos[j]) 
  111.                             { 
  112.                                 playerPos[j] = 0;       //被踩到的玩家退回到起點 
  113.                                 encounter = true;       //標誌有玩家被踩到 
  114.                                 msg = string.Format("{0}踩到了{1},{1}退回起點!", name[i], name[j]); 
  115.                                 break
  116.                             } 
  117.                         } 
  118.  
  119.                         //沒人被踩到 
  120.                         if (encounter == false
  121.                         { 
  122.                             switch (Map[playerPos[i]])  //當前玩家位置 
  123.                             { 
  124.                                 case 1:     //幸運輪盤 
  125.                                     Console.Clear(); 
  126.                                     ShowUI(); 
  127.                                     DrawMap(); 
  128.  
  129.                                     //獲得前一個玩家的編號 
  130.                                     int ex; 
  131.                                     if (i == 0) 
  132.                                     { 
  133.                                         ex = playerNum - 1; 
  134.                                     } 
  135.                                     else 
  136.                                     { 
  137.                                         ex = i - 1; 
  138.                                     } 
  139.  
  140.                                     Console.WriteLine("請選擇運氣(1:和{0}交換位置;2:轟炸{0}):", name[ex]); 
  141.  
  142.                                     int userSelect = Num(1, 2);     //讓用戶選擇使用哪種運氣 
  143.  
  144.                                     if (userSelect == 1)    //和前一位玩家交換位置 
  145.                                     { 
  146.                                         int temp = playerPos[i]; 
  147.                                         playerPos[i] = playerPos[ex]; 
  148.                                         playerPos[ex] = temp; 
  149.  
  150.                                         msg = string.Format("{0}和{1}交換了位置", name[i], name[ex]); 
  151.                                     } 
  152.                                     else   //轟炸前一位玩家,使其退6格 
  153.                                     { 
  154.                                         playerPos[ex] = playerPos[ex] - 6; 
  155.                                         CheckPos(); 
  156.                                         msg = string.Format("{0}轟炸{1},{1}退六格", name[i], name[ex]); 
  157.                                     } 
  158.  
  159.                                     break
  160.  
  161.                                 case 2:     //地雷 
  162.                                     playerPos[i] = playerPos[i] - 6;    //當前玩家退後六格 
  163.                                     CheckPos(); 
  164.                                     msg = string.Format("{0}踩到了\"地雷\"退六格", name[i]); 
  165.                                     break
  166.  
  167.                                 case 3:     //暫停 
  168.                                     isStop[i] = true;   //設置當前玩家暫停標記 
  169.                                     break
  170.  
  171.                                 case 4:     //時空隧道 
  172.                                     playerPos[i] = playerPos[i] + 10;   //當前玩家前進10格 
  173.                                     CheckPos(); 
  174.                                     msg = string.Format("{0}走到了\"時空隧道\"前進十格", name[i]); 
  175.                                     break
  176.  
  177.                                 default
  178.                                     msg = ""
  179.                                     break
  180.                             } 
  181.                         } 
  182.                     } 
  183.  
  184.                     Console.Clear(); 
  185.                     ShowUI(); 
  186.                     DrawMap(); 
  187.  
  188.                     //顯示玩家遇到關卡等信息 
  189.                     if (msg != ""
  190.                     { 
  191.                         Console.WriteLine(msg); 
  192.                         Console.WriteLine("*****************************"); 
  193.                     } 
  194.  
  195.                     if (playerPos[i] == 99)   //如果當前玩家走到終點,則遊戲結束 
  196.                     { 
  197.                         Console.Clear(); 
  198.                         ShowUI(); 
  199.                         DrawMap(); 
  200.                         Console.WriteLine("{0}最先走到終點,獲得勝利!!!!", name[i]); 
  201.                         win = true
  202.                         Console.ReadKey(); 
  203.                         break
  204.                     } 
  205.                 } 
  206.             } 
  207.  
  208.             Console.ReadKey(); 
  209.         } 
  210.  
  211.         /// <summary> 
  212.         /// 遊戲名稱及規則等介紹 
  213.         /// </summary> 
  214.         private static void ShowUI() 
  215.         { 
  216.             Console.SetWindowSize(80, 50); 
  217.  
  218.             Console.WriteLine("*********************************************************************"); 
  219.             Console.WriteLine("*                     騎    士    飛    行    棋                    *"); 
  220.             Console.WriteLine("*         遊戲製作:五子連星(http://stwzlx.blog.51cto.com)        *"); 
  221.             Console.WriteLine("*                                                                   *"); 
  222.             Console.WriteLine("*最多4名玩家,輪流擲骰子,有一位先達到終點結束遊戲。                *"); 
  223.             Console.WriteLine("*被踩到的玩家退回起點                                               *"); 
  224.             Console.WriteLine("*走到“幸運輪盤”可以選擇和前一位玩家交換位置或者轟炸他(使其退6格)*"); 
  225.             Console.WriteLine("*走到“地雷”需要退後6格                                            *"); 
  226.             Console.WriteLine("*走到“暫停”需要暫停擲骰子一次                                     *"); 
  227.             Console.WriteLine("*走到“時空隧道”可以往前移動10格                                   *"); 
  228.             Console.WriteLine("*********************************************************************"); 
  229.         } 
  230.  
  231.         /// <summary> 
  232.         /// 得到用戶輸入的一個minValue和maxValue之間的整數 
  233.         /// </summary> 
  234.         /// <param name="minValue">最小值</param> 
  235.         /// <param name="maxValue">最大值</param> 
  236.         /// <returns></returns> 
  237.         private static int Num(int minValue, int maxValue) 
  238.         { 
  239.             while (true
  240.             { 
  241.                 try 
  242.                 { 
  243.                     int number = Convert.ToInt32(Console.ReadLine()); 
  244.                     if (number < minValue || number > maxValue) 
  245.                     { 
  246.                         Console.WriteLine("必須輸入一個{0}到{1}之間的整數!請重新輸入:", minValue, maxValue); 
  247.  
  248.                         continue
  249.                     } 
  250.  
  251.                     return number; 
  252.                 } 
  253.                 catch 
  254.                 { 
  255.                     Console.WriteLine("只能輸入一個整數!請重新輸入:"); 
  256.                     continue
  257.                 } 
  258.             } 
  259.         } 
  260.  
  261.         /// <summary> 
  262.         /// 獲得參加遊戲的人數。 
  263.         /// 最小人數爲1,playerMax控制最大人數。 
  264.         /// </summary> 
  265.         /// <returns>參加的人數</returns> 
  266.         private static int PlayerNum() 
  267.         { 
  268.             int playerMax = 4;  //最大參加人數 
  269.  
  270.             Console.WriteLine("請輸入參加的人數(1—{0}人):", playerMax); 
  271.  
  272.             return Num(1, playerMax);    //返回遊戲人數 
  273.         } 
  274.  
  275.         /// <summary> 
  276.         /// 讓用戶輸入每一個玩家的姓名,並返回所有玩家的姓名。 
  277.         /// </summary> 
  278.         /// <param name="number">玩家的人數</param> 
  279.         /// <returns>所有玩家的暱稱</returns> 
  280.         private static string[] PlayerName(int number) 
  281.         { 
  282.             //定義一個數組存放玩家姓名 
  283.             string[] name = new string[number]; 
  284.  
  285.             for (int i = 0; i < name.Length; i++) 
  286.             { 
  287.                 Console.WriteLine("請輸入第{0}位玩家的姓名:", i + 1); 
  288.                 name[i] = Console.ReadLine(); 
  289.                 while (name[i] == "")   //判斷玩家姓名是否爲空,爲空則重新輸入 
  290.                 { 
  291.                     Console.WriteLine("姓名不能爲空,請重新輸入第{0}位玩家姓名:", i + 1); 
  292.                     name[i] = Console.ReadLine(); 
  293.                 } 
  294.                 if (i > 0)  //判斷玩家人數,兩位以上需要覈對姓名是否相同 
  295.                 { 
  296.                     for (int j = 0; j < i; j++)     //當前輸入的玩家姓名與已經存在的所有玩家姓名進行對照,看是否相同 
  297.                     { 
  298.                         if (name[i] == name[j]) 
  299.                         { 
  300.                             Console.WriteLine("該姓名與第{0}位玩家相同,請重新輸入第{1}位玩家姓名:", j + 1, i + 1); 
  301.                             name[i] = Console.ReadLine(); 
  302.                         } 
  303.                     } 
  304.                 } 
  305.             } 
  306.             return (string[])name;      //返回玩家姓名 
  307.         } 
  308.  
  309.         /// <summary> 
  310.         /// 設置地圖關卡的位置 
  311.         /// </summary> 
  312.         private static void InitialMap() 
  313.         { 
  314.             //在下面的數組存儲我們遊戲地圖各個關卡 
  315.  
  316.             //在數組中用以下數字表示相關圖標 
  317.             //1:幸運輪盤—◎ 
  318.             //2:地雷—★ 
  319.             //3:暫停—▲ 
  320.             //4:時空隧道—※ 
  321.             //0:普通—□ 
  322.  
  323.             //定義相關關卡的位置 
  324.             int[] luckyTurn = { 6, 23, 40, 55, 69, 83 };      //幸運輪盤1 
  325.             int[] landMine = { 5, 13, 17, 33, 38, 50, 64, 80, 94 };      //地雷2 
  326.             int[] pause = { 9, 27, 60, 93 };        //暫停3 
  327.             int[] timeTunel = { 20, 25, 45, 63, 72, 88, 90 };      //時空隧道4 
  328.  
  329.             for (int i = 0; i < luckyTurn.Length; i++) 
  330.             { 
  331.                 Map[luckyTurn[i]] = 1;  //把地圖Map的第luckyTurn[i]格設置爲1(幸運輪盤) 
  332.             } 
  333.  
  334.             for (int i = 0; i < landMine.Length; i++) 
  335.             { 
  336.                 Map[landMine[i]] = 2;   //把地圖Map的第landMine[i]格設置爲2(地雷) 
  337.             } 
  338.  
  339.             for (int i = 0; i < pause.Length; i++)  //把地圖Map的第pause[i]格設置爲3(暫停) 
  340.             { 
  341.                 Map[pause[i]] = 3; 
  342.             } 
  343.  
  344.             for (int i = 0; i < timeTunel.Length; i++)  //把地圖Map的第timeTunel[i]格設置爲4(時空隧道) 
  345.             { 
  346.                 Map[timeTunel[i]] = 4; 
  347.             } 
  348.         } 
  349.  
  350.         /// <summary> 
  351.         /// 判斷當前格應該繪製的圖標 
  352.         /// </summary> 
  353.         /// <param name="pos">當前格位置</param> 
  354.         /// <returns>當前格圖標</returns> 
  355.         private static string MapIco(int pos) 
  356.         { 
  357.             string ico = "";     //存放要繪製的圖標字符 
  358.  
  359.             //判斷是否有兩個以上的玩家處於當前格上 
  360.             int j = 0; 
  361.             for (int i = 0; i < playerNum; i++) 
  362.             { 
  363.                 if (playerPos[i] == pos)     //判斷玩家是否在當前格上 
  364.                 { 
  365.                     j++; 
  366.                     if (j >= 2)     //有兩個以上玩家在同一個格上 
  367.                     { 
  368.                         Console.ForegroundColor = ConsoleColor.Yellow;  //設置圖標顏色 
  369.                         ico = ("<>"); 
  370.                         return ico; 
  371.                     } 
  372.                 } 
  373.             } 
  374.  
  375.             //判斷當前格上是否有某一位玩家存在 
  376.             for (int i = 0; i < playerNum; i++) 
  377.             { 
  378.                 if (playerPos[i] == pos)    //當前格有玩家playerPos[i]存在 
  379.                 { 
  380.                     Console.ForegroundColor = ConsoleColor.Yellow;  //設置圖標顏色 
  381.                     ico = playerIco[i];     //獲得該玩家的標識字符 
  382.                     return ico; 
  383.                 } 
  384.             } 
  385.  
  386.             switch (Map[pos])     //根據當前格的值來顯示相應的圖標 
  387.             { 
  388.                 case 1: 
  389.                     Console.ForegroundColor = ConsoleColor.Magenta; //設置圖標顏色 
  390.                     ico = ("◎");     //1:幸運輪盤—◎ 
  391.                     break
  392.  
  393.                 case 2: 
  394.                     Console.ForegroundColor = ConsoleColor.Red;    //設置圖標顏色 
  395.                     ico = ("★");     //2:地雷—★ 
  396.                     break
  397.  
  398.                 case 3: 
  399.                     Console.ForegroundColor = ConsoleColor.Cyan;    //設置圖標顏色 
  400.                     ico = ("▲");     //3:暫停—▲ 
  401.                     break
  402.  
  403.                 case 4: 
  404.                     Console.ForegroundColor = ConsoleColor.Green;   //設置圖標顏色 
  405.                     ico = ("※");     //4:時空隧道—※ 
  406.                     break
  407.  
  408.                 default
  409.                     Console.ForegroundColor = ConsoleColor.White;   //設置圖標顏色 
  410.                     ico = ("□");     //0:普通—□ 
  411.                     break
  412.             } 
  413.             return ico; 
  414.         } 
  415.  
  416.         /// <summary> 
  417.         /// 繪製地圖 
  418.         /// </summary> 
  419.         private static void DrawMap() 
  420.         { 
  421.             //圖例及玩家說明文字 
  422.             Console.WriteLine("圖例說明:幸運輪盤—◎   地雷—★   暫停—▲   時空隧道—※   普通—□"); 
  423.             Console.Write("玩家說明:多名玩家—<>  "); 
  424.             for (int i = 0; i < playerNum; i++) 
  425.             { 
  426.                 Console.Write("第{0}位玩家:{1}  ", i + 1, playerIco[i]); 
  427.             } 
  428.             Console.WriteLine();    //新起一行 
  429.  
  430.             //畫第一行 
  431.             for (int i = 0; i <= 29; i++) 
  432.             { 
  433.                 Console.Write(MapIco(i));       //繪製當前格的圖標 
  434.             } 
  435.  
  436.             Console.WriteLine();    //第一行結束,換行 
  437.  
  438.             //畫第右邊列(包含5行,每行前29格爲空字符) 
  439.             for (int i = 30; i <= 34; i++)      //循環繪製5行 
  440.             { 
  441.                 for (int j = 0; j < 29; j++)    //有圖標的字符串需要繪製在第30格,因此需要每行前29格繪製兩個空字符串 
  442.                 { 
  443.                     Console.Write("  "); 
  444.                 } 
  445.                 Console.WriteLine(MapIco(i)); ;      //繪製當前格的圖標,並換行 
  446.             } 
  447.  
  448.             //畫第二行 
  449.             for (int i = 64; i >= 35; i--) 
  450.             { 
  451.                 Console.Write(MapIco(i));     //繪製當前格的圖標 
  452.             } 
  453.  
  454.             Console.WriteLine();    //第二行結束,換行 
  455.  
  456.             //畫第左邊列 
  457.             for (int i = 65; i <= 69; i++) 
  458.             { 
  459.                 Console.WriteLine(MapIco(i));      //繪製當前格的圖標,並換行 
  460.             } 
  461.  
  462.             //畫第三行 
  463.             for (int i = 70; i <= 99; i++) 
  464.             { 
  465.                 Console.Write(MapIco(i));       //繪製當前格的圖標 
  466.             } 
  467.  
  468.             Console.WriteLine(); 
  469.  
  470.             Console.ResetColor();   //重置控制檯的前景色爲默認 
  471.         } 
  472.  
  473.         /// <summary> 
  474.         /// 對玩家的座標是否越界進行判斷 
  475.         /// </summary> 
  476.         private static void CheckPos() 
  477.         { 
  478.             for (int i = 0; i < playerNum; i++) 
  479.             { 
  480.                 if (playerPos[i] > 99)      //如果座標超過99格則設置爲到99格 
  481.                 { 
  482.                     playerPos[i] = 99; 
  483.                 } 
  484.                 else if (playerPos[i] <= 0) //如果座標超過0格則設置爲到0格 
  485.                 { 
  486.                     playerPos[i] = 0; 
  487.                 } 
  488.             } 
  489.         } 
  490.     } 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章