纸牌游戏21点 数学建模

合集下载

C语言程序设计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点游戏设计

课程设计(大作业)报告课程名称:算法设计与分析设计题目: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点基本策略表_概率及解释说明

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点

数据结构与算法课设-纸牌游戏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点

C++课设21点
void hit3(float &total); //超级玩家要一张牌
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点游戏

软件综合实验报告_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++课设)

模拟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语言课程设计指导书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概念和面向对象程序设计思想的由顶向下设计方法,从顶层抽象设计开始,通过过程抽象和数据抽象,逐层分解、渐进推进程序设计实现和测试改进,理顺程序设计和测试完善的思路。

C++21点游戏设计

C++21点游戏设计

1.1 问题描述本次C++课程设计题目是“21点纸牌游戏”,系统的主要功能是娱乐游戏,有电脑和玩家一起玩这个游戏,玩家设法使自己的牌达到总分21并要比电脑开的点数大而且不超过这个数值。

扑克牌的分值取它们的面值。

J,Q,K 分别是5,6和6分。

1.2 要求分析编写程序实现游戏,该程序是模拟古老的21点扑克牌游戏,实现1对1的人机大战。

要求游戏过程中任意一方牌的点数之和超过21点,则自动出局;在不超过21点的情况下,玩家下注由电脑随机发牌与庄家比累积牌的点数的大小,大者为赢家。

2 总体设计2.1 总体功能框图2.2主要算法流程图3. 详细设计程序流程图。

图2-1 算法流程图3程序清单及注释// 21点游戏.cpp : 定义控制台应用程序的入口点。

//#include "stdafx.h"#include<iostream>#include<math.h>#include<time.h>using namespace std;int x=1;int mima;int rand(int n ); //声明bool win();bool win1();bool win2();//定义变量win为逻辑型变量void money(); //运行赌注int main(){cout<<"\t※※※※※※※※※※欢迎进入21点※※※※※※※※※※\n\n";cout<<"\t\t 游戏规则:\n";cout<<endl;cout<<"\t\t 1.玩家最多可下赌注1~100;\n";cout<<endl;cout<<"\t\t 2.如果牌点数的总数超过21点则暴点,自动判数;\n";cout<<endl;cout<<"\t\t 3.计算机方在大于等于16点时不再要牌。

数学建模-扑克牌问题

数学建模-扑克牌问题

第一章数学建模作业问题重述在扑克牌中任选27张出来,任选一张牌,将这张牌加入牌堆并将此牌堆重洗。

之后将牌依次发成三堆,知晓选中牌在那堆后合起牌堆,重复三次。

要求最后所选牌在特定位置。

一、模型假设与符号说明(1)假设所选牌在牌堆中第n个位置。

(2)假设第一次合牌时,所选牌所在的牌堆从上到下第x个放置(x<=3)。

(3)假设第二次合牌时,所选牌所在的牌堆从上到下第y个放置(y<=3)。

(4)假设第三次合牌时,所选牌所在的牌堆从上到下第z个放置(z<=3)。

二、建立模型第一次操作之后,这张扑克牌在n mod 3 组,第n/3张。

依此类推,每一次操作之后都是这样的规律。

这个魔术的关键在于总牌数是27,每一组都有9张牌。

一开始所选牌的位置是n/3,如果是整数,那么还是n/3,否则结果为(n/3取整数+1)。

第一次分牌堆时牌在n/3处。

第一次合牌时所选牌在(n/3+9(x-1))处。

第二次分牌时所选牌在(n/3+9(x-1))/3处。

第二次合牌时所选牌在((n/3+9(x-1))/3)+9(y-1)处。

第三次分牌时所选牌在(((n/3+9(x-1))/3)+9(y-1))/3处。

第三次合牌时所选牌在(((n/3+9(x-1))/3)+9(y-1)/3)+9(z-1)处。

三、模型求解解方程(((n/3+9(x-1))/3)+9(y-1)/3)+9(z-1)得原式=n/27+(x-1)+3(y-1)+9(z-1)由于n<=27,所以n/27=1由于x<=3,所以(x-1)取值为0,1,2。

