- 最後登錄
- 2024-3-29
- 在線時間
- 0 小時
- 註冊時間
- 2016-8-22
- 閱讀權限
- 20
- 精華
- 0
- UID
- 16624936
- 帖子
- 61
- 積分
- 49 點
- 潛水值
- 26590 米
| 回覆中加入附件並不會使你增加積分,請使用主題方式發佈附件。 因上下限也可能是終極密碼,若未被猜過遊戲者是可以猜的,下面是修正的程式,
並將遊戲邏輯另建一個類別來處理,這個類別將扮演莊家的角色,另外遊戲也改為下一局從被淘汰的遊戲者的下一位遊戲者開始
首先建立玩家類別- public class Player
- {
- public string Name { get; set; }
- }
複製代碼 建立比對結果的列舉- public enum Result
- {
- Out, //淘汰(猜中數字)
- OutOfRange,//猜的數字超過上下限
- Normal //未猜中(數字在上下限之間)
- }
複製代碼 建立扮演莊家的類別- public class Game//相當莊家(BOOKIEnoun)角色
- {
- Random r = null;
- int max = 99, min = 0;//上下限
- int num = 0;
- //nums放猜過的數字以避免猜重複的數字
- /*
- * 因上下限也可能是終極密碼,
- * 若未被猜過遊戲者是可以猜的,
- * 所以利用nums存猜過的數字並於每一局開始時清空
- * **/
- List<int> nums = null;
- public Game(int min, int max)
- {
- this.max = max;
- this.min = min;
- r = new Random();
- GetNum(min,max);
- }
- public void GetNum(int min, int max)
- {
- nums = new List<int>();
- this.max = max;
- this.min = min;
- //亂數產生數字
- num = r.Next(min, max + 1);
- }
- public Result Guess(string playerName,int guessnum, out string msg)
- {
- if (guessnum < min || guessnum > max)//猜的數字超過上下限
- {
- msg = "別鬧了!" + string.Format("數字介於{0}~{1}之間", min, max); ;
- return Result.OutOfRange;
- }
- if (guessnum == num)
- {
- msg = playerName + "您輸了!!";
- return Result.Out;
- }
- if (nums.Contains(guessnum))
- {
- msg ="數字已有人猜過!!";
- return Result.OutOfRange;
- }
- if (guessnum < num)//猜的數字小於答案,下限等於猜的數字
- {
- min = guessnum;
- }
- if (guessnum > num)//猜的數字大於答案,上限等於猜的數字
- {
- max = guessnum;
- }
- nums.Add(guessnum);
- msg = string.Format("數字介於{0}~{1}之間", min, max);
- return Result.Normal;
- }
- }
複製代碼 主程式- namespace GuessNumber2
- {
- public partial class Form1 : Form
- {
- List<Player> players = null;//遊戲者清單
- int currentPlayer = 0;//目前遊戲者
- int max = 25, min = 0;//上下限
- public Form1()
- {
- InitializeComponent();
- groupBox1.Enabled = false;//groupBox1放猜數字的文字盒(TextBox)txtGuess及btnSend猜數字按鈕
- btnBegin.Enabled = true;//開始遊戲的按鈕
- }
- Game game = null;
- //開始新遊戲
- private void btnBegin_Click(object sender, EventArgs e)
- {
- //初始化遊戲者
- players = new List<Player>();
- for (int i = 0; i < 4; i++)
- {
- players.Add(new Player() { Name = "玩家" + (i + 1).ToString() });
- }
- lblplayer.Text = players[0].Name;//顯示第一個猜數字的遊戲者
- currentPlayer = 0;
- game = new Game(min, max);//建立新遊戲
- //txtMessage控制項是一個TextBox顯示訊息
- txtMessage.Text = "";
- groupBox1.Enabled = true;
- btnBegin.Enabled = false;
- }
- //猜數字(txtGuess及btnSend在groupBox1裡面)
- private void btnSend_Click(object sender, EventArgs e)
- {
- int guessnum = Convert.ToInt32(txtGuess.Text);//猜的數字
- string msg = string.Empty;//接收訊息
- //比對猜的數字
- Result result = game.Guess(players[currentPlayer].Name, guessnum, out msg);
- if (result == Result.OutOfRange)//猜的數字超過上下限
- {
- MessageBox.Show(msg);
- return;
- }
- else if (result == Result.Out)//猜中數字
- {
- MessageBox.Show(msg);
- txtMessage.Text += msg + Environment.NewLine;
- players.Remove(players.Where(p=>p==players[currentPlayer]).FirstOrDefault());//移除輸的遊戲者
- if (players.Count == 1)//若只剩一位遊戲者則遊戲結束
- {
- MessageBox.Show(players[0].Name + "您贏了!");
- txtMessage.Text += players[0].Name + "您贏了!" + Environment.NewLine; ;
- groupBox1.Enabled = false;
- btnBegin.Enabled = true;
- return;
- }
- //有遊戲者輸了,重新產生猜的數字,進入下一局
- game.GetNum(min, max);
- //lblplayer.Text = players[0].Name;//顯示下一局第一位猜數字的遊戲者
- //currentPlayer = 0;
- }
- else
- {
- //顯示上下限
- txtMessage.Text += msg + Environment.NewLine;
- currentPlayer += 1;//換下一個遊戲者
- }
- if (currentPlayer > players.Count - 1) currentPlayer = 0;
- lblplayer.Text = players[currentPlayer].Name;//顯示目前猜數字的遊戲者
- }
- }
- }
複製代碼 ... |
|