纸牌游戏21点 数学建模
C语言程序设计21点扑克牌游戏

实用标准文案实验报告课程名称:C语言程序设计实验项目:21点扑克牌游戏设计专业班级:电子信息工程实验室号:信息205 实验组号:xx 实验时间:2010-5-4 批阅时间:指导教师:成绩:沈阳工业大学实验报告(适用计算机程序设计类)专业班级:电子信息工程0902 学号:姓名:实验名称:21点扑克牌游戏附件A 沈阳工业大学实验报告(适用计算机程序设计类)专业班级:电子信息工程0902 学号:姓名:实验步骤或程序:(我所做的程序是作弊程序改动已经加粗)#include<time.h>#include<stdio.h>#include<conio.h>#include<stdlib.h>void Wait_f(int);void Pause_f();/*暂停,按任意键继续*/int Random_f(long ,long );/*返回两个参数之间的随机数*/void Replay_f(char *);/*询问是否重开一局*/void Hit_f(int *);/*发一张牌*/void Deal_f(int *,int *,int *,int *);/*双方各发两张牌*/void Bet_f(int *,int *);/*接受下注的数目*/void Print_f(int ,int ,int ,int );/*打印结果*/void Rules_f();/*显示游戏规则*/void Results_f(int ,int ,int ,int *,int *,int *,int *);/*统计结果(输赢平)*/void Hit_f2(int * npTotal,int a);int nnn;int main(){int nPlayer=0,nCpu=0,nWin=0,nLose=0,nDraw=0,nPlayerTurns=0, nCpuTurns=0,nMoney=0,nBet;/* nPlayer——玩家手中全部牌的点数和,nPlayerTurns——玩家手中牌的数量*/char chAnswer;char mmm;int a;system("cls");/*执行系统命令“清屏”*/Rules_f();printf("\t\t\tWOULD YOU LIKE TO PLAY? ");scanf("%c",&chAnswer);if((chAnswer=='y')||(chAnswer=='Y')){printf("\t\t\tI WILL LET YOU START WITH $100\n");nMoney=100;printf("\t\t\t");Pause_f();}else{return(0);}do{system("cls");if(nMoney<0){printf("Your broke\n");return(0);}Bet_f(&nBet,&nMoney);/*接受下注的数目*/Deal_f(&nPlayer,&nCpu,&nPlayerTurns,&nCpuTurns);/*双方各发两张牌*/ printf("\t\t\tWould you want to cheat? yes or no?");scanf("%c",&mmm);if((mmm=='y')||(mmm=='Y')){printf("%d",nnn);printf("\t\t\twhich card do you want?");scanf("%d",&a);}system("cls");do{printf("\t\t\tWould You Like To Hit or Stay :");/*询问玩家是否接着要牌*/scanf(" %c",&chAnswer);if((chAnswer=='h')||(chAnswer=='H')){nPlayerTurns++;/*计算总牌数*/if(nPlayerTurns>5)/*看是否允许再要牌*/{printf("\t\t\tYou Can't Have more than 5 cards");}}if((nPlayerTurns<6)&&(chAnswer=='h')){printf("\n");if((mmm=='y')||(mmm=='Y'))Hit_f2(&nPlayer,a);else Hit_f(&nPlayer);/*为玩家发一张牌*/}}while((chAnswer=='h')||(chAnswer=='H'));for(;(nCpu<16)&&(nCpuTurns<6);nCpuTurns++)/*计算机要牌的条件*/{printf("\n");printf("\t\t\tThe Dealer Takes A Card");Hit_f(&nCpu);/*为计算机发一张牌*/}printf("\n\n");printf("\t\t\tThe Dealer Has A Total: %d\n", nCpu);/*显示总点数*/printf("\t\t\tYou Have A Total Of: %d\n", nPlayer);printf("\n");Results_f(nPlayer,nCpu,nBet,&nMoney,&nDraw,&nWin,&nLose);/*计算最后的结果(统计输赢平的局数)*/Replay_f(&chAnswer);/*询问是否重开一局*/}while((chAnswer=='y')||(chAnswer=='Y'));Print_f(nWin,nLose,nDraw,nMoney);/*打印最后结果*/printf("\n");printf("\t\t\t\t");return(0);}void Rules_f() /*这个函数显示游戏规则*/{printf("\t\t WELCOME TO ISAAC SHAFFERS BLACK JACK GAME\n");printf("\t\t\t HERE ARE SOME SIMPLE RULES\n");printf("\t\t\t1:You Can only have a max of 5 cards.\n");printf("\t\t\t2:If you bust you automatically lose.\n");printf("\t\t\t3:If you win you win double what you bet");printf("\t\t\t4:The Dealer stops at or after 16.\n");printf("\t\t\t\t");getchar();}void Bet_f(int* npBet,int* npMoney) /*该函数接受玩家下注,并计算赌资的总数*/{system("cls");printf("\t\t\tYOU HA VE:$%d\n",*npMoney);printf("\t\t\tHow Much Do You Wish To Bet:");scanf("%d",npBet);if(*npBet<0){*npBet=*npBet*(-1);}*npMoney=*npMoney-*npBet;}void Deal_f(int* npPlayer,int*npCpu,int*npPlayeReturns,int *npCpuReturns)/*该函数是给计算机与玩家各发两张牌*/{int nPlayerCard1,nPlayerCard2,nCpuCard1,nCpuCard2;*npPlayeReturns=2;*npCpuReturns=2;nPlayerCard1=Random_f(13,1);printf("\n\t\t\tDEALING HAND\n");getchar();Pause_f();nPlayerCard2=Random_f(13,1);Pause_f();nCpuCard1=Random_f(13,1);Pause_f();nCpuCard2=Random_f(13,1);if (nPlayerCard1>=10){nPlayerCard1=10;}if (nPlayerCard2>=10){nPlayerCard2=10;}if (nCpuCard1>=10){nCpuCard1=10;}if (nCpuCard2>=10){nCpuCard2=10;}*npPlayer=nPlayerCard1+nPlayerCard2;*npCpu=nCpuCard1+nCpuCard2;printf("\t\t\tYOU HA VE a total of:%d\n",*npPlayer);printf("[%d]", nPlayerCard1);printf("[%d]",nPlayerCard2);printf("\n");printf("\t\t\tThe DEALER HAS A %d SHOWING",nCpuCard1);printf("\n");printf("[*][%d]",nCpuCard1);nnn=nCpuCard2;}void Hit_f(int * npTotal) /* 发一张牌,返回点数之和*/{int nCard;nCard=Random_f(13,1);if(nCard>=10){nCard=10;}* npTotal=* npTotal+nCard;printf("\t\t\tThe card is a :%d\n", nCard);printf("\t\t\tTotal is :%d\n", * npTotal);}void Results_f(int nPlayer,int nCpu,int nBet,int * npMoney,int * npDraw,int* npWin,int * npLose)/*统计结果(输赢平及输赢平的局数)*/ {if(nCpu==nPlayer){printf("\t\t\tIT WAS A DRAW HOUSE WINS\n");++* npDraw;}if(nPlayer>21){printf("\t\t\tYou Bust\n");++* npLose;}else{if(nCpu<nPlayer){printf("\n\t\t\tYOU WIN");*npMoney=*npMoney+(nBet*2);++* npWin;}}if(nCpu>21){printf("\t\t\tDealer Bust\n");if(nPlayer<=21){printf("\n\t\t\tYOU WIN");++* npWin;*npMoney=*npMoney+(nBet*2);}}else{if(nCpu>nPlayer){printf("\t\t\tYOU LOSE\n");++* npLose;}}}void Replay_f(char *chpAns) /*询问是否重开一局*/ {printf("\n\t\tWould You Like To Play This Game Again:");scanf("%c",chpAns);}void Print_f(int nWins,int nLose,int nDraw,int nMoney){printf("\t\t\t\tWINS:%d\n", nWins);printf("\t\t\t\tLOSE:%d\n", nLose);printf("\t\t\t\tDRAWS:%d\n",nDraw);printf("\t\t\t\tMONEY:%d\n",nMoney);}void Wait_f(int nMilli){int nStart1,nStart2;for(nStart1=0;nStart1<nMilli*100;nStart1++)for(nStart2=0;nStart2<nMilli*100;nStart2++){;}}void Pause_f(){printf("Press Any Key To Continue");getchar();}int Random_f(long lBigNumber, long lSmallNumber) /*选择两个参数之间的随机数*/{int nRan;srand((unsigned)time(NULL));nRan=rand()%(lBigNumber-(lSmallNumber-1))+lSmallNumber;return(nRan);}void Hit_f2(int * npTotal,int a) /* 发一张牌,返回点数之和*/{int nCard;nCard=a;if(nCard>=10){nCard=10;}* npTotal=* npTotal+nCard;printf("\t\t\tThe card is a :%d\n", nCard);printf("\t\t\tTotal is :%d\n", * npTotal);}。
21点游戏设计

