这是我的任务:
在 Puzzlevania 的土地上,Aaron、Bob 和 Charlie 争论了他们中的哪一个是有史以来最伟大的解谜者。为了一劳永逸地结束这场争论,他们同意进行一场生死决斗。亚伦的射门很差,只有 1/3 的概率击中目标。Bob 稍微好一点,以 1/2 的概率击中了他的目标。查理是一位专家级的神枪手,从不失手。击中意味着杀死,被击中的人退出决斗。为了弥补枪法上的不公平,三人决定轮流进行,先是 Aaron,然后是 Bob,然后是 Charlie。循环将重复,直到有一个人站着。那个人将被永远铭记为有史以来最伟大的解谜者。
一个明显且合理的策略是让每个人向还活着的最准确的射手射击,理由是这个射手是最致命的,并且有最好的反击机会。编写一个程序来模拟使用这种策略的决斗。你的程序应该使用随机数和问题中给出的概率来确定射手是否击中了他的目标。您可能希望创建多个子例程和函数来完成问题。
提示 假设 Aaron 击中目标的几率是 1/3。您可以通过生成介于 1 和 99(含)之间的随机变量 R 来模拟此概率。R小于33的概率是多少?是 1/3。你知道这会导致什么吗?如果 R 为 33,那么我们可以模拟 Aaron 击中目标。如果 R > 33,那么他错过了。您还可以生成一个介于 0 和 1 之间的随机变量,并检查它是否小于 0.33。
这是我从头开始重写两次后终于能够编写的代码:
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main ()
{
int aaron=1, bob=1,charlie=1, a=0,b=0,c=0,counter=0;
srand(time(0));
a= rand() % 100;
if (a<=33)//if aaron kills charlie
{
charlie=0;
b= rand() % 100; //bob choots at aaron
if (b<=50) //if bob kills aaron
{
aaron=0;
cout<<"error1"<<endl;
}
else if (b>50)
{
while (b>50) //if bob misses
{
a= rand() % 100; //aaron shoots at bob
if (a<=33)// if he kills bob
{
bob=0;
cout<<"error2"<<endl;
}
else //if he misses
{
b= rand() % 100;//bob shoots at aaron
if (b<=50)//if he kills him
{
aaron=0;
cout<<"error3"<<endl;
}
else //if he misses then the loop continues
{
counter++;
}
}
}
}
}
else if (a>33)//aaron misses
{
b= rand() % 100; //bob shoots at charlie
if (b<=50) //he kills charlie
{
charlie = 0;
a= rand() % 100; //aaron shoots at bob
if (a<=33)//aaron kills bob
{
bob=0;
cout<<"error4"<<endl;
}
else //if not
{
b= rand() % 100;//bob shoots at aaron
if (b<=50) // if he kills aaron
{
aaron=0;
cout<<"error5"<<endl;
}
else if (b>50)
{
while (b>50)//if not then begin loop
{
a= rand() % 100; //aaron shoots at bob
if (a<=33) //if he kills him
{
bob=0;
cout<<"error6"<<endl;
}
else
{
b= rand() % 100;; //if not bob shoots at aaron
if (b<=50)// if he kills aaron
{
aaron=0;
cout<<"error7"<<endl;
}
else
{
counter++; //if not loop around
}
}
}
}
}
}
else //he misses so charlies kills bob
{
bob=0;
a= rand() % 100; //aaron shoots at charlie
if (a<=33) //aaron kills charlie
{
charlie=0;
cout<<"error8"<<endl;
}
else // or charlie kills aaron
{
aaron=0;
cout<<"error9"<<endl;
}
}
if (charlie==0 && bob==0)
{
cout<<"Aaron wins."<<endl;
}
else if (aaron==0 && bob==0)
{
cout<<"Charlie wins."<<endl;
}
else if (charlie==0 && aaron==0)
{
cout<<"Bob wins."<<endl;
}
}
return 0;
}
我在 cout 行中添加了错误#,以便在编译程序时查看我的错误在哪里。
如果我得到错误 1、2、3 和 6 的 cout 行,程序将继续运行,我没有得到一个带有命名获胜者的 cout,它应该附带它。此外,对于这些数字,我似乎有时会得到双重结果(即一个错误的结果和另一个来自程序不同部分的结果)导致我假设我的循环有问题。
我选择使用循环而不是递归函数,因为它超出了赋值的范围。
我会很感激任何对我的语法和形式的评论,因为我真的很难过。