由于y<=3,所以(y-1)取值为0,1,2。

由于z<=3,所以(z-1)取值为0,1,2。

由x,y,z取值不同,一共有3*3*3=27种可能,值为1到27。

四、模型评价与分析我次次所做的数学模型所做的变量太多,过程有些繁琐,有些不合心意。

五、模型应用做这个魔术时,当所选幸运数字为1时,可以选择将所选牌所在牌堆在三次合牌时都放在最上方,第一个就是所选牌。

数学建模纸牌游戏21点(蒙特卡罗法)

数学建模纸牌游戏21点(蒙特卡罗法)

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. 停止.
• • • • • • • • •
else if 21>totw && totw==totz SCORE=0; end end end end end fprintf('玩家得分SCORE=%d\n',SCORE); 保存为dian21.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
• 第5步 判断y1的值,若>10,则将其值改 为10,并重新计算SUM2. • 第6步 判断y2的值,若>10,则将其值改 为10,并重新计算SUM2. • 第7步 判断x1的值是否为1,若等于1将其 值改为11,重新计算SUM1,并判断SUM1 是否大于21,若大于21则将x1改为1,并重 新计算SUM1,若没有大于21则继续第9步; 若x1不为1,直接进行第9步.
二.Matlab程序
• • • • • • • • • 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);

数学建模纸牌游戏21点(蒙特卡罗法)

数学建模纸牌游戏21点(蒙特卡罗法)

• 第10步 判断y2的值是否为1,若等于1将 其值改为11,重新计算SUM2,并判断 SUM2是否大于21,若大于21则将y2改为1, 并重新计算SUM2,若没有大于21则继续第 12步;若y2不为1,直接进行第12步. • 第11步 玩家判断SUM1是否大于等于18 或大于庄家第一张牌y1的两倍,若是则玩家 停止取牌,跳到第14步;若没有则继续取 牌,得到[1,13]内的随机数xi,进行第13步.
• • • • • • • • • • • •
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; %玩家总点数
• 第14步 同第6步和第10步,判断yi的值, 若>10,则将其值改为10,并将其值加到 SUM2;接着判断yi的值是否为1,若等于1 将其值改为11,重新计算SUM1,并判断 SUM2是否大于21,若大于21则将yi改为1, 并重新计算SUM2,若没有大于21则回到第 14步;若yi不为1,直接回到第14步. • 第15步 比较SUM1和SUM2的大小, If ( SUM1>21&&SUM2>21) or (SUM1=21&&SUM2=21),则为平局,得 分SCORE=0;
>> dian21 玩家总点数SUM1=15 玩家总点数SUM1=22 玩家得分SCORE=0 >> dian21 玩家总点数SUM1=19 玩家总点数SUM1=19 玩家得分SCORE=0 >> dian21 玩家总点数SUM1=14 玩家总点数SUM1=18 玩家得分SCORE=-2

数学建模纸牌游戏21点(蒙特卡罗法)

数学建模纸牌游戏21点(蒙特卡罗法)
步骤5
根据玩家选择,计算此次游戏的输赢情况,并更新赌金 和筹码数。
步骤6
重复步骤2至5多次(例如10000次),记录每次游戏 的输赢情况。
模拟结果分析
分析1
计算每次游戏的输赢概率。分析庄家和玩家的赢率,了解游戏的 基本策略。
分析2
绘制输赢概率与牌面点数的关系图。了解不同牌面点数对输赢的 影响。
分析3
庄家胜利条件
庄家手中的牌点数超过其他所有玩家手中牌 点数总和时,庄家胜利。
基本策略
01
02
03
保持点数
玩家应尽量让自己的牌点 数接近21点,避免超过21 点。
观察庄家
玩家应密切关注庄家的牌 点数变化,以便调整自己 的策略。
适时加倍
当庄家手中的牌点数较大 时,玩家可以适时加倍自 己的牌点数,以增加获胜 概率。
03
游戏通常使用一副或两副标准的扑克牌,每副牌有52张, 大小顺序为2-A-K-Q-J-10-9-8-7-6-5-4-3。
蒙特卡罗方法简介
蒙特卡罗方法是一种基于随机抽样的数值计算 方法,通过模拟大量随机样本的统计特性来求 解问题。
在21点游戏中,蒙特卡罗方法可以用来模拟玩 家和庄家抽取纸牌的过程,通过计算各种可能 的牌型组合出现的概率来预测游戏结果。
根据胜负分析和赔率调整要牌 和停牌的阈值。
测试与验证
通过模拟大量游戏,测试策略 的有效性。
优化反馈
根据测试结果,持续优化和改 进策略。
06
结论与展望
研究总结
01
成功应用蒙特卡罗方法对21点游戏进行数学建模,通过大量随 机模拟分析游戏策略和胜率。
02
发现最优策略并非一直加牌,而是根据当前牌面和庄家牌面进

