实验一 21点纸牌游戏
21点规则与技巧

21点规则与技巧21点是一种非常受欢迎的纸牌游戏,也被称为“blackjack”或“pontoon”,并在全球各地的赌场中广泛流行。
在21点游戏中,玩家的目标是尽量接近或达到等于21点的总数,但不能超过该数。
以下是一些21点的规则和技巧,帮助玩家在游戏中取得更好的结果。
规则:1.21点游戏通常使用一副或多副扑克牌,每副牌中排除了大小王。
2.游戏开始时,每位玩家和庄家(即荷官)将收到两张牌,玩家的牌是明牌,而庄家的一张牌则是暗牌。
3.玩家可以选择要求庄家继续发牌,直到玩家认为自己的点数足够接近21点,或者超过21点导致“爆牌”。
4.玩家可以选择“要牌”来增加点数,或者选择“停牌”保持当前点数。
5. 玩家可以选择“分牌”(split)将一副相同点数的牌分成两副独立的牌,并继续进行游戏。
6.庄家必须在总点数达到17点或更高时“停牌”,并且超过21点时“爆牌”。
技巧:1.熟悉牌的点数:扑克牌的点数可以帮助玩家做出更明智的决策。
例如,点数为J、Q和K的牌都被视为10点,而A可以视为1点或11点,根据玩家的需求决定。
2.计算牌的价值:在决定是否要牌时,玩家应该计算所有手中牌的总和。
记住,如果手中有A,可以根据情况将其视为1点或11点。
例如,如果玩家手中有A和8,可以将A视为11点,总和为19点。
3.考虑庄家的明牌:玩家可以根据庄家的明牌来制定自己的策略。
如果庄家的明牌是7点或更高,那么庄家很可能会继续牌直到超过21点。
因此,如果玩家的总点数较低,可以选择要牌直到接近21点。
4.避免“爆牌”:玩家应该尽量避免超过21点,因为这将导致玩家立即输掉该局游戏。
在选择要牌时,玩家应该根据当前点数和庄家的明牌来做出决策。
5.使用“分牌”策略:如果玩家手中的两张牌点数相同,可以选择“分牌”,将牌分成两副独立的牌并继续游戏。
这样可以增加玩家的机会,因为玩家有机会获得两副更好的牌。
6.使用基本策略表:基本策略表是一个指导玩家如何在各种情况下做出最佳决策的参考工具。
21点游戏策划书3篇

21点游戏策划书3篇篇一21 点游戏策划书一、游戏名称21 点二、游戏类型休闲类扑克牌游戏三、游戏目标玩家需要通过手中的牌和庄家的牌比较大小,尽可能接近 21 点但不超过 21 点,以获得胜利。
四、游戏规则1. 牌面大小:2 至 10 的牌面数字与牌面数值相同,J、Q、K 牌面数值为 10,A 牌面可以是 1 或者 11。
2. 发牌:游戏开始前,玩家和庄家都会收到 2 张牌,玩家的第一张牌会被面朝下放置。
3. 比牌:玩家可以选择查看自己的第二张牌,也可以选择停牌。
如果停牌,玩家的手牌大小将由前两张牌决定。
如果查看第二张牌,玩家需要比较自己的手牌和庄家的手牌大小,决定是否继续要牌或者停牌。
4. 要牌:如果玩家认为自己的手牌不够大,可以选择继续要牌,直到达到停牌或者超过 21 点。
5. 获胜:如果玩家的手牌大小不超过 21 点,并且比庄家的手牌大,那么玩家获胜。
如果玩家的手牌大小超过 21 点,那么玩家输牌。
如果玩家和庄家的手牌大小相同,那么玩家平局。
6. 加倍:玩家可以在游戏开始前选择是否进行加倍。
如果进行加倍,玩家需要支付初始赌注的两倍,并且只有在玩家的手牌不超过 21 点时才能继续要牌。
如果玩家的手牌超过 21 点,那么玩家输牌。
五、游戏流程1. 发牌:游戏开始前,玩家和庄家都会收到 2 张牌,玩家的第一张牌会被面朝下放置。
3. 比牌:玩家可以选择查看自己的第二张牌,也可以选择停牌。
如果停牌,玩家的手牌大小将由前两张牌决定。
如果查看第二张牌,玩家需要比较自己的手牌和庄家的手牌大小,决定是否继续要牌或者停牌。
4. 要牌:如果玩家认为自己的手牌不够大,可以选择继续要牌,直到达到停牌或者超过 21 点。
5. 获胜:如果玩家的手牌大小不超过 21 点,并且比庄家的手牌大,那么玩家获胜。
如果玩家的手牌大小超过 21 点,那么玩家输牌。
如果玩家和庄家的手牌大小相同,那么玩家平局。
6. 结算:如果玩家获胜,将会获得下注金额的相应倍数的奖励。
21点游戏设计范文

