张志勇课程设计说明书.docx
《张志勇课程设计说明书.docx》由会员分享,可在线阅读,更多相关《张志勇课程设计说明书.docx(13页珍藏版)》请在冰豆网上搜索。
张志勇课程设计说明书
学校代码:
10128
学号:
201320905047
课程设计说明书
题目:
“21”点纸牌游戏
学生姓名:
张志勇
学院:
理学院
班级:
信计13-1
指导教师:
白莲花、侯睿、杜雅娟
二〇一六年一月二十二日
内蒙古工业大学课程设计(论文)任务书
课程名称:
面向对象的程序设计学院:
理学院班级:
信计13-1
学生姓名:
张志勇学号:
201320905047指导教师:
白莲花、侯睿、杜雅娟
一、题目“21点”纸牌游戏
二、目的与意义
面向对象程序设计课程设计可以培养学生综合运用所学面向对象程序设计知识和技能分析与解决实际问题的能力,以及严肃认真的科学态度和严谨求实的工作作风。
三、要求(包括原始数据、技术参数、设计要求、图纸量、工作量要求等)
●采用面向对象程序设计语言C++进行程序开发
●选用一种C++语言的开发环境设计界面及程序
●在开发环境下,进行程序的运行及调试
四、工作内容、进度安排
主要内容
使用C++程序设计语言及其开发环境实现简单的“21点”纸牌游戏;完成程序的编写和调试。
工作进度安排
第一天:
熟悉课程设计题目及具体要求,确定选择的语言开发环境,查阅资料、学习、讨论。
第二天:
根据课题给出的基本需求,进行认真分析和讨论,按照软件工程的思想,完成软件的面向对象分析工作。
第三天到第四天:
在面向对象分析的基础上,对软件进行面向对象的设计工作,完成相关设计工作。
第五天到第六天:
进行面向对象实现工作,确定需要的用户界面以及结构,完成软件的整体框架,在开发环境下,编程实现所开发的系统。
第七到第八天:
调试、测试工作,相关的后期工作。
第九和第十天:
撰写课程设计报告
五、主要参考文献
[1]钱能.C++程序设计教程(第2版)[M].北京:
清华大学出版社.2005
审核意见
系(教研室)主任(签字)
指导教师下达时间2016年1月4日
指导教师签字:
____________________
目录
引言4
第一章系统开发环境的简介和特点5
1.1开发环境的简介5
1.2开发环境的特点5
第二章系统分析6
2.1系统定位6
2.1.1系统介绍6
2.1.2系统面向的用户群体6
2.2系统需求6
2.2.1系统的功能性需求6
2.2.2系统的非功能性需求7
2.3技术可能性分析7
第三章总体结构设计7
3.1“21”点纸牌游戏简介7
3.2“21”点纸牌游戏总体功能流程图8
第四章程序设计思路及测试结果8
4.1设计步骤和关键代码8
(一)先定义全局变量:
8
(二)创建一个poker类,构造函数poker;9
(三)新一局开始时需要洗牌,实现洗牌这个函数initPoker();12
(四)给玩家发牌函数和给庄家发牌函数的实现getPokerF();getPokerL();12
(五)玩家总点数的函数和庄家总点数函数的实现getSumF();getSumL();13
(六)main函数;14
4.2测试15
引言
本次课程设计利用计算机高级语言C++进行简单编程,实现简易的C++程序计算器的编程和运行。
通过MicrosoftVisualC++6.0软件可以进行C++程序编译,通过模块之间关系的确定及各模块功能,最后设计一个简单的操作界面实现游戏。
本系统通过C++高级语言进行编程,并设计了简单明了的操作界面。
简单的界面能给用户更好的操作体验,更直接而充分的掌握本程序的一些应用和功能。
通过直观的方式,最终实现C++设计的应用程序——“21点”纸牌游戏。
本次课设所做程序虽然只是一个简单的C++计算器程序,但是基本的应用功能都已具备,可以更好的用在实际应用中。
C++这个词在中国大陆的程序员圈子中通常被读做“C加加”,而西方的程序员通常读做“Cplusplus”,“CPP”。
它是一种使用非常广泛的计算机编程语言。
C++是一种静态数据类型检查的、支持多重编程范式的通用程序设计语言。
它支持过程化程序设计、数据抽象、面向对象程序设计、制作图标等等泛型程序设计等多种程序设计风格。
本学期我们开设了“C++语言程序设计”这门课程。
随着老师的讲解及对这门语言的深入认识和学习,我们已经对这门计算机语言有了一定的理解。
而C++作为一种较为普遍的计算机语言,已经被大多数程序员所采用。
随着这么语言的普及应用,生活中各种软件都会用到这种语言。
如生活中的一些应用软件、管理软件等。
例如:
万年历程序,“21点”纸牌游戏程序„„本次课程设计,我做的是一个简单的计算器程序集,他是利用C++的文件处方式实现一个“21点”纸牌游戏的程序。
在现代社会中,随着社会的快速发展,人们对休闲娱乐越来越重视,又由于电脑的快速发展,“21点”纸牌游戏逐渐成为人们的娱乐的一种方式,编写程序实现游戏,该程序是模拟古老21点扑克牌游戏,实现1对1的人机大战。
要求游戏过程中任意一方牌的点数之和超过21点,则自动出局;在不超过21点的情况下,玩家下注由电脑随机发牌与庄家比累积牌的点数的大小,大者为赢家。
第一章系统开发环境的简介和特点
1.1开发环境的简介
MicrosoftVisualC++6.0,简称VC6.0,是微软推出的一款C++编译器,将“高级语言”翻译为“机器语言(低级语言)”的程序。
VisualC++是一个功能强大的可视化软件开发工具。
自1993年Microsoft公司推出VisualC++1.0后,随着其新版本的不断问世,VisualC++已成为专业程序员进行软件开发的首选工具。
虽然微软公司推出了VisualC++.NET(VisualC++7.0),但它的应用的很大的局限性,只适用于Windows2000、WindowsXP和WindowsNT4.0。
所以实际中,更多的是以VisualC++6.0为平台。
VisualC++6.0不仅是一个C++编译器,而且是一个基于Windows操作系统的可视化集成开发环境(integrateddevelopmentenvironment,IDE)。
VisualC++6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导ClassWizard等开发工具。
这些组件通过一个名为DeveloperStudio的组件集成为和谐的开发环境。
1.2开发环境的特点
由于C++是由C语言发展起来的,也支持C语言的编译。
6.0版本是使用最多的版本,很经典。
最大的缺点是对于模版的支持比较差。
现在最新补丁为SP6,推荐安装,否则易出现编译时假死状态和有些功能不可用的情况。
同时,6.0版本对windows7和windows8的兼容性较差
第二章系统分析
2.1系统定位
2.1.1系统介绍
本系统定位简单的“21点”纸牌游戏小应用程序,暂时只考虑单机环境下的实现;操作系统选择目前常用的Windows 7。
系统界面力求简洁、易用,在标准化的基础上考虑界面的美观和新颖
2.1.2系统面向的用户群体
系统面向所有人群,凡是懂得计算机基本操作的人都可以对本程序进行应用。
简单明了的操作界面能够让用户迅速的适应并掌握。
2.2系统需求
2.2.1系统的功能性需求
(1)系统启动后,出现欢迎界面,满足人机交互的命令行设计。
(2)能实现基本信息的输入与游戏开始分开。
(3)能实现开始后显示每一个玩家的牌点大小,当然庄家的首张牌是隐藏的。
(4)能实现决定是否要继续发牌。
。
通过(1,2)?
问题选项的提问与回答,来完成是否继续发牌的游戏要求
(5)能实现自主完成庄家的发牌与显示最终大小工作。
通过所有玩家都已决定是否要发牌后,最终可以完成对庄家的是否发牌和显示最终牌点大小。
(6)能实现系统自动比较大小,并通过界面最终显示到屏幕上
(7)能实现在游戏结束后提示游戏结束界面。
2.2.2系统的非功能性需求
(1)用户界面需求:
简洁、易用、易懂,美观、大方、标准,具备一定的兼容性。
(2)系统开发平台:
Windows 7Microsoft Visual C++ 6.0
(3)软件质量需求:
易用、健壮、兼容性好、运行稳定、有一定安全保障
2.3技术可能性分析
本系统设计的核心部分就是通过C++语言的文件处理模块,通过相应代码、类实现游戏,该程序是模拟古老的21点扑克牌游戏,实现1对1的人机大战。
要求游戏过程中任意一方牌的点数之和超过21点,则自动出局;在不超过21点的情况下,玩家下注由电脑随机发牌与庄家比累积牌的点数的大小,大者为赢家。
可以得出结论:
该系统的实现在技术上是可行的。
第三章总体结构设计
3.1“21”点纸牌游戏简介
21点一般用到1-8副牌。
庄家给每个玩家发两张牌,牌面朝上;给自己发两张牌,一张牌面朝上,一张牌面朝下。
K、Q、J和10牌都算作10点。
其余所有2至9牌均按其原面值计算。
如果玩家拿到的前两张牌是一张A和一张10点牌,就拥有天生21点(Blackjack);此时,如果庄家没有黑杰克,玩家就能赢得1.5倍的赌金(2赔3)。
没有黑杰克的玩家可以继续拿牌,以使总点数尽可能接近但不超过21点;如果超过21点,玩家就会“爆(Bust)”并输掉赌金。
如果庄家的总点数等于或少于16点,则必须拿牌(Hit);如果庄家的总点数等于或多于17点,则必须停牌(Stand)。
3.2“21”点纸牌游戏总体功能流程图
游戏界面——》输入赌注——》选择要牌——》开始游戏——》退出
第四章程序设计思路及测试结果
4.1设计步骤和关键代码
第一步:
首先创建项目名称(game2);
第二步:
往项目中添加需要的源文件,和头文件;
(一)先定义全局变量:
#include
#include
#include
usingnamespacestd;
#defineNUM1000
intj=2;//定义为全局变量
intrandNum[NUM];//因为rand()函数有一定的缺陷,所以在程序中定义了randNum数组来存放随机数
//即使使用了种子函数srand(),由于程序运行时间比较短,也不太好设置种子。
因此使用数组来存放随机数
(二)创建一个poker类,构造函数poker;
classPoker
{private:
intpoker[53];//扑克
intpokerValue[53];//扑克代表的数值
stringpokerName[53];//扑克名
intmoney;//玩家钱数
intbet;//玩家的赌注
intpokerF[5];//玩家手中的牌F:
FarmerL:
Landlord
intpokerL[5];//庄家手中的牌F:
FarmerL:
Landlord
intpokerNumF;//玩家手中的牌数
intpokerNumL;//庄家手中的牌数
public:
Poker();//构造函数,对牌初始化
voidinitPoker();//洗牌,在每轮游戏开始前进行
stringgetPokerF();//用字符串的形式返回玩家的牌
stringgetPokerL();//用字符串的形式返回庄家的牌
intgetSumF();//返回玩家牌的点数,用以判断是否超过21点
intgetSumL();//返回庄家牌的点数
voidfarmerAsk();//玩家要牌
voidlandlordAsk();//庄家要牌
voidinputBet();//玩家输入赌注
voidnewGame();//开始新游戏
voidlandlordProcess();//在玩家不要牌时进行处理
};Poker:
:
Poker()
{poker[0]=0;
for(inti=1;i<=13;i++)//|
{poker[i]=i;//|用构造函数对牌初始化
poker[i+13]=i;//|
poker[i+26]=i;//|
poker[i+39]=i;//|
}//for结束
pokerValue[0]=0;
for(i=1;i<=52;i++)
{if(poker[i]<=10)pokerValue[i]=poker[i];
elsepokerValue[i]=10;
}pokerName[0]="";
for(i=0;i<4;i++)
{pokerName[1+13*i]="A";
pokerName[2+13*i]="2";
pokerName[3+13*i]="3";
pokerName[4+13*i]="4";
pokerName[5+13*i]="5";
pokerName[6+13*i]="6";
pokerName[7+13*i]="7";
pokerName[8+13*i]="8";
pokerName[9+13*i]="9";
pokerName[10+13*i]="10";
pokerName[11+13*i]="J";
pokerName[12+13*i]="Q";
pokerName[13+13*i]="K";
}money=200;//玩家开始玩游戏时钱数是200
bet=0;
for(i=0;i<5;i++)
{pokerF[i]=0;//|对pokerOfFarmer初始化
pokerL[i]=0;//|对pokerOfLandlord初始化
}pokerNumF=0;//玩家手中的牌数初始化为0
pokerNumL=0;//庄家手中的牌数初始化为0
srand((int)time(0));
for(i=0;i{randNum[i]=rand()*51/32767+1;//产生随机数数组
}
}//构造函数Poker()结束
(三)新一局开始时需要洗牌,实现洗牌这个函数initPoker();
voidPoker:
:
initPoker()
{cout<<"新一局游戏开始,开始洗牌>>>>>"<pokerF[0]=randNum[j++];//产生1-52的随机数
pokerF[1]=randNum[j++];//产生1-52的随机数
pokerL[0]=randNum[j++];//产生1-52的随机数
pokerL[1]=randNum[j++];//产生1-52的随机数
pokerNumF=2;
pokerNumL=2;
cout<<"洗牌完成,你的牌为:
"<}//voidPoker:
:
initPoker()结束
(四)给玩家发牌函数和给庄家发牌函数的实现getPokerF();getPokerL();
stringPoker:
:
getPokerF()//用字符串的形式返回玩家的牌
{
inti;
stringresult="";
for(i=0;iresult=result+pokerName[pokerF[i]]+"";
returnresult;
}//stringPoker:
:
getPokerF()结束
stringPoker:
:
getPokerL()//用字符串的形式返回庄家的牌
{
inti;
stringresult="";
for(i=0;iresult=result+pokerName[pokerL[i]]+"";
returnresult;
}//stringPoker:
:
getPokerL()结束
(五)玩家总点数的函数和庄家总点数函数的实现getSumF();getSumL();
intPoker:
:
getSumF()//返回玩家的总点数
{
intresult=0;
for(inti=0;iresult=result+pokerValue[pokerF[i]];
returnresult;
}
intPoker:
:
getSumL()//返回庄家的总点数
{
intresult=0;
for(inti=0;iresult=result+pokerValue[pokerL[i]];
returnresult;
}
(六)main函数;
intmain()
{
intchoose=1;
Pokerpoker;
cout<<"******************欢迎玩二十一点游戏******************"<poker.inputBet();
poker.initPoker();//洗牌
while(choose==1||choose==2||choose==3||choose==4)
{
cout<<"1.要牌2.不要牌3.重新开始4.退出>>请输入数字选择操作:
";
cin>>choose;
if(choose==1)poker.farmerAsk();
elseif(choose==2)poker.landlordProcess();
elseif(choose==3)poker.newGame();
elseif(choose==4)exit(0);
}
return0;
}//main函数结束
4.2测试
开始洗牌,输入赌注;
当小于21点大于15点时应选择继续要牌;
当你超过21点时系统会提示你撑死了,也就是说你输了