纸牌游戏“21点”实验设计报告

纸牌游戏“21点”实验设计报告

湖北第二师范学院《面向对象程序设计》课程设计报告书题目:纸牌游戏——“21点”院系:计算机学院专业:网络工程姓名:李林学号:0850311013同组人员:陈易俊、吴鑫、易龙、张帅指导老师:张琪设计时间:2011年2月26日~2011年3月19日目录一.课程设计目的 (3)二.问题描述 (3)三.需求分析 (4)四.概要设计 (5)4.1系统中类类型定义及系统各类类成员功能说明 (5)4.2 系统各类间关系 (6)五.详细设计 (7)5.1 数据类型定义及伪代码描述 (7)5.2系统主要子程序详细设计(加注释的源程序) (8)六.测试分析 (19)七.技术难点及创新 (19)八.自己完成模块说明 (19)九.源程序清单 (23)一.课程设计目的在Visual C++6.0或者C++ Builder 6.0环境中编译运行纸牌游戏——“21点”,通过编程练习、程序调试、程序纠错等过程训练,真正掌握所学知识、提高编程水平。

二.问题描述“21点”是一个古老的扑克牌游戏,游戏规则是:各个参与者设法使自己的牌达到总分21而不超过这个数值。

扑克牌的分值取它们的面值,A充当1分或者11分(由玩家自己选择一种分值),J.Q和K人头牌都是10分。

庄家对付1到7个玩家。

在一局开始时,包括庄家在内的所有参与者都有两张牌。

玩家可以看到他们的所有牌以及总分,而庄家有一张牌暂时是隐蔽的。

接下来,只有愿意,各个玩家都有机会依次再拿一张牌。

如果某个玩家的总分超过了21(称为“引爆”),那么这个玩家就输了。

在所有玩家都拿了额外的牌后,庄家将显示隐藏的牌。

只要庄家的总分等于或小于16,那么他就必须再拿牌,如果庄家引爆了,那么还没有引爆的所有玩家都将获胜。

引爆的玩家打成平局。

否则,将余下的各玩家的总分与庄家的总分做比较,如果玩家的总分大于庄家的总分,则玩家获胜。

如果二者的总分相同,则玩家与庄家打成平局。

(1)将所有的函数与相应的数据封装到类中,并改写主程序,使程序简化。

纸牌游戏21点-数学建模

纸牌游戏21点-数学建模

纸牌游戏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张)继续玩。

微机程序设计参考——21点扑克游戏设计

微机程序设计参考——21点扑克游戏设计

21点扑克游戏设计21点游戏中,我们想要实现的功能大致有以下几点,具体的扑克21点规则程序(随机的取牌、自动判断是否大于21点、电脑玩家的牌底隐藏)、玩家的赌注程序、游戏的可循环性、将游戏形象在dos 界面简洁的输出、游戏的难度选择设计。

程序框图:成员: 冯麟堡 2012180016 随机数的生成,dos 界面的输出,辅助功能的实现 林康尘 2012180012 取牌条件判断子程序,输赢判断子程序实现,赌注计算 由子程序的调用和宏指令调用完善整个程序。

