算法/回合制战斗

OI

一小道C语言题带来的乐趣


要用游戏的玩法打败游戏的情景题!
对于以下题目:
某游戏规则中,甲乙双方每个回合的战斗总是有一方胜利,一方失败。游戏规定:失败的一方要把自己的体力值的1/4加给胜利的一方。例如:如果双方体力值当前都是4,则经过一轮战斗后,双方的体力值会变为:5,3。现在已知:双方开始时的体力值甲:1000,乙:2000。假设战斗中,甲乙获胜的概率都是50%,求解:双方经过4个回合的战斗,体力值之差小于1000的理论概率。
用基础模拟算法来解决:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include<stdio.h>
#define all 16//所有可能的结果数目
int exchange(double * x,double * y) //x为吸收血量方
{
double t;
t=(*y)*0.25;(*x)+=t;(*y)-=t;
return 0;
}
int main()
{
int js=0;
double x=1000,y=2000;
//美好的游戏模拟开始了
for(int i=0;i<=1;i++)
{
double ax=x,ay=y;//存档,防止数据丢失
i?exchange(&x,&y):exchange(&y,&x); //i判断甲(x)是否赢得一回合,并改变血条
for(int i=0;i<=1;i++)
{
double bx=x,by=y;
i?exchange(&x,&y):exchange(&y,&x);
for(int i=0;i<=1;i++)
{
double cx=x,cy=y;
i?exchange(&x,&y):exchange(&y,&x);
for(int i=0;i<=1;i++)
{
double dx=x,dy=y;
i?exchange(&x,&y):exchange(&y,&x);
if(x-y<1000&&x-y>-1000) js++;
x=dx;y=dy; //重新读档,开始下一轮模拟
}
x=cx;y=cy;//读档,余同
}
x=bx;y=by;
}
x=ax;y=ay;
}
printf("四回合后体力值差<1000的理论概率:\n%f",js*1.0/all);
return 0;
}

是不是特像打游戏刷关呢?( ^ v ^ )