Java类的编写实例(二) 抛硬币统计正反面出现的次数 谁先连续三次正面朝上的游戏 创建一个好的类可以在许多不同的程序中复用

创建一个模拟抛硬币的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中的类一样。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

成名在望xy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值