21点纸牌游戏 - C++课程设计报告

发布时间:2012-09-25 09:17:35   来源:文档文库   
字号:

郑州轻工业学院

课程设计报告

课程设计名称: 21点纸牌游戏

称: 面向对象程序设计(C++

源代码下载地址:http://pan.baidu.com/share/link?shareid=62566&uk=1930577918

名: 谢先斌

(系): 计算机与通信工程学院

专业班级: 计算机10-1

号: 541007010144

指导教师:

时间:20111226 20111230

郑州轻工业学院

学生课程设计任务书

一、 题目(任选一题)

21点纸牌游戏

公司员工管理系统

二、学生信息

专业 计算机科学与技术 学号 541007010144 姓名 谢先斌

三、基本要求及约束条件

(一)“21点纸牌游戏”设计

1需求及内容

21点是一个古老的扑克牌游戏,游戏规则是:各个参与者设法使自己的牌达到总分21而不超过这个数值。扑克牌的分值取它们的面值,A充当1分或者11分(由玩家自己选择一种分值),JQK人头牌都是10分。家对付1~7个玩家。在一局开始时,包括庄家在内的所有参与者都有两张牌。玩家可以看到它们的所有牌以及总分,而专家有一张牌暂时是隐藏的。接下来,只要愿意,各个玩家都有机会依次再拿一张牌。如果某个玩家的总分超过了21(称为“引爆”),那么这个玩家就输了。在所有玩家都拿了额外的牌后,庄家将显示隐藏的牌。只有庄家的总分等于或小于16,那么他就必须再拿牌。如果庄家引爆了,那么还没有引爆的所有玩家都将获胜,引爆的玩家打成平局。否则,将余下的各玩家的总分与庄家的总分做比较,如果玩家的总分大于庄家的总分,则玩家获胜。如果二者的总分相同,则玩家与庄家打成平局。

编写程序实现游戏,计算机作为庄家,1~7个人作为普通玩家参与游戏。游戏程序运行输出如下所示:

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, JACK, QUEEN, KING

} RankType;

typedef enum

{ // 扑克牌花色:CLUBS(梅花), DIAMONDS(方块), HEARTS(红桃)SPADES(黑桃)

CLUBS, DIAMONDS, HEARTS, SPADES

} SuitType;

struct Card

{ // 扑克牌结构体

RankType rank; // 扑克牌面值

SuitType suit; // 扑克牌花色

};

(二)“公司员工管理系统”设计

1需求及内容

为了方便对公司员工基本信息进行电子化管理,利用面向对象的程序设计技术实现对员工信息的自动化管理。

系统应能满足如下的需求:

增加员工数据信息

更新员工数据信息

查询员工数据信息

删除员工数据信息

良好的人际交互界面、方便操作

2要求及要点分析

设计一个虚基类Staff(员工),包括编号、姓名和年龄保护数据成员以及相关的成员函数;由Staff派生出工程师类Engineer包含专业和职称保护数据成员以及相关的成员函数,再由Staff派生出领导类Leader,包括职务和部门保护数据成员以及相关的成员函数;然后由EngineerLeader类派生出主任工程师类Chairman

设计一个利用文件处理方式实现对公司人员(包括工程师、领导和主任工程师)进行管理,具有增加数据、更新数据、查询数据、删除数据的功能。

编写程序实现游戏,按照要求实现程序。游戏程序运行输出如下所示:

四、难度分析及目标

该课题涉及到面向对象程序设计技术,难度适中,工作量适中。

该次课程设计的总体目标是培养学生对系统开发总体流程的了解,经过本次课程设计,学生应能对系统开发的步骤和面向对象程序设计的思路有较好的理解和掌握。

五、 设计要求、技术参数及设计规格

1、设计的系统能够运行,提交压缩程序;

2、提交课程设计报告,按“课程设计报告要求”撰写

3、程序设计环境为 Visual C++ 6.0WindosXPWindows2000