21点游戏设计范文21点是一种非常受欢迎的扑克牌游戏,通常由两个或更多个玩家参与。
每个玩家的目标是使手中的牌的点数总和尽可能接近21点,但不能超过21点。
以下是一个关于如何设计一个21点游戏的详细说明。
游戏规则:1.游戏使用一副标准扑克牌,不含大小王。
每张牌的点数为A到K,其中A值1点,J、Q、K值10点。
2.每局游戏开始时,玩家会收到两张面朝上的牌,庄家(计算机或其他玩家)也收到两张牌,其中一张面朝下。
3.玩家可以选择“要牌”或“停牌”。
如果玩家选择“要牌”,则会从牌堆中抽取一张牌并加入手牌,如果点数超过了21点,则玩家输掉这局游戏。
如果玩家选择“停牌”,则庄家会继续向自己的手牌中加牌,直到点数达到17点或超过21点为止。
4.如果玩家的点数超过21点,庄家自动获胜。
如果庄家点数超过21点,玩家获胜。
如果两者都没有超过21点,则点数较靠近21点的一方获胜。
游戏设计:1.游戏界面:设计一个简洁美观的游戏界面,包括牌桌、发牌区和得分区。
牌桌上有两个区域,分别是玩家区和庄家区,用来放置玩家和庄家的手牌。
发牌区用来显示发牌动画和发牌结果。
得分区用来显示当前的得分情况。
2.发牌逻辑:设计一个发牌逻辑,当游戏开始或每局结束后,从牌堆中随机抽取四张扑克牌,两张分别发给玩家和庄家,其中一张庄家的牌面朝下。
同时,在得分区显示当前的得分情况。
3.玩家操作:提供“要牌”和“停牌”两个操作按钮,当玩家点击“要牌”时,从牌堆中抽一张牌并加入玩家手牌,更新得分区的得分情况。
当玩家点击“停牌”时,庄家开始抽牌直到达到17点或超过21点。
4.判断胜负:设计一个胜负判断逻辑,在玩家和庄家都停牌后,比较两者的点数,判断胜负并显示结果。
如果玩家点数超过21点,则庄家获胜;如果庄家点数超过21点,则玩家获胜;如果两者都没有超过21点,则点数较靠近21点的一方获胜。
5.游戏结束后,提供重新开始游戏的选项,可以重新发牌开始新的一局游戏。
这是一个基本的21点游戏设计,你可以根据需要进行进一步的扩展和改进。
C++课程设计21点扑克牌游戏