循环次数 随机数发牌子程序产生ASCII 码 ASCII 码赋予变量并输出循环次数 随机数发牌子程序产生ASCII 码 ASCII 码赋予变量并输出 电脑取牌条件判断 由输入进行条件判断 START输赢判断子程序 赌注计算子程序 屏幕清理 寄存器清理 变量清理不取 大于2 取 大于2程序代码:DA TA SEGMENTN DW 0COMPUTERN DB 0,0,0,0,0,0,0 ;电脑点数数字PLAYERN DB 0,0,0,0,0,0,0 ;玩家点数数字COMPUTERA DB 0,0,0,0,0,0,0 ;电脑点数ASCIII码CHOOSEP DB 0 ;玩家选择变量S_PLAYER DB 'player: $' ;游戏提示字符串S_COMPUTER DB 'computer:$' ;游戏提示字符串S_GAMETIME DB 'your game times:$';游戏次数提示字符串GAMETIME DB '00$' ;游戏次数字符串GAMETIMEN DB 0 ;游戏次数S_CASH DB 'your cash:$' ;游戏现金提示字符串CASH DB '00500$' ;游戏现金字符串CASHN DW 500 ;游戏现金S_BET DB 'your bet:$' ;游戏赌注提示字符串GAMBLE DB 4,0,0,0,0,0 ;游戏赌注变量GAMBLEN DW 0 ;游戏赌注SPA DB ' ','$' ;空格字符串S_CHOOSE DB 'your choose ',40,' ',41,'$' ;游戏提示字符串WIN DB 'Congratulations! YOU WIN!$' ;游戏提示字符串LOSE DB 'YOU LOSE!$' ;游戏提示字符串DRAW DB 'DRAW!$' ;游戏提示字符串S_INPUT DB '!Please input your bet!$' ;游戏提示字符串NOCASH DB 'NO CASH!$' ;游戏提示字符串REPEAT DB 'play again',129,'(Y or N)$' ;游戏提示字符串CARD DB 'take another card or not',129,'(Y or N)$' ;游戏提示字符串SPA1 DB ' $' ;长空格字符串DA TA ENDSSTACK SEGMENT ;堆栈设置STA DB 128 DUP (0)STACK_TOP DB 0STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKPRINT MACRO ;设置光标位置,显示字符串MOV AH,02HINT 10H ;根据dx中的内容设置光标位置MOV AH,09H ;屏幕输出SI指针的字符串MOV DX,SIINT 21HENDMCASHSUM MACRO ;将现金cash数字换算为ascii码LEA SI,CASHMOV AX,CASHN ;AX中保存CASHNMOV DX,0 ;DX清零MOV BX,10000DIV BX ;計算CASHN中的萬分位ADD AL,30HMOV [SI],ALINC SIMOV AX,DXMOV DX,0MOV BX,1000DIV BX ;;計算CASHN中的千分位ADD AL,30HMOV [SI],ALINC SIMOV AX,DXMOV DX,0MOV BX,100DIV BX ;計算CASHN中的百分位ADD AL,30HMOV [SI],ALINC SIMOV AX,DXMOV DX,0MOV BX,10DIV BX ;計算CASHN中的十分位ADD AL,30HMOV [SI],ALADD DL,30HMOV [SI+1],DL ;余数即为CASHN的个位ENDMBETPRINT MACRO ;赌注的显示程序宏MOV AH,02HMOV DX,020CHINT 10HLEA SI,GAMBLEMOV AH,02HMOV DL,[SI+2]INT 21HMOV DL,[SI+3]INT 21HMOV DL,[SI+4]INT 21HENDMSTART:MOV AX,DATA ;数据段初始化MOV DS,AX ;设置数据段MOV AX,STACKMOV SS,AX ;设置堆栈段LEA SP,STACK_TOP ;设置堆栈顶端指针LEA SI,S_GAMETIMEMOV DX,0 ;DH为显示器行位置;DL为显示器列位置PRINT ;显示游戏次数文字LEA SI,GAMETIMEMOV DX,0010HPRINT ;显示游戏次LEA SI,S_BETMOV DX,0203HPRINT ;显示赌注文字LEA SI,S_CASHMOV DX,0017HPRINT ;显示现金文字LEA SI,CASHMOV DX,0021HPRINT ;显示现金LEA SI,S_COMPUTER ;显示computer字符MOV DX,0503HPRINTLEA SI,S_PLAYER ;显示player字符MOV DX,0903HPRINTLEA SI,S_CHOOSEMOV DX,0E03HPRINT ;显示CHOOSE字符串NEW:MOV AH,0 ;初始化玩家选择开关MOV CHOOSEP,AHLEA SI,SPA1 ;利用显示空格字符串进行屏幕清理MOV DX,050EHPRINT ;利用显示空格字符串进行屏幕清理MOV DX,060EHPRINT ;利用显示空格字符串进行屏幕清理MOV DX,090EHPRINT ;利用显示空格字符串进行屏幕清理MOV DX,1005HPRINT ;利用显示空格字符串进行屏幕清理MOV DX,1105HPRINTLEA SI,SPA ;利用显示空格字符串进行屏幕清理MOV DX,020CHPRINTLEA SI,COMPUTERN ;电脑扑克点数清零MOV CX,7COMN0:MOV [SI],0INC SILOOP COMN0LEA SI,PLAYERN ;玩家扑克点数清零MOV CX,7PLAYN0:MOV [SI],0INC SILOOP PLAYN0LEA SI,COMPUTERA ;电脑ASCII码清零MOV CX,7COMA0:MOV [SI],0INC SILOOP COMA0MOV AL,GAMETIMEN ;游戏次数重新计算ADD AL,1MOV GAMETIMEN,ALMOV AH,0SUB AL,0AAA ;游戏次数由十六进制变为十进制ADD AH,30HADD AL,30HLEA SI,GAMETIME ;更改游戏次数字符串MOV [SI],AHMOV [SI+1],ALLEA SI,GAMETIME ;游戏次数屏幕显示MOV DX,0010HPRINTLEA SI,S_INPUT ;显示提示输入赌注字符串MOV DX,1106HPRINTAG1:LEA SI,SPA ;输出空格字符串进行屏幕清理MOV DX,0E10HPRINTLEA SI,GAMBLE ;赌注ASCII清零MOV CX,5RG: MOV [SI+1],0INC SILOOP RGMOV AX,0 ;赌注数清零MOV GAMBLEN,AXMOV DX,0E10H ;设置光标位置到your bet:MOV AH,02HINT 10HMOV AH,0AHLEA SI,GAMBLE ;赌注字符串输入存入GAMBLEMOV DX,SIINT 21HMOV BX,1 ;判断输入个数,非法字符不纳入计算BETNUM:CMP [SI+BX+1],30HJS BETSUMCMP [SI+BX+1],40HJNS BETSUMINC BXJMP BETNUMBETSUM:CMP BX,1 ;对赌注字符串变换为数字JZ CMPCGMOV AL,[SI+BX]SUB AL,30HMOV AH,0ADD GAMBLEN,AX ;个位加入GAMBLENDEC BXCMP BX,1JZ CMPCGMOV DX,10MOV AL,[SI+BX]SUB AL,30HMUL DLADD GAMBLEN,AX ;十位加入GAMBLENDEC BXCMP BX,1JZ CMPCGMOV DX,100MOV AL,[SI+BX]SUB AL,30HMUL DLADD GAMBLEN,AX ;百位加入GAMBLEN CMPCG:MOV AX,CASHNMOV DX,GAMBLENCMP AX,DX ;比较输入的赌注和现金大小JNS F1LEA SI,NOCASH ;显示现金不够的字符串MOV DX,1006HPRINTJMP AG1 ;跳转至赌注输入处F1: SUB AX,DX ;现金减去赌注MOV CASHN,AX ;赋予CASHN现金值CASHSUM ;;将现金cash数字换算为ascii码LEA SI,CASH ;屏幕输出CASHMOV DX,0021HPRINTBETPRINT ;赌注屏幕显示BEGIN:LEA SI,SPA1 ;利用空格字符串进行屏幕清理MOV DX,1105HPRINTMOV DX,1005HPRINTLEA SI,SPAMOV DX,0E10HPRINTLEA SI,COMPUTERALEA DI,COMPUTERNMOV DH,05H ;设置DH为05HCMP CX,2 ;电脑取牌条件判断JS TACALL SUM ;调用点数大小计算子程序CMP AH,17JS TA ;大点数小于17取牌CMP AH,22JS NTA ;大点数小于22不取牌CMP AL,17JS TA ;小点数小于17取牌JMP NTATA: CALL 21P ;调用随机产生21点数子程序ADD DI,CX ;DL为点数大小MOV [DI],DL ;存至COMPUTERNINC DIADD SI,CX ;BL为ascii码MOV [SI],BL ;存至COMPUTERAINC SIMOV AX,1CMP CX,0JZ CNP ;当cx等于0,AX=0使子程序输出*MOV AX,0CNP:CALL 21PRINT ;调用点数屏幕显示子程序JMP GOAHEAD ;跳过取牌判断NTA:MOV AH,CHOOSEP ;若电脑不取牌,判断玩家选择CMP AH,1JZ ADDSTAGE ;玩家也不取牌,进行结果统计GOAHEAD:MOV AH,CHOOSEP ;判断玩家选择CMP AH,0JZ PTAKEC ;若玩家CHOOSEP为0,直接执行电脑取牌判断INC CXJMP BEGINPTAKEC:LEA DI,PLAYERN ;指针指向PLAYERNMOV DH,09HCALL 21P ;调用随机数取21点ADD DI,CX ;DL为点数大小MOV [DI],DL ;存入PLAYERN中INC DIMOV AX,1 ;当AX为1时,21PRINT不输出*CALL 21PRINT ;调用21点数屏幕显示子程序CMP CX,6 ;取牌次数判断JZ ADDSTAGE ;双方最多取7次扑克,跳至结果统计INC CXCMP CX,2 ;至少循环两次,再询问玩家的取牌JS BEGINLEA SI,CARD ;屏幕输出取牌的提示MOV DX,1105HPRINTMOV DX,0E10H ;光标位置确认MOV AH,02HINT 10HMOV AH,01H ;单字符输入INT 21HCMP AL,'N' ;玩家输入'N'则跳转JZ DONOTTAKECMP AL,'n' ;玩家输入'n'则跳转JZ DONOTTAKEJMP BEGINDONOTTAKE: ;玩家不取牌,CHOOSEP赋予1 MOV AH,1MOV CHOOSEP,AHJMP BEGINADDSTAGE:MOV DH,06H ;DH为显示的行数LEA SI,COMPUTERA;结果统计时在下一行输出电脑隐藏扑克MOV N,CX ;重置CX次数MOV CX,0SHOWCARD:MOV AX,1 ;重复重置AXMOV BL,[SI]INC SICALL 21PRINT ;调用21点屏幕输出子程序INC CXCMP CX,NJZ SUMMA TIONJMP SHOWCARDSUMMA TION:LEA DI,PLAYERNCALL SUM ;玩家扑克点数和计算子程序CMP AL,22 ;玩家AL点数大于21点即输掉比赛JNS LOSEPCMP AH,22 ;AH点数小于22点,则使用AH点数JNS EQ1MOV DL,AH ;玩家点数赋予DLJMP PO1EQ1:MOV DL,AL ;玩家点数赋予DLPO1:LEA DI,COMPUTERNCALL SUM ;电脑扑克点数和计算子程序CMP AL,22 ;电脑AL点数大于21点即输掉比赛JNS WINPCMP AH,22 ;AH点数小于22点,则使用AH点数JNS EQ2MOV DH,AH ;电脑点数赋予DHJMP PO2EQ2:MOV DH,AL ;电脑点数赋予DHPO2:CMP DH,DL ;DH与DL比较;电脑点数和与玩家点数和比较JS WINP ;胜负跳转JZ DRAWPJMP LOSEPWINP: ;玩家胜利的情况LEA SI,WIN ;提示胜利的字符串屏幕显示MOV DX,100AHPRINTMOV AX,GAMBLEN ;玩家获得双倍的赌注ADD CASHN,AX ;CASHN加上GAMBLENADD CASHN,AX ;CASHN加上GAMBLENJMP GAMEOVERDRAWP: ;玩家平局LEA SI,DRAW ;提示平局的字符串屏幕显示MOV DX,100AHPRINTMOV AX,GAMBLEN ;赌注还给玩家ADD CASHN,AX ;CASHN加上GAMBLENJMP GAMEOVERLOSEP: ;电脑胜利LEA SI,LOSE ;提示失败的字符串进行屏幕显示MOV DX,100AHPRINTJMP GAMEOVERGAMEOVER:MOV AX,CASHNCASHSUM ;CASH十六进制转换为ASCII码LEA SI,CASH ;对CASH进行屏幕显示MOV DX,0021HPRINTLEA SI,REPEAT ;提示重新游戏进行屏幕显示MOV DX,1106HPRINTLEA SI,SPA ;输出空格进行屏幕清理MOV DX,0E10HPRINTMOV DX,0E10H ;设置光标位置到CHOOSE位置MOV AH,02HINT 10HMOV AH,01H ;单字符输入调用INT 21HCMP AL,'Y' ;输入为'Y'时,重新21点游戏JZ NEWCMP AL,'y' ;输入为'y'时,重新21点游戏JZ NEWMOV AX,4C00HINT 21HSUM PROC ;计算点数总和;输出AL,AH为点数和PUSH CXPUSH DXPUSH DIPUSH BXMOV CX,7MOV AX,0MOV BX,0SUMREPEAT:MOV BH,[DI] ;DI指针指向需要计算点数和的变量ADD AL,BHADD AH,BHCMP BH,01H ;BH为01H时进行A扑克特殊规则计算JNZ SUMOVERCMP BL,1 ;A扑克规则只进行一次JZ SUMOVERMOV BL,1ADD AH,10 ;若牌堆中含A,AH为A为11点时点数和,AL为A作1点时点数和SUMOVER:INC DILOOP SUMREPEATPOP BXPOP DIPOP DXPOP CXRETENDP21PRINT PROC ;ASCII码在屏幕输出,需给出DH行位置,BL输出ASCII PUSH CX ;子程序外调用,ax=0输出'*'PUSH AXMOV DL,0BH ;ASCII码显示初始列位置ADD CX,1MOV AX,4MUL CLADD DL,AL ;根据cx确定正确输出位置MOV AH,02H ;光标位置调用INT 10HPOP AXCMP AX,0 ;判断ax,若为0输出*JNZ PRIMOV AH,02HMOV DL,2AH ;'*'的ASCII码为2AHINT 21HJMP PRINTOVERPRI:MOV AH,02HCMP BL,31H ;判断是否为10的ASCIIJNZ NORMALPRMOV DL,31H ;输出1INT 21HMOV DL,30H ;输出0INT 21HJMP PRINTOVERNORMALPR:MOV DL,BL ;输出其余ASCIIINT 21HPRINTOVER:POP CXRETENDP21P PROC ;随机取数计算成扑克点数PUSH CX ;输出dl为点数大小CALL RAND ;输出bl为ascii大小CMP BL,8JS L1JNZ L2MOV DL,1MOV BL,41H ;AJMP OVERL2: MOV DL,10CMP BL,0BHJNS L3ADD BL,41H ;J/KJMP OVERL3: JNZ L4MOV BL,51H ;QJMP OVERL4: MOV BL,31H ;10JMP OVERL1: MOV DL,BLADD DL,2ADD BL,32H ;2~9OVER:POP CXRET21P ENDPRAND PROC ;随机数产生器PUSH CXPUSH DXPUSH AXSTIMOV AH,0 ;读取时钟计数器数值INT 1AHMOV AX,DXAND AH,0 ;清高位MOV DL,13 ;除以13,产生0~12余数DIV DLMOV BL,AH ;余数存bl,作随机数CLIPOP AXPOP DXPOP CXRETRAND ENDPCODE ENDS程序中的关键功能调用:MOV AH,02HINT 10H功能为设置当前显示光标位置,输入参数有BH=页数,DH=行数,DL=列数MOV AH,00HINT 1AH功能为读取时钟“滴答”计数,出口参数有AL表示是否经过午夜;CX:DX=时钟“滴答”计数通过调用后,读取的计数单位是微秒量级的,即使同样程序多次运行过程,其中输出的DX 都不同,能够很好的实现小范围的随机数设计。

