java——智力题:三个枪手(命中率不同)为女人而战斗

这篇博客探讨了一个智力问题,三个枪手小李(命中率30%)、小黄(命中率50%)和小林(命中率100%)为了争夺同一女子进行决斗。决斗顺序为小李、小黄、小林,直到只剩一人。博客讨论了在这种情况下,每个人存活的最大概率以及他们应采取的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

三个小伙子同时爱上了一 个姑娘,为了决定他们谁能娶这个姑娘,他们决定用手枪进行一次决斗。小李的命中率是30%,小黄比他好些,命中率是50%,最出色的枪手是小林,他从不失 误,命中率是100%。由于这个显而易见的事实,为公平起见,他们决定按这样的顺序:小李先开枪,小黄第二,小林最后。然后这样循环,直到他们只剩下一个 人。那么这三个人中谁活下来的机会最大呢?他们都应该采取什么样的策略?


代码:

     创建一个类,用来初始化人物背景

package wyp.wife.copy;

import java.math.BigDecimal;

/**
 * 对象类 :挑战者信息 修改日期:2013-5-19 作者: 倒霉蛋
 */
public class Challenger {
	// 挑战者姓名
	private String name;
	// 命中率
	private double hit_rate;
	// 生?死
	private boolean alive;
	// 开枪的次数
	private int num;

	public Challenger(String name, double hit_rate) {
		super();
		this.name = name;
		this.hit_rate = hit_rate;
		this.alive = true;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public double getHit_rate() {
		return hit_rate;
	}

	public void setHit_rate(double hit_rate) {
		BigDecimal b = new BigDecimal(hit_rate);
		hit_rate = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
		this.hit_rate = hit_rate;
	}

	public boolean isAlive() {
		return alive;
	}

	public void setAlive(boolean alive) {
		this.alive = alive;
	}

	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	@Override
	public String toString() {
		return "[姓名=" + name + ", 命中率=" + hit_rate + ", 开枪的次数=" + num + "]";
	}

}


package wyp.wife.copy;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class TakeWife {

	public static void main(String[] args) {
		TakeWife takeWife = new TakeWife();
		takeWife.start();
	}

	public void start() {
		Challenger one = new Challenger("one", 0.30);
		Challenger two = new Challenger("two", 0.50);
		Challenger three = new Challenger("three", 1.00);
		List<Challenger> isEnd = new ArrayList<Challenger>();
		isEnd.add(one);
		System.out.println("选手" + one + "入场");
		isEnd.add(two);
		System.out.println("选手" + two + "入场");
		isEnd.add(three);
		System.out.println("选手" + three + "入场");
		System.out.println("挑战者全部就位");
		// 为了女人他们开始了拼杀 -<-<--
		while (isEnd.size() != 1) {
			happen(isEnd);
		}
		System.out.println("胜利者信息" + isEnd.toString());
	}

	public void happen(List<Challenger> isEnd) {
		// 根据命中率重新排序 -<-<--
		for (int i = 0; i < isEnd.size() - 1; i++) {
			if (isEnd.get(i).getHit_rate() > isEnd.get(i + 1).getHit_rate()) {
				Challenger turn;
				turn = isEnd.get(i);
				isEnd.set(i, isEnd.get(i + 1));
				isEnd.set(i + 1, turn);
			}
		}
		// 一轮枪击活动 -<-<--
		int shou = isEnd.size() - 1;
		for (int x = 0; x < isEnd.size(); x++) {
			int gong = x;
			if (gong == shou) {
				shou -= 1;
			}
			System.out.print(isEnd.get(gong).getName() + "向"
					+ isEnd.get(shou).getName() + "发起了攻击:>>>>");
			isEnd.get(gong).setNum(isEnd.get(gong).getNum() + 1);
			if (attack(isEnd.get(gong).getHit_rate())) {
				isEnd.get(shou).setAlive(false);
				System.out.println(isEnd.get(shou).getName() + "被"
						+ isEnd.get(gong).getName() + "击杀了");
				isEnd.remove(isEnd.get(shou));
				shou -= 1;
			} else {
				System.out.println("----未击中");
			}
		}
	}

	// 命中率操作 -<-<--
	public boolean attack(Double rate) {
		boolean flag = true;
		int i = (int) (rate * 100);
		Random random = new Random();
		int j = random.nextInt(100);
		if (j >= i) {
			flag = false;
		}
		return flag;
	}
}



每次运行都会输出战斗过程以及,胜利者信息。


附:运行了几次应该没有什么问题,如果有什么BUG希望能提出来,以便能进一步整个流程的思路。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值