4、所有的设计工作需要同学自己真实地、独立地完成。

六、工作量

日期

任务描述

2011.12.26

查找相应资料、阅读程序;写出“21点纸牌”游戏或公司员工管理系统”等的需求分析、算法整体设计

2011.12.26

根据算法思想,完成算法整体设计描述整个游戏流程,设计相关程序的类(基类或派生类),编写程序

2011.12.28

程序代码的设计与实现

2011.12.28

程序代码的设计与实现、测试

2011.12.30

完成课程设计文档书写、作品成绩评定

七、考核形式考核时间考核指标成绩评定

课程设计成绩由下面构成:课程设计纪律、课程设计态度和平时表现占20%课程设计结果占50%课程设计报告占30%

考核形式:1)老师每日对学生的考察、评估和考核;2)最后对课程设计项目完成的质量进行考核和验收。

限: 20111230

指导教师签章: 王秉政、郭锋

专业负责人签章:

教学院长签章



一、 需求说明

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)可转移、可转换性

Visual StudioC编程语言的兼容性很高,在windows95/98. Windows NT. windows2000. windows XP等操作系统都可以直接运行。

输入项:

用户通过软件输入必要的信息,然后保存到数据到内存,所输入的信息是经过需求分析限定的内容。

输出项:

游戏信息系统软件会将所有需要浏览的数据显示在屏幕上,以便使玩家能够清晰的看到自己的操作

算法:

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

#define LEN_OF_MAX_NAME 21

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, JACK, QUEEN, KING

}RankType;

typedef enum

{

//扑克牌的花色:CAUBS(梅花),DIAMONDS(方块),HEARTS(红桃),SPADES(黑桃)

CLUBS, DIAMONDS, HEARTS, SPADES

}SuitType;

struct Card

{

RankType rank;

SuitType suit;

};

class GameOf21Point

{

private:

Card d[52];

int dealPos;

Card hands[8][21];

int numOfCard[8];

char name[8][LEN_OF_MAX_NAME];

int numOfPlayer;

void Shuffle();

int GetTotalScore(Card hand[21], int n);

void ShowStatus(int num,bool hideFirstCardAndTotalScore=false);

Card DealOneCard()

{

return d[dealPos++];

}

public:

GameOf21Point();

virtual~GameOf21Point()

{

};

void Game();

};

//GameOf21Point.cpp

#include

#include

#include

#include

#include "GameOf21Point.h"

ostream &operator<<(ostream &o,const Card &c)

{

if(c.suit==CLUBS)

o<<"梅花";

else if(c.suit==DIAMONDS)

o<<"方块";

else if(c.suit==HEARTS)

o<<"红桃";

else if(c.suit==SPADES)

o<<"KING";

if(c.rank==ACE)

o<<"A";

else if(c.rank==JACK)

o<<"J";

else if(c.rank==QUEEN)

o<<"Q";

else if(c.rank==KING)

o<<"K";

else cout<<(int)c.rank;

return o;

}

void GameOf21Point::Shuffle()

{

srand(time(NULL));

for(int i=51;i>0;i--)

{

int pos=rand()%(i+1);

Card t;

t=d[pos];

d[pos]=d[i];

d[i]=t;

}

}

int GameOf21Point::GetTotalScore(Card hand[21], int n)

