《C++》21点扑克牌游戏程序.docx
《《C++》21点扑克牌游戏程序.docx》由会员分享,可在线阅读,更多相关《《C++》21点扑克牌游戏程序.docx(41页珍藏版)》请在冰豆网上搜索。
《C++》21点扑克牌游戏程序
课程设计报告
课程名称C++语言课程设计
课题名称21点扑克牌游戏程序
专业电气工程及其自动化
班级
学号
姓名
指导教师余新宇谌新年郭芳
2009年6月19日
湖南工程学院
课程设计任务书
课程名称C++语言课程设计
课题21点扑克牌游戏程序
专业班级
学生姓名
学号
指导老师余新宇谌新年郭芳
审批
任务书下达日期2009年6月15日
任务完成日期2009年6月19日
任务书
一、设计内容
1、问题描述:
“21点”扑克牌游戏:
编写程序实现游戏,计算机作为庄家,1~4人作为普通玩家参与游戏。
各个参与者设法使自己的牌达到总分21而不超过这个数值。
扑克牌的分值取它们的面值。
A充当1分或11分(由玩家自己选择),其他花牌都是10分。
在一局开始时,包括庄家在内的所有参与者都有两张牌。
玩家可以看到他们的所有牌以及总分,而庄家有一张牌暂时隐藏。
接下来,只要愿意。
各个玩家都有机会依次再拿一张牌。
如果某个玩家的总分超过了21(称为“引爆”),则这个玩家就输了。
在所有玩家都拿了额外的牌后,庄家将显示隐藏的牌。
只要庄家的总分等于或小于16分,那么庄家必须再拿牌。
如果庄家引爆了,那么还没有引爆的所有玩家都将获胜,引爆的玩家达成平局。
否则,将余下的各玩家与庄家的总分做比较,如果玩家的总分大于庄家的总分,则玩家获胜,如果相同,则玩家与庄家达成平局。
2、功能要求:
(1)本系统采用一个包含N个结构的数组,每个数据结构应当包括:
牌的面值,牌的花色,持牌者以及发牌的顺序。
另外还定义了一个结构体用来记录玩家的金钱总额、每局中玩家所押的钱及玩家的战绩。
(2)本系统显示这样的菜单:
a.多少人加入游戏?
b.输入第i位玩家的姓名:
c.你带了多少钱?
d.你押多少钱?
e.你想再要一张牌吗?
f.你想再玩一次吗?
(3)在游戏过程中,程序会按规则提示菜单项。
(4)显示游戏结果。
3、算法提示:
(1)数据结构:
数组,结构体。
(2)数据库结构:
下表构成该系统的基本数据库。
玩家人数
int
玩家姓名
char
牌的面值
int
牌的花色
char
玩家的金钱总数
int
玩家押的金钱数
int
一盘游戏中玩家赢的次数
int
一盘游戏中玩家得平局的次数
int
4、测试数据:
(1)玩家数:
1~4
(2)纸牌数:
13*4-2=52
(3)每个玩家最多发牌数:
21
5、其他
本系统在完成了系统基本功能的实现后,进行了一定的改进:
(1)增加了记录并计算玩家总金钱数的功能,游戏开始前玩家要输入所带来
的金钱数,而且玩家每局都可以自己输入该局想要押的金额,每局结束后,
系统会自动输出各位玩家的余额。
(2)为提高游戏的可行性,系统默认游戏开始时庄家(电脑)的金钱总数
是各玩家金钱数的平均值。
(3)一盘游戏结束,系统会自动显示出该盘游戏中各玩家赢的局数和平局的
局数。
(4)添加了幽默搞笑的输出语言,提高了游戏的趣味性。
(5)修改了输出界面的背景和字体颜色,提高了程序得美观度。
二、设计要求:
1,学生选择并完成一个题目。
要求每个学生能独立思考认真并按时完成本课程设计所包含的所有内容。
2,要求学生必须按照课程设计报告的完整格式说明设计内容,设计任务分析过程和算法,给全部源程序,并做出总结。
3.设计报告的完整格式应包括以下部分的内容:
●课题设计内容与主要功能
●课题分析:
分析课程设计项目的实现方法
●程序实现步骤
●程序测试结果与结论
●程序清单
●总结与体会
三、进度安排
6月15日到6月19日
时间
上午
下午
1-4节(四小时)
5,6,7,8节(四小时)
6月15号
布置课题,题目讲解
上机编程
6月16号
上机编程
6月17号
上机编程
上机编程
附:
课程设计报告装订顺序:
封面、任务书、目录、正文、附件(A4大小的图纸及程序清单)、评分表。
正文的格式:
一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;行距为22。
正文的内容:
一、课题设计内容与主要功能;二、课题分析;分析课程设计项目的实现方法,并写出类声明与核心算法实现代码。
三、主要功能的实现步骤;四、程序测试与结论;应包括课程设计程序的屏幕显示,并加以简单的文字说明。
五、总结;六、附件(所有程序的原代码,要求对程序写出必要的注释)。
1、课题设计内容与主要功能···························
(1)
2、课题分析·································
(1)—(7)
(1)项目实现方法··························
(1)--
(2)
(2)类声明······································(3)
(3)核心算法代实现代码····················(3)--(7)
3、实现步骤··································(7)—(8)
4、测试与结论·······························(9)—(11)
5、总结····································(11)—(12)
6、参考书目········································(12)
7、附件····································(13)—(28)
一、课题设计内容与主要功能
(1)定义一副扑克牌(不包括两个王),四种花色十三个点数共52张牌,游戏过程中系统自动随机从这52张牌中抽牌发给参与者。
(2)将J、Q、K的点数改为10点,A的点数可由系统自动在1和11之间选择最佳的点数。
(3)系统提示输入玩家数(1~4)、玩家姓名以及玩家所带的金钱数。
(4)系统提示各玩家输入所押的金钱数,新的一局开始时可以重新设定押的金钱数。
(5)游戏开始,系统先自动给每位参与者发两张牌,并且隐藏庄家的第一张牌,然后依次询问玩家是否需要继续发牌,玩家输入“Y”,则再发一张牌给该玩家,玩家输入“N”,则跳过该玩家。
(6)当所有玩家都不再要牌,输出玩家总分值、胜负情况,并输出各参与者的余额。
(7)玩家再押钱,新的一局游戏开始。
(8)当有玩家的金钱等于0时,该盘游戏结束,统计各位玩家胜的局数和平局的局数,输出统计结果。
提示玩家是否选择重新再来一盘。
二、课题分析
1、项目实现方法
(1)函数调用关系
(2)游戏过程示意图
2、类声明
classGameOf21Point
{
private:
//数据成员:
Carddeck[52];//一副扑克牌
intdealPos;//发牌位置
Cardhands[4][21];//hand[0]存储庄家手中的牌,hand[1~4]存储玩家手中的牌
intnumOfCard[4];//庄家(numOfCard[0])及玩家(numOfCard[1~4])手中的牌数
charname[4][LEN_OF_MAX_NAME];//庄家与玩家姓名
intnumOfPlayer;//玩家人数
//辅助函数
voidShuffle();//洗牌,将扑克牌混在一起以便产生一种随机的排列
intGetTotalScore(Cardhand[21],intn);//返回一手扑克牌的总分值
voidShowStatus(intnum,boolhideFirstCardAndTotalScore=false);
//显示庄家(对应num=0)或玩家(对应num=1~4)的当前状态
CardDealOneCard(){returndeck[dealPos++];}//发一张扑克牌
public:
//方法声明
GameOf21Point();//无参数的构造函数
virtual~GameOf21Point(){}//析构函数,当一盘游戏结束时,清空数据。
voidGame();//运行游戏
};
3、核心算法及实现代码
(1)枚举结构体
typedefenum
{
A,2,3,4,5,6,7,8,9,10,J,Q,K十三张牌;
}RankType;//扑克牌面值
typedefenum
{
梅花,红桃,黑桃,方块四种花色;
}SuitType;//扑克牌花色
(2)数据结构体
structCard//扑克牌结构体
{
前面枚举的十三张牌的面值;
前面枚举的四种花色;
};
structPlayer//玩家金钱和战绩结构体
{
玩家金钱总数;
玩家押的金钱数;
玩家赢的局数;
玩家打平局的局数;
};
(3)功能函数模块
数据初始化函数GameOf21Point()//初始化扑克牌,各参与者手中的牌数、姓名和金钱等
GameOf21Point:
:
GameOf21Point()
{
当前扑克牌位置在庄家;
for(int牌花色=0;牌花色<4;牌花色++)
{
for(int牌面值=1;牌面值<=13;牌面值++)
{
给curPos位置的牌赋花色;
给curPos位置的牌赋面值;
牌的位置移到下一个;
}
}
输出提示"多少人加入游戏?
(1~4):
";
输入玩家人数;
while(玩家人数小于1或者大于4)
{
输出玩家人数不合格"人数只能在1~4之间,请重新输入人数:
";
重新输入玩家人数;
}
初始化发牌位置,从庄家开始发牌;
定义临时变量i;
for(i=0;i<=玩家人数;i++)
初始化参与者手中的扑克牌数为0;
让庄家name[0]的输出名为“庄家”;
for(i=1;i<=玩家人数;i++)
{
提示输入玩家姓名"输入第"<
";
输入玩家姓名;
提示输入玩家金钱数"你带了多少钱啊?
"<输入玩家金钱数;
}
定义一个变量z等于0;
初始化庄家的金钱为0;
for(i=1;i<=玩家人数;i++)
{
z的值等于所有玩家的金钱之和;
}
定义庄家的金钱数为所有玩家金钱的平均值;
洗牌函数Shuffle()//洗牌,将扑克牌混在一起以便产生一种随机的排列组合
voidGameOf21Point:
:
Shuffle()
{
设置当前时间为随机数种子
for(int牌的位置=51;牌的位置>0;牌的位置--)//产生随机的位置为curPos的扑克牌
{
intpos=Rand:
:
GetRand(牌的位置+1);//生成0~curPos之间的随机数
调用swap()函数;//交换deck[pos]与deck[curPos]
}
}
点数计算函数GetTotalScore()
intGameOf21Point:
:
GetTotalScore(Cardhand[21],intn)//返回一手扑克牌的总分值
{
定义临时变量pos;
初始化总分值为0;
for(pos=0;pos<手中的牌数;pos++)
{
如果手中有张A,总分加11;
如果手中有牌J或Q或K,总分加10;
如果手中的牌是2~10中的,总分加上对应的2~10;
}
for(pos=0;总分大于21且pos<手中的牌数;pos++)
{
如果手中有张A,总分减10;
}
用return返回总分
}
状态显示函数ShowStatus()//显示各玩家手中的牌和总分值
voidGameOf21Point:
:
ShowStatus(int参与者数,boolhideFirstCardAndTotalScore)
{
如果hideFirstCardAndTotalScore为真,隐藏庄家首张牌,输出“不让你看”代替;
否则输出各参与者首张牌;
for(inti=1;i<第num位玩家手中的牌;i++)
输出各参与者手中其他的牌;
如果hideFirstCardAndTotalScore为假;
输出各参与者的总分;
如果第num位玩家的总分大于21;
输出玩家爆了;
}
游戏运行函数Game()//运行游戏
voidGameOf21Point:
:
Game()
{
定义临时变量p和记录局数的变量s;
for(p=1;p<=玩家数;p++)
{
初始化赢局数为0;
初始化平局数为0;
}
定义goto语句的标识符ks,定义s++记录该盘游戏进行的局数;
洗牌;
for(p=1;p<=玩家数;p++)
{
输入玩家押的钱;
当玩家押的钱大于余额;
{
重新输入玩家押的钱;
}
}
定义临时变量i,j;
清零庄家手中的牌;
for(i=1;i<=玩家数;i++)初始化参与者手中的
清零玩家手中的牌;牌和发牌的位置
复位发牌位置到庄家;
for(i=0;i<2;i++)
调用DealOneCard()函数,为庄家发两张牌;
调用ShowStatus()函数,显示庄家的状态,隐藏首张牌和总分值。
for(i=1;i<=玩家数;i++)
{
for(j=0;j<2;j++)
调用DealOneCard()函数,为第i位玩家发两张牌;
调用ShowStatus()函数,显示第i位玩家手中的牌和总分值
}
换行;
for(i=1;i<=玩家数r;i++)
{
定义goto的标识符Pai,问玩家是否继续要牌;
如果玩家输入“Y”;
{
调用DealOneCard()函数,为第i位玩家再发一张牌;
调用ShowStatus(),显示第i位玩家手中的牌;
如果第i位玩家得总分小于21;
{
跳转到标识符Pai;
}
}
}
显示庄家手中的牌和总分;
当庄家的点数不大于16;当庄家的点数不大
{于16,庄家必须
调用DealOneCard()函数,给庄家再发一张牌;再要牌直到大于
显示庄家手中的牌和总分;16并决定不再要牌
}
输出游戏结果余额;
当各参与者都还有钱;
跳转到标识符ks;
当其中有参与者没有钱了;
输出游戏结果、余额和战绩;
}
三、实现步骤
(1)创建card.h头函数
●定义_CARD_H_
●定义牌面值和花色为枚举常量并初始化
typedefenum
{……..
}RankType;
typedefenum
{……….
}SuitType;
●定义一个结构体表示牌面值和花色
StructCard
{
RankTyperank;
SuitTypesuit;
};
(2)创建game_of_21_point.h头函数
●定义_GAME_OF_21_POINT_H_
●包含头函数card.h
●定义结构体表示玩家的金钱数、玩家押的金钱数、玩家赢的局数和玩家平的局数
structPlayer
{
intmoney;
intyq;
intsl;
intpj;
};
●声明类GameOf21Point
●编写实体部分,包含功能函数:
1)GameOf21Point()
2)Shuffle()
3)GetTotalScore(Cardhand[21],intn)
4)ShowStatus(intnum,boolhideFirstCardAndTotalScore)
5)Game()
(3)创建实用程序工具包utility.h
●定义__UTILITY_H__
●包含各类头文件
●包含几个有用的实用函数模块
(4)创建主程序函数main.cpp
●包含utility.h
●包含game_of_21_point.h
●编写main函数主体
{
system("color60");//输出窗口颜色
do
{
GameOf21PointobjGame;//21点游戏对象
objGame.Game();//运行游戏
if(Pla[0].money<=0)
cout<<"………….";
else
cout<<"………";
}while(UserSaysYes());//肯定回符循环,直到得到否定回答为止
system("PAUSE");//调用库函数system()
return0;//返回值0,返回操作系统
}
(5)在vc++6.0环境下运行,进行测试、修改。
四、测试与结论
运行程序得到如下界面
输入玩家数为6,系统提示错误,重新输入2,然后根据系统提示输入相应内容,得下界面:
输入Y,程序继续运行,按照提示输入相应内容,完成一局游戏。
由上图可看到一局游戏的整个过程:
押钱发牌要牌输出结果输出余额。
有一名玩家没钱了,一盘游戏结束,输出统计的战绩。
输入Y可进入新的一盘游戏。
庄家输光了,这盘游戏运行完毕,输出战绩。
输入N,退出游戏。
五、总结
通过此次课程设计,进一步掌握和巩固使用面向对象程序设计语言C++,对面向对象设计程序的设计方法和思想有了一定的了解,初步能应用面向对象设计程序的设计方法及思想解决实际问题的能力;培养了查阅文献资料的好习惯和能力;具备了完成编写任务并对任务加以提升、对程序加以改进的能力。
对系统进行的改进:
(1)增加了记录并计算玩家总金钱数的功能,玩家每局都要输入想要押的金
额。
每局结束,系统自动输出各位玩家的余额。
StructPlayer
{
Intmoney;
Intyq;
……
}
(2)一盘游戏结束,系统会自动输出该盘游戏中各玩家赢的局数和平局的
局数。
StructPlayer
{
……
Intsl;
Intpj;
}
(4)添加了幽默搞笑的输出语句,提高了游戏的趣味性。
如:
“你带了多少钱啊?
”“你这个笨蛋,你已经只有¥_了!
少押点:
”“你这个化生子,你已经把钱输得精光了。
”等。
(5)修改了输出界面的背景和字体颜色,提高了程序得美观度。
同时,还发现许多不足:
1、对以前所学的C++内容遗忘过多,不能灵活地运用C++知识解决问题;
2、独立解决问题的能力不强,无法完全独立完成设计,需要求助于老师同学以及文献资料。
例如:
在设计中参考了许多案例,向同学请教了一些函数的用法;
4、对设计系统界面的知识完全不熟悉,所以在系统界面上没有什么设计,影响了美观度。
参考书目:
吕凤翥《C++语言程序设计教程》——人民邮电出版社
杨路明《C语言程序设计》—— 北京邮电大学出版社
钱能《C++程序设计教程》——清华大学出版社
附件:
附件一:
源代码清单:
main.cpp
#include"utility.h"
#include"game_of_21_point.h"
intmain(void)
{
do
{
GameOf21PointobjGame;
objGame.Game();
if(Pla[0].money<=0)
cout<<"我没钱了,但兄弟我讲义气,还要玩的话我就去拿钱,还玩不玩?
";
else
cout<<"你想回去问妈妈要钱来再玩一次吗?
";
}while(UserSaysYes());
system("PAUSE");
return0;
}
card.h
#ifndef__CARD_H__
#define__CARD_H__
typedefenum
{
ACE=1,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE,TEN,JACK,QUEEN,KING
}RankType;
typedefenum
{
CLUBS,DIAMONDS,HEARTS,SPADES
}SuitType;
structCard
{
RankTyperank;
SuitTypesuit;
};
ostream&operator<<(ostream&outStream,constCard&card)
{
if(card.suit==CLUBS)outStream<elseif(card.suit==DIAMONDS)outStream<elseif(card.suit==HEARTS)outStream<elseif(card.suit==SPADES)outStream<if(card.rank==ACE)outStream<<"A";
elseif(card.rank==JACK)outStream<<"J";
elseif(card.rank==QUEEN)outStream<<"Q";
elseif(card.rank==KING)outStream<<"K";
elsecout<<(int)card.rank;
returnoutStream;
}
#endif
game_of_21_point.h
#ifndef__GAME_OF_21_POINT_H__
#define__GAME_OF_21_POINT_H__
#include"card.h"
#defineLEN_OF_MAX_NAME21
structPlayer
{
intmoney;
intyq;
intsl;
intpj;
};