此程序为21点扑克牌游戏, 玩家一共可以要五张牌, 但假如牌的点数超过21, 则自动出局;在不超过21点的情况下, 玩家与庄家比牌的点数大小, 大者为赢, 相同则为平局。
程序说明:1)将所有的函数与相应的数据封装到类中, 并改写主程序。
使程序简化。
2)程序中一共有13张扑克牌可以随时抽取, 大于10的点数为0.5。
3)超级玩家永远不会输掉, 即超级玩家可以查看下一张牌, 若大于21点, 则可以拒绝, 当然游戏规则上不能泄露这点秘密。
4)超级玩家可以查看下一张牌, 即输入指定的字符串或字符, 然后按规定输入对的密码后才干看自己的和计算机的牌, 并指定下一级牌的点数。
5)每次要牌后可以设定赔率, 即假如开始下的是10元钱的注, 假如牌好, 你可以规定继续下注, 当然不能超过你所有的总钱数。
6)将界面的提醒说明改成中文界面, 界面的解释具体和谐, 可以吸引更多的玩家。
类的封装设计一个类, 将出牌, 下注等的操作包含进去, 玩家和计算机。
均为这个类的对象。
这样, 在玩牌及判断输赢时, 函数只需要用这两个对象的引用做参数即可, 大大简化了函数。
具体的参考的数据结构如下;class CCard{private:int naPip[5]; //一共五张牌int nNumber; //实际发了多少牌int nDollar; //有多少钱int nGamble; //赌注int nWin; //赢局数int nLost; //输局数int nDraw; //平局数public:CCard(); //构造函数, 初始化void FirstPlayTwo(); // 最初两张牌int GetNumber(); //返回牌的张数double GetPip(); //返回点数void DidplayPip(); //依次显示牌面的点数void DidplayPip(int); //除了第一张牌, 依次所有显示牌面点数(针对计算机牌的显示) void TurnPlay(); //出一张牌void Win(); //赢了计算赌注void Lose(); //输了void Draw(); //平局int SetGamblec(int); //设立赌注, 赌本不够返回-1int GetMoney(); //返回钱数void DisplayInfo(); //显示必要的信息char * GetCurrentCard(); //返回当前牌点void DeleteCard(void); //删除当前牌点, 作弊用void ModifyCard(double); //修改当前牌, 作弊用int Addgamble(int); //加赌注};主程序#include<iostream.h>#include<stdlib.h>//fuctionsvoid replay(char &ans); //询问玩家是否再玩一局void hit(int &total); //要一张牌void deal(int &player,int &cpu,int &playerturns,int &cputurns); //为计算机和玩家各发两张牌void BET(int &bet,int &money); //下注void print(int wins,int lose,int draw,int money); //输出最后结果void rules(); //输出游戏规则void results(int player,int cpu,int bet,int &money,int &draw,int &win,int &lose); //判断一局的结果/*diyige*///wait.h begin#include <time.h>#include <stdio.h>void wait(int milli) //暂停, milli 毫秒{clock_t start;start=clock();while( ( clock()-start ) < milli );}//wait.h end#include<iostream.h>#include<stdlib.h>#include<conio.h>#include<time.h>//========================================================= void pause()//暂停, 任按一键继续{cout<<"任按一键继续"<<endl;getch();}//========================================================= int GetInt(int L=0,int H=100){int ent;cout<<"Please Enter A Number Between "<<L<<" and "<<H<<endl;cin>>ent;while((ent<L)||(ent>H)){cout<<"Error"<<endl;cout<<"Value must be between "<<L<< " and "<<H<<endl;cin>>ent;}return(ent);}//========================================================== void sign()//Displays ISAAC SHAFFER{cout<<"This Program Was Written By Isaac Shaffer"<<endl;}//============================================================= int random(long hi,long lo)//This Program Finds A Random Number Between Hi and Low{int ran;srand((unsigned)time(NULL));ran=rand()%(hi-(lo-1))+lo;return(ran);}//utility.h endint main(){int player=0,cpu=0,win=0,lose=0,draw=0,playerturns=0,cputurns=0,money=0,bet; char ans;system("cls"); //执行系统命令, 清屏rules();cout<<"\t\t\t请问是否玩牌:";cin>>ans;if((ans == 'y')||(ans=='Y')) // 检查输入是否为Yes{cout<<"\t\t\t您的赌本为100美元"<<endl;//起始的赌本money=100;cout<<"\t\t\t";pause(); //暂停, 任按一键继续}else{return(0);}do{system("cls");if(money<0) //看看有无赌本{cout<<"对不起, 您没赌本了"<<endl; //若赌本输光, 结束程序return(0);}BET(bet,money); //下注的程序deal(player,cpu,playerturns,cputurns); //给玩家和计算机各发两张牌do{cout<<"\t\t\tWould You Like To Hit or Stay :"; //询问是否要牌cin>>ans;if((ans=='h')||(ans=='H')) //假如玩家要牌{playerturns++; //玩家手中的牌数增长一张if(playerturns>5) //判断玩家手中的牌数是否超过5张{cout<<"\t\t\t你手中的牌不能超过5张牌"; //若超过5张不能继续要牌 }}if((playerturns<6)&&(ans=='h')) //判断是否符合玩家要牌的条件{cout<<endl;hit(player); //调用发牌程序}}while((ans=='h')||(ans=='H')); //继续询问玩家是否要牌for(;(cpu<16)&&(cputurns<6);cputurns++) //计算机开始要牌的条件{cout<<endl;cout<<"\t\t\t计算机要了一张牌"<<endl;hit(cpu); //调用发牌程序}cout<<endl;cout<<endl;cout<<"\t\t\t计算机的牌面为:"<<cpu<<endl; //输出计算机的牌面的总点数cout<<"\t\t\t您的牌面为:"<<player<<endl; //输出玩家的牌面的总点数cout<<endl;results(player,cpu,bet,money,draw,win,lose); //判断输赢replay(ans); //询问是否继续玩牌}while((ans=='y')||(ans=='Y'));print(win,lose,draw,money); //游戏结束, 输出结果cout<<endl;cout<<"\t\t\t\t";return(0);}//---------------------------------------------------------------------------------------void rules() //游戏规则{cout<<"\t\t WELCOME TO ISAAC SHAFFER'S BLACK JACK GAME"<<endl;cout<<"\t\t\t HERE ARE SOME SIMPLE RULES"<<endl;cout<<"\t\t\t1:You Can only have a max of 5 cards."<<endl;cout<<"\t\t\t2:If you bust you automatically lose."<<endl;cout<<"\t\t\t3:If you win you win double what you bet."<<endl;cout<<"\t\t\t4:The Dealer stops at or after 16."<<endl;cout<<"\t\t\t\t";pause();}//---------------------------------------------------------------------------------------- void BET(int &bet,int &money) //接受玩家下注{system("cls");cout<<"\t\t\t您现有的 :$"<<money<<endl;cout<<"\t\t\t您要下的赌注是: ";cin>>bet;if(bet<0){bet=bet*-1;}money=money-bet;}//---------------------------------------------------------------------------------------- void deal(int &player,int &cpu,int &playerturns,int &cputurns)//为计算机和玩家各发两张牌{int playercard1,playercard2,cpucard1,cpucard2;playerturns=2;cputurns=2;playercard1=random(13,1); //取得13与1之间的随机数cout<<"\n\t\t\tDEALING HAND"<<endl;wait(350); //等待350msplayercard2=random(13,1);wait(150);cpucard1=random(13,1);wait(350);cpucard2=random(13,1);if(playercard1>=10) //若牌面的点数大于10,按10来计点数{playercard1=10;}if(playercard2>=10){playercard2=10;}if(cpucard1>=10){cpucard1=10;}if(cpucard2>=10){cpucard2=10;}player=playercard1+playercard2; //玩家两张牌的总点数cpu=cpucard1+cpucard2; //计算机两张牌的总点数cout<<"\t\t\t现有您的牌面总数是 :"<<player<<endl;cout<<"["<<playercard1<<"]";cout<<"["<<playercard2<<"]";cout<<endl;cout<<"\t\t\t计算机有一张"<<cpucard1<<" 显示"<<endl; cout<<endl;cout<<"[*] "<<" ["<<cpucard1<<"]"; //计算机隐藏一张牌面}//---------------------------------------------------------------------------------------- void hit(int &total) //要一张牌//This fuction is to deal a card and add it to the total{int card;card=random(13,1);if(card>=10){card=10;}total=total+card; //牌点总数cout<<"\t\t\t牌面是 :"<<card<<endl; //输出牌面cout<<"\t\t\t总的牌面是:"<<total<<endl; //输出总点数}//-----------------------------------------------------------------void results(int player,int cpu,int bet,int &money,int &draw,int &win,int &lose) //判断一局的结果{if(cpu==player) //平局{cout<<"\t\t\t平局"<<endl;draw++;}if(player>21) //玩家超过了21点{cout<<"\t\t\t很遗憾,你输了"<<endl; lose++;}else{if(cpu<player) //玩家赢了{cout<<"\n\t\t\t恭喜你,你赢了"; money=money+(bet*2);win++;}}if(cpu>21) //计算机超过了21点 {cout<<"\t\t\t计算机输了"<<endl; if(player<21){cout<<"\n\t\t\t恭喜你,你赢了";win++;money=money+(bet*2);}}else{if(cpu>player){cout<<"\t\t\t很遗憾,你输了"<<endl;lose++;}}}//----------------------------------------------------------------- void replay(char &ans) //询问玩家是否再玩一局{cout<<"\n\t\t\t您是否想再玩一局:";cin>>ans;}//----------------------------------------------------------------- void print(int wins,int lose,int draw,int money){cout<<"\t\t\t\t赢的次数 :"<<wins<<endl;cout<<"\t\t\t\t输的次数 :"<<lose<<endl;cout<<"\t\t\t\t平的次数 :"<<draw<<endl;cout<<"\t\t\t\t您的赌本 :"<<money<<endl;}尚有。
21点纸牌游戏课程设计报告(李志文)

《高级语言程序设计》课程设计报告设计题目21点纸牌游戏设计专业计算机科学与技术(教育方向)班级06教育班姓名李志文学号0611140522007年6 月4日目录1.设计目标 (2)2.设计思想 (2)3.类及对象设计 (5)4.程序源代码 (6)5.调试记录 (19)6.总结 (22)21点纸牌游戏设计1.课程设计题目描述、要求及设计目标1.1 题目描述一个21点的扑克牌游戏。
本程序取点于手机游戏,游戏规则与手机游戏相同。
玩家一共可以要5张牌,但如果牌的点数超过21,则暴了,自动出局;在不超过21点的情况下,玩家与庄家比牌的点数大小,大者为赢。
1.2 要求及设计目标(1)将所有的函数与相应的数据封装到类中,并改写主程序,使程序简化。
(2)程序中一共有13张扑克牌可以随机抽取,大于10的点数为10,A根据情况点数不同,当前点数小于11时为11点,大于10时则为1点。
(3)要求庄家永远不会暴庄,即庄家可以查看下一张牌,若大于21点,则拒绝,当然,在游戏规则上不能泄露这点秘密。
(4)高级玩家可以查看下一张牌,即按H键,然后按要求输入密码,密码正确可以看牌,并决定是否要牌。
(5)将界面的提示说明全部设计为中文界面,界面的解释详细友好,可以吸引更多的玩家。
2.设计思想本程序设计了一个Game_21类,包含16个类成员函数。
考虑达到更好的封装性,程序所有功能都在类里实现,主函数只调用了一个类的开始成员函数充分体现了类的面向对象编程的优点。
程序中一共有13张扑克牌可以随机抽取,设计了一个random函数实现。
大于10的点数为10,A根据情况点数不同,当前点数小于11时为11点,大于10时则为1点。
用if判断语句控制。
庄家永远不会暴庄,庄家取下一张牌之前先判定取牌后总点数是否会大于21点,大于的话就拒绝取下一张,小于时就继续取牌,在函数中首先随机产生下一张牌,接着用条件语句判定原有点数与新牌的点数之和是否大于21点,然后决定是否取牌。
21点游戏的设计与开发

21点游戏的设计与开发21点是一种非常受欢迎的纸牌游戏,也被称为“黑杰克”。
在这个游戏中,玩家需要与庄家比较点数的大小,但不能超过21点。
现在,我将为你提供一个关于21点游戏的设计与开发的详细说明。
1.游戏规则:-游戏使用一副标准52张扑克牌(不含大小王)。
-游戏开始时,每个玩家和庄家分别发两张牌。
-扑克牌的点数计算方式:-A~10:牌面上的点数。
-J、Q、K:均算作10点。
-A:玩家根据自己的情况判断为1点或11点。
-玩家可以选择"要牌"或者"停牌":-要牌:玩家可以选择继续拿一张牌。
-停牌:玩家结束回合,不再拿牌。
-玩家的目标是使得自己的手牌总点数尽量接近21点,但不能超过21点。
-如果玩家的手牌点数超过21点,则游戏结束,庄家获胜。
-当所有玩家均停牌后,庄家开始发牌,直到手牌点数超过17点为止。
-当庄家手牌点数超过21点时,所有停牌的玩家获胜。
-如果庄家和玩家的手牌点数相同,则为平局。
2.界面设计:-游戏界面应包含以下元素:玩家手牌区域、庄家手牌区域、计分区域、操作按钮区域。
-玩家手牌区域和庄家手牌区域应分别显示当前手牌和点数。
-计分区域应显示玩家和庄家的分数。
-操作按钮区域应包括“要牌”和“停牌”按钮。
3.游戏开发:-使用合适的编程语言和开发工具创建游戏的图形化界面。
-设计一个合适的数据结构来表示扑克牌和玩家的手牌。
-实现游戏的规则逻辑,包括发牌、计算手牌点数、判断游戏胜负等。
-根据玩家的选择更新界面显示和计算分数。
-设计合适的算法来实现庄家的行为,例如在手牌达到17点时停牌。
-在玩家停牌后进行庄家的回合,并进行点数比较与判断胜负。
-在游戏结束后,提供重新开始的选项。
4.测试和调试:-在开发过程中,进行充分的测试和调试,确保游戏逻辑正确且无误。
-可以通过用户反馈来改进游戏的稳定性和性能。
5.添加额外功能:-可以考虑添加一些额外的功能来增加游戏的趣味性,如可选的游戏模式、多个玩家之间的对战等。
C 21点纸牌游戏实践报告

目录第1章软件设计内容 (2)1.1软件达到的目的 (2)1.2软件功能说明 (2)1.2.1功能分析说明图 (3)1.2.2各项功能说明 (4)1.3软件功能的验收标准 (5)第2章软件设计环境与原理 (5)2.1设计环境与模块的划分 (5)2.1.1软件设计环境 (5)2.1.2软件模块的划分 (5)2.2软件设计主要原理 (6)2.2.1采用的主要数据结构类型 (6)2.2.2各个模块之间的调用关系和数据储存格式说明 (6)2.2.3主要流程图 (6)第3章软件的设计过程 (7)3.1各软件模块之间的调用方式 (7)3.2软件中实现各项功能的函数与程序代码 (7)3.3数据保存方式以及格式 (7)第4章设计结果与分析 (7)4.1软件使用结果 (7)总结......................................................................................................................错误!未定义书签。
致谢......................................................................................................................错误!未定义书签。
附录......................................................................................................................错误!未定义书签。
第1章软件设计内容1.1软件达到的目的1、熟悉VC++6.0WIN32工程的创建步骤。
2、掌握windows控制台程序的机制、结构。
3、深刻C++类的定义和对象的使用。
4、重点了解C++程序的多文件组织。
数学建模纸牌游戏21点(蒙特卡罗法)

根据玩家选择,计算此次游戏的输赢情况,并更新赌金 和筹码数。
步骤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
发现最优策略并非一直加牌,而是根据当前牌面和庄家牌面进
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
冰之龙设计实验一21点纸牌游戏专业:软件工程班级:09软工学号:1200911041XX 姓名:XXX实验日期:2010-09-30 实验地点:B102 指导老师:吴景岚一.实验原理“21点”是一个古老的扑克牌游戏,游戏规则是:各个参与者设法使自己的牌达到总分21而不超过这个数值。
扑克牌的分值取它们的面值,A充当1分或者11分(由玩家自己选择一种分值),J.Q和K人头牌都是10分。
二.实验目的庄家对付1到7个玩家。
在一局开始时,包括庄家在内的所有参与者都有两张牌。
玩家可以看到他们的所有牌以及总分,而庄家有一张牌暂时是隐蔽的。
接下来,只有愿意,各个玩家都有机会依次再拿一张牌。
如果某个玩家的总分超过了21(称为“引爆”),那么这个玩家就输了。
在所有玩家都拿了额外的牌后,庄家将显示隐藏的牌。
只要庄家的总分等于或小于16,那么他就必须再拿牌,如果庄家引爆了,那么还没有引爆的所有玩家都将获胜。
引爆的玩家打成平局。
否则,将余下的各玩家的总分与庄家的总分做比较,如果玩家的总分大于庄家的总分,则玩家获胜。
如果二者的总分相同,则玩家与庄家打成平局。
三.实验方法1.首先定义表示扑克牌花色与面值的枚举类型,这样程序可读性更强2.其次,方法Game()用来运行游戏,下面为用伪代码描述的整个游戏的流程:洗牌给庄家和玩家发最初的二张牌隐藏庄家的第一张牌显示庄家和玩家手中的牌依次向玩家发额外的牌显示庄家的第一张牌给庄家发额外的牌if(庄家引爆)没有引爆的玩家人赢引爆的玩家平局elsefor(每个玩家)if(玩家没有引爆且玩家的总分比庄家大) 宣布玩家赢else if(玩家的总分与庄家相等) 宣布平局else 宣布玩家赢四.实验步骤(1)建立工程game_of_21_point(2)将软件包中的utlity.h复制到game_of_21_point文件夹中,并将utility.h加入到工程中。
(3)建立头文件card.h,声明相关用户自定义类型,结构体Card 的运算符 << 进行重载,具体内容如下://文件路径名:game_of_21_point\card.h#ifndef__CARD_H__#define__CARD_H__Typedef enum{ //扑克牌面值:ACE(A),TWO(2)到TEN(10),JACK(J),QUEEN(Q),KING(K)ACK=1,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE,TEN,JACK,QUEEN,KING} RankType;Typedef enum{ //扑克牌花色:(梅花),DIAMONDS(方块),HEARTS(红桃)和SPADES(黑桃)CLUBS,DIAMONDS,HEARTS,SPADES} suitType;Struct card{ //扑克牌结构体RankType rank;suitType suit;};Ostream &operator<<(ostream,const card &card)//操作结果:重载<<运算符{ //输出花色if(card.suit==CLUBS) outStream<< “梅花”;else if(card.suit==DIAMONDS) outStream<<“方块”;else if(card.suit==HEARTS) outStream<<“红桃”;else if(card.suit==SPADES) outStream<<“黑桃”;//输出面值if(card.rank==ACE) outStream<<“A”;else if(card.rank==JACK) outStream<<“J”;else if(card.rank==QUEEN) outStream<<“Q”;else if(card.rank==KING) outStream<<“K”;else cout<<(int)card.rank;return outStream;}#endif(4)建立头文件game_of_21_point.h,声明及实现21点游戏类GameOf21Point.具体内容如下://文件路径名:game_of_21_point\game_of_21_point.h#ifndef__GAME_OF_21_POINT_H__#define__GAME_OF_21_POINT_H__#include“card.h”#define LEN_OF_MAX_NAME 21//21点游戏类 Gameof21point声明Class Gameof21point{ private:Card deck[52];int dealpos;card hands[8][21];int numofcard[8];char name[8][LEN_OF_MAX_NAME];int numofplayer;void shuffle();int GetTotalscore(card hand[21],int n);void showstatus(int num,bool hideFirsrcardAndTotalscore=false);card Dealonecard(){ return deck[dealpos++];}public:Gameof21Point();Virtual~GameOf21Point(){ }Void Game();};GameOf21Point::GameOf21Point(){int curPos=0;for(int suitPos=0;suitPos<4;suitPos++){ deck[curPos].suit=(suitType) suitPos;Deck[curPos].rank=(RankType) rankPos;curPos++;}}cout << “多少人加入游戏?(1~7):”;cin >> numOfPlayer;while(numOfPlayer<1 || numOfPlayer>7){cout << “人数只能在1~7之间,请重新输入人数:”;cin >>numOfPlayer;}dealPos=0;int i;for(i=0;i<numOfPlayer;i++) numOfCard[i]=0;strcpy(name[0],“庄家”);for(i=1;i<numOfPlayer;i++){ cout <<“输入第”<<i<<“位玩家的姓名:”;cin >> name[i];}cout << “游戏开始” << endl;}Void GameOf21Point::Shuffle(){Rand::SetRandSeed();for (int curPos=51;curPos>0;curpos--){int pos=Rand::GetRand(curPos+1);swap (deck[pos],deck[curPos]);}}int GameOf21Point::GetTotalScore(Card hand[21],int n) {int pos;int totalscore=0;for(pos=0;pos<n;pos++){if (hand[pos].rank==ACE totalscore+=11;else if (hand[pos].rank>TEN) totalscore+=10;else totascore+=(int)hand[pos].rank;}for(pos=0;totalscore>21&&pos<n;pos++){ if (hand[pos].rank==ACE) totalscore-=10;}return totalscore;}Void GameOf21Point::showstatus(int num,bool hideFirstcardAndTotalscore){cout << name[num] << “:”;if (hideFirstcardAndTotalscore) cout << “<隐藏>”;else cout << hands[num][0];for (int i=1;i<numOfcard[num];i++)cout << hands[num][i];for(i=1;i<numOfPlayer;i++){if(GetTotalscore(hands[i],numOfcard[i])<=21)cout << name[i] << “,恭喜你,你赢了!” <<endl;else cout << name[i] <<“,哎,你打平局了!”<<endl;}}else{for(i=1;i<=numOfPlayer;i++){ if(GetTotalscore(hand[i],numOfcard[i])<=21&&GetTotalscore(hands[i],numOfcard[i]) >GetTotalscore (hands[0],numOfcard[0]){ cout << name[i] << “,恭喜你,你赢了!” << endl;}elseif(GetTotalscore(hands[i],numOfcard[i])==GetTotalscore(hands[0],numOfcard[0]) { cout << name[i]<< “,唉,你打平局了!” << endl;}else{ cout << name[i] << “,对不起,你输了!” << endl;}}}}#endif(5)建立源程序文件 main.cpp,实现main()函数,具体代码如下:#include“utility.h”#include“game_of_21_point.h”int main(void){do{ GameOf21Point objGame;objGame.Game();if (!hideFirstcardAndTotalscore)cout << “总分值 << GetTotalscore(hands[num],numOfcard[num]);cout << endl;if (GetTotalscore(hands[num],numOfcard[num])>21)cout << name[num]<<“引爆!”<< endl;}Void GameOf21Point::Game(){Shuffle()int i,j;for(i=0;i<2;i++)hands[0][numOfcard[0]++]=DealOneCard();ShowStatus(0,ture);for(i=1;i<=numOfPlayer;i++){for(j=0;j<2;j++)hands[i][numOfcard[i]++]=DealOneCard();ShowStatus(i);}cout << endl;for(i=1;i<numOfPlayer;i++){ cout << name[i] << “,你想再要一张牌吗”;if (UserSaysYes()){ hands[i][numOfcard[i]++]=DealOneCard();ShowStatus(i);}}ShowStatus(0);While (GetTotalscore(hands[0],numOfCard[0])<=16){ hands[0][numOfCard[0]++]=DealOneCard();ShowaStatus(0);}cout << endl;if (GetTotalscore(hands[0],numOfCard[0])>21){ cout << “你想再玩一次吗”;}while (UserSaysYes());syetem(“PAUSE”);return 0;}(6)编译及运行21点游戏五.实验测试与结论测试时,屏幕显示如下:多少人加入游戏?(1~7):2输入第1位玩家的姓名:方超输入第2位玩家的姓名:赵建游戏开始庄家:<隐藏>方块7方超:梅花3 红桃2 总分值5赵建:方块9 红桃10 总分值19方超:你想再要一张牌吗(y,n)?y方超:梅花3 红桃2 黑桃k 总分值15赵建:你想再要一张牌吗(y,n)?n庄家:梅花Q 方块7 总分值17方超:对不起,你输了!赵建:恭喜你,你赢了!你想再玩一次吗(y,n)?n。