21点详细规则范文

21点详细规则范文

21点详细规则范文21点(Blackjack)是一种非常受欢迎的纸牌游戏,也是在赌场中最常见的游戏之一、本文将详细介绍21点的规则,并提供一些策略和技巧。

21点的目标是使手中的点数总和尽可能地接近或等于21点,但不超过该数值。

如果玩家或庄家的点数超过21点,则被称为“爆牌”(Bust),即该回合的输家。

游戏使用一副或多副扑克牌进行,通常会进行洗牌以增加游戏的公正性。

每种牌的点数为:2-10按牌面点数计算,J、Q、K为10点,A可视为1点或11点,取决于当前手牌的点数总和。

游戏开始时,庄家会派发给玩家两张明牌,自己则一张明牌和一张暗牌(只有庄家可以看见)。

接下来,玩家依次决定是否要再发一张牌(Hit)或停止要牌(Stand)。

如果玩家的第一两张牌的点数总和为21点(即一张A和一张10点牌,如J、Q、K),则称之为“Blackjack”,玩家即刻胜利,除非庄家也是21点。

玩家发牌后,可以选择要牌或停牌。

如果选择要牌,则庄家需要继续发牌,直到自己的点数总和达到17点或更多。

一旦庄家的点数超过21点或达到17点及以上,游戏结束。

