从我的简介java课程开始研究这个项目,这是他需要做的事情的要点 -
在普拉维尼亚的土地上,亚伦,鲍勃和查理都在争吵 其中一个是有史以来最伟大的益智游戏。为了结束 争论和所有人,他们同意决定死亡。亚罗尼斯很穷 射击者只能以1/3的概率命中他的目标。鲍勃有点好 并以1/2的概率命中他的目标。查理是一位专家 从来没有错过。击中意味着杀戮,并且击中的人掉落决斗。 为了弥补他们射击技巧的不公平性,我们决定了 参赛者将从Aaron开始,然后是Bob, 然后是查理。这个循环会重复,直到有一个人 常设。那个男人将被人们记住是所有人中最大的益智者 时间。
一个。编写一个模拟单次拍摄的功能。它应该使用 以下声明: voidshoot(bool& targetAlive,double accuracy,int& num_alive); 这将模拟一个人在使用thegiven射击targetAlive 通过生成0到1之间的随机数来准确。如果是随机数 数字小于准确度,那么目标就会被命中,而targetget应该是 设置为false。附录4说明了如何生成随机数。 例如,如果鲍勃在查理拍摄,可以调用: 射击(charlieAlive,0.5,num_alive); 这里,charlieAlive是一个布尔变量,表示Charlieis是否还活着。测试 在继续使用stepb之前使用驱动程序的功能。
湾一个明显的策略是每个人最多射击 准确的射手仍然活着,理由是这个射手是 最致命的,最有可能击退。写一下 名为start Duel的函数,使用拍摄功能进行模拟 使用这种策略的整个决斗。它应该循环直到只有一个 选手留下,用适当的目标调用射击功能 以及根据谁射击击中目标的概率。 该函数应返回一个变量,指示谁赢了 决斗。
℃。在main函数中,调用startDuel函数1,000次 一个循环,跟踪每个参赛者获胜的次数。 输出每个参赛者赢得所有人的概率 使用最准确的射手左侧射击策略 活着。
d。一个反直觉的策略是让Aaron故意误导他的 第一枪。此后,每个人都采用射击策略 最准确的射手还活着。这个策略意味着Aaron 鲍勃和查理将会保证自己过第一轮比赛 互相开火。修改程序以适应这个新的 策略并输出每个参赛者的获胜概率。
所以这是我正在使用的代码......到目前为止,它只进行了一次,但我不知道应该把循环放在哪里?此外,我们非常感谢代码中的任何其他指针。
import java.util.Random;
public class Duelist
{
Random rnd = new Random();
static int aaron_wins,bob_wins,charlie_wins;
class Shooter
{
public static final int StartingHits = 1;
private String name;
private double accuracy;
private int hitsLeft = StartingHits;
public Shooter(String name, double accuracy)
{
this.name = name;
this.accuracy = accuracy;
}
public String getName() { return this.name; }
public double getAccuracy() { return this.accuracy; }
public boolean isAlive() { return this.hitsLeft > 0; }
public void takeHit() { this.hitsLeft--; }
public void shoot(Shooter target)
{
if (rnd.nextDouble() <= this.getAccuracy())
{
System.out.println(this.getName() + " hits " + target.getName());
target.takeHit();
if (!target.isAlive())
{
System.out.println(target.getName() + " dies.");
}
else
{
System.out.println(this.getName() + " misses " + target.getName());
}
}
}
}
private Shooter [] shooters;
public Duelist()
{
this.shooters = new Shooter []
{
new Shooter("Aaron", 0.33),
new Shooter("Bob", 0.5),
new Shooter("Charlie", 1)
};
}
public Shooter pickTarget(Shooter shooter) {
Shooter victim = null;
for(Shooter possibleVictim : this.shooters) {
if (!possibleVictim.isAlive()) { continue; }
if (shooter==possibleVictim) { continue; }
if (victim == null || possibleVictim.getAccuracy() > victim.getAccuracy()) {
victim = possibleVictim;
}
}
return victim;
}
public void fireAway() {
int currentShooter = 0;
int maxShooter = this.shooters.length;
while(true) {
Shooter shooter = this.shooters[currentShooter++];
if (shooter.isAlive()) {
Shooter victim = pickTarget(shooter);
if (victim!=null) {
shooter.shoot(victim);
} else {
System.out.println(shooter.getName() + " wins.");
if(shooter.getName().equals("Aaron"))
aaron_wins++;
else if(shooter.getName().equals("Bob"))
bob_wins++;
else if(shooter.getName().equals("Charlie"))
charlie_wins++;
break;
}
}
if (!(currentShooter<maxShooter)) { currentShooter=0; }
}
}
public static String beginDuel_alternative_strategy()
{
boolean aaronAlive = true;
boolean bobAlive = true;
boolean charlieAlive = true;
int num_alive = 3;
aaron_wins=bob_wins=charlie_wins=0;
String winner = "";
int round = 1;
do
{
if (aaronAlive)
{
if (round == 1)
{
if (charlieAlive)
shoot(charlieAlive, 1/3.0, num_alive);
else if (bobAlive)
shoot(bobAlive, 1/3.0, num_alive);
}
}
if (bobAlive)
{
if (charlieAlive)
shoot(charlieAlive, 0.5, num_alive);
else if (aaronAlive)
shoot(aaronAlive, 0.5, num_alive);
}
if(charlieAlive)
{
if (bobAlive)
shoot(bobAlive, 1.0, num_alive);
else if (aaronAlive)
shoot(aaronAlive, 1.0, num_alive);
}
round++;
num_alive--;
}while(num_alive > 1);
if (aaronAlive)
{
winner = "Aaron";
aaron_wins++;
}
else if(bobAlive)
{
winner = "Bob";
bob_wins++;
}
else
{
winner = "Charlie";
charlie_wins++;
}
return winner;
}
public static void shoot(boolean targetAlive, double accuracy, int number_alive)
{
Random rnd2 = new Random();
if (rnd2.nextDouble()< accuracy)
{
targetAlive = false;
number_alive--;
}
}
public static void main(String[] args)
{
Duelist duel = new Duelist();
duel.fireAway();
System.out.println("Using first strategy: \n");
System.out.println("Aaron won " + aaron_wins + " duels or " + aaron_wins * 100 + "%\n");
System.out.println("Bob has " + bob_wins + " duels or " + bob_wins * 100 + "%\n");
System.out.println("Charlie has " + charlie_wins + " duels or " + charlie_wins * 100 + "%\n");
System.out.println();
System.out.println("Using alternate strategy: \n");
System.out.println("Winner :" + beginDuel_alternative_strategy());
System.out.println();
System.out.println("Aaron has " + aaron_wins + " duels or " + aaron_wins * 100 + "%\n");
System.out.println("Bob won " + bob_wins + " duels or " + bob_wins * 100 + "%\n");
System.out.println("Charlie won " + charlie_wins + " duels or " + charlie_wins * 100 + "%\n");
}
}
答案 0 :(得分:0)
您的问题的答案写在您的问题的要求中:
℃。在你的main函数中,在循环中调用startDuel函数1000次,跟踪每个参赛者获胜的次数。输出每个参赛者在每个人都使用最准确的射手活动拍摄策略时获胜的概率。
// main() pseudocode:
Shooter[] shooters = new Shooter[3](); // or however java syntax is ...
// Set the strategy, name for each of the 3 shooters...
shooters[0].setName("..");
shooters[0].setStrategy(...);
// ...
// get some storage to count which player wins a round...
int[] winCounters = new int[3];
for( int i = 0; i < 1000; i++ )
{
int winner = startDuel(shooters); // returns index of winner...
winCounters[winner]++;
}
// ... output the statistics ....