Java完成簡單猜數字遊戲v2.0,java猜數字v2.0
猜數字遊戲v2.0 最佳化了擷取隨機數、輸入資料超出邊界值的代碼,並增加了異常處理,能夠在玩家輸入錯誤資料錯誤時給出可靠指引,希望對和我一樣的新人有協助,
最後希望有大神願意幫我解決代碼最佳化的問題,謝謝。
/*需求:
*1. 玩家輸入錯誤類型資料時,要求重新輸入;
*2. 最佳化輸入整數超出區間部分的代碼;
*3. 最佳化擷取隨機數部分的代碼;
*思路:
*1. 建立一個函數,要求必須輸入整數;
*2. 超邊界後有更加清晰的提示,能夠正確指引玩家輸入;
*3. 引入帶標號的while迴圈,內層迴圈結束後,跳至指定標號,即可重新開始,不必重新擷取隨機數;
*步驟:
*1. 建立getInteger函數,引入try-catch,在輸入非int情形下要求重新輸入,利用continue,直到玩家輸入整數為止;
*2. 針對玩家輸入的資料與區間上下限作比較,超出後給出超上限或者超下限的提示;
*3. 針對玩家輸入的區間上限低於下限時,給出正確的錯誤提示,並要求使用者能夠重新輸入上限值;
*4. while迴圈添加一個標號outer,玩家輸入yes後,繼續outer迴圈,其他情況就結束outer迴圈,即結束遊戲。
* +++++++++++++++++
* 缺點
* 太多迴圈嵌套,需要繼續最佳化。
* +++++++++++++++++
*/
1 import java.util.*; 2 public class GuessGame 3 { 4 public static void main(String[] args) 5 { 6 outer:while (true) 7 { 8 //確認競猜資料的下限 9 Scanner guessMin = new Scanner(System.in); 10 System.out.println("歡迎來到猜數字遊戲v2.0!\n請輸入您要競猜資料的下限:"); 11 int min = getInteger(); 12 //確認競猜資料的上限 13 while(true) 14 { 15 Scanner guessMax = new Scanner(System.in); 16 System.out.println("請輸入您要競猜資料的上限:"); 17 int max = getInteger(); 18 if(max < min) 19 { 20 System.out.println("您輸入的競猜資料上限低於上限,請重新輸入。"); 21 continue; 22 } 23 //產生一個指定區間的隨機數,Math.random()產生一個[0,1)之間的double類型的隨機數。 24 int givenNumber = (int)(Math.random()*(max-min+1)) + min; 25 //System.out.println("系統已產生的隨機數:"+givenNumber);//測試時可取消注釋 26 System.out.println("系統已產生一個[" + min + "," + max + "]區間的隨機數,來競猜吧!"); 27 //引入count,用來計算輸入次數 28 int count = 0; 29 while(true) 30 { 31 //玩家輸入猜想的資料 32 Scanner sc = new Scanner(System.in); 33 try 34 { 35 System.out.println("在這個給定區間,[" + min + "," + max + "]"+",請輸入您所猜想的資料:"); 36 count++ ; 37 int guessNumber = sc.nextInt(); 38 //大於判斷,將max-1的目的是為了更加精準範圍 39 if (guessNumber > givenNumber) 40 { 41 //此處是針對輸入值超出上限時的一個判斷,避免誤導玩家 42 if (guessNumber > max) 43 { 44 System.out.println("太可惜了,您在第" + count + "次輸入的資料是"+guessNumber+",超出了區間上限。"); 45 } 46 else 47 { 48 max = guessNumber-1; 49 System.out.println("太可惜了,您在第" + count + "次猜大了,請繼續:"); 50 } 51 } 52 //小於判斷,將min+1的目的是為了更加精準範圍 53 else if (guessNumber < givenNumber) 54 { 55 //此處是針對輸入值超出上限時的一個判斷,避免誤導玩家 56 if (guessNumber < min) 57 { 58 System.out.println("太可惜了,您在第" + count + "次輸入的資料是"+guessNumber+",超出了區間下限。"); 59 } 60 else 61 { 62 min = guessNumber+1; 63 System.out.println("太可惜了,您在第" + count + "次猜小了,請繼續:"); 64 } 65 } 66 //等於判斷,並詢問是否繼續遊戲 67 else 68 { 69 System.out.println("太贊了,您花了" + count + "次就猜中了這個隨機數," + givenNumber + "。"); 70 //是否繼續遊戲 71 System.out.println("\n輸入yes繼續挑戰,按任意鍵退出。\n"); 72 sc = new Scanner(System.in); 73 String str = sc.nextLine(); 74 if ("yes".equals(str)) 75 { 76 continue outer; 77 } 78 else 79 { 80 System.out.println("歡迎使用猜數字遊戲v2.0,再見!\n"); 81 break outer; 82 } 83 } 84 } 85 catch (InputMismatchException e) 86 { 87 System.out.println("您輸入的資料有誤,請重新輸入一個區間內的整數。\n"); 88 } 89 } 90 } 91 } 92 } 93 public static int getInteger()//對擷取的資料進行分析,是整數繼續,不是整數就要求重新輸入 94 { 95 while(true) 96 { 97 Scanner in = new Scanner(System.in); 98 int getNum = 0; 99 String str = in.nextLine();100 boolean b = true;101 try102 {103 getNum = Integer.parseInt(str);//如果輸入是int類型,則把值轉化成整型賦給getNum104 }105 catch(Exception e)//不是整數則讓b為false106 {107 b = false;108 }109 if(b)//如果b是false則要求重新輸入110 {111 System.out.println("您輸入的整數是:"+getNum);112 }113 else114 {115 System.out.println("輸入錯誤,請重新輸入一個整數。");116 continue;117 }118 return getNum;//函數返回使用者輸入的整數119 }120 }121 }