本节书摘来自异步社区《Android游戏开发详解》一书中的第2章,第2.20节对象的更多实践——模拟一个色子,作者 【美】Jonathan S. Harbour,更多章节内容可以访问云栖社区“异步社区”公众号查看
2.20 对象的更多实践——模拟一个色子
Android游戏开发详解
在我们的下一个项目中,将模拟一个六面色子的滚动。色子会出现在许多现代的桌上游戏中,因为它们增添了不可预期的因素,如图2-26所示。在本节中,我们将展示在Java程序中如何模拟这种随机性。
我们首先创建一个名为“DiceProject”的新的Java项目。其中,创建一个名为DiceMaker的新的类,并且像通常一样给它一个main方法。
要产生一个随机数,我们必须使用Java库中名为Random的一个内建类。我们使用熟悉的对象创建语法来创建一个Random对象,如程序清单2.22的第4行所示。
程序清单2.22 DiceMaker.java
1 public class DiceMaker {
2
3 public static void main(String[] args) {
4 Random r = new Random();
5 }
6
7 }
应该注意到,Eclipse告诉你在创建Random对象的代码行中有一个错误,如图2.27所示。
一旦将鼠标移动到关键字Random上,将会出现如下所示的信息。
Random cannot be resolved to a type
这只是告诉你,编译器不能创建一个Random类型的对象,因为它不知道Random类在哪里。
要修正这个问题,必须提供完整的地址,让编译器知道在哪里找到Random。想要的Random类可以在java.util.Random中找到(这是UnitedKingdom.London.221BBakerSt形式的地址)。让我们导入这个类,如程序清单2.23第1行所示。
程序清单2.23 导入java.util.Random
1 import java.util.Random;
2
3 public class DiceMaker {
4
5 public static void main(String[] args) {
6 Random r = new Random();
7 }
8
9 }
既然已经告诉计算机在哪里找到Random,我们就能够调用这个方法了。我们感兴趣的是nextInt()方法,它接受一个整数,并且返回0(包括)到所接受的整数(不包括)之间的一个值。
例如,r.nextInt(6)将会随机地产生如下所示的数字之一。
0, 1, 2, 3, 4, 5
如果我们想要生成1到6之间的数字,直接给结果加上1就行了,如程序清单2.24中的第7行和第8行所示。
程序清单2.24 模拟色子滚动
01 import java.util.Random;
02
03 public class DiceMaker {
04
05 public static void main(String[] args) {
06 Random r = new Random();
07 int randNum = r.nextInt(6) + 1;
08 System.out.println("You have rolled a " + randNum);
09 }
10
11 }
运行该程序的时候,将会看到如下所示的结果之一。
You have rolled a 1
You have rolled a 2
You have rolled a 3
You have rolled a 4
You have rolled a 5
You have rolled a 6
Random类有哪些应用呢?当英雄杀死怪兽的时候,你可以选择实现一个随机数生成器来决定丢下什么物品。当在类似Minecraft这样的游戏中生成地图的时候,也可以使用随机数生成器。真的有无数种可能性。
java.util.Random有多随机
我们已经使用了Random类来模拟随机性,但是,它并没有实现真正的随机性。尽管它似乎产生了随机数,但实际上它遵循了一个公式,该公式生成理论上可以预测的结果。我们将这种现象叫作伪随机数(pseudo-random)。这对我们编写游戏不可能有任何影响,但是它引发了一个有趣的讨论。长期来讲,你可以肯定地期待这个随机数生成器将会生成所有可能的数字的一个一致的分布。如果你想要学习有关真正的随机性的更多知识,请访问Random.org网站。
关于导入的更多介绍
在上面的示例中,我们必须导入java.util.Random。这是我们将要从Java库导入的Random类的全名。
Java库组织成包的形式,其中包含了可以在代码中使用的各种类。无论何时,当你想要使用Java库中的一个类的时候,都必须告诉程序,在哪里可以找到这个类所在的包(完整名称)。
并不是所有的对象都需要导入。例如,属于java.lang包的String,由于它如此常用,实际上会自动导入。下一小节所要介绍的数组,也是不用导入就可以创建。