课程设计(大作业)报告课程名称:算法设计与分析设计题目:21点游戏设计院系:信息技术学院专业及班级:计算机科学与技术设计者:学号:指导教师:设计时间:2014年6月30日至7月4日昆明学院昆明学院课程设计(大作业)任务书目录昆明学院课程设计(大作业)任务书 (2)一、概述 (5)1.1 题目要求 (5)1.2 JAVA工作平台的简介 (5)1.3 21点游戏发展历史 (6)1.4 21点游戏介绍 (6)二、设计分析 (6)三、总体设计 (7)3.1程序总体结构 (7)3.2重要数据的数据结构设计 (7)3.3总体功能框图 (8)3.4主要算法流程图 (9)四、运行结果与分析 (10)4.1开始游戏 (10)4.2返回上级菜单的示意图 (10)4.3查看玩家记录 (11)4.4结束游戏 (11)五、总结 (12)六、参考文献 (12)附录源代码: (13)一、概述近来随着计算机的快速发展,各种各样的电脑游戏层出不穷,使得我们能有更多的娱乐项目,而一些游戏能起到锻炼人的思维和修身养性的作用。
越来越多的具有智能的机器进入了人类的生活,人工智能的重要性如今显而易见。
自己对人工智能比较感兴趣,而21点游戏程序的开发实现了这个课题,正好提供给我这样一个研究的机会,通过对人工智能中博弈方面的研究(人机对弈),让我在简单的人机对弈全局设计,以及具体到相关算法上有了深入的了解。
人工智能大致可以分成几个任务,这时,这些学科之间的差别就变的很模糊。
人工智能在机器人学、模式识别、物景分析、数据库的智能检索、机器下棋(实际上是博弈论问题)和家用电气智能化等领域都有广泛的应用。
而这个课程设计就是和人工智能中博弈论领域紧密相关的,我们会尽全力做好它。
1.1 题目要求本次算法设计与分析课程设计题目是“21点纸牌游戏”,系统的主要功能是娱乐游戏,根据52张扑克牌,随机发出两手牌,其中一个玩家为人,另外一方为计算机。
玩家设法使自己的牌的总分达到21分,并要比电脑开的点数大而且不超过这个数值。
casino21点基本策略表_概率及解释说明

