C++程序课程设计报告21点游戏Word格式文档下载.docx
- 文档编号:4498037
- 上传时间:2023-05-03
- 格式:DOCX
- 页数:19
- 大小:207.70KB
C++程序课程设计报告21点游戏Word格式文档下载.docx
《C++程序课程设计报告21点游戏Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《C++程序课程设计报告21点游戏Word格式文档下载.docx(19页珍藏版)》请在冰点文库上搜索。
{
//扑克牌面值:
ACE(A),TWO
(2)~TEN(10),JACK(J),QUEEN(Q),KING(K)
ACE=1,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE,TEN,JACK,QUEEN,KING
}RankType;
//扑克牌花色:
CLUBS(梅花),DIAMONDS(方块),HEARTS(红桃)和SPADES(黑桃)
CLUBS,DIAMONDS,HEARTS,SPADES
}SuitType;
structCard
{//扑克牌结构体
RankTyperank;
//扑克牌面值
SuitTypesuit;
//扑克牌花色
};
四、21点游戏类设计
GameOf21Point类
属性成员
变量名
数据类型
意义
Deck[]
Card
一副扑克牌
dealPose
int
发牌位置
Name[][]
char
玩家改姓名
方法成员
函数名
属性
函数功能
Shuffle()
private
洗牌
GetTotalScore()
返回总分值
ShowStatus()
显示当前状态
DealOneCard()
发牌
Game()
public
运行游戏
五、源代码
#ifndef__CARD_H__
#define__CARD_H__
#include<
iostream>
//#include<
stdlib>
usingnamespacestd;
};
ostream&
operator<
<
(ostream&
outStream,constCard&
card)
//操作结果:
重载<
运算符
//输出花色
if(card.suit==CLUBS)outStream<
"
梅花"
;
//CLUBS表示梅花
elseif(card.suit==DIAMONDS)outStream<
方块"
//DIAMONDS表示方块
elseif(card.suit==HEARTS)outStream<
"
红桃"
//HEARTS表示红桃
elseif(card.suit==SPADES)outStream<
黑桃"
//SPADES表示黑桃
//输出面值
if(card.rank==ACE)outStream<
A"
//ACE表示A
elseif(card.rank==JACK)outStream<
J"
//JACK表示J
elseif(card.rank==QUEEN)outStream<
Q"
//JACK表示Q
elseif(card.rank==KING)outStream<
K"
//JACK表示K
elsecout<
(int)card.rank;
returnoutStream;
}
#endif
#ifndef__GAME_OF_21_POINT_H__
#define__GAME_OF_21_POINT_H__
#include"
card.h"
//扑克牌
ctime>
#defineLEN_OF_MAX_NAME21//最大姓名长度
//21点游戏类GameOf21Point声明
classGameOf21Point
private:
Carddeck[52];
//一副扑克牌
intdealPos;
//发牌位置
Cardhands[8][21];
//hand[0]保存庄家的牌,hand[1~7]保存各玩家的牌
intnumOfCard[8];
//庄家(numOfCard[0])及玩家numOfCard[1~7]的牌数
charname[8][LEN_OF_MAX_NAME];
//庄家及玩家姓名
intnumOfPlayer;
voidShuffle();
//洗牌
intGetTotalScore(Cardhand[21],intn);
//返回一手牌的总分值
voidShowStatus(intnum,boolhideFirstCardAndTotalScore=false);
//显示庄家(对应num=0)或玩家(对应num>
0)的当前状态
CardDealOneCard(){returndeck[dealPos++];
}//发一张扑克牌
public:
//方法声明
GameOf21Point();
//无参构造函数
virtual~GameOf21Point(){};
voidGame();
//初始化扑克牌,发牌位置,庄家与各玩家手中的扑克牌数
GameOf21Point:
:
GameOf21Point()
intcurPos=0;
//当前扑克牌位置
for(intsuitPos=0;
suitPos<
4;
suitPos++)//花色
{
for(intrankPos=1;
rankPos<
=13;
rankPos++)//面值
{
deck[curPos].suit=(SuitType)suitPos;
//花色
deck[curPos].rank=(RankType)rankPos;
//面值
curPos++;
}
}
cout<
多少人加入游戏?
(1~7):
cin>
>
numOfPlayer;
while(numOfPlayer<
1||numOfPlayer>
7)//限制人数在1~7之间
cout<
玩家人数限定在1~7个,请重新输入人数:
cin>
dealPos=0;
inti=0;
//临时变量
//庄家numOfCard[0]及玩家numOfCard[1~7]手中的扑克牌张数
for(i=0;
i<
=numOfPlayer;
i++)numOfCard[i]=0;
strcpy(name[0],"
庄家"
);
//玩家姓名
for(i=1;
i++)
输入第"
玩家的姓名"
name[i];
游戏开始"
endl;
//洗牌,通过产生随机数,交换随机数对应位置的牌和当前位置的牌
voidGameOf21Point:
srand((unsigned)time(NULL));
//初始化随机种子
for(intcurPos=51;
curPos>
0;
curPos--)
intpos=rand()%(curPos+1);
//产生0~curPos之间的随机数
Cardtemp;
//定义一个临时变量用于交换牌
temp=deck[pos];
deck[pos]=deck[curPos];
deck[curPos]=temp;
intGameOf21Point:
GetTotalScore(Cardhand[21],intn)
intpos;
inttotalScore=0;
for(pos=0;
pos<
n;
pos++)//循环求最大分值(A的分值为11)
if(hand[pos].rank==ACE)totalScore+=11;
//A的分值为11
elseif(hand[pos].rank>
TEN)totalScore+=10;
//J,Q,K的分值为10
elsetotalScore+=(int)hand[pos].rank;
//TWO~TEN分值为2~10
//分值大于21时,将A的分值改为1
totalScore>
21&
&
pos++)
if(hand[pos].rank==ACE)totalScore-=10;
returntotalScore;
ShowStatus(intnum,boolhideFirstCardAndTotalScore)
//当num=0时,显示庄家当前状态,当num>
0,显示第num个玩家的当前状态,当
//hideFirstCardAndTotalScore为真时,将隐藏首张扑克牌与总分,否则将显示首
//张牌与总分
/*cout<
name[num]<
//显示庄家或玩家姓名
//隐藏庄家首张牌
if(hideFirstCardAndTotalScore)cout<
**庄家首张牌被隐藏**>
hands[num][0];
//显示庄家的首张牌
for(inti=1;
numOfCard[num];
hands[num][i];
if(!
hideFirstCardAndTotalScore)
总分值"
GetTotalScore(hands[num],numOfCard[num]);
if(GetTotalScore(hands[num],numOfCard[num])>
21)
引爆!
//**不使用输出符<
重载时的代码*/
//根据庄家的状态隐藏或显示庄家首张牌的花色
//隐藏首张牌
elseif(hands[num][0].suit==CLUBS)cout<
elseif(hands[num][0].suit==DIAMONDS)cout<
elseif(hands[num][0].suit==HEARTS)cout<
elseif(hands[num][0].suit==SPADES)cout<
//输出庄家首张牌的面值
elseif(hands[num][0].rank==ACE)cout<
elseif(hands[num][0].rank==JACK)cout<
elseif(hands[num][0].rank==QUEEN)cout<
elseif(hands[num][0].rank==KING)cout<
(int)hands[num][0].rank;
if(hands[num][i].suit==CLUBS)cout<
elseif(hands[num][i].suit==DIAMONDS)cout<
elseif(hands[num][i].suit==HEARTS)cout<
elseif(hands[num][i].suit==SPADES)cout<
//输出面值
if(hands[num][i].rank==ACE)cout<
elseif(hands[num][i].rank==JACK)cout<
elseif(hands[num][i].rank==QUEEN)cout<
elseif(hands[num][i].rank==KING)cout<
elsecout<
(int)hands[num][i].rank;
Shuffle();
inti,j;
//为庄家发两张牌
2;
hands[0][numOfCard[0]++]=DealOneCard();
ShowStatus(0,true);
//显示庄家状态,隐藏首张牌与总分
//向各玩家发牌并显示
for(j=0;
j<
j++)
hands[i][numOfCard[i]++]=DealOneCard();
ShowStatus(i);
//依次向各玩家发额外的牌
charAns;
name[i]<
你还想再要一张牌吗?
再要请输入y,不要请输入n:
Ans;
//玩家选择再要一张牌,如果玩家没有引爆则继续发牌
//switch(Ans)
//{
while(Ans!
='
y'
&
Ans!
n'
)
cout<
你的输入不正确,请重新输入。
cin>
while(GetTotalScore(hands[i],numOfCard[i])<
=21&
Ans=='
ShowStatus(i);
//玩家引爆则跳出循环
if(GetTotalScore(hands[i],numOfCard[i])>
21)break;
你想再要一张牌吗?
//}
ShowStatus(0);
//显示庄家
//庄家总分小于等于16,必须再拿牌
while(GetTotalScore(hands[0],numOfCard[0])<
=16)
//为庄家发1张牌
ShowStatus(0);
//庄家引爆,没有引爆的所有人赢
if(GetTotalScore(hands[0],numOfCard[0])>
for(i=1;
{//依次查看每位玩家
if(GetTotalScore(hands[i],numOfCard[i])<
=21)
cout<
恭喜你,你赢了!
//玩家没有引爆
elsecout<
唉,你打平局了!
//玩家引爆
else
{//庄家没有引爆,依次查看每位玩家
{//总分比庄家大
GetTotalScore(hands[i],numOfCard[i])>
GetTotalScore(hands[0],numOfCard[0]))
{//玩家未引爆,且总分比庄家大,玩家赢
恭喜你,你赢了!
}
elseif(GetTotalScore(hands[i],numOfCard[i])==GetTotalScore(hands[0],numOfCard[0]))
{//玩家总分与庄家相等,平局
唉,你打平局了!
else
{//玩家引爆或总分比庄家小,玩家输
对不起,你输了!
game_of_21_point.h"
intmain()
charAgainGame;
do
GameOf21PointobjGame;
//生成21点游戏对象
objGame.Game();
endl<
****你想再玩一次吗,再玩请输入y,退出请输入n:
AgainGame;
}while(AgainGame=='
return0;
六、测试情况
七、
八、小结
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对我们的实际工作能力的具体训练和考察过程.随着科学技术发展的日新月异,当今计算机应用在生活中可以说得是无处不在。
因此作为二十一世纪的大学来说掌握程序开发技术是十分重要的,而C++语言又是最常见,功能最强大的一种高级语言,因此做好C++语言课程设计是十分必要的。
通过几天的课程设计使我们懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次真真的做程序设计,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对一些前面学过的知识理解得不够深刻,掌握得不够牢固,比如说结构体,指针……通过这次课程设计之后,我们把前面所学过的知识又重新温故了一遍。
我做的课程设计,虽然是很简单的一个小的程序,但对我来说却是一个很大的困难。
更加是第一次做课程设计,所以在机房做了一个下午却丝毫没有进展,最主要是不知从何开始,这个时候才知道上课老师们不厌其烦的教导是多么的宝贵,这个时候才后悔上课的时候没有认真的听讲。
可是现在一切都晚了,还好时间还算是充裕,只好拿出书本重新复习一下。
开始的时候真的感觉编程是一件很无聊的事情,不过当一个程序运行成功的时候那种喜悦是无法言语的,那种成就感是无法比拟的。
又经过几天的努力,终于把程序完成了,尽管程序还是有很多功能上的欠缺和漏洞,可我还是很高兴的。
无论如何是自己的劳动成果,是自己经过努力得到的成绩,同时也是学习C++语言的一次实践作业,自己进步的证明。
在课程设计过程中,收获知识,提高能力的同时,我也学到了很多人生的哲理,懂得怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪。
因此在以后的生活和学习的过程中,我一定会把课程设计的精神带到生活中,不畏艰难,勇往直前!
九、参考文献
C程序设计教程谭浩强著清华大学出版社
C++面向对象程序设计陈维兴林小茶编著中国铁道出版社
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 程序 课程设计 报告 21 游戏