1、21点扑克牌游戏21点扑克牌游戏VC+课程设计报告课题名称:21点扑克牌游戏单位:动力工程学院2005级学号:0508190111姓名:田 骏指导教师:张 薇一、 程序功能简介:这是一个21点的扑克牌游戏。玩家一共可以要5张牌,如果牌的点数超过21点则输了,自动出局。在不超过21点的情况下,玩家与庄家比牌的点数大小,大者赢。根据玩家的级别高低,分为“普通玩家”、“高级玩家”、“超级玩家”,不同玩家在游戏中的规则有所不同。二、 程序设计思想: 1)、类的封装 根据程序设计要求,把程序中的函数与数据装到一个类中。因此,定义了类class Ccard,并定义两个构造函数,其中一个为缺省的构造函数。2
2、)、对输入密码是否正确的判断 在判断“高级玩家”、“超级玩家”的成员函数hplayer( )、splayer( )中利用字符串函数中的strcmp(char1 ,char2 )判断密码的正确性。其中char1 为玩家通过成员函数keyword( )输入的密码;char2 为设定的密码。当strcmp( )返回值为0时,char1 与char2 完全以致,hplayer( )、splayer( )返回值1;当strcmp( )返回值为1时,char1 与char2 完全以致,hplayer( )、splayer( )返回值0。3)、对“高级玩家”设计 程序设计要求“高级玩家”在要牌时点数不会超过
3、21点,设计了友元函数Hplayerhit(CCard &b)。通过对玩家对象的引用,实现计算机替“超级玩家”要下一张牌,判断要了下一张牌,总牌点数是否大于21点,并替玩家要牌,这些通过一个if else语句实现。4)、对“超级玩家”的设计 程序设计要求“超级玩家”时,可以看庄家的牌,可以看下一张牌,还可以指定下一张的牌点数。设计了有元函数Splayerhit(CCard &a,CCard &b),通过主函数对玩家对象与庄家对象的引用实现程序要求。a.nTotal为庄家的牌点数。5)、对增加赌注的设计 程序设计要求玩家可以根据牌的情况自行增加赌注。成员函数Addbet( )实现这一功能。通过判
4、断输入的字符确定玩家是否要增加赌注。当玩家加赌注时,判断是否超过了手中有的资金。提示玩家一共下了多少赌注,手中还有剩的资金。6)、对要张数的设计 程序设计要求要牌不能超过5 张。设计了成员数据 playerturns、cputurns,成员函数Playerturns( )、 Cpuhit ( )。玩家每次要牌时playerturns加1。Playerturns( )返回值大于1时,可以继续要牌。Cpuhit ( )实现了计算机的要牌,并限制了计算机要牌数不超过5张。7)、游戏熟赢的判定 设计了友元函数results(CCard &a,CCard &b),通过对庄家与玩家对象的引用,判断玩家、庄
5、家的牌点数是否超过21点,在不超过21 点的情况下,与庄家的总牌点数比较大下,判断一局游戏的书赢。并对类中有关玩家的数据nDollar(赌注资金)、nWin(赢局数)、nLose(输局数)、nDraw;(平局数),进行操作。8)主函数设计思想 程序开始运行,首先建立两个对象 cpu(庄家)、player(玩家),并判断玩家是否要开始游戏。在一局游戏结束后通过do-while语句判断玩家是否继续玩牌。开始游戏后,通过playerFirstplaytwo( ) cpuFirstplaytwo( )为玩家与庄家分别发两张牌。do-while语句判断玩家是否要牌、是否有资格要牌。在do-while语句
6、段中利用if-else-if语句判断玩家的级别,根据不同级别player调用不同函数进行要牌。通过cpu调用Cpuhit ( )完成庄家的要牌。之后程序从do-while程序段跳出,调用results(cpu,player)进行本局游戏胜负的判断。如果玩家不再继续游戏,player调用print( )输出游戏结果。三、 序中主要数据与函数列表:主要数据: int nDollar有多少钱int nWin赢局数 int nLose输局数 int nDraw平局数 double nTotal总的牌点数int nGamble赌注资金 int playerturns玩家牌的张数 int cputurns
7、庄家牌的张数 char str10输入的密码存入该字符串主要函数: CCard(int money) 构造函数CCard( ) 缺省构造函数int random(int hi,int lo) 取两参数之间的随即数,用于随即产生牌点void rules( ) 规则输出void BET( ) 接受玩家第一次下注void Addbet( ) 接受玩家增加赌注void playerFirstplaytwo( ) 为玩家发头两张牌void cpuFirstplaytwo( ) 为庄家发头两张牌void keyword( ) 输入密码程序void hit( ) 普通玩家要一张牌void print( )
8、输出最后结果void replay( ) 询问是否再玩一局int hplayer( ) 判断高级玩家int splayer( ) 判断超级玩家int Playerturns( ) 计算玩家牌的张数void Cpuhit( ) 庄家要牌friend void results(CCard &) 判定一局游戏结果friend void Hplayerhit(CCard &) 高级玩家要牌friend void Splayerhit(CCard &,CCard &) 超级玩家要牌四、程序:#include#include#include#include#include#define H class C
9、Card public: int nDollar;/有多少钱 int nWin;/赢局数 int nLose;/输局数 int nDraw;/平局数 double nTotal;/牌的总点数 int nGamble;/赌注资金 int playerturns;/ 玩家牌的张数 int cputurns;/ 庄家牌的张数 char ans1; char str10;/ 输入的密码存入该字符串CCard(int money,int Draw,int lose,int win)/构造函数 nDollar=money; nDraw=Draw; nLose=lose; nWin=win; /-CCard
10、( ) ; /虚构函数/-int random(int hi,int lo) /取两参数之间的随即数 int ran; srand(unsigned)time(NULL); ran=rand()%(hi-(lo-1)+lo)+lo; return(ran);/-void wait(int milli) /暂停milli秒 clock_t start; start=clock(); while(clock()-start)milli);/-void pause() /暂停,任按一键继续 coutendl; cout任按一键继续endl; getch();/-int begin( )/开头设置 c
11、outans1; if(ans1= y)|(ans1=Y) /检查输入是否为Yes rules( ); coutendl; couttt 你的赌本为$nDollarendl; /起始赌本 pause(); /暂停,任按一键继续 return(1); else return(0); /-int DisplayInfo( ) /有无赌本提示 system(cls); if(nDollar=0) /看看有无赌本 cout对不起,你没赌本了endl; /若赌本输光,结束程序 return(0); return(1);/-void rules( )/规则输出 system(cls); coutendl;
12、 coutendl; cout欢迎进入游戏endl; couttt 规则如下:endl; couttt 你最多只能选五张牌.endl; couttt 大于10点牌按0.5点计算.endl; couttt 如果你输了就自动出局.endl; couttt 如果你胜出将赢得双倍赌注.endl; couttt 电脑将在16点后结束要牌.endl; couttt; pause();/-void BET( )/接受玩家第一次下注 system(cls); cout开始游戏!go-endl; coutendl; cout你现在有 :$nDollarendl; coutnGamble; while(nGamb
13、lenDollar) cout你的钱不够,请重新下注nGamble; nDollar=nDollar-nGamble; cout您一共下注:nGamble 您还有赌注 :$nDollarendl;/-void Addbet( )/接受玩家增加赌注 int gamble; coutans1; if(ans1=y)|(ans1=Y) cout你现在的牌点总数:nTotalendl; cout你现在有赌注 :$nDollargamble; while(gamblenDollar) cout你的钱不够,请重新下注gamble; nGamble=nGamble+gamble; nDollar=nDoll
14、ar-gamble; cout您一共下注:nGamble 您还有赌注 :$nDollarendl; coutendl;/-void playerFirstplaytwo()/为玩家发头最初两张牌 double playercard1,playercard2; playerturns=2; playercard1=random(13,1);/取得13与1之间的随即数 coutntttDEALING HAND10)/若牌面点数大于10,按10 计点数 playercard1=0.5; if(playercard210) playercard2=0.5; nTotal=playercard1+pla
15、yercard2; /玩家的两张牌的总点数coutplayercard1;coutplayercard2;coutendl;cout现在你的牌面的总点数是 :nTotal10) cpucard1=0.5; if(cpucard210) cpucard2=0.5; nTotal=cpucard1+cpucard2; /计算机的两张牌的总点数 coutendl; cout* cpucard1endl; cout计算机有一张cpucard1显示endl;/计算机隐藏一张牌面 coutendl;/-void keyword( )/输入密码程序 char ch; int i=0; cout输入密码,以空
16、格键结束.注意:您只有一次输入密码的机会!endl; cout.flush(); ch=getch(); while(ch!=H) stri+=ch; cout10) card=0.5; nTotal=nTotal+card;/牌点总数 cout下张牌面是:cardendl;/输出牌面 cout总的牌面是: nTotalendl;/输出总点数 coutendl;/-void print( )/输出最后结果 coutendl; coutendl; coutendl; cout您的游戏纪录:endl; coutt赢的次数 :nWinendl; coutt输的次数 :nLoseendl; coutt
17、平局的次数 :nDrawendl; coutt你的赌本 :nDollarendl;/-void replay( )/询问是否再玩一局 coutendl; coutans1;/-int hplayer( )/判断高级玩家 char key10=123; coutans1; if(ans1=y)|(ans1=Y) keyword( ); if(strcmp(str,key)=0) return(1); cout错误密码!endl; return(0);/-int splayer( )/判断超级玩家 char key10=345; coutans1; if(ans1=y)|(ans1=Y) keyw
18、ord( ); if(strcmp(str,key)=0) return(1); cout错误密码!endl; return(0);/-int Playerturns( )/计算玩家牌的张数 playerturns+; /如果玩家要牌 cout你要了playerturns张牌endl; cout=5) /玩家手中的牌数增加一张 cout你手中不能超过5张牌endl;/若超过,则不能继续发牌 wait(500); return(0); return(1);/-void Cpuhit( )/庄家要牌 for(;(nTotal16)&(cputurns5);cputurns+) /计算机开始要牌的条件 wait(200); coutendl; cout计算机要了一张牌10) card=0.5; coutendl; cout现在计算机的总牌点为:a.nTotalendl; cout您的总牌点为:b.nTotalendl; cout下张牌面是:cardendl; coutcard; if(card10) card=0.5; coutendl; cout您要的牌为cardendl; b.nTo
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1