21点纸牌游戏C++课程设计报告.docx
《21点纸牌游戏C++课程设计报告.docx》由会员分享,可在线阅读,更多相关《21点纸牌游戏C++课程设计报告.docx(23页珍藏版)》请在冰豆网上搜索。
![21点纸牌游戏C++课程设计报告.docx](https://file1.bdocx.com/fileroot1/2023-1/26/0ab8a5e3-abbb-455b-89ee-bfde9515a371/0ab8a5e3-abbb-455b-89ee-bfde9515a3711.gif)
21点纸牌游戏C++课程设计报告
郑州轻工业学院
课程设计报告
课程设计名称:
21点纸牌游戏
课程名称:
面向对象程序设计(C++)
姓名:
谢先斌
院(系):
计算机与通信工程学院
专业班级:
计算机10-1
学号:
541007010144
指导教师:
王秉政、郭锋
成绩:
时间:
2011年12月26日至2011年12月30日
郑州轻工业学院
学生课程设计任务书
一、题目(任选一题)
21点纸牌游戏
公司员工管理系统
二、学生信息
专业计算机科学与技术学号541007010144姓名谢先斌
三、基本要求及约束条件
(一)“21点纸牌游戏”设计
1、需求及内容
21点是一个古老的扑克牌游戏,游戏规则是:
各个参与者设法使自己的牌达到总分21而不超过这个数值。
扑克牌的分值取它们的面值,A充当1分或者11分(由玩家自己选择一种分值),J、Q和K人头牌都是10分。
庄家对付1~7个玩家。
在一局开始时,包括庄家在内的所有参与者都有两张牌。
玩家可以看到它们的所有牌以及总分,而专家有一张牌暂时是隐藏的。
接下来,只要愿意,各个玩家都有机会依次再拿一张牌。
如果某个玩家的总分超过了21(称为“引爆”),那么这个玩家就输了。
在所有玩家都拿了额外的牌后,庄家将显示隐藏的牌。
只有庄家的总分等于或小于16,那么他就必须再拿牌。
如果庄家引爆了,那么还没有引爆的所有玩家都将获胜,引爆的玩家打成平局。
否则,将余下的各玩家的总分与庄家的总分做比较,如果玩家的总分大于庄家的总分,则玩家获胜。
如果二者的总分相同,则玩家与庄家打成平局。
编写程序实现游戏,计算机作为庄家,1~7个人作为普通玩家参与游戏。
游戏程序运行输出如下所示:
2、要点及分析
首先定义表示扑克牌花色与面值的枚举类型,这样程序可读性更强,具体定义如下:
typedefenum
{//扑克牌面值:
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;
typedefenum
{//扑克牌花色:
CLUBS(梅花),DIAMONDS(方块),HEARTS(红桃)和SPADES(黑桃)
CLUBS,DIAMONDS,HEARTS,SPADES
}SuitType;
structCard
{//扑克牌结构体
RankTyperank;//扑克牌面值
SuitTypesuit;//扑克牌花色
};
(二)“公司员工管理系统”设计
1、需求及内容
为了方便对公司员工基本信息进行电子化管理,利用面向对象的程序设计技术实现对员工信息的自动化管理。
系统应能满足如下的需求:
Ø增加员工数据信息
Ø更新员工数据信息
Ø查询员工数据信息
Ø删除员工数据信息
Ø良好的人际交互界面、方便操作
2、要求及要点分析
设计一个虚基类Staff(员工),包括编号、姓名和年龄保护数据成员以及相关的成员函数;由Staff派生出工程师类Engineer包含专业和职称保护数据成员以及相关的成员函数,再由Staff派生出领导类Leader,包括职务和部门保护数据成员以及相关的成员函数;然后由Engineer和Leader类派生出主任工程师类Chairman。
设计一个利用文件处理方式实现对公司人员(包括工程师、领导和主任工程师)进行管理,具有增加数据、更新数据、查询数据、删除数据的功能。
编写程序实现游戏,按照要求实现程序。
游戏程序运行输出如下所示:
四、难度分析及目标
该课题涉及到面向对象程序设计技术,难度适中,工作量适中。
该次课程设计的总体目标是培养学生对系统开发总体流程的了解,经过本次课程设计,学生应能对系统开发的步骤和面向对象程序设计的思路有较好的理解和掌握。
五、设计要求、技术参数及设计规格
1、设计的系统能够运行,提交压缩程序;
2、提交课程设计报告,按“课程设计报告要求”撰写
3、程序设计环境为VisualC++6.0和WindosXP或Windows2000。
4、所有的设计工作需要同学自己真实地、独立地完成。
六、工作量
日期
任务描述
2011.12.26
查找相应资料、阅读程序;写出“21点纸牌”游戏或“公司员工管理系统”等的需求分析、算法整体设计
2011.12.26
根据算法思想,完成算法整体设计描述整个游戏流程,设计相关程序的类(基类或派生类),编写程序
2011.12.28
程序代码的设计与实现
2011.12.28
程序代码的设计与实现、测试
2011.12.30
完成课程设计文档书写、作品成绩评定
七、考核形式、考核时间、考核指标及成绩评定
课程设计成绩由下面构成:
课程设计纪律、课程设计态度和平时表现占20%;课程设计结果占50%;课程设计报告占30%。
考核形式:
1)老师每日对学生的考察、评估和考核;2)最后对课程设计项目完成的质量进行考核和验收。
完成期限:
2011年12月30日
指导教师签章:
王秉政、郭锋
专业负责人签章:
教学院长签章:
年月日
一、需求说明
21点纸牌游戏是一个很具有使用价值的扑克牌小游戏。
首先,要从21点游戏的古老的起源说起,21点小游戏的起源与民间,其主要是用于打发人们休闲使用,茶钱饭后经常看到人们在玩。
再次,21点游戏也是能满足人们赌性心理的一款首选游戏,且所需条件简单只需一副扑克牌而已,易于被人们接受。
综上,编写21点游戏的前途是十分光明的,其应用空间又是十分宽广的。
当今计算机已经在全国大部分地区得到了广泛的普及,为满足人们对21点纸牌游戏的软件使用需求,21点游戏的软件开发又是一件十分急迫又有前景的开发。
随着社会的发展科技的进步,计算机的应用在社会各领域中都得到了普及。
越来越多的人都感受到利用计算机来玩各种游戏的快捷,且更能满足人们消耗业余时间的心理。
21点游戏是一款典型的纸牌游戏,其使用面积极广,应用人说极多,界面要求低,是一款不错的上机编写程序实例。
它要方便的实现玩家通过界面来控制游戏的是否要牌,是否开始新游戏等一系列操作。
总体任务是实现了21点游戏的的系统化﹑规范化和自动化。
二、功能描述
21点纸牌游戏最多允许7位玩家,在开始时每一位玩家都先发两张牌,只有庄家的第一张牌隐藏,其余的牌都是明着的,接下来,只要愿意,各个玩家都有机会依次再拿一张牌。
如果某个玩家的总分超过了21(称为“引爆”),那么这个玩家就输了。
在所有玩家都拿了额外的牌后,庄家将显示隐藏的牌。
只有庄家的总分等于或小于16,那么他就必须再拿牌。
如果庄家引爆了,那么还没有引爆的所有玩家都将获胜,引爆的玩家打成平局。
否则,将余下的各玩家的总分与庄家的总分做比较,如果玩家的总分大于庄家的总分,则玩家获胜。
如果二者的总分相同,则玩家与庄家打成平局。
三、系统设计及实现
软件规格要求合理,基于C++程序设计,通过类与对象的编写,最终在有限空间达到效果最优化。
2.1设计要求
用C++实现“21点游戏系统”。
2.2系统功能:
(1)系统启动后,出现欢迎界面,满足人机交互的命令行设计。
(2)能实现基本信息的输入与游戏开始分开。
开始时输入参加游戏的人数(1~7人),单击回车后进入按要求依次输入玩家的姓名。
(3)能实现开始后显示每一个玩家的牌点大小,当然庄家的首张牌是隐藏的。
(4)能实现决定是否要继续发牌。
。
通过(y,n)?
问题选项的提问与回答,来完成是否继续发牌的游戏要求
(5)能实现自主完成庄家的发牌与显示最终大小工作。
通过所有玩家都已决定是否要发牌后,最终可以完成对庄家的是否发牌和显示最终牌点大小。
(6)能实现系统自动比较大小,并通过界面最终显示到屏幕上。
(7)能实现在一次游戏结束后询问是否要进行下一次的游戏。
(8)能实现在游戏结束后提示游戏结束界面。
2.3系统性能:
(1)时间特性需求
在网络连接正常的情况下,查询响应时间为秒级。
(2)灵活性
可以自主控制玩家的个数,及让玩家有足够的自主选择全来决定是否要牌和进行下一盘游戏。
(3)可用性
软件应该尽可能的一目了然,使一般用户能够使用。
(4)安全性
本游戏不会出现安全问题,所有程序代码不会被360,金山,qq关键等判为危险程序。
(5)可维护性
(6)应用程序的维护
当用户使用本套职工信息系统软件时,遇到了软件本身的逻辑错误时,应当有软件的维护人员对软件进行修改。
(7)可转移、可转换性
VisualStudio及C编程语言的兼容性很高,在windows95/98.WindowsNT.windows2000.windowsXP等操作系统都可以直接运行。
输入项:
用户通过软件输入必要的信息,然后保存到数据到内存,所输入的信息是经过需求分析限定的内容。
输出项:
本游戏信息系统软件会将所有需要浏览的数据显示在屏幕上,以便使玩家能够清晰的看到自己的操作。
算法:
1)将用户输入的数据,将数据存放到数组中。
2)将数组中的数据,提取到用户界面中。
3)按条件依次填入数组中的数据。
4)按条件选择执行。
注释设计:
尽可能的将软件中插入注释语句,使语句功能明了。
制作的时候应该制作两分,一份是标有注释语句的代码,用来给维护人员、测试人员和开发人员了解开发过程所用,另一份是不带有注释语句的代码,用来最后实际应用当中,这样可以充分的利用有限的时间,降低客户的计算机打开系统功能的时间,提高客户的使用速度。
限制条件:
限制必要的条件,以排除由于用户的误操作造成不必要的错误。
测试计划:
在软件编辑的工作进行当中,测试人员便要开始制定测试计划,主要通过大量的重复测试来达到测试软件的目的。
3.1设计思路和管理框架
(1)思路:
通过类,数组的应用搭建子函数,通过main函数调用各个分模块实现系统的主要功能。
(2)管理框架流程图:
功能实现模块图
(1)录入信息,玩家人数及姓名。
(2)录入后,系统自动发牌,并显示庄家(第一张牌隐藏)及各个玩家的牌点大小及总点数。
(3)依次询问玩家是否要牌,并y决定要牌,你n决定不要牌。
如果哪一位玩家总点数超过21点,玩家引爆。
(4)所有玩家输入完后,则会显示输赢信息,表示一盘游戏结束。
(5)输入y表示继续下一盘游戏,n则停止游戏。
3.2各功能模块
1.交互式菜单
开始系统自动进入用户操作界面。
2.输入玩家人数
输入有多少人参加游戏,然后依次输入玩家姓名,之后熊、通会自动开始游戏并显示每一位玩家的信息。
3.玩家决定是否要牌
按照提示信息,填写y/n,决定是否要牌,完成后系统自动显示输赢,并询问是否下一盘游戏。
4.继续下一盘游戏
输入y后,系统进入下一盘游戏,询问参加游戏人数,其他信息同2-3步骤。
5.继续游戏
根据提示继续下一盘游戏游戏。
6.退出游戏
输入n,将退出游戏。
四、课程设计心得
通过这次课程设计,我真正的明白了什么是计算机的软件的开发及软件开发的整个过程,并更加深刻的体会到作为当代大学生的我们就应该体会到学以致用的重要价值。
课程设计期间,虽说时间极短,但其中能学到的知识不仅仅能满足我对软件开发的好奇,更重要的是让我第一次看到了从入大学到现在一年半来对所学知识的应用与收获,可谓是受益匪浅。
这几天的学习所学到的知识正是这一年对C++学习一个全面覆盖与整体回顾,也加深了我对C++知识的理解,积累了软件开发的宝贵经验,相信在以后的学习中我定能够汲取今天的经验铺垫明天的殿堂。
从入学第一学期接触到C语言,到C#在到今天的C++,每一次的学习都各有侧重点。
C++给我最大的感触就是他对面向对象的设计,通过我对封装、多态、继承的一步一步深入地了解,使我对所学的计算机编程有了一个更加深入的认识。
这次的实习更是给了我一次上机检验的机会,通过编写一次21点游戏的机会窥视整个编程世界的灵魂。
在这次课程设计之前我对软件项目没有一点眉目,只是在河科大的同学那里接触到一些他们的软件作品。
终于在这次的上机实习中扣开了我编些实用软件的大门,激发了我的软件开发的乐趣。
21点游戏是一个古老的纸牌游戏,其开发过程的整体规划是一件很重要的工作。
以前总以为只要掌握了对C++的基本知识就可以满足未来对就业的需求,但这次我错了。
经历了这次课程设计,让我明白一个完整的项目所要的基本步骤并不是想象中的那么简单。
从软件的需求到系统的布局等一项项功能的具体实现,在通过对所学类的一次次的应用及理解的不断加深,每一步都要经过自己的不懈努力并感受着收获的快乐。
在最后的界面的整体设计上,我更是体会到与老师同学交流的重要性。
更进一步的了解到以后要维持一个团队团结的重要性。
虽说这次界面设计是现学现用,但在其中更是给自己不少启发,使我明白在以后的工作中所遇到的每一件事物并不是自己所熟悉的,因此我们就应该加强对新知识的接受理解应用的能力。
自己的能力总是有限的,在今后的生活中我要加强与同学老师的交流,懂得分享的重要性,并从中进一步加强对团结的理解。
最后,我应该感谢老师同学的指导与帮助及学院提供的这次难得的实习机会。
五、附录(代码)
//GameOf21Point.h
#include
#defineLEN_OF_MAX_NAME21
typedefenum
{
//扑克牌面值:
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;
typedefenum
{
//扑克牌的花色:
CAUBS(梅花),DIAMONDS(方块),HEARTS(红桃),SPADES(黑桃)
CLUBS,DIAMONDS,HEARTS,SPADES
}SuitType;
structCard
{
RankTyperank;
SuitTypesuit;
};
classGameOf21Point
{
private:
Cardd[52];
intdealPos;
Cardhands[8][21];
intnumOfCard[8];
charname[8][LEN_OF_MAX_NAME];
intnumOfPlayer;
voidShuffle();
intGetTotalScore(Cardhand[21],intn);
voidShowStatus(intnum,boolhideFirstCardAndTotalScore=false);
CardDealOneCard()
{
returnd[dealPos++];
}
public:
GameOf21Point();
virtual~GameOf21Point()
{
};
voidGame();
};
//GameOf21Point.cpp
#include
#include
#include
#include
#include"GameOf21Point.h"
ostream&operator<<(ostream&o,constCard&c)
{
if(c.suit==CLUBS)
o<<"梅花";
elseif(c.suit==DIAMONDS)
o<<"方块";
elseif(c.suit==HEARTS)
o<<"红桃";
elseif(c.suit==SPADES)
o<<"KING";
if(c.rank==ACE)
o<<"A";
elseif(c.rank==JACK)
o<<"J";
elseif(c.rank==QUEEN)
o<<"Q";
elseif(c.rank==KING)
o<<"K";
elsecout<<(int)c.rank;
returno;
}
voidGameOf21Point:
:
Shuffle()
{
srand(time(NULL));
for(inti=51;i>0;i--)
{
intpos=rand()%(i+1);
Cardt;
t=d[pos];
d[pos]=d[i];
d[i]=t;
}
}
intGameOf21Point:
:
GetTotalScore(Cardhand[21],intn)
{
intp;
inttotalScore=0;
for(p=0;p{
if(hand[p].rank==ACE)
totalScore+=1;
elseif(hand[p].rank==TEN||hand[p].rank==JACK||hand[p].rank==QUEEN||hand[p].rank==KING)
totalScore+=10;
else
totalScore+=(int)hand[p].rank;
}
for(p=0;p21;p++)
if(hand[p].rank==ACE)
totalScore-=10;
returntotalScore;
}
voidGameOf21Point:
:
ShowStatus(intn,boolhideFirstCardAndTotalScore)
{
cout<<"\t\t"<";
if(hideFirstCardAndTotalScore)
cout<<"<隐藏>";
else
{
if(hands[n][0].suit==CLUBS)
cout<<"梅花";
elseif(hands[n][0].suit==DIAMONDS)
cout<<"方块";
elseif(hands[n][0].suit==HEARTS)
cout<<"红桃";
elseif(hands[n][0].suit==SPADES)
cout<<"黑桃";
if(hands[n][0].rank==ACE)
cout<<"A";
elseif(hands[n][0].rank==JACK)
cout<<"J";
elseif(hands[n][0].rank==QUEEN)
cout<<"Q";
elseif(hands[n][0].rank==KING)
cout<<"K";
else
cout<<(int)hands[n][0].rank;
}
for(inti=1;i{
if(hands[n][i].suit==CLUBS)
cout<<"梅花";
elseif(hands[n][i].suit==DIAMONDS)
cout<<"方块";
elseif(hands[n][i].suit==HEARTS)
cout<<"红桃";
elseif(hands[n][i].suit==SPADES)
cout<<"黑桃";
if(hands[n][i].rank==ACE)
cout<<"A";
elseif(hands[n][i].rank==JACK)
cout<<"J";
elseif(hands[n][i].rank==QUEEN)
cout<<"Q";
elseif(hands[n][i].rank==KING)
cout<<"K";
else
cout<<(int)hands[n][i].rank;
}
if(!
hideFirstCardAndTotalScore)
cout<<"总分数"<cout<if(GetTotalScore(hands[n],numOfCard[n])>21)
cout<<"\t\t"<"<}
GameOf21Point:
:
GameOf21Point()
{
intcurPos=0;
dealPos=0;
inti=0;
for(intsuitpos=0;suitpos<4;suitpos++)
{
for(intrankPos=1;rankPos<=13;rankPos++)
{
d[curPos].suit=(SuitType)suitpos;
d[curPos].rank=(RankType)rankPos;
curPos++;
}
}
cout<cout<<"\t\t\t"<<"21点游戏欢迎您的使用!
"<cout<<"====================================================================="<cout<<"\t\t多少人加入游戏?
<1~7>:
";
cin>>numOfPlayer;
while(numOfPlayer<1||numOfPlayer>7)
{
cout<<"\t\t玩家人数限定在1~7人,请重新输入人数<1~7>:
";
cin>>numOfPlayer;
}
for(i=0;i<=numOfPlayer;i++)
numOfCard[i]=0;
strcpy(name[0],"庄家");
cout<for(i=1;i<=numOfPlayer;i++)
{
cout<<"\t\t输入第"<
";
cin>>name[i];
}
cout<cout<<"\t\t\t\t游戏开始!
"<}
voidGameOf21Point:
:
Game()
{
inti,j;
Shuffle();
for(i=1;i<=2;i++)
{
hands[0][numOfCard[0]]=DealOneCard();
numOfCard[0]++;