目录

  • 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 + "次");
    }
}