猜数字游戏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 try
102 {
103 getNum = Integer.parseInt(str);//如果输入是int类型,则把值转化成整型赋给getNum
104 }
105 catch(Exception e)//不是整数则让b为false
106 {
107 b = false;
108 }
109 if(b)//如果b是false则要求重新输入
110 {
111 System.out.println("您输入的整数是:"+getNum);
112 }
113 else
114 {
115 System.out.println("输入错误,请重新输入一个整数。");
116 continue;
117 }
118 return getNum;//函数返回用户输入的整数
119 }
120 }
121 }