您的位置:首页 > 编程语言 > Java开发

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希望能提出来,以便能进一步整个流程的思路。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: