21点扑克牌游戏.docx
《21点扑克牌游戏.docx》由会员分享,可在线阅读,更多相关《21点扑克牌游戏.docx(21页珍藏版)》请在冰豆网上搜索。
21点扑克牌游戏
21点扑克牌游戏
VC++课程设计报告
课题名称:
21点扑克牌游戏
单位:
动力工程学院2005级
学号:
0508190111
姓名:
田骏
指导教师:
张薇
一、程序功能简介:
这是一个21点的扑克牌游戏。
玩家一共可以要5张牌,如果牌的点数超过21点则输了,自动出局。
在不超过21点的情况下,玩家与庄家比牌的点数大小,大者赢。
根据玩家的级别高低,分为“普通玩家”、“高级玩家”、“超级玩家”,不同玩家在游戏中的规则有所不同。
二、程序设计思想:
1)、类的封装根据程序设计要求,把程序中的函数与数据
装到一个类中。
因此,定义了类classCcard,并定义
两个构造函数,其中一个为缺省的构造函数。
2)、对输入密码是否正确的判断在判断“高级玩家”、“超级玩家”的成员函数hplayer()、splayer()中利用字符串函数中的strcmp(char1[],char2[])判断密码的正确性。
其中char1[]为玩家通过成员函数keyword()输入的密码;char2[]为设定的密码。
当strcmp()返回值为0时,char1[]与char2[]完全以致,hplayer()、splayer()返回值1;当strcmp()返回值为1时,char1[]与char2[]完全以致,hplayer()、splayer()返回值0。
3)、对“高级玩家”设计程序设计要求“高级玩家”在要牌时点数不会超过21点,设计了友元函数Hplayerhit(CCard&b)。
通过对玩家对象的引用,实现计算机替“超级玩家”要下一张牌,判断要了下一张牌,总牌点数是否大于21点,并替玩家要牌,这些通过一个ifelse语句实现。
4)、对“超级玩家”的设计程序设计要求“超级玩家”时,可以看庄家的牌,可以看下一张牌,还可以指定下一张的牌点数。
设计了有元函数Splayerhit(CCard&a,CCard&b),通过主函数对玩家对象与庄家对象的引用实现程序要求。
a.nTotal为庄家的牌点数。
5)、对增加赌注的设计程序设计要求玩家可以根据牌的情况自行增加赌注。
成员函数Addbet()实现这一功能。
通过判断输入的字符确定玩家是否要增加赌注。
当玩家加赌注时,判断是否超过了手中有的资金。
提示玩家一共下了多少赌注,手中还有剩的资金。
6)、对要张数的设计程序设计要求要牌不能超过5张。
设计了成员数据playerturns、cputurns,成员函数Playerturns()、Cpuhit()。
玩家每次要牌时playerturns加1。
Playerturns()返回值大于1时,可以继续要牌。
Cpuhit()实现了计算机的要牌,并限制了计算机要牌数不超过5张。
7)、游戏熟赢的判定设计了友元函数results(CCard&a,CCard&b),通过对庄家与玩家对象的引用,判断玩家、庄家的牌点数是否超过21点,在不超过21点的情况下,与庄家的总牌点数比较大下,判断一局游戏的书赢。
并对类中有关玩家的数据nDollar(赌注资金)、nWin(赢局数)、nLose(输局数)、nDraw;(平局数),进行操作。
8)主函数设计思想程序开始运行,首先建立两个对象cpu(庄家)、player(玩家),并判断玩家是否要开始游戏。
在一局游戏结束后通过do-while语句判断玩家是否继续玩牌。
开始游戏后,通过playerFirstplaytwo()cpuFirstplaytwo()为玩家与庄家分别发两张牌。
do-while语句判断玩家是否要牌、是否有资格要牌。
在do-while语句段中利用if-else-if语句判断玩家的级别,根据不同级别player调用不同函数进行要牌。
通过cpu调用Cpuhit()完成庄家的要牌。
之后程序从do-while程序段跳出,调用results(cpu,player)进行本局游戏胜负的判断。
如果玩家不再继续游戏,player调用print()输出游戏结果。
三、序中主要数据与函数列表:
主要数据:
intnDollar—有多少钱
intnWin—赢局数
intnLose—输局数
intnDraw—平局数
doublenTotal—总的牌点数
intnGamble—赌注资金
intplayerturns—玩家牌的张数
intcputurns—庄家牌的张数
charstr[10]—输入的密码存入该字符串
主要函数:
CCard(intmoney)构造函数
CCard(){}缺省构造函数
intrandom(inthi,intlo)取两参数之间的随即数,用于随即产生牌点
voidrules()规则输出
voidBET()接受玩家第一次下注
voidAddbet()接受玩家增加赌注
voidplayerFirstplaytwo()为玩家发头两张牌
voidcpuFirstplaytwo()为庄家发头两张牌
voidkeyword()输入密码程序
voidhit()普通玩家要一张牌
voidprint()输出最后结果
voidreplay()询问是否再玩一局
inthplayer()判断高级玩家
intsplayer()判断超级玩家
intPlayerturns()计算玩家牌的张数
voidCpuhit()庄家要牌
friendvoidresults(CCard&)判定一局游戏结果
friendvoidHplayerhit(CCard&)高级玩家要牌
friendvoidSplayerhit(CCard&,CCard&)超级玩家要牌
四、程序:
#include
#include
#include
#include
#include
#defineH''
classCCard
{
public:
intnDollar;//有多少钱
intnWin;//赢局数
intnLose;//输局数
intnDraw;//平局数
doublenTotal;//牌的总点数
intnGamble;//赌注资金
intplayerturns;//玩家牌的张数
intcputurns;//庄家牌的张数
charans1;
charstr[10];//输入的密码存入该字符串
CCard(intmoney,intDraw,intlose,intwin)//构造函数
{nDollar=money;nDraw=Draw;nLose=lose;nWin=win;
}
//-----------------------------------------------------------------------------------------------------
CCard(){};//虚构函数
//----------------------------------------------------------------------------------------------------------
intrandom(inthi,intlo)//取两参数之间的随即数
{intran;
srand((unsigned)time(NULL));
ran=rand()%(hi-(lo-1)+lo)+lo;
return(ran);
}
//-----------------------------------------------------------------------------------------------------------
voidwait(intmilli)//暂停milli秒
{clock_tstart;
start=clock();
while((clock()-start)}
//------------------------------------------------------------------------------------------------------
voidpause()//暂停,任按一键继续
{cout<cout<<"任按一键继续"<getch();
}
//------------------------------------------------------------------------------------------------------
intbegin()//开头设置
{
cout<<"欢迎来到疯狂21点!
您要开始游戏吗?
y/n";
cin>>ans1;
if((ans1=='y')||(ans1=='Y'))//检查输入是否为Yes
{rules();
cout<cout<<"\t\t你的赌本为$"<pause();//暂停,任按一键继续
return
(1);
}
elsereturn(0);
}
//------------------------------------------------------------------------------------------------
intDisplayInfo()//有无赌本提示
{
system("cls");
if(nDollar<=0)//看看有无赌本
{
cout<<"对不起,你没赌本了"<return(0);
}
return
(1);
}
//------------------------------------------------------------------------------------------------
voidrules()//规则输出
{system("cls");
cout<cout<cout<<"欢迎进入游戏"<cout<<"\t\t规则如下:
"<cout<<"\t\t你最多只能选五张牌."<cout<<"\t\t大于10点牌按0.5点计算."<cout<<"\t\t如果你输了就自动出局."<cout<<"\t\t如果你胜出将赢得双倍赌注."<cout<<"\t\t电脑将在16点后结束要牌."<cout<<"\t\t";
pause();
}
//------------------------------------------------------------------------------------------------
voidBET()//接受玩家第一次下注
{
system("cls");
cout<<"开始游戏!
!
!
go------"<cout<cout<<"你现在有:
$"<cout<<"你要下的赌注是:
";
cin>>nGamble;
while(nGamble>nDollar)
{
cout<<"你的钱不够,请重新下注"<cin>>nGamble;}
nDollar=nDollar-nGamble;
cout<<"您一共下注:
"<$"<}
//---------------------------------------------------------------------------------
voidAddbet()//接受玩家增加赌注
{
intgamble;
cout<<"您要加注吗?
y/n.";
cin>>ans1;
if((ans1=='y')||(ans1=='Y'))
{
cout<<"你现在的牌点总数:
"<cout<<"你现在有赌注:
$"<";
cin>>gamble;
while(gamble>nDollar)
{
cout<<"你的钱不够,请重新下注"<cin>>gamble;
}
nGamble=nGamble+gamble;
nDollar=nDollar-gamble;
cout<<"您一共下注:
"<$"<}
cout<}
//------------------------------------------------------------------------------------------------------
voidplayerFirstplaytwo()//为玩家发头最初两张牌
{
doubleplayercard1,playercard2;
playerturns=2;
playercard1=random(13,1);//取得13与1之间的随即数
cout<<"\n\t\t\tDEALINGHAND"<wait(500);
playercard2=random(13,1);
if(playercard1>10)//若牌面点数大于10,按10计点数
{
playercard1=0.5;
}
if(playercard2>10)
{
playercard2=0.5;
}
nTotal=playercard1+playercard2;//玩家的两张牌的总点数
cout<<"["<cout<<"["<cout<cout<<"现在你的牌面的总点数是:
"<}
//-----------------------------------------------------------------------------------------------------------------
voidcpuFirstplaytwo()//为庄家发头两张牌
{
doublecpucard1,cpucard2;
cputurns=2;
cpucard1=random(13,1);
wait(350);//等待350ms
cpucard2=random(13,1);
if(cpucard1>10)
{
cpucard1=0.5;
}
if(cpucard2>10)
{
cpucard2=0.5;
}
nTotal=cpucard1+cpucard2;//计算机的两张牌的总点数
cout<cout<<"[*]"<<"["<cout<<"计算机有一张"<cout<}
//------------------------------------------------------------------------------------------------------
voidkeyword()//输入密码程序
{
charch;
inti=0;
cout<<"输入密码,以空格键结束."<<"注意:
您只有一次输入密码的机会!
!
!
!
"<cout.flush();
ch=getch();
while(ch!
=H)
{
str[i++]=ch;
cout<<'*';
cout.flush();
ch=getch();
}
str[i]=0;
}
//------------------------------------------------------------------------------------------------------
voidhit()//普通玩家要一张牌
{
doublecard;
card=random(13,1);
if(card>10)
{
card=0.5;
}
nTotal=nTotal+card;//牌点总数
cout<<"下张牌面是:
"<<"["<cout<<"总的牌面是:
"<cout<}
//---------------------------------------------------------------------------------------------------------------
voidprint()//输出最后结果
{
cout<cout<cout<cout<<"您的游戏纪录:
"<cout<<"\t赢的次数:
"<cout<<"\t输的次数:
"<cout<<"\t平局的次数:
"<cout<<"\t你的赌本:
"<}
//-----------------------------------------------------------------------------------------------
voidreplay()//询问是否再玩一局
{cout<cout<<"你是否想再玩一局?
y/n.";
cin>>ans1;
}
//------------------------------------------------------------------------------------------------------
inthplayer()//判断高级玩家
{charkey[10]="123";
cout<<"您是高级玩家吗?
y/n.";
cin>>ans1;
if((ans1=='y')||(ans1=='Y'))
{keyword();
if(strcmp(str,key)==0)
return
(1);
cout<<"错误密码!
"<}
return(0);
}
//------------------------------------------------------------------------------------------------
intsplayer()//判断超级玩家
{
charkey[10]="345";
cout<<"您是超级玩家吗?
y/n.";
cin>>ans1;
if((ans1=='y')||(ans1=='Y'))
{keyword();
if(strcmp(str,key)==0)
return
(1);
cout<<"错误密码!
"<}
return(0);
}
//--------------------------------------------------------------------------------------------------
intPlayerturns()//计算玩家牌的张数
{
playerturns++;//如果玩家要牌
cout<<"你要了"<cout<if(playerturns>=5)//玩家手中的牌数增加一张
{
cout<<"你手中不能超过5张牌"<wait(500);
return(0);
}
return
(1);
}
//------------------------------------------------------------------------------------------------
voidCpuhit()//庄家要牌
{
for(;(nTotal<16)&&(cputurns<5);cputurns++)//计算机开始要牌的条件
{wait(200);
cout<cout<<"计算机要了一张牌"<wait(300);
hit();//调用发牌程序
}
}
//------------------------------------------------------------------------------------------------
friendvoidresults(CCard&);//判断一局游戏的结果
friendvoidHplayerhit(CCard&);//高级玩家要牌
friendvoidSplayerhit(CCard&,CCard&);//超级玩家要牌
};
//友元函数如下
//------------------------------------------------------------------------------------------------
voidSplayerhit(CCard&a,CCard&b)//超级玩家要牌
{
doublecard;
card=b.random(13,1);
if(card>10)card=0.5;
cout<cout<<"现在计算机的总牌点为:
"<cout<<"您的总牌点为:
"<cout<<"下张牌面是:
"<<"["<cout<<"您想要什么牌?
请输入牌点数:
";
cin>>card;
if(card>10)card=0.5;
cout<cout<<"您要的牌为"<<"["<b.nTo