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