casino21点基本策略表概率及解释说明1. 引言1.1 概述在各种博弈游戏中,21点(Blackjack)是一种极为受欢迎且常见的游戏。
这个简单而富有策略性的扑克牌比赛以其激动人心的赌博过程吸引了众多玩家。
本文将重点讨论21点游戏的基本策略表以及概率在游戏中的作用和解释。
1.2 文章结构本文分为五个部分进行详细阐述。
首先,我们将介绍21点游戏基本策略的概述,并说明游戏规则。
接下来,我们将深入探讨基本策略表在游戏中的使用方法,并解释其中各项指示的意义和原理。
然后,我们会讨论概率在21点游戏中的重要性和应用场景,并分析它在玩家决策过程中的影响因素和盈利潜力。
最后,在结论部分,我们将总结文章内容要点并提出对基本策略表和概率解释的见解和建议。
1.3 目的本文旨在帮助读者更好地理解21点游戏,并引导他们在玩家决策时采取最佳策略。
通过详细解释基本策略表中的概念和指导原则,读者将能够提高自己在游戏中的胜率,同时最大化其利润。
此外,文章还将探讨概率在游戏中的重要作用,并给出优化赌博决策以提高胜算利润率等相关建议。
希望读者通过本文的阅读和理解,能够成为更具竞争力和智慧的21点玩家。
以上就是文章引言部分内容。
2. 21点游戏基本策略概述:2.1 简介21点游戏是一种非常受欢迎的赌博游戏,也被称为“Blackjack”。
玩家与庄家之间进行比牌,目标是使手中的牌点数尽可能接近21点但不能超过这个数值。
本游戏常见的规则包括使用一副或多副扑克牌玩,并依据不同地区和赌场规则的不同会有所变化。
2.2 游戏规则说明在21点游戏中,参与者(玩家)需要与庄家进行比较。
开始时,每位玩家会先下注并获得两张明牌,而庄家则会拿到一张明牌和一张暗牌。
- 牌面数字:A,1,2,3,4,5,6,,7,8,9,10,J,Q,K其中A可以表示1或者11;- 游戏规则:(1) 玩家可以选择“要牌”(Hit)来获得额外的一张明牌,或者选择“停牌”(Stand)保持当前手里的明牌;(2) 如果任意一方手中的牌达到或超过了21点,则该方爆掉(Bust),即输掉此局;(3) 在所有玩家停牌之后,庄家会翻开他的暗牌,并且根据固定规则来决定是否要牌;(4) 庄家必须继续拿牌直到手中点数达到17点或以上为止;(5) 如果庄家爆掉,则玩家赢得该局;否则,比较双方点数,点数更接近21点的一方获胜。
数据结构与算法课设-纸牌游戏21点

