游戏开发论坛

 找回密码
 立即注册
搜索
查看: 6065|回复: 19

[讨论] 做个数学题,抽牌游戏

[复制链接]

69

主题

2031

帖子

2356

积分

金牌会员

Rank: 6Rank: 6

积分
2356
发表于 2010-5-29 17:34:00 | 显示全部楼层 |阅读模式
游戏规则比较简单。
两人人玩A张牌,在牌里有一张“鬼”。
两人分好牌后,没“鬼牌”的人抽“有鬼牌”的牌。
如果没抽到鬼牌,则把抽到的牌舍弃,然后继续抽;
如果抽到鬼牌,则把鬼牌放自己牌里,让对方抽。
一直这么抽下去,直到一方最后只剩一张“鬼牌”,则为输的一方。

这个游戏是个很老的纸牌游戏了,我想问的是,这种牌的总数A,和平均回合数B是否有公式或者算法,可以推算。

0

主题

156

帖子

156

积分

注册会员

Rank: 2

积分
156
发表于 2010-5-29 19:25:00 | 显示全部楼层

Re:做个数学题,抽牌游戏

看这规则,除鬼牌外,初始两个人手里必须至少有一张牌。
当各有一张牌时,1/2几率1回合,1/2^2几率2回合,1/2^3几率3回合,之后类推,不会算平均,脚本模拟了一下是平均两回合

各两张牌和以上时不算了。。头疼

134

主题

1802

帖子

1914

积分

金牌会员

Rank: 6Rank: 6

积分
1914
发表于 2010-5-29 19:39:00 | 显示全部楼层

Re:做个数学题,抽牌游戏

平均回合数??啥概念
这B要是回合数,那就是1<=B<=A-2
你这逻辑有点乱啊

69

主题

2031

帖子

2356

积分

金牌会员

Rank: 6Rank: 6

积分
2356
 楼主| 发表于 2010-5-29 23:03:00 | 显示全部楼层

Re: Re:做个数学题,抽牌游戏

养猫男: Re:做个数学题,抽牌游戏

平均回合数??啥概念
这B要是回合数,那就是1<=B<=A-2
你这逻辑有点乱啊

平均回合数和平均冲星次数一样。
然后,如果双方都在无限抓鬼牌,那么这个回合数可以是无限。

0

主题

156

帖子

156

积分

注册会员

Rank: 2

积分
156
发表于 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回合。。
呃,懒,就测了一次,有误差别找我。。

69

主题

2031

帖子

2356

积分

金牌会员

Rank: 6Rank: 6

积分
2356
 楼主| 发表于 2010-5-30 23:17:00 | 显示全部楼层

Re:做个数学题,抽牌游戏

用程序算就没意思了。
我记得这题目很早以前有人教过我一个算法,只是我给忘了。

0

主题

156

帖子

156

积分

注册会员

Rank: 2

积分
156
发表于 2010-5-31 04:18:00 | 显示全部楼层

Re: Re:做个数学题,抽牌游戏

huori: Re:做个数学题,抽牌游戏

用程序算就没意思了。
我记得这题目很早以前有人教过我一个算法,只是我给忘了。


找个数学NB的用结果逆推函数好了……
不过数学NB的似乎也不用逆推了……

0

主题

73

帖子

87

积分

注册会员

Rank: 2

积分
87
发表于 2010-5-31 09:21:00 | 显示全部楼层

Re:做个数学题,抽牌游戏

鬼牌是有放回抽样,其他牌是无放回抽样。

69

主题

2031

帖子

2356

积分

金牌会员

Rank: 6Rank: 6

积分
2356
 楼主| 发表于 2010-5-31 14:27:00 | 显示全部楼层

Re: Re:做个数学题,抽牌游戏

三无人员: Re:做个数学题,抽牌游戏

鬼牌是有放回抽样,其他牌是无放回抽样。

但别忘了,只要一方还剩一张鬼牌就结束,而不是双方。
那么有可能是一方手里的牌是满的,而另一方被抽光了。

7

主题

1102

帖子

1178

积分

金牌会员

Rank: 6Rank: 6

积分
1178
发表于 2010-5-31 18:41:00 | 显示全部楼层

Re:做个数学题,抽牌游戏

2*log(A,2)-6=B

当A>50 的时候才基本成立。


一幅扑克,54张,所以,一般是 5 回合结束。


以上是小弟猜的!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-8-15 16:05

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表