java——智力题:三个枪手(命中率不同)为女人而战斗
2013-05-19 15:16
453 查看
题目:
三个小伙子同时爱上了一 个姑娘,为了决定他们谁能娶这个姑娘,他们决定用手枪进行一次决斗。小李的命中率是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希望能提出来,以便能进一步整个流程的思路。
相关文章推荐
- java 使用MongoDB作为数据库三个不同阶段的操作记录
- 在eclipse中,创建Java工程时候三个JRE选项的不同
- 求:1,2,5这三个数不同组合的和为100的组合的个数!Java实现。
- leetcode解题之 16. 3Sum Closest Java版(结果离目标值最近三个数字和)
- kotlin 语法跟 java 的不同
- JavaScript基础(基本语法:变量、语句、数组、函数、对象、全局方法以及js与java不同,js与html关联)
- Java之美[从菜鸟到高手演变]之智力题【史上最全】
- java中不同数据库连接字符串
- java不同版本特性
- 在java中弱引用,软引用,虚引用和强引用的不同之处
- leetcode-java.T015_3Sum---给定一个n个元素的数组,是否存在a,b,c三个元素,使用得a+b+c=0,找出所有符合这个条件的三元组
- java生成4个不同的随机数
- java国际化中,查找不同国家的语言代码和对应的语言
- Java ClassLoader基础及加载不同依赖 Jar 中的公共类
- java中,throws与throw有什么不同?
- mysql-connector-java-3.1.10-bin-g.jar 和 mysql-connector-java-3.1.10-bin.jar两个文件有什么不同呀?
- JavaScript和客户端编程语言C++,java,objective-C的三大不同
- php java static 不同
- C语言和java的不同
- Java与c/c++运行时的不同