创建一个模拟抛硬币的Coin类,实现随机抛掷硬币的方法,用随机数来表示硬币当前的状态,并能够根据这个值判断硬币是否正面朝上。
Coin对象可以是两种状态之一:正面朝上或反面朝上。我在Coin类中用整数值来表示这个状态,0表示正面朝上,1表示反面朝上(反之也不影响,因为实例调用的将是判断方法的返回值),这个值保存在变量face中。对于这个问题来说,可以用布尔值、字符串或者是枚举类型来表示硬币的状态,之所以选择使用整数来表示,是因为选择随机数的方法(本例采用的是Math.random)返回的是一个数值,所以避免了额外的类型转换。
public class Coin {
private final int HEADS = 0; //设数值0代表正面
private int face;
public Coin()
{
face = 0;
}
public void flip()
{
face = (int)(Math.random()*2); // 0或1
}
public boolean isHeads() //判断当前是否为正面朝上,返回布尔值true或false
{
return (face == HEADS);
}
public String toString()
{
return (face == HEADS)?"Heads":"Tails"; //三元运算符,同C语言中的问号表达式
}
}
实例化一个Coin对象,然后投掷硬币多次,统计正面和反面出现的次数。
public class CountFlips {
public static void main(String[] args) {
final int FLIPS = 1000;
int heads = 0, tails = 0;
Coin myCoin = new Coin();
for (int count = 1; count <= FLIPS; count++)
{
myCoin.flip();
if (myCoin.isHeads()) //通过isHeads方法判断正反面
heads++;
else
tails++;
}
System.out.println("Number of flips:" + FLIPS);
System.out.println("Number of heads:" + heads);
System.out.println("Number of tails:" + tails);
}
}
我们也可以在另一个程序中使用Coin类。实现一个FlipRace“硬币赛跑”程序,它的main方法实例化两个Coin对象,并反复地依次抛掷它们,直到其中地一枚硬币连续三次出现正面朝上时为止,判定该枚硬币获胜。
public class FlipRace {
public static void main(String[] args) {
final int GOAL = 3;
int count1 = 0, count2 = 0, flips = 0;
Coin Coin1 = new Coin();
Coin Coin2 = new Coin();
while (true) {
flips++; // 循环次数递增语句要注意位置,放在break语句之后会少一次递增
Coin1.flip();
Coin2.flip();
System.out.println("Coin1:" + Coin1.toString() + "\tCoin2:"+ Coin2.toString());
//这里的Coin1.toString()可以直接写成Coin1,因为在println内会自动执行toString
if (Coin1.isHeads()) //不加花括号的话,默认后面的第一个语句(第一个";"前)在结构体内执行
count1++;
else
count1 = 0;
if (Coin2.isHeads())
count2++;
else
count2 = 0;
if (count1 == GOAL || count2 == GOAL)
break; // 除了这种退出循环的方法还可以直接在while后设置条件
}
if (count1 == GOAL)
System.out.println("Coin1 wins!");
else
System.out.println("Coin2 wins!");
System.out.println("Flip times:" + flips);
}
}
在println语句中,将Coin1和Coin2对象与字符串进行了连接,这种情况下会调用对象的toString方法返回要输出的字符串,不需要显式地调用toString方法。
每次抛掷硬币,根据硬币的正反面来给计数器赋值,这样二项选择的情况可以多使用三元运算符来作为条件语句以简化代码。
和前面的CountFlips类一样,FlipRace类也用到了Coin类。程序员精心设计的类通常可复用在多个程序中,如同一次又一次地复用Java API中的类一样。