目录备注: (2)一、游戏简介 (2)二、设计要求 (2)2.1 问题描述 (2)2.2 要求分析 (2)三、程序功能 (3)3.1 程序的主要功能描述 (3)3.2序流程图 (3)3.3主界面 (4)3.4功能测试 (4)四、源程序 (6)五、课设心得 (14)备注:由于这次课设开始时以为可以做其他题目,知道周四才知道不行。
但我的21点一几个基本成型,因此没有继续改动,希望老师能够理解。
一、游戏简介又名黑杰克,起源于法国,现已流传到世界各地。
现在在世界各地的赌场中都可以看到二十一点,随着互联网的发展,二十一点开始走向网络时代,比如菲律宾的博彩公司就有该游戏。
该游戏由 2 到 6 个人玩,使用除大小王之外的52 张牌,游戏者的目标是使手中的牌的点数之和不超过 21 点且尽量大。
有着悠久的历史。
1700年左右法国赌场就有这种21点的纸牌游戏。
1931年,当美国内华达州宣布赌博为合法活动时,21点游戏第一次公开出现在内华达州的赌场俱乐部,15年内,它取代掷骰子游戏,而一举成为非常流行的赌场庄家参与的赌博游戏。
二、设计要求编写程序实现游戏,该程序是模拟古老的“21点纸牌游戏”,实现一对一的人机大战。
要求游戏过程中任意一方牌的点数之和超过 21 点,则自动出局;在不超过 21 点的情况下,玩家下注由电脑随机发牌与庄家比累积牌的点数的大小,大者为赢家。
2.1 问题描述本次C++课程设计题目是“21点纸牌游戏”,系统的主要功能是娱乐游戏,有电脑和玩家一起玩这个游戏,玩家设法使自己的牌达到总分21并要比电脑开的点数大而且不超过这个数值。
扑克牌的分值取它们的面值。
J,Q,K分别是11, 12和13分。
2.2 要求分析编写程序实现游戏,该程序是模拟古老的“21点纸牌游戏”,实现1对1的人机大战。
要求游戏过程中任意一方牌的点数之和超过21点,则自动出局;在不超过21点的情况下,玩家下注由电脑随机发牌与庄家比累积牌的点数的大小,大者为赢家。
C++课设21点

