纸牌游戏21点数学建模.doc

举报
资源描述
^` 纸牌游戏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次游戏的输出结果。 1、 模型的建立与求解 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; If SUM1=21&&UM2≠21,则玩家赢,得分SCORE=3; If (SUM2=21&&SUM2≠21) or (21>SUM2>SUM1),则庄家赢,得分SCORE=-2; If 21>SUM1>SUM2 则玩家赢,得分SCORE=2; If 21>SUM1=SUM2 则为平局,SCORE =0. 第16步 输出得分SCORE. 停止. 二.Matlab程序 在matlab中先输入edit,出现一个窗口,在里面建立函数程序dian21.m如下: function y=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); while 1 if (totw>18)|(totw> (2*pz(1)) ) break; else [numw,pw,a]=choose(numw,pw,a); totw=totw+pw(numw); end end while 1 if (totz>=17)&(totz<=21) break; end if totz<17 [numz,pz,a]=choose(numz,pz,a); totz=totz+pz(numz); else b=0; for i=1:numz if pz(i)==11 pz(i)=1; totz=totz-10; b=1; break; end end if b==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; else if (totw==21 && totz~=21) SCORE=3; else if (totz==21&&totw~=21) || (21>totz && totz>totw) SCORE=-2; else if 21>totw && totw>totz SCORE=2; else if 21>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) while 1 m=fix(rand(1)*8)+1; n=fix(rand(1)*13)+1; if a(m,n)==1 a(m,n)=0; num=num+1; if n==1 if num<21 n=11; end end if n>10 n=10; end p=[p n]; 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如下 function y=dian21() n=input(请输入局数:); SUM=0; flag=input(请输入决策数:); %这是一个决策数,我们可以改变其值,测试哪一个值最优 for i=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); while 1 if (totw>flag)%|(totw> (2*pz(1)) ) break; else [numw,pw,a]=choose(numw,pw,a); totw=totw+pw(numw); end end while 1 if (totz>=17)&(totz<=21) break; end if totz<17 [numz,pz,a]=choose(numz,pz,a); totz=totz+pz(numz); else b=0; for i=1:numz if pz(i)==11 pz(i)=1; totz=totz-10; b=1; break; end end if b==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; else if (totw==21 && totz~=21) SCORE=3; else if (totz==21&&totw~=21) || (21>totz && totz>totw) ||(totw>21 && totz<21) SCORE=-2; else if (21>totw && totw>totz) ||(totz>21 && totw<21) SCORE=2; else if 21>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) while 1 m=fix(rand(1)*8)+1; n=fix(rand(1)*13)+1; if a(m,n)==1 a(m,n)=0; num=num+1; if n==1 if num<21 n=11; end end if n>10 n=10; end p=[p n]; 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就停止取牌
展开阅读全文
相关搜索
温馨提示:
taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。

当前位置:首页 > 教育专区 > 教案示例


本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