纸牌游戏点数学建模.docx
- 文档编号:29875631
- 上传时间:2023-08-03
- 格式:DOCX
- 页数:15
- 大小:25.21KB
纸牌游戏点数学建模.docx
《纸牌游戏点数学建模.docx》由会员分享,可在线阅读,更多相关《纸牌游戏点数学建模.docx(15页珍藏版)》请在冰豆网上搜索。
纸牌游戏点数学建模
纸牌游戏21点(Blackjack).构造并实施21点游戏的蒙特卡洛模拟
21点游戏规则如下:
大多数赌场使用6副牌或8副牌玩这种游戏,以防止“数牌点”,在你的模拟中使用两副牌(共104张)。
只有2位参与者,你和庄家。
游戏开始时每人得到两张牌,对于牌面为2~10的牌,点数和面数相同;对于为人脸(J、Q、K)的牌,点数为10;牌面为A的牌,点数为1或者11.游戏的目的是得到总数尽量接近21点的牌,不得超过(超过称“爆了”),并使你得到的总点数多于庄家。
如果开始两张牌的总点数恰为21(A-10或A-人脸),称为21点,自动成为胜者(若你和庄家都得到21点,则为平局,你的赌注仍在台上)。
靠21点赢时,付给你3赔2,即1.5赔1(1元赌注赢1.5元,且1元赌注仍保留)。
如果你和庄家都未得到21点,你想要多少张牌就可以取多少张牌,一次一张,使总数尽量接近21点,如果你超过了21点,就输了,游戏结束。
一旦你对牌的点数满意,你就“打住”,然后庄家按照下列规则取牌:
当庄家牌的点数为17、18、19、20和21时,就打住。
若庄家牌的点数小于或等于16,必然取牌。
庄家总把A的点数记为11,除非这样使他或她爆了(这时A的点数记为1)。
例如,庄家的A-6组合是17点,不是7点(庄家没有选择权),且庄家必须打住在17点上。
而若庄家有A-4组合(15点),又拿了一张K,那么新的总点数是15,因为A回到点数1(使之不超过21点),庄家还要再取牌。
如果庄家超过21点,你就赢了(赢赌注的钱,每1元赌注赢1元)。
如果庄家的总点数超过你,你将输掉全部赌注。
如果庄家和你的总点数相同,为平局(你不输也不赢)。
赌场中这个游戏的刺激之处在于,庄家开始的两张牌一张明、一张暗,所以你不知道庄家牌地总点数,必须根据那张明牌赌一把。
在这个项目模拟中你不用考虑这种情况,你需要做的是:
用两幅牌做12次游戏,你可以有无限的赌资(不希望吗?
),每次下赌2元。
两副牌玩过一次后,用两幅新牌(104张)继续玩。
这时记录你的得分(加或者减X元),然后下一幅牌从0开始。
输出是12次游戏的12个结果,可以用平均数或总数决定你的总成绩。
你的策略是什么?
完全由你决定!
可是这里有一招——假定庄家的牌你都看不到(于是你没有庄家牌这一点信息)。
选择一种游戏策略并在整个模拟中运行。
给出模拟算法的说明书、计算机程序以及12次游戏的输出结果。
一、模型的建立与求解
21点的蒙特卡罗算法
输出玩家的得分SCORE
第1步初始化:
COUNTER=0.
第2步得到[1,13]内的随机数
.计算
的和SUM1(玩家总点数
),
的和SUM2(庄家总点数
);同时庄家现出自己的第一张牌
.
第3步判断
的值,若>10,则将其值改为10,并重新计算SUM1.
第4步判断
的值,若>10,则将其值改为10,并重新计算SUM1.
第5步判断
的值,若>10,则将其值改为10,并重新计算SUM2.
第6步判断
的值,若>10,则将其值改为10,并重新计算SUM2.
第7步判断
的值是否为1,若等于1将其值改为11,重新计算SUM1,并判断SUM1是否大于21,若大于21则将
改为1,并重新计算SUM1,若没有大于21则继续第9步;若
不为1,直接进行第9步.
第8步判断
的值是否为1,若等于1将其值改为11,重新计算SUM1,并判断SUM1是否大于21,若大于21则将
改为1,并重新计算SUM1,若没有大于21则继续第10步;若
不为1,直接进行第10步.
第9步判断
的值是否为1,若等于1将其值改为11,重新计算SUM2,并判断SUM2是否大于21,若大于21则将
改为1,并重新计算SUM2,若没有大于21则继续第11步;若
不为1,直接进行第11步.
第10步判断
的值是否为1,若等于1将其值改为11,重新计算SUM2,并判断SUM2是否大于21,若大于21则将
改为1,并重新计算SUM2,若没有大于21则继续第12步;若
不为1,直接进行第12步.
第11步玩家判断SUM1是否大于等于18或大于庄家第一张牌
的两倍,若是则玩家停止取牌,跳到第14步;若没有则继续取牌,得到[1,13]内的随机数
,进行第13步.
第12步同第4步和第8步,判断
的值,若>10,则将其值改为10,并将其值加到SUM1;接着判断
的值是否为1,若,等于1将其值改为11,重新计算SUM1,并判断SUM1是否大于21,若大于21则将
改为1,并重新计算SUM1,若没有大于21则回到第12步;若
不为1,直接进行第12步.
第13步庄家判断SUM2是否大于16,若是则庄家不取牌,则跳到第16步;否则庄家取牌,得到[1,13]内的随机数
,进行第15步.
第14步同第6步和第10步,判断
的值,若>10,则将其值改为10,并将其值加到SUM2;接着判断
的值是否为1,若,等于1将其值改为11,重新计算SUM1,并判断SUM2是否大于21,若大于21则将
改为1,并重新计算SUM2,若没有大于21则回到第14步;若
不为1,直接回到第14步.
第15步比较SUM1和SUM2的大小,
If(SUM1>21&&SUM2>21)or(SUM1=21&&SUM2=21),则为平局,得分SCORE=0;
IfSUM1=21&&UM2≠21,则玩家赢,得分SCORE=3;
If(SUM2=21&&SUM2≠21)or(21>SUM2>SUM1),则庄家赢,得分SCORE=-2;
If21>SUM1>SUM2则玩家赢,得分SCORE=2;
If21>SUM1=SUM2则为平局,SCORE=0.
第16步输出得分SCORE.
停止.
二.Matlab程序
在matlab中先输入edit,出现一个窗口,在里面建立函数程序dian21.m如下:
functiony=dian21()
a=ones(8,13);%产生8*13的矩阵
numz=0;
numw=0;
pz=[];
pw=[];
totz=0;%庄家总点数
totw=0;%玩家总点数
[numz,pz,a]=choose(numz,pz,a);
totz=totz+pz(numz);
[numz,pz,a]=choose(numz,pz,a);
totz=totz+pz(numz);
[numw,pw,a]=choose(numw,pw,a);
totw=totw+pw(numw);
[numw,pw,a]=choose(numw,pw,a);
totw=totw+pw(numw);
while1
if(totw>18)|(totw>(2*pz
(1)))
break;
else
[numw,pw,a]=choose(numw,pw,a);
totw=totw+pw(numw);
end
end
while1
if(totz>=17)&(totz<=21)
break;
end
iftotz<17
[numz,pz,a]=choose(numz,pz,a);
totz=totz+pz(numz);
else
b=0;
fori=1:
numz
ifpz(i)==11
pz(i)=1;
totz=totz-10;
b=1;
break;
end
end
ifb==0
break;
end
end
end
fprintf('玩家总点数SUM1=%d\n',totw);
fprintf('玩家总点数SUM1=%d\n',totz);
SCORE=0;
if(totw>21&&totz>21)||(totz==21&&totw==21)
SCORE=0;
elseif(totw==21&&totz~=21)
SCORE=3;
elseif(totz==21&&totw~=21)||(21>totz&&totz>totw)
SCORE=-2;
elseif21>totw&&totw>totz
SCORE=2;
elseif21>totw&&totw==totz
SCORE=0;
end
end
end
end
end
fprintf('玩家得分SCORE=%d\n',SCORE);
保存为dian21.m
同样edit建立函数程序choose.m如下
function[num,p,a]=choose(num,p,a)
while1
m=fix(rand
(1)*8)+1;
n=fix(rand
(1)*13)+1;
ifa(m,n)==1
a(m,n)=0;
num=num+1;
ifn==1
ifnum<21
n=11;
end
end
ifn>10
n=10;
end
p=[pn];
break;
end
end
保存为choose.m
然后在matlab中输入dian21,回车就可以得到如下数据
>>dian21
玩家总点数SUM1=20
玩家总点数SUM1=17
玩家得分SCORE=2
>>dian21
玩家总点数SUM1=20
玩家总点数SUM1=22
玩家得分SCORE=0
>>dian21
玩家总点数SUM1=20
玩家总点数SUM1=19
玩家得分SCORE=2
>>dian21
玩家总点数SUM1=15
玩家总点数SUM1=22
玩家得分SCORE=0
>>dian21
玩家总点数SUM1=19
玩家总点数SUM1=19
玩家得分SCORE=0
>>dian21
玩家总点数SUM1=14
玩家总点数SUM1=18
玩家得分SCORE=-2
这些数据都是随机出现的。
这种方法并不是很好,下面对上述游戏策略进行该进。
程序如下
先输入edit,在弹出的窗口中输入函数程序dian21.m如下
functiony=dian21()
n=input('请输入局数:
');
SUM=0;
flag=input('请输入决策数:
');%这是一个决策数,我们可以改变其值,测试哪一个值最优
fori=1:
n
a=ones(8,13);%产生8*13的矩阵
numz=0;
numw=0;
pz=[];
pw=[];
totz=0;%庄家总点数
totw=0;%玩家总点数
[numz,pz,a]=choose(numz,pz,a);
totz=totz+pz(numz);
[numz,pz,a]=choose(numz,pz,a);
totz=totz+pz(numz);
[numw,pw,a]=choose(numw,pw,a);
totw=totw+pw(numw);
[numw,pw,a]=choose(numw,pw,a);
totw=totw+pw(numw);
while1
if(totw>flag)%|(totw>(2*pz
(1)))
break;
else
[numw,pw,a]=choose(numw,pw,a);
totw=totw+pw(numw);
end
end
while1
if(totz>=17)&(totz<=21)
break;
end
iftotz<17
[numz,pz,a]=choose(numz,pz,a);
totz=totz+pz(numz);
else
b=0;
fori=1:
numz
ifpz(i)==11
pz(i)=1;
totz=totz-10;
b=1;
break;
end
end
ifb==0
break;
end
end
end
%fprintf('玩家总点数=%d,',totw);
%fprintf('庄家总点数=%d\n',totz);
SCORE=0;
if(totw>21&&totz>21)||(totz==21&&totw==21)
SCORE=0;
elseif(totw==21&&totz~=21)
SCORE=3;
elseif(totz==21&&totw~=21)||(21>totz&&totz>totw)||(totw>21&&totz<21)
SCORE=-2;
elseif(21>totw&&totw>totz)||(totz>21&&totw<21)
SCORE=2;
elseif21>totw&&totw==totz
SCORE=0;
end
end
end
end
end
SUM=SUM+SCORE;%fprintf('玩家得分SCORE=%d\n',SCORE);
end
fprintf('玩家得分平均值SCORE=%d\n',SUM/n);
保存为dian21.m
同样edit建立函数程序choose.m如下:
function[num,p,a]=choose(num,p,a)
while1
m=fix(rand
(1)*8)+1;
n=fix(rand
(1)*13)+1;
ifa(m,n)==1
a(m,n)=0;
num=num+1;
ifn==1
ifnum<21
n=11;
end
end
ifn>10
n=10;
end
p=[pn];
break;
end
end
保存为choose.m
然后在matlab中输入dian21,回车
会出现:
请输入局数:
你填一个数字,例如100000
会出现:
请输入决策数:
你再填一个数字,例如21
就会显示:
玩家得分平均值SCORE=-1.351880e+00
例:
>>dian21
请输入局数:
100000
请输入决策数:
21
玩家得分平均值SCORE=-1.351880e+00
>>dian21
请输入局数:
100000
请输入决策数:
20
玩家得分平均值SCORE=-9.434000e-01
>>dian21
请输入局数:
100000
请输入决策数:
19
玩家得分平均值SCORE=-3.226500e-01
>>dian21
请输入局数:
100000
请输入决策数:
18
玩家得分平均值SCORE=-1.038300e-01
>>dian21
请输入局数:
100000
请输入决策数:
17
玩家得分平均值SCORE=3.641000e-02
>>dian21
请输入局数:
100000
请输入决策数:
16
玩家得分平均值SCORE=5.810000e-02
>>dian21
请输入局数:
100000
请输入决策数:
15
玩家得分平均值SCORE=3.657000e-02
>>dian21
请输入局数:
100000
请输入决策数:
14
玩家得分平均值SCORE=2.397000e-02
>>dian21
请输入局数:
100000
请输入决策数:
13
玩家得分平均值SCORE=-1.116000e-02
>>dian21
请输入局数:
100000
请输入决策数:
12
玩家得分平均值SCORE=-3.628000e-02
可见,在决策数16时玩家的平均得分最高。
所以最终决策是:
玩家的总点数大于16就停止取牌
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 纸牌 游戏 点数 建模