void BET(int &bet,int &money); //下注
void results(float player,float cpu,int bet,int &money,int &draw,int &win,int &lose); //判断输赢
int CCard::common()
{
char ans;
do{
system("cls");
if(money<0) //看是否无赌本
{
cout<<"你破产了!"<<endl; //若输光了,结束程序
return(0);
}
game.BET(bet,money); //下注程序
game.deal(player,cpu,playerturns,cputurns); //为计算机和玩家个发两张牌
game.results(player,cpu,bet,money,draw,win,lose); //判断输赢
game.replay(ans);
}while((ans=='y')||(ans=='Y'));
game.print(win,lose,draw,money);
cout<<endl;
cout<<"\t\t\t\t";
cout<<"如果您是高级玩家请按2."<<endl;
cout<<"如果您是超级玩家请按3."<<endl;
软件综合实验报告_21点游戏

综合实验报告( 2008-- 2009年度第1学期)实验名称:软件综合实验题目:21点游戏院系:计算机科学与技术系班级:计算0701班组长学号:1071220103组长姓名:丁炳淼指导教师:石敏设计周数: 2 周成绩:日期:2009年1月9日一、综合实验的目的与要求㈠实验目的:掌握用图解决实际问题的方法。
培养综合运用已经学过的程序设计知识,针对实际问题建立相应的数据模型的能力。
综合运用所学过的知识分析实际问题和解决问题的能力,熟练掌握一种开发平台并编写出高效、完整的实用程序。
进一步提高编程能力。
㈡实验要求:图形用户界面包含一个含“开始”、“要牌”、“结束”三个按钮和分别代表“当前分数”和“历史最高分数”的两个标签的Panel对象,以及一个使用CardLayout布局策略的Panel对象,设其中叠放了一幅52张的扑克牌(有“红心”、“黑桃”、“草花”、“方片”四种花色,每种花色有A到K共13张牌)。
当用户点击“开始”按钮时,当前分数清零,“要牌”按钮被激活;当用户点击“要牌”按钮时,计算机在52张牌中随机跳出一张显示给用户,并将其分数添加在“当前分数”的标签中显示出来;如果当前分数超过21,则用户输掉了一局,“要牌”按钮变灰,用户不能再要牌;如果用户点击“结束”按钮,结束当前一局游戏,查看当前分数是否超过历史最高分数,是则更新历史最高分数。
二、设计正文⑴实验题目21点游戏⑵程序总体结构在同一个文件夹下由文件夹cards,存放了名为0.gif~52.gif,代表扑克的图1、图形界面(构造函数以及布局设置,图片的加入及初始)2、事件监听器(ActionListener和WindowListener)3、事件处理的设计(Actionperformed和窗口时间处理)4、main方法⑶界面设计用边布局管理器BorderLayout():north设置为电脑庄家的面板comcards,作边布局BorderLayout(),从左到右面板包括标签“电脑庄家”,文本区拿到牌点数和当前总分数;south设置为玩家的面板mycards,也作作边布局BorderLayout(),从左到右面板包括标签“玩家”,文本区各次拿到牌的点数和当前总分数;west设置了介绍面板introduce,作网格布局GridLayout(3,1)放入3各文本区:2个为介绍,最下面的为用户输入name用;east为设置分数的面版rank,作网格布局GridLayout(3,1),包含1个标签wager,作提示信息,然后为玩家当前分数和历史最高分数的文本区;中央区为一个GridLayout (1,2)网格布局,其左边再加入一个按钮面板作GridLayout(3,2),放入6个按钮,实现5个,另一个作空。
模拟21点扑克牌游戏(C++课设)

沈阳理工大学课程设计专用纸No i目录1 题目内容及设计要求 (2)2 总体设计 (2)2.1 总体功能框图 (2)2.2 类的设计说明 (3)2.3 主要算法流程图 (4)3 程序清单及注释 (5)4 运行结果与分析 (5)5 总结 (25)6 参考文献 (25)2.2 类的设计说明定义一个Game类实现游戏的基本功能,可以抽牌,计算牌点,返回牌数,设置赌注,拥有的金额,计算赢局,输局,平局等。
如Game(); //构造函数。
Void FirstPlayTwo();//最初两张牌。
int GetNumber();//返回牌张数。
float GetPip(); //返回点数。
void DisplayPip();//一次全部显示牌面点数。
void DisplayPip(int ); //除了除了前两张牌,一次全部显示牌面点数(针对计算机牌的显示)。
void TurnPlay();//产生随机数,随机出一张牌。
void Win();//赢了计算赌注。
void Lose();//输了。
void Draw();//平局。
int setGamble(int);//设置赌注,赌本不够返回1。
int getMoney();//返回钱数。
void DisplayInfo();//打印必要的信息。
int GetCurrentCard();//返回当前牌点。
int Gamble();//返回赌注。
等等。
定义一个Display类可以打印进入游戏的界面,可以实现用户注册,登录,查看规则,升级用户储存用户资料等功能。
Display();//构造函数。
void cls();//清屏。
char Playername();//返回用户名。
char Password(int);//返回密码。
int nMoney();//返回现金。
void DisplayRegister();//打印注册界面。
void DisplayBegin();//打印登录界面。
C语言课程设计指导书21点双人对战与人机对战

《C/C++语言课程设计》指导书一、课程设计概要课题名称:21点双人对战和人机对战二、课题背景概述21点扑克是牌类游戏中的比较基础游戏,其基本打法为双人共玩一副洗好的52张牌(大小王拿走),采用回合制比每回合输赢,直至打完一副牌算总积分决出胜负。
每回合双方轮流拿牌,每人牌数2-5张,每回合拿牌结束时统计两人手上牌的总点数,并裁决本回合输赢。
如果轮到一方拿牌而放弃,则本回合此人不能再拿牌;如果手上牌的点数超过21点,则算爆。
如果双方都没爆,则点数较高者获胜;如果一方爆另一方没爆,则没爆者获胜;如果双方都爆,则爆的少的人(点数超过21点较少者)获胜。
牌点计算方式:牌面10、J、Q、K均算10点;牌面2-9的点数同数字;花牌A既可以当1点用,也可以当11点用,具体当什么用,由持有花牌者按有利于自己的策略决定,但是计算机裁决程序总是会按最有利于持花牌者的算法自动进行点数计算。
三、课程设计目标1、课题实现的功能目标渐进开发实现21点双人对战和人机对战,并最终实现其类封装和面向对象程序设计。
2、知识应用能力的培养目标通过项目开发、调试、完善的过程,渐进地理解、正误、巩固和掌握基本数据类型的使用和转换、顺序-分支-循环的组合应用、变量声明和引用、函数的定义/声明/调用、数组和指针使用、结构体和类的使用等语法知识,熟练掌握常用测试和调试技术手段,达到理论联系实践、融会贯通的目的。
3、数学建模能力的培养目标随机数产生无重复无遗漏牌张、随机插牌、A牌的用法、计算胜率(在最后的人机对战要用)都涉及一定数学建模和算法设计应用能力,因此在无形中也锻炼了这种能力。
4、软件工程方法论培养目标从项目开发过程体会、理解和自觉应用程序设计和测试的思路及方法。
理解和应用ADT概念和面向对象程序设计思想的由顶向下设计方法,从顶层抽象设计开始,通过过程抽象和数据抽象,逐层分解、渐进推进程序设计实现和测试改进,理顺程序设计和测试完善的思路。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
纸牌游戏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]内的随机数2121,,x ,x y y .计算21,x x 的和SUM1(玩家总点数∑ii x ),21,y y 的和SUM2(庄家总点数∑ii y );同时庄家现出自己的第一张牌1y .第3步 判断1x 的值,若>10,则将其值改为10,并重新计算SUM1.第4步 判断2x 的值,若>10,则将其值改为10,并重新计算SUM1.第5步 判断1y 的值,若>10,则将其值改为10,并重新计算SUM2.第6步 判断2y 的值,若>10,则将其值改为10,并重新计算SUM2.第7步 判断1x 的值是否为1,若等于1将其值改为11,重新计算SUM1,并判断SUM1是否大于21,若大于21则将1x 改为1,并重新计算SUM1,若没有大于21则继续第9步;若x不为1,直接进行1第9步.第8步判断x的值是否为1,若等于1将其值改为11,重新计2算SUM1,并判断SUM1是否大于21,若大于21则将x改为1,并重2新计算SUM1,若没有大于21则继续第10步;若x不为1,直接进行2第10步.第9步判断y的值是否为1,若等于1将其值改为11,重新计1算SUM2,并判断SUM2是否大于21,若大于21则将y改为1,并重1新计算SUM2,若没有大于21则继续第11步;若y不为1,直接进行1第11步.第10步判断y的值是否为1,若等于1将其值改为11,重新2计算SUM2,并判断SUM2是否大于21,若大于21则将y改为1,并2重新计算SUM2,若没有大于21则继续第12步;若y不为1,直接进2行第12步.第11步玩家判断SUM1是否大于等于18或大于庄家第一张牌y的两倍,若是则玩家停止取牌,跳到第14步;若没有则继续取牌,1得到[1,13]内的随机数x,进行第13步.i第12步同第4步和第8步,判断x的值,若>10,则将其值i改为10,并将其值加到SUM1;接着判断x的值是否为1,若,等于1i将其值改为11,重新计算SUM1,并判断SUM1是否大于21,若大于21则将x改为1,并重新计算SUM1,若没有大于21则回到第12步;i若x不为1,直接进行第12步.i第13步庄家判断SUM2是否大于16,若是则庄家不取牌,则跳到第16步;否则庄家取牌,得到[1,13]内的随机数y,进行第i15步.第14步同第6步和第10步,判断y的值,若>10,则将其值i改为10,并将其值加到SUM2;接着判断y的值是否为1,若,等于1i将其值改为11,重新计算SUM1,并判断SUM2是否大于21,若大于21则将y改为1,并重新计算SUM2,若没有大于21则回到第14步;i若y不为1,直接回到第14步.i第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 1if (totw>18)|(totw> (2*pz(1)) )break;else[numw,pw,a]=choose(numw,pw,a);totw=totw+pw(numw);endendwhile 1if (totz>=17)&(totz<=21)break;endif totz<17[numz,pz,a]=choose(numz,pz,a);totz=totz+pz(numz);elseb=0;for i=1:numzif pz(i)==11pz(i)=1;totz=totz-10;b=1;break;endendif b==0break;endendendfprintf('玩家总点数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>totzSCORE=2;else if 21>totw && totw==totzSCORE=0;endendendendendfprintf('玩家得分SCORE=%d\n',SCORE);保存为dian21.m同样edit 建立函数程序choose.m如下function [num,p,a]=choose(num,p,a)while 1m=fix(rand(1)*8)+1;n=fix(rand(1)*13)+1;if a(m,n)==1a(m,n)=0;num=num+1;if n==1if num<21n=11;endendif n>10n=10;endp=[p n];break;endend保存为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:na=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 1if (totw>flag)%|(totw> (2*pz(1)) )break;else[numw,pw,a]=choose(numw,pw,a); totw=totw+pw(numw);endendwhile 1if (totz>=17)&(totz<=21)break;endif totz<17[numz,pz,a]=choose(numz,pz,a); totz=totz+pz(numz);elseb=0;for i=1:numzif pz(i)==11pz(i)=1;totz=totz-10;b=1;break;endendif b==0break;endendend%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==totzSCORE=0;endendendendendSUM=SUM+SCORE;%fprintf('玩家得分SCORE=%d\n',SCORE); endfprintf('玩家得分平均值SCORE=%d\n',SUM/n);保存为dian21.m同样edit建立函数程序choose.m如下:function [num,p,a]=choose(num,p,a)while 1m=fix(rand(1)*8)+1;n=fix(rand(1)*13)+1;if a(m,n)==1a(m,n)=0;num=num+1;if n==1if num<21n=11;endendif n>10n=10;endp=[p n];break;endend保存为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时玩家的平均得分最高。