注释
单行注释
- 以
//
为开始,到这一行结束都是注释内容 - 注释可以是任何内容
- 可以在一行的开始注释,也可以在程序内容后面添加注释
- 注释不会对程序有任何影响
多行注释
使用 /*
开头, */
结尾,中间是注释内容。
生成指定范围内的随机数
新功能
Math.random() 生成随机数,随机数在 0 到 1 之间,类型是 double
生成一个在指定范围内的随机正整数程序关键点
- 得到随机数,Java 支持得到的 0 到 1 的 double 类型的随机数
- 确定基本的数学方法
- 运用取模运算符
- 使用强制类型转换
- 确保生成的数字在指定的范围内。极限思维,假设随机数是 0 或者 1,结果是多?假设取模后是0 或者 mod-1,结果会是多少?
double randNum = 0;
// 生成一个大于 0.5 的随机数
while (randNum < 0.5) {
randNum = Math.random();
System.out.println(randNum);
}
int rangeStart = 99;
int rangeEnd = 180;
for (int i = 0; i < 100; i++) {
// 确定模
int mod = rangeEnd - rangeStart;
//生成随机数
randNum = Math.random();
// num的值会在0到mod-1,也就是0到rangeEnd - rangeStart -1
int num = ((int) (randNum * rangeEnd * 100)) % mod;
// num加rangeStart之后,值域是0到rangeEnd - 1
num += rangeStart;
if (num <= rangeStart) {
num = rangeStart + 1;
}
// 根据数据分析,这个条件不会满足,只是为了做最后的防护
if (num >= rangeEnd) {
num = rangeEnd - 1;
}
System.out.println("这次的随机数是:" + num);
}
从标准输出读取字符串和整数
新功能
Scanner in = new Scanner(System.in)
连接标准输入,在我们例子里也就是命令行。in 也是变量,只是不是基本类型。in.nextLine()
可以从命令行读取一行字符串in.nextInt()
可以从命令行读取一个正整数- 点操作符也是 Java 中的操作符,和
System.out.printIn()
以及Math.random()
中的点是一样的操作符。是对点前面的 “变量” 进行点后面的 “操作” 。这里所谓的操作,就是指方法,也就是我们一直写的 main 方法的那个方法。这些操作都是使用一个个的的方法。使用方法我们叫做调用方法(invoke a method)。方法是 Java 中的重中之重,我们后面会用大篇幅讲解。 import java.util.Scanner;
是告诉程序,Scaner 这个类型在哪里。- 创建 Scanner 类型的 “变量”,它就是我们提过的工具,可以帮我们从标准收入读取数据
nextLine()
和nextInt()
两个方法可以从命令行读取一行字符串或者一行字符串代表的整数
import java.util.Scanner;
public class ReadStringAndIntFromConsole {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("请问你的名字是?");
String str = in.nextLine();
System.out.println(str + ",你好。");
System.out.println("请问你几岁了?");
int age = in.nextInt();
System.out.println("好的," + str + age + "岁了。");
}
}
猜数字的游戏
善假于物也
Random 方法和 readInt 方法是两个工具,可以完成一个明确具体的功能。
游戏功能
- 猜数字:生成一个指定范围内的随机正整数,从命令行读取一个整数,如果和随机数相同,就算猜中。
- 固定随机数的范围。
- 支持每次猜数字游戏的猜测次数,在指定次数内没猜对,则猜数字失败,否则就是成功。
- 可以支持退出游戏。
- 输出剩余的猜测次数。
- 每次猜测后,如果未猜中,则提示本次猜测的数字比目标数字大还是小。
- 游戏结束后,输出猜数字游戏的统计。
- 没有猜中,要输出这次的目标数字。
- 可以设置随机数的范围,可以设置最大猜测次数。
import java.util.Scanner;
public class GuessNumber {
public static void main(String[] args) {
// 创建Scanner从控制台读取输入
Scanner in = new Scanner(System.in);
// 游戏设置
int rangeStart = 1;
int rangeEnd = 8;
int guessTotal = 5;
// 游戏统计
int totalGameCount = 0;
int totalCorrectCount = 0;
// 是否结束游戏
boolean stopGame = false;
while (!stopGame) {
// 初始化本次游戏的变量
int guessLeft = guessTotal;
int mod = rangeEnd - rangeStart;
double randNum = Math.random();
int num = ((int) (randNum * rangeEnd * 100)) % mod;
num += rangeStart;
if (num <= rangeStart) {
num = rangeStart + 1;
}
if (num >= rangeEnd) {
num = rangeEnd - 1;
}
System.out.println("=================== 猜 数 字 ===================");
System.out.println("目标数已经生成,数字在" + rangeStart + "到" + rangeEnd + "之间," +
"不包括这两个数。共有" + guessTotal + "次猜测的机会。输入-1随时结束游戏。");
// 本次游戏是否开始了
boolean gameStart = true;
// 本次是否猜中数字
boolean guessCorrect = false;
while (guessLeft > 0) {
System.out.println("还有" + guessLeft + "次机会,请输入猜测的数字,回车确认");
int guessNum = in.nextInt();
// 输入-1,结束游戏
if (guessNum == -1) {
stopGame = true;
break;
}
if (guessNum <= rangeStart || guessNum >= rangeEnd) {
System.out.println("请输入在" + rangeStart + "到" + rangeEnd + "之间,的数字,不包括这两个数。");
continue;
}
// 只要至少猜过一次,就算玩过了。
if (gameStart) {
totalGameCount++;
gameStart = false;
}
// 可以用的猜测次数减1
guessLeft--;
if (guessNum == num) {
totalCorrectCount++;
guessCorrect = true;
System.out.println("恭喜你猜对了!这次的数字就是" + num +
"。本次你共猜了" + (guessTotal - guessLeft) + "次。");
break;
} else if (guessNum > num) {
System.out.println("猜测的数字比目标数字大。");
} else {
System.out.println("猜测的数字比目标数字小。");
}
}
if (!guessCorrect) {
System.out.println("本次的目标数字是" + num + "。这次没有猜中。");
}
}
System.out.println("共进行了" + totalGameCount + "次游戏,其中正确的为" + totalCorrectCount + "次");
}
}