一個控制檯的小遊戲,看了傳智播客的視頻製做的,增長一些功能,最多支持4人同時玩。(做弊程序:擲骰子時使用(Ctrl+F12)能夠輸入1至100步。)編程
本身第一個編寫的做品,花了不少時間調試,可能還有bug。數組
感受就是編程確實不容易(對於我這樣的零基礎菜鳥,哈哈)。dom
附件是遊戲的可執行文件,雙擊運行就能夠玩了。代碼也貼出來。ide
- using System;
- namespace FlightGame
- {
- /// <summary>
- /// ************************************************
- ///
- /// 飛行棋遊戲 v1.0
- ///
- /// 編寫:五子連星(http://stwzlx.blog.51cto.com)
- ///
- /// ************************************************
- /// </summary>
- internal class Program
- {
- //數組的下標爲0的元素對應地圖上的第1格,下標爲1的元素對應第2格…下標爲n的元素對應第n+1格
- /// <summary>
- /// Map數組用來存放地圖的格數
- /// </summary>
- private static int[] Map = new int[100];
- /// <summary>
- /// playerPos數組存放玩家的座標
- /// </summary>
- private static int[] playerPos;
- /// <summary>
- /// playerIco數組用來存放玩家的標識字符(不能小於玩家人數)
- /// </summary>
- private static string[] playerIco = { "A", "B", "C", "D" };
- /// <summary>
- /// playerNum變量用來存放玩家的人數
- /// </summary>
- private static int playerNum = 0;
- private static void Main(string[] args)
- {
- Random r = new Random(); //產生一個隨機數
- int step = 0; //用於存放臨時產生的隨機數
- string msg = ""; //設置msg變量用來接收玩家擲骰子後的信息
- bool win = false; //設置win變量來存放是否有玩家獲勝
- ShowUI();
- playerNum = PlayerNum(); //調用PlayerNum()方法得到用戶輸入的人數
- playerPos = new int[playerNum]; //根據玩家人數產生初始座標
- string[] name = PlayerName(playerNum); //調用PlayerName()方法獲得每個玩家的暱稱
- bool[] isStop = new bool[playerNum]; //根據玩家人數產生一個數組,存放玩家是否處於暫停狀態
- Console.Clear();
- ShowUI();
- //初始化地圖數據
- InitialMap();
- //繪製地圖
- DrawMap();
- Console.WriteLine("開始遊戲……");
- while (win == false) //判斷是否有人勝出
- {
- for (int i = 0; i < playerNum; i++) //根據玩家人數循環遊戲
- {
- if (isStop[i] == true) //當前玩家是否暫停一次
- {
- isStop[i] = false; //恢復暫停標記爲未暫停
- Console.WriteLine("{0}暫停一次!", name[i]);
- Console.WriteLine("*****************************");
- continue; //當前玩家暫停一次,繼續循環
- }
- else
- {
- Console.WriteLine("{0}按任意鍵開始擲骰子……", name[i]);
- //取得用戶按下的鍵
- ConsoleKeyInfo rec = Console.ReadKey(true); //Console.ReadKey(true)不顯示用戶按下的鍵
- //做弊鍵
- if (rec.Key == ConsoleKey.F12 && rec.Modifiers==ConsoleModifiers.Control) //按下 Ctrl + F12 鍵
- {
- step = Num(1, 100);
- }
- else
- {
- step = r.Next(1, 7); //獲得一個1到6之間的隨機數
- }
- Console.WriteLine("{0}擲出了:{1}", name[i], step);
- Console.WriteLine("按任意鍵開始行動……");
- Console.ReadKey(true);
- playerPos[i] += step; //玩家向前走了擲出點數的格數
- CheckPos(); //判斷玩家走動後的格數是否超界
- bool encounter = false; //用來存儲是否有玩家被踩到
- //判斷當前玩家是否踩到某一位玩家
- for (int j = 0; j < playerNum; j++)
- {
- if (i != j && playerPos[i] == playerPos[j])
- {
- playerPos[j] = 0; //被踩到的玩家退回到起點
- encounter = true; //標誌有玩家被踩到
- msg = string.Format("{0}踩到了{1},{1}退回起點!", name[i], name[j]);
- break;
- }
- }
- //沒人被踩到
- if (encounter == false)
- {
- switch (Map[playerPos[i]]) //當前玩家位置
- {
- case 1: //幸運×××
- Console.Clear();
- ShowUI();
- DrawMap();
- //得到前一個玩家的編號
- int ex;
- if (i == 0)
- {
- ex = playerNum - 1;
- }
- else
- {
- ex = i - 1;
- }
- Console.WriteLine("請選擇運氣(1:和{0}交換位置;2:轟炸{0}):", name[ex]);
- int userSelect = Num(1, 2); //讓用戶選擇使用哪一種運氣
- if (userSelect == 1) //和前一位玩家交換位置
- {
- int temp = playerPos[i];
- playerPos[i] = playerPos[ex];
- playerPos[ex] = temp;
- msg = string.Format("{0}和{1}交換了位置", name[i], name[ex]);
- }
- else //轟炸前一位玩家,使其退6格
- {
- playerPos[ex] = playerPos[ex] - 6;
- CheckPos();
- msg = string.Format("{0}轟炸{1},{1}退六格", name[i], name[ex]);
- }
- break;
- case 2: //地雷
- playerPos[i] = playerPos[i] - 6; //當前玩家退後六格
- CheckPos();
- msg = string.Format("{0}踩到了\"地雷\"退六格", name[i]);
- break;
- case 3: //暫停
- isStop[i] = true; //設置當前玩家暫停標記
- break;
- case 4: //時空隧道
- playerPos[i] = playerPos[i] + 10; //當前玩家前進10格
- CheckPos();
- msg = string.Format("{0}走到了\"時空隧道\"前進十格", name[i]);
- break;
- default:
- msg = "";
- break;
- }
- }
- }
- Console.Clear();
- ShowUI();
- DrawMap();
- //顯示玩家遇到關卡等信息
- if (msg != "")
- {
- Console.WriteLine(msg);
- Console.WriteLine("*****************************");
- }
- if (playerPos[i] == 99) //若是當前玩家走到終點,則遊戲結束
- {
- Console.Clear();
- ShowUI();
- DrawMap();
- Console.WriteLine("{0}最早走到終點,得到勝利!!!!", name[i]);
- win = true;
- Console.ReadKey();
- break;
- }
- }
- }
- Console.ReadKey();
- }
- /// <summary>
- /// 遊戲名稱及規則等介紹
- /// </summary>
- private static void ShowUI()
- {
- Console.SetWindowSize(80, 50);
- Console.WriteLine("*********************************************************************");
- Console.WriteLine("* 騎 士 飛 行 棋 *");
- Console.WriteLine("* 遊戲製做:五子連星(http://stwzlx.blog.51cto.com) *");
- Console.WriteLine("* *");
- Console.WriteLine("*最多4名玩家,輪流擲骰子,有一位先達到終點結束遊戲。 *");
- Console.WriteLine("*被踩到的玩家退回起點 *");
- Console.WriteLine("*走到「幸運×××」能夠選擇和前一位玩家交換位置或者轟炸他(使其退6格)*");
- Console.WriteLine("*走到「地雷」須要退後6格 *");
- Console.WriteLine("*走到「暫停」須要暫停擲骰子一次 *");
- Console.WriteLine("*走到「時空隧道」能夠往前移動10格 *");
- Console.WriteLine("*********************************************************************");
- }
- /// <summary>
- /// 獲得用戶輸入的一個minValue和maxValue之間的整數
- /// </summary>
- /// <param name="minValue">最小值</param>
- /// <param name="maxValue">最大值</param>
- /// <returns></returns>
- private static int Num(int minValue, int maxValue)
- {
- while (true)
- {
- try
- {
- int number = Convert.ToInt32(Console.ReadLine());
- if (number < minValue || number > maxValue)
- {
- Console.WriteLine("必須輸入一個{0}到{1}之間的整數!請從新輸入:", minValue, maxValue);
- continue;
- }
- return number;
- }
- catch
- {
- Console.WriteLine("只能輸入一個整數!請從新輸入:");
- continue;
- }
- }
- }
- /// <summary>
- /// 得到參加遊戲的人數。
- /// 最小人數爲1,playerMax控制最大人數。
- /// </summary>
- /// <returns>參加的人數</returns>
- private static int PlayerNum()
- {
- int playerMax = 4; //最大參加人數
- Console.WriteLine("請輸入參加的人數(1—{0}人):", playerMax);
- return Num(1, playerMax); //返回遊戲人數
- }
- /// <summary>
- /// 讓用戶輸入每個玩家的姓名,並返回全部玩家的姓名。
- /// </summary>
- /// <param name="number">玩家的人數</param>
- /// <returns>全部玩家的暱稱</returns>
- private static string[] PlayerName(int number)
- {
- //定義一個數組存放玩家姓名
- string[] name = new string[number];
- for (int i = 0; i < name.Length; i++)
- {
- Console.WriteLine("請輸入第{0}位玩家的姓名:", i + 1);
- name[i] = Console.ReadLine();
- while (name[i] == "") //判斷玩家姓名是否爲空,爲空則從新輸入
- {
- Console.WriteLine("姓名不能爲空,請從新輸入第{0}位玩家姓名:", i + 1);
- name[i] = Console.ReadLine();
- }
- if (i > 0) //判斷玩家人數,兩位以上須要覈對姓名是否相同
- {
- for (int j = 0; j < i; j++) //當前輸入的玩家姓名與已經存在的全部玩家姓名進行對照,看是否相同
- {
- if (name[i] == name[j])
- {
- Console.WriteLine("該姓名與第{0}位玩家相同,請從新輸入第{1}位玩家姓名:", j + 1, i + 1);
- name[i] = Console.ReadLine();
- }
- }
- }
- }
- return (string[])name; //返回玩家姓名
- }
- /// <summary>
- /// 設置地圖關卡的位置
- /// </summary>
- private static void InitialMap()
- {
- //在下面的數組存儲咱們遊戲地圖各個關卡
- //在數組中用如下數字表示相關圖標
- //1:幸運×××—◎
- //2:地雷—★
- //3:暫停—▲
- //4:時空隧道—※
- //0:普通—□
- //定義相關關卡的位置
- int[] luckyTurn = { 6, 23, 40, 55, 69, 83 }; //幸運×××1
- int[] landMine = { 5, 13, 17, 33, 38, 50, 64, 80, 94 }; //地雷2
- int[] pause = { 9, 27, 60, 93 }; //暫停3
- int[] timeTunel = { 20, 25, 45, 63, 72, 88, 90 }; //時空隧道4
- for (int i = 0; i < luckyTurn.Length; i++)
- {
- Map[luckyTurn[i]] = 1; //把地圖Map的第luckyTurn[i]格設置爲1(幸運×××)
- }
- for (int i = 0; i < landMine.Length; i++)
- {
- Map[landMine[i]] = 2; //把地圖Map的第landMine[i]格設置爲2(地雷)
- }
- for (int i = 0; i < pause.Length; i++) //把地圖Map的第pause[i]格設置爲3(暫停)
- {
- Map[pause[i]] = 3;
- }
- for (int i = 0; i < timeTunel.Length; i++) //把地圖Map的第timeTunel[i]格設置爲4(時空隧道)
- {
- Map[timeTunel[i]] = 4;
- }
- }
- /// <summary>
- /// 判斷當前格應該繪製的圖標
- /// </summary>
- /// <param name="pos">當前格位置</param>
- /// <returns>當前格圖標</returns>
- private static string MapIco(int pos)
- {
- string ico = ""; //存放要繪製的圖標字符
- //判斷是否有兩個以上的玩家處於當前格上
- int j = 0;
- for (int i = 0; i < playerNum; i++)
- {
- if (playerPos[i] == pos) //判斷玩家是否在當前格上
- {
- j++;
- if (j >= 2) //有兩個以上玩家在同一個格上
- {
- Console.ForegroundColor = ConsoleColor.Yellow; //設置圖標顏色
- ico = ("<>");
- return ico;
- }
- }
- }
- //判斷當前格上是否有某一位玩家存在
- for (int i = 0; i < playerNum; i++)
- {
- if (playerPos[i] == pos) //當前格有玩家playerPos[i]存在
- {
- Console.ForegroundColor = ConsoleColor.Yellow; //設置圖標顏色
- ico = playerIco[i]; //得到該玩家的標識字符
- return ico;
- }
- }
- switch (Map[pos]) //根據當前格的值來顯示相應的圖標
- {
- case 1:
- Console.ForegroundColor = ConsoleColor.Magenta; //設置圖標顏色
- ico = ("◎"); //1:幸運×××—◎
- break;
- case 2:
- Console.ForegroundColor = ConsoleColor.Red; //設置圖標顏色
- ico = ("★"); //2:地雷—★
- break;
- case 3:
- Console.ForegroundColor = ConsoleColor.Cyan; //設置圖標顏色
- ico = ("▲"); //3:暫停—▲
- break;
- case 4:
- Console.ForegroundColor = ConsoleColor.Green; //設置圖標顏色
- ico = ("※"); //4:時空隧道—※
- break;
- default:
- Console.ForegroundColor = ConsoleColor.White; //設置圖標顏色
- ico = ("□"); //0:普通—□
- break;
- }
- return ico;
- }
- /// <summary>
- /// 繪製地圖
- /// </summary>
- private static void DrawMap()
- {
- //圖例及玩家說明文字
- Console.WriteLine("圖例說明:幸運×××—◎ 地雷—★ 暫停—▲ 時空隧道—※ 普通—□");
- Console.Write("玩家說明:多名玩家—<> ");
- for (int i = 0; i < playerNum; i++)
- {
- Console.Write("第{0}位玩家:{1} ", i + 1, playerIco[i]);
- }
- Console.WriteLine(); //新起一行
- //畫第一行
- for (int i = 0; i <= 29; i++)
- {
- Console.Write(MapIco(i)); //繪製當前格的圖標
- }
- Console.WriteLine(); //第一行結束,換行
- //畫第右邊列(包含5行,每行前29格爲空字符)
- for (int i = 30; i <= 34; i++) //循環繪製5行
- {
- for (int j = 0; j < 29; j++) //有圖標的字符串須要繪製在第30格,所以須要每行前29格繪製兩個空字符串
- {
- Console.Write(" ");
- }
- Console.WriteLine(MapIco(i)); ; //繪製當前格的圖標,並換行
- }
- //畫第二行
- for (int i = 64; i >= 35; i--)
- {
- Console.Write(MapIco(i)); //繪製當前格的圖標
- }
- Console.WriteLine(); //第二行結束,換行
- //畫第左邊列
- for (int i = 65; i <= 69; i++)
- {
- Console.WriteLine(MapIco(i)); //繪製當前格的圖標,並換行
- }
- //畫第三行
- for (int i = 70; i <= 99; i++)
- {
- Console.Write(MapIco(i)); //繪製當前格的圖標
- }
- Console.WriteLine();
- Console.ResetColor(); //重置控制檯的前景色爲默認
- }
- /// <summary>
- /// 對玩家的座標是否越界進行判斷
- /// </summary>
- private static void CheckPos()
- {
- for (int i = 0; i < playerNum; i++)
- {
- if (playerPos[i] > 99) //若是座標超過99格則設置爲到99格
- {
- playerPos[i] = 99;
- }
- else if (playerPos[i] <= 0) //若是座標超過0格則設置爲到0格
- {
- playerPos[i] = 0;
- }
- }
- }
- }
- }