目录
- Java 中的单行注释
- 从标准输出读取字符串和整数
- 生成指定范围内的随机数
- 猜数字的游戏
1. Java 中的单行注释
- 以 // 为开始,到这一行结束都是注释内容
- 注释可以是任何内容
- 可以在一行的开始注释,也可以在程序内容后面添加注释
- 注释不会对程序有任何影响
public class Comments {
public static void main(String[] args) {
int a = 9;//定义变量a,赋值为9
//将a输出到控制台
System.out.println(a);
}
}
多行注释:
public class Comments {
public static void main(String[] args) {
int a = 9;//定义变量a,赋值为9
//将a输出到控制台
/*
System.out.println(a);
System.out.println(a);
System.out.println(a);
System.out.println(a);
System.out.println(a);
System.out.println(a);
System.out.println(a);
*/
System.out.println(a);
}
}
2. 生成指定范围内的随机数
-
新功能
- Math.random() 生成随机数,随机数在 0 到 1 之间,类型是 double;
-
生成一个在指定范围内的随机正整数程序关键点
- 得到随机数,Java 支持得到的 0 到 1 的 double 类型的随机数
- 确定基本的数学方法
- 运用取模运算符
- 使用强制类型转换
- 确保生成的数字在指定的范围内。极限思维,假设随机数是 0 或者 1,结果是多少? 假设取模后是 0 或者 mod-1,结果会是多少?
小试牛刀1:生成随机数
/*
* @Author: AI悦创
* @Date: 2020-10-10 09:39:20
* @Last Modified by: aiyuechuang
* @Last Modified time: 2020-10-10 09:47:06
*/
public class Example {
public static void main(String[] args) {
double ranDomNum = 0;
// 要生成一个大于 0.5 的随机数,只有随机数大于 0.5,循环才会退出
while (ranDomNum < 0.5) {
// 使用 Java 中的 Math.random(),生成一个随机数
ranDomNum = Math.random();
System.out.println(ranDomNum);
}
System.out.println("生成的大于 0.5 的随机数是:" + ranDomNum);
}
}
0.18314678143955454
0.40330292877036744
0.5298453794544753
生成的大于 0.5 的随机数是:0.5298453794544753
小试牛刀2:生成0~100之间的随机数(double)
public class Test {
public static void main(String[] args) {
double randNum = Math.random();
System.out.println(randNum * 100);
}
}
94.02797607694808
小试牛刀3:生成0~100之间的随机数(int) 「这个时候就会取到0或100了」
public class Test {
public static void main(String[] args) {
double randNum = Math.random();
System.out.println((int) (randNum * 100)) ;
}
}
小试牛刀:生成指定范围之内的随机数
/*
* @Author: AI悦创
* @Date: 2020-10-10 14:11:50
* @Last Modified by: aiyuechuang
* @Last Modified time: 2020-10-10 17:37:03
*/
public class test {
public static void main(String[] args) {
int rangeStart = 30;
int rangeEnd = 90;
int mod = rangeEnd - rangeStart;
int bigRandom = (int) (Math.random() * (rangeEnd * 100));
int numberToGuess = (bigRandom % mod) + rangeStart;
System.out.println("mod = " + mod + ", bigRandom = " + bigRandom + ", numberToGuess = " + numberToGuess);
}
}
加上 for 循环看是否是真的随机
public class test {
public static void main(String[] args) {
int rangeStart = 30;
int rangeEnd = 90;
int mod = rangeEnd - rangeStart;
for (int i = 0; i < 50; i++) {
int bigRandom = (int) (Math.random() * (rangeEnd * 100));
int numberToGuess = (bigRandom % mod) + rangeStart;
System.out.println("mod = " + mod + ", bigRandom = " + bigRandom + ", numberToGuess = " + numberToGuess);
}
}
}
最终优化
public class RandomNumber {
public static void main(String[] args) {
double randNum = 0;
while (randNum < 0.5) {
randNum = Math.random();
System.out.println(randNum);
}
int rangeStart = 99;
int rangeEnd = 180;
for (int i = 0; i < 100; i++) {
// 确定模,也就是差值。
// 这样我们就可以通过 rangeStart 这个数与差值求出 rangeEnd 的这个值
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);
}
}
}
public class test {
public static void main(String[] args) {
double randNum = 0;
while (randNum < 0.5) {
randNum = Math.random();
System.out.println(randNum);
}
int rangeStart = 99;
int rangeEnd = 180;
if (rangeStart < 0 || rangeEnd < 0) {
System.out.println("开始和结束必须是正数或者0");
}
if ((rangeEnd - rangeStart) <= 1) {
System.out.println("非法的数字范围:(" + rangeStart + ", " + rangeEnd + ")");
}
for (int i = 0; i < 100; i++) {
// 确定模,也就是差值。
// 这样我们就可以通过 rangeStart 这个数与差值求出 rangeEnd 的这个值
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);
}
}
}
3. 从标准输出读取字符串和整数
-
新功能
-
Scanner in = new Scanner(System.in)
连接标准输入,在我们例子里也就是命令行。in 也是变量, 只是不是基本类型。 -
in.nextLine()
可以从命令行读取一行字符串 -
in.nextInt()
可以从命令行读取一个正整数 - 点操作符也是 Java 中的操作符,和
System.out.println()
以及Math.random()
中的点是一样的操作符。是对点前面的“变量”进行点后面的“操作”。这里所谓的操作,就是指方法,也就 是我们一直写的 main 方法的那个方法。这些操作都是使用一个个的的方法。使用方法我们 叫做调用方法 (invoke a method) 。方法是Java中的重中之重,我们后面会用大篇幅讲解。 -
importjava.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 + "岁了。");
}
}
请问你的名字是?
AI悦创
AI悦创,你好。
请问你几岁了?
18
好的,AI悦创18岁了。
4. 猜数字的游戏
-
善假于物也
- 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 + "次");
}
}