除了要牌和停牌之外,还有其他一些游戏选择:1. 分牌(Split):如果庄家发给玩家的前两张牌点数相同(如两张8),则玩家可以选择将两张相同点数的牌分成两手牌。

此时,玩家需要把另一半的下注金额与原来的一样放在新分出来的牌上。

然后,玩家需要依次对每一手牌要牌或停牌,直至两手牌都停牌或爆牌。

2. 双倍下注(Double Down):玩家在发牌后可以选择将原有下注金额的一倍加上,然后只能再要一张牌。

这是一种高风险高回报的策略,在适合的条件下使用,可增加赢得一手牌的概率。

3. 保险(Insurance):如果庄家的明牌是一张A,玩家可以选择购买保险,金额为原下注金额的一半。

如果庄家下一张牌是10点牌而形成Blackjack,则玩家可以获得1:1的赔率。

在进行21点游戏时,除了了解基本的规则之外,还可以考虑使用一些策略和技巧来提高胜率。

实验1 纸牌游戏----“21点”实验步骤

实验1 纸牌游戏----“21点”实验步骤
打开“一 般C++类 向导”对 话框。在
“一般C++ 类向导”对 话框的“类 名”文本框 中输入类名:
GameOf 21Point
9
GameOf21Point类 八、在GameOf21Point类中添加成
员变量----即数据成员 员变量----即数据成员 ---右击类名 GameOf21P oint,弹出快 捷菜单,选择 “添加”快捷 菜单中的“添 加变量”菜单 项,打开“添 加变量”对话 框。
10
GameOf21Point类 九、在GameOf21Point类中添加成
员函数
右击类名 GameOf21P oint,弹出快 捷菜单,选 择“添加” 快捷菜单中 的“添加函 数”菜单项, 打开“添加 函数”对话 框。
11
十、在成员函数的函数体中添加
代码
在类视图中,单击类GameOf21Point左边的“+”号,展开 GameOf21Point类,双击函数SetRandSeed的图标,跳转到 SetRandSeed的函数体,在SetRandSeed的函数体中添加代码。
2
game中 二、在项目:21 points game中 在项目: 添加头文件: 添加头文件:utility.h
选择“项 目”菜单 中的“添 加新项” 菜单命令。 打开“添 加新项” 对话框。
3
三、 在头 文件: 文件: utilit y.h 中添 加代 码
4
game的头文 四、在项目:21 points game的头文 在项目: stdafx.h”中包含文件 中包含文件: 件“stdafx.h 中包含文件:utility.h
数据结构电子教案
实验1 纸牌游戏---实验1 纸牌游戏---“21点 “21点”实验步骤
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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时玩家的平均得分最高。

相关文档
最新文档