{

int p;

int totalScore=0;

for(p=0;p

{

if(hand[p].rank==ACE)

totalScore+=1;

else if(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;

return totalScore;

}

void GameOf21Point::ShowStatus(int n,bool hideFirstCardAndTotalScore)

{

cout<<"\t\t"<

if(hideFirstCardAndTotalScore)

cout<<" <隐藏>";

else

{

if(hands[n][0].suit==CLUBS)

cout<<" 梅花";

else if(hands[n][0].suit==DIAMONDS)

cout<<" 方块";

else if(hands[n][0].suit==HEARTS)

cout<<" 红桃";

else if(hands[n][0].suit==SPADES)

cout<<" 黑桃";

if(hands[n][0].rank==ACE)

cout<<"A";

else if(hands[n][0].rank==JACK)

cout<<"J";

else if(hands[n][0].rank==QUEEN)

cout<<"Q";

else if(hands[n][0].rank==KING)

cout<<"K";

else

cout<<(int)hands[n][0].rank;

}

for(int i=1;i

{

if(hands[n][i].suit==CLUBS)

cout<<" 梅花";

else if(hands[n][i].suit==DIAMONDS)

cout<<" 方块";

else if(hands[n][i].suit==HEARTS)

cout<<" 红桃";

else if(hands[n][i].suit==SPADES)

cout<<" 黑桃";

if(hands[n][i].rank==ACE)

cout<<"A";

else if(hands[n][i].rank==JACK)

cout<<"J";

else if(hands[n][i].rank==QUEEN)

cout<<"Q";

else if(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()

{

int curPos=0;

dealPos=0;

int i=0;

for(int suitpos=0;suitpos<4;suitpos++)

{

for(int rankPos=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游戏开始!"<

}

void GameOf21Point::Game()

{

int i,j;

Shuffle();

for(i=1;i<=2;i++)

{

hands[0][numOfCard[0]]=DealOneCard();

numOfCard[0]++;

}

ShowStatus(0,true);

for(i=1;i<=numOfPlayer;i++)

for(j=0;j<2;j++)

{

hands[i][numOfCard[i]]=DealOneCard();

numOfCard[i]++;

}

for(i=1;i<=numOfPlayer;i++)

ShowStatus(i);

cout<

for(i=1;i<=numOfPlayer;i++)

{

char ch;

cout<<"\t\t"<,你想要一张牌吗?";

cin>>ch;

while(ch!='y'&&ch!='n')

{

cout<<"\t\t"<,你输入错误,请重新输入?";

cin>>ch;

}

while(GetTotalScore(hands[i],numOfCard[i])<=21&&ch=='y')

{

hands[i][numOfCard[i]]=DealOneCard();

numOfCard[i]++;

ShowStatus(i);

if(GetTotalScore(hands[i],numOfCard[i])>21)

break;

cout<<"\t\t"<,你还想再要一张牌吗?";

cin>>ch;

}

}

ShowStatus(0);

while(GetTotalScore(hands[0],numOfCard[0])<=16)

{

hands[0][numOfCard[0]]=DealOneCard();

numOfCard[0]++;

ShowStatus(0);

}

cout<

if(GetTotalScore(hands[0],numOfCard[0])>21)

{

for(i=1;i<=numOfPlayer;i++)

{

if(GetTotalScore(hands[i],numOfCard[i])<=21)

cout<<"\t\t"<,恭喜你,你赢了!"<

else

cout<<"\t\t"<,你们打成了平局。"<

}

}

else

{

for(i=1;i<=numOfPlayer;i++)

{

if(GetTotalScore(hands[i],numOfCard[i])<=21 && GetTotalScore(hands[i],numOfCard[i])>GetTotalScore(hands[0],numOfCard[0]))

cout<<"\t\t"<,恭喜你,你赢了!"<

else if(GetTotalScore(hands[i],numOfCard[i])==GetTotalScore(hands[0],numOfCard[0]))

cout<<"\t\t"<,你们打成了平局。"<

else

cout<<"\t\t"<,对不起,你输了。"<

}

}

}

//main.cpp

#include

#include "GameOf21Point.h"

int main()

{

char ch;

ch='y';

while(ch=='y')

{

GameOf21Point game;

game.Game();

cout<您想在玩一次吗?";

cin>>ch;

}

cout<

cout<<"\t\t\t你已成功退出游戏!!谢谢使用!!"<

cout<<" ====================================================================="<

return 0;

}

本文来源:https://www.2haoxitong.net/k/doc/b1e81472a417866fb84a8ec9.html

《21点纸牌游戏 - C++课程设计报告.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式