|
发表于 2010-5-30 03:16:00
|
显示全部楼层
Re:做个数学题,抽牌游戏
#include <iostream>
#include <ctime>
#include <cmath>
using namespace std;
int youxi (int a,int b,int n)
{
int x,y=1,i;
for(i=0;i<=n&&y>=1;)
{
for(;i<=n&&y==1;)
{
x=1+rand() % (a+1);
if (x==(a+1))
{
i++;
y=2;
//进入b循环
cout<<"抽中a的鬼牌"<<endl;
}
else
{
if(a==1 &&x==1)
{
i++;
y=0;
cout<<"a只剩鬼牌"<<endl;
}
else
{
a--;
b++;
i++;
cout<<"抽到a的非鬼牌但未胜利"<<endl;
}
}
}
if (y>=1)
{
x=1+rand() % (b+1);
if (x==(b+1))
{
i++;
y=1;
//进入a循环
cout<<"抽中b的鬼牌"<<endl;
}
else
{
if(a==1 &&x==1)
{
i++;
y=0;
cout<<"b只剩鬼牌"<<endl;
}
else
{
b--;
a++;
i++;
cout<<"抽到b的非鬼牌但未胜利"<<endl;
}
}
}
else
{
}
}
return i;
}
int main (void)
{
srand(unsigned(time(NULL)));
int a,b,n,y,i,j;
double z=0,c;
cout<<"请输入测试最大回合数,防止死循环,数值越大越接近极限值"<<endl;
cin>>n;
cout<<"请输入A、B各有几张牌"<<endl;
cin>>a;
b=a;
cout<<"请输入测试次数"<<endl;
cin>>j;
i=j;
for (j=j;j>0;j--)
{
y=youxi(a,b,n);
cout<<"此次回合数为"<<y<<endl;
z=z+y;
}
c=z/i;
cout<<"平均回合数为"<<c<<endl;
return 0;
}
蛋疼的我啊。。。
输入三个参数。
第一个是最大回合限制,防止那可能性极小的大家来回抽鬼牌直到世界毁灭。。
第二个是除鬼牌外A、B手中持有的牌数,单人的牌数。。
第三个是测试次数,明显越多越精确。。
大概测试了下,每人手里一张牌,平均2回合。
每人手里两张牌,平均9回合,每人手里三张牌,平均20回合。。
呃,懒,就测了一次,有误差别找我。。 |
|