c++课程设计21点扑克牌游戏.docx
《c++课程设计21点扑克牌游戏.docx》由会员分享,可在线阅读,更多相关《c++课程设计21点扑克牌游戏.docx(17页珍藏版)》请在冰豆网上搜索。
c++课程设计21点扑克牌游戏
福建农林大学计算机与信息学院计算机类
课程设计结果评定
评语:
评分项目
分值
得分
①课程设计报告符合规范
10
②类层次结构图和用例图合理
30
③主要技术路线正确
30
④设计报告条理清晰,重点突出
20
⑤有一定的创新性,难易程度
10
成绩:
指导教师签字:
任务下达日期:
2008年12月日
评定日期:
1课程设计目的……………………………………………………………4
2课程设计要求……………………………………………………………4
3运行环境……………………………………………………………4
4设计内容……………………………………………………………4
4.1程序说明………………………………………………………………………4
4.2设计内容及功能……………………………………………………4
4.3题目分析及算法描述…………………………………………………………5
4.4系统程序流程图及层次模块图………………………………………………6
4.5系统测试………………………………………………………………………6
5总结………………………………………………………………………9
6参考文献…………………………………………………………………9
7源代码………………………………………………………………………9
21点扑克牌游戏
1.课程设计目的
《面向对象程序设计课程设计》是计算机科学与技术专业和软件工程专业集中实践性环节之一,是学习完《面向对象程序设计》课程后进行的一次全面的综合练习。
其目的在于加深对面向对象程序设计中基础理论和基本知识的理解,培养学生的实践能力,促进理论与实践的结合。
通过课程设计,让学生能够熟练运用C++进行面向对象编程,建立对象模型,降低软件的复杂性,改善软件的重用性和维护性,提高软件的生产效率,全面掌握面向对象编程技术。
2.课程设计要求
1、掌握使用一种面向对象程序设计语言如BorlandC++或VisualC++等。
2、培养调查研究、查阅技术文献、资料、手册以及编写技术文献的能力。
3、通过课程设计,要求学生在指导教师的指导下,独立完成实习课题的全部内容,包括:
⑴通过调查研究和上机实习,收集和调查有关技术资料。
⑵掌握设计课题的基本步骤和方法。
⑶根据课题的要求进行上机实验调试。
4、课程设计完成后,提交课程设计报告
3.运行环境
联想计算机,WindowsXP操作系统,MicrosoftVisualC++6.0
4.设计内容
4.1程序说明
该程序是模拟21点扑克牌游戏,玩家最多可以要5张牌,但如果牌的点数之和超过21点,则自动出局;在不超过21点的情况下,玩家与庄家比牌的点数的大小,大者为赢家。
4.2设计内容及功能
(1)将大于10点的点数改为半点(修改点数的类型)。
(2)高级玩家(经理级)可以查看下一张牌,即按H键,然后按要求输入密码,密码正确可以看牌,并决定是否要牌。
(3)超级玩家(总经理级)可以查看庄家(计算机)的所有牌面,并任意输入自己想要的牌,有赢无输,为保密起见,输入自己想要的牌后应立刻屏。
(4)每次要完牌后可以重新设定赔率,只能回流。
也就是说如果牌好,可以加大赌注。
4.3题目分析及算法描述
类classCCard
该程序只需要一个CCard类,其中有表格如下:
classCCard
private:
intm_Pip[5];//一共五张牌
intm_Number;//发了多少张牌
intm_Dollar;//赌本
intm_Gamble;//赌注
intm_Win;//赢局数
intm_Lose;//输局数
intm_Draw;//平局数
public:
CCard();//构造函数。
voidFirstPlayTwo();//最初的两张牌
intGetNumber();//返回牌张
intGetPip();//返回点数
voidDisplayPip();//依次全部显示牌面的点数
voidDisplayPip(int);//除了第一张牌,依次显示全部牌面点数(针对计算机牌的显示)
voidTurnPlay();//出一张牌。
voidWin();//赢了计算赌注
voidLose();//输了
voidDraw();//平局
intSetGamble(int);//设置赌本,赌本不够返回-1
intGetMoney();//返回钱数
voidDisplayInfo();//打印必要的信息
intGetCurrentCard();//返回当前的牌点
4.4系统程序流程图及层次模块图
(1)程序的N-S流程图如下图所示:
初始化随机种子
显示游戏规则
While(chChoice)
判断chChoice,(必须是Y/N)
Y/y
N/y
Do{……}
While(blLogic)
您的选择是明智的,赌博有碍家庭和睦!
欢迎再次使用此程序!
(2)do的模块N-S流程图
输出“您现在有的赌本:
$100”
输出下注的赌本
执行Player.SetGamble(nMoney)
判断If(blLogic)
Y/y
N/y
您的赌本不够,请重新下注!
PlayTurn(cpu,player)
4.5系统测试
(1)运行MicrosoftVisualC++6.0,新建一个工程文件,立即保存在自己建的一个文件夹中,再建一个为21point.cpp。
(2)单击“save”按钮,出现21point.cpp的文件编辑窗口,输入附录的程序代码;再单击“saveall”按钮保存文件。
(3)执行MicrosoftVisualC++快捷菜单中的编译、连接。
(4)21point.cpp文件编译成功,如下图所示:
输入y,回车开始游戏。
如下图所示:
输入赌本10回车。
如下图所示:
输入y,回车。
如下图所示:
输入y,回车后继续游戏。
如下图所示:
当你输入错误的信息的时候如:
1000。
出现如下图:
5.总结
本次课程设计,使我对C++面向对象程序设计有了进一步的认识和掌握。
我设计的这个简单的师生管理系统主要用到了继承和派生、虚继承、switch语句……在设计过程中,我遵循一个指导思想:
先把总的框架设计出来,再在对其中加上再的内容。
千万不要企图在一开始时就解决所有的细节。
边编程,边调试,边扩充。
6.参考文献
[1]谭浩强.C++面向对象程序设计.北京:
清华大学出版社,2006.
[2]谭浩强.C程序设计(第三版).北京:
清华大学出版社,2005.
7.源代码:
#include
#include
#include
usingnamespacestd;
classCCard
{
private:
intm_Pip[5];//一共五张牌
intm_Number;//发了多少张牌
intm_Dollar;//赌本
intm_Gamble;//赌注
intm_Win;//赢局数
intm_Lose;//输局数
intm_Draw;//平局数
public:
CCard();//构造函数。
voidFirstPlayTwo();//最初的两张牌
intGetNumber();//返回牌张
intGetPip();//返回点数
voidDisplayPip();//依次全部显示牌面的点数
voidDisplayPip(int);//除了第一张牌,依次显示全部牌面点数(针对计算机牌的显示)
voidTurnPlay();//出一张牌。
voidWin();//赢了计算赌注
voidLose();//输了
voidDraw();//平局
intSetGamble(int);//设置赌本,赌本不够返回-1
intGetMoney();//返回钱数
voidDisplayInfo();//打印必要的信息
intGetCurrentCard();//返回当前的牌点
};
CCard:
:
GetNumber()
{
returnm_Number;
}
CCard:
:
CCard()//构造函数,初始化
{
m_Number=0;
m_Dollar=100;//初始赌注为100美元
for(inti=0;i<5;i++)
m_Pip[i]=0;
m_Gamble=0;
m_Win=m_Lose=m_Draw=0;
}
intCCard:
:
GetMoney()
{
returnm_Dollar;
}
voidCCard:
:
DisplayInfo()//打印必要的信息
{
cout<<"\n\n\n\t\t\t您一共玩了"<"<cout<<"\n\t\t\t\t您的赌本共计有$"<\n"<}
intCCard:
:
SetGamble(intgamble)
{
if(gamble<0)
{
cout<<"\n输入金额有误"<return-1;
}
if(m_Dollar-gamble<0)
{
cout<<"\n金额不足"<return-1;
}
else
m_Gamble=gamble;
m_Dollar-=gamble;
return0;
}
voidCCard:
:
FirstPlayTwo()//最初两张牌
{
m_Pip[0]=rand()%13+1;
m_Pip[1]=rand()%13+1;
m_Number=2;
}
intCCard:
:
GetPip()
{
intSumPip=0;
for(inti=0;i{
SumPip+=m_Pip[i];
}
returnSumPip;
}
voidCCard:
:
DisplayPip()
{
inti;
for(i=0;i{
cout<}
cout<}
voidCCard:
:
TurnPlay()
{
m_Number++;
m_Pip[m_Number-1]=rand()%13+1;
}
voidCCard:
:
Win()
{
cout<<"赢家牌面:
";
DisplayPip();
cout<<"\n牌面点数:
"<m_Dollar=m_Dollar+2*m_Gamble;
m_Win++;
cout<<"\n赌本:
$"<cout<cout<}
voidCCard:
:
Lose()
{
m_Lose++;
cout<<"\n输家的牌面:
";
DisplayPip();
if(GetPip()>21)
cout<<"\t\t\t\t\t\t\t\t暴了!
"<else
cout<<"牌面点数:
"<cout<<"\n赌本:
$"<cout<}
voidCCard:
:
Draw()
{
m_Draw++;
m_Dollar+=m_Gamble;
cout<<"\n平局牌面:
";
DisplayPip();
if(GetPip()>21)
cout<<"\n暴了!
"<else
cout<<"牌面点数:
"<cout<<"赌本:
$"<cout<}
voidDisplayRule(void)
{
cout<cout<<"\t※※※※※※※※※※欢迎进入21点游戏世界!
※※※※※※※※※※\n\n";
cout<<"\t\t游戏规则:
\n";
cout<cout<<"\t\t1.玩家最多可以要5张牌;\n";
cout<cout<<"\t\t2.如果牌点数的总数超过21点则暴点,自动判数;\n";
cout<cout<<"\t\t3.赢家可得双倍的赌注;\n";
cout<cout<<"\t\t4.计算机方在大于等于16点时不再要牌。
\n";
cout<cout<<"\t※※※※※※※※※※※※※祝您好运!
※※※※※※※※※※\n";
cout<}
voidJudge(CCard&cpu,CCard&player)
{
cout<if((cpu.GetPip()>21&&player.GetPip()>21)||cpu.GetPip()==player.GetPip())
{
cout<<"\n\n\t\t\t\t\t\t\t\t平局!
\n";
cout<<"计算机数据:
\t";
cpu.DisplayPip();
cout<<"牌面点数:
"<cout<<"\n您的数据:
\t";
player.Draw();
cout<}
elseif((cpu.GetPip()>21)||(player.GetPip()>cpu.GetPip()&&player.GetPip()<=21))
{
cout<<"\n\n\n\t\t\t\t\t\t\t\t恭喜您赢了!
\n\n";
cout<<"计算机数据:
\t";
cpu.DisplayPip();
cout<<"牌面点数:
"<cout<<"\n您的数据:
\t";
player.Win();
cout<}
else
{
cout<<"\n\n\t\t\t\t\t\t\t\t很遗憾您输了!
\n";
cout<<"计算机数据:
\t";
cpu.DisplayPip();
cout<<"牌面点数:
"<cout<<"\n您的数据:
\t";
player.Lose();
cout<}
}
voidCCard:
:
DisplayPip(intn)
{
inti;
cout<<"[*]"<<'\t';
for(i=1;icout<cout<}
voidPlayTurn(CCard&cpu,CCard&player)//玩一局
{
charchChoice;
intblCpu=1;//判断是否要牌
intblPlayer=1;
cpu.FirstPlayTwo();//计算机和玩家各要两张牌
player.FirstPlayTwo();
do
{
cout<<"\n您的牌点为:
\t";
player.DisplayPip();
cout<<"\n";
cout<<"您的牌面点数是:
"<cout<<"\n计算机的牌点为:
\t";
cpu.DisplayPip
(1);
if(blPlayer)
{
cout<<"\n\n\t您是否继续要牌(Y/N)?
\t\t\t";
cin>>chChoice;
if((chChoice=='Y'||chChoice=='y'))
{
if(player.GetNumber()<5)
{
player.TurnPlay();
cout<<"\n您要的这张牌是:
"<if(player.GetPip()>21)
blPlayer=0;
}
else
{
cout<<"对不起,您已经要了5张牌,不能再要牌了!
";
blPlayer=0;
}
}
if(chChoice=='n'||chChoice=='N')
blPlayer=0;
}
if(cpu.GetPip()<16&&cpu.GetNumber()<5)
{
cpu.TurnPlay();
cout<<"\n计算机要牌,牌点是:
"<}
else
blCpu=0;
if(blCpu&&player.GetNumber()<5&&player.GetPip()<21)
blPlayer=1;
}while(blCpu||blPlayer);
Judge(cpu,player);
return;
}
intmain()
{
srand((unsigned)time(NULL));//初始化随机数种子
CCardcpu,player;
intblLogic;
intnMoney;//
DisplayRule();//
charchChoice;
cout<<"是否现在开始游戏(Y/N)?
\t\t";
cin>>chChoice;
while(chChoice=='Y'||chChoice=='y')
{
do
{
cout<cout<<"\t\t\t您现在有的赌本:
$"<cout<<"\n\n请下注(赌注不能超过赌本);";
cin>>nMoney;
blLogic=player.SetGamble(nMoney);
if(blLogic)
cout<<"您的赌本不够,请重新下注!
\n";
}while(blLogic);
PlayTurn(cpu,player);//
cout<<"是否继续21点游戏(Y/N)?
\t\t\t";
cin>>chChoice;
}
player.DisplayInfo();
cout<<"\t\t\t您的选择是明智的,赌博有碍家庭和睦!
\n";
cout<<"\n\n\t\t\t\t欢迎再次使用此程序!
"<return0;
}