21点纸牌游戏课程设计报告李志文.docx
《21点纸牌游戏课程设计报告李志文.docx》由会员分享,可在线阅读,更多相关《21点纸牌游戏课程设计报告李志文.docx(9页珍藏版)》请在冰豆网上搜索。
![21点纸牌游戏课程设计报告李志文.docx](https://file1.bdocx.com/fileroot1/2023-8/13/38957d73-8055-4d2a-93ee-bc616afa3861/38957d73-8055-4d2a-93ee-bc616afa38611.gif)
21点纸牌游戏课程设计报告李志文
《高级语言程序设计》
课程设计报告
设计题目21点纸牌游戏设计
专业计算机科学与技术(教育方向)
班级06教育班
姓名李志文
学号061114052
2007年6月4日
目录
1.设计目标………………………………………………………………2
2.设计思想………………………………………………………………2
3.类及对象设计…………………………………………………………5
4.程序源代码……………………………………………………………6
5.调试记录………………………………………………………………19
6.总结……………………………………………………………………22
21点纸牌游戏设计
1.课程设计题目描述、要求及设计目标
1.1题目描述
一个21点的扑克牌游戏。
本程序取点于手机游戏,游戏规则与手机游戏相同。
玩家一共可以要5张牌,但如果牌的点数超过21,则暴了,自动出局;在不超过21点的情况下,玩家与庄家比牌的点数大小,大者为赢。
1.2要求及设计目标
(1)将所有的函数与相应的数据封装到类中,并改写主程序,使程序简化。
(2)程序中一共有13张扑克牌可以随机抽取,大于10的点数为10,A根据情况点数不同,当前点数小于11时为11点,大于10时则为1点。
(3)要求庄家永远不会暴庄,即庄家可以查看下一张牌,若大于21点,则拒绝,当然,在游戏规则上不能泄露这点秘密。
(4)高级玩家可以查看下一张牌,即按H键,然后按要求输入密码,密码正确可以看牌,并决定是否要牌。
(5)将界面的提示说明全部设计为中文界面,界面的解释详细友好,可以吸引更多的玩家。
2.设计思想
本程序设计了一个Game_21类,包含16个类成员函数。
考虑达到更好的封装性,程序所有功能都在类里实现,主函数只调用了一个类的开始成员函数充分体现了类的面向对象编程的优点。
程序中一共有13张扑克牌可以随机抽取,设计了一个random函数实现。
大于10的点数为10,A根据情况点数不同,当前点数小于11时为11点,大于10时则为1点。
用if判断语句控制。
庄家永远不会暴庄,庄家取下一张牌之前先判定取牌后总点数是否会大于21点,大于的话就拒绝取下一张,小于时就继续取牌,在函数中首先随机产生下一张牌,接着用条件语句判定原有点数与新牌的点数之和是否大于21点,然后决定是否取牌。
随机产生的1~13的数据为整型,设计一个转换函数changechar将其转换为扑克的字符形式,主要考虑到对10的转化输出,此函数设计为指针函数。
可以查看下一张牌,即按H键,然后按要求输入密码,密码正确可以看下一张牌,并决定是否要牌。
设计一整型成员函数chkkey(),判定玩家是否继续要牌之前加入对玩家是否输入H键的判定,如果输入H则调用为处理玩家输入密码而单独编写的成员函数,在该函数中,首先判定玩家的密码输入是否正确,不正确则返回0,正确则返回1。
一个好程序首先应该界面清晰易读。
本程序对界面设计处理做了很多努力,尽量使程序运行界面易于分辨。
本程序针对字符输入和数字输入的错误处理问题做了很好的设计。
在宿舍同学相互讨论中,我们想到用指针的方式处理较好。
对于判断输入如(Y/N),如果只用一般方式,当一次输入多个字符时易产生循环,用指针的方式动态申请字符数组,然后只对第一个字符判断即可很好地处理此问题。
如检验函数的使用。
举例如:
下面一个程序,要求输入Y则输出YES,输入N则输出NO:
//普通方式:
当输入多余1个字符时就会出现循环问题:
#include
#include
voidmain(){
intn=1;
do{
charm;
cout<<"\t\t输入y/n:
";
cin>>m;
if(m=='y')cout<<"\t\tyes\n\n";
if(m=='n')cout<<"\t\tno\n\n";
cout<<"\t\t输入n值判断结束:
";cin>>n;
cout<}while(n);
}
当输入y1时由于循环输出了yes并跳过判断到下一次输入,输入y1n0时同时输出了yes和蔼no并结束了程序。
//此种方式易产生循环问题,可用指针方式处理:
#include
#include
voidmain(){
intn=1;
do{
char*s;
s=newchar;
cout<<"\t\t输入y/n:
";
cin>>s;
if(*s=='y')cout<<"\t\tyes\n"<if(*s=='n')cout<<"\t\tno\n"<cout<<"\t\t输入n值判断结束:
";cin>>n;
cout<}while(n);
}
此种指针的方式只取输入字符串的第一个字符进行判断,因此不会出现循环输出问题。
对于数字输入,由于字符和数字可以混用,用一般的整型数据输入方式,当输入字符也可以执行,并且输入汉字时程序就会变死,极易产生错误。
用指针的方式动态申请字符数组,然后对每个输入的字符即数组的每个元素判断是否在0~9之间,再作相应的处理,这样即可很好地处理此种错误输入问题。
3.类及对象设计
类及对象的设计主要体现类的封装性和面向对象编程的特点。
本程序设计了一个Game_21类,包含16个类数据成员和16个类函数成员。
程序所有功能都在类里实现,主函数定义了一个Game_21game1对象,然后只调用了一个类的开始成员函数启动程序,因而达到了很好的封装效果,充分体现了类的面向对象编程的优点。
4.程序源代码
5.调试记录
(1)程序运行后,给出如下界面:
*********************欢迎使用李志文制作的21点纸牌游戏********************
*以下是简单的游戏规则介绍
*1:
开始双方个发两张牌,然后玩家根据牌点数决定是否加牌,你最多能持有5张牌。
*2:
如果,你的牌面点数之和超过了21点,你就"暴"了,自动出局。
*3:
如果,你赢了,你就能获得双倍的赌注。
*4:
如果,双方都没有超过21点,则点数和大的一方获胜。
*5:
牌面点数小于10则点数为牌面数,否则点数都为10。
发牌时若牌面点数为1,如果此时总点数小于11则此牌点数为11。
*************************************************************************
你是否要开始游戏?
(Y/N):
(2)输入Y,结果如下:
你拥有的金钱:
¥200
请问你将取出多少下注?
10
先各发两张牌,正在发牌……
按任意键发一张牌
G
按任意键发一张牌
G
按任意键发一张牌
G
你发到的两张牌为:
[10][3]
你的牌面点数之和为:
13
庄家打开的一张牌为:
[6]
你是否打算加牌?
(Y/N):
Y
发到的牌是:
[9]
牌面总和是:
22
你撑死了,哈哈!
!
你是否打算再玩一次?
(Y/N):
Y
(3)以下对检验函数进行测试:
你拥有的金钱:
¥190
请问你将取出多少下注?
10
先各发两张牌,正在发牌……
按任意键发一张牌
G
按任意键发一张牌
G
按任意键发一张牌
G
你发到的两张牌为:
[A][5]
你的牌面点数之和为:
16
庄家打开的一张牌为:
[8]
你是否打算加牌?
(Y/N):
H
输入密码:
LZWY
下一张牌为:
[10]
你是否打算加牌?
(Y/N):
Y
发到的牌是:
[10]
牌面总和是:
16
你是否打算加牌?
(Y/N):
H
输入密码:
LZWY
下一张牌为:
[8]
你是否打算加牌?
(Y/N):
N
庄家牌面点数之和为:
18
你的牌面点数之和为:
16
很遗憾!
你输了!
再接再厉~~
你是否打算再玩一次?
(Y/N):
n
(4)显示最终结果
游戏结果:
胜:
0
负:
2
平局:
0
剩余金钱:
180
还想再玩一轮吗?
(Y/):
n
(5)结束程序,显示签名
*****************************************
**************************本程序由李志文制作***********************
*****************************谢谢你的使用**************************
**************************版权没有,随便复制***********************
*****************************************
输入任意键结束
6.总结
本程序经过了很长时间的设计和调试修改,有些地方借鉴了网络上的类似程序代码。
网络上类似游戏程序虽多用C++编写的却很少,并且大都是可执行游戏,代码很少。
找到的代码设计不全,错误处理方面基本没做处理,游戏很容易产生误操作,规则也不一样。
尽管如此这些代码很多地方仍给了我很大的启示。
本程序经过了很长时间的设计和调试修改,在各方面都尽量考虑周密,特别在错误处理和格式输出方面做了很大努力。
设计和调试程序过程中个人能力得到了很大的提高。
宿舍同学一起讨论也给了我很多建议和帮助。
在程序设计过程中获益匪浅,确实熟悉了很多东西,也感受到相互之间讨论帮助的重要性,或许别人很随意的一句话都可能给你很大的启发。
尽管一直努力优化本程序,但仍存在一些不足之处,敬请指正。
此外,我认为学习本门课程应该多编程,多思考,设计测试程序;多研究别人的程序;多与别人讨论交流,观察别人编写和调试程序的方式,获取他人的想法。
这样才会快速提高个人的能力。
参考资料:
[1]刘振安等.《C++程序设计课程设计》,北京:
机械工业出版社,2004.12.
[2]周玉龙等.《高级语言C++程序设计》,北京:
高等教育出版社,2005.12.