完成一个能模拟简略猜扑克牌大小地 Win32 控制台游戏
2007-11-30 17:46
399 查看
在坛子里经常能看到MFC编制的GUI游戏,功能强大,界面美观,人机交互便利等优点是控制台程序是无可比拟的.但对于刚初步了解 C/C++的朋友们是无法短期内能学会编写MFC游戏的。于是小弟采用 Win32 控制台 项目做了一个C++的小游戏,希望对于那些朋友,对大一, 大二的学生编写字符界面的小程序有所帮助。
该游戏的名称不妨命名为Hi(gh)-Low,其玩法和规则如下:
1、玩法
①洗牌:每盘游戏开始之前,使扑克牌的排列顺序充分随机;
②发牌:每局开始时,从未使用的扑克牌集合中顺序发给玩家5张扑克牌(明牌);
③猜点:从未使用的扑克牌集合中按顺序取出一张扑克牌(即庄家的暗牌),要求玩家将手中的第一张扑克牌和这张庄家的暗牌进行比较,确定哪张牌大?
④积分:玩家确定回答后,翻开被猜的扑克牌(暗牌变成明牌),同时根据玩家回答的正确与否显示相应的提示,并为玩家的游戏成绩积分。然后将这两张 已经比较过的牌回收到已经使用过的扑克牌集合中,玩家手中的下一张克牌成为新的一张扑克牌;
⑤对玩家手中剩余的扑克牌顺序重复第③和④步操作,直至玩家手中不再有剩余的扑克牌时,一局游戏结束;
⑥如果未使用的扑克牌集合中的扑克牌数目多余10张,则从第②步开始进行本盘游戏的下一局;
⑦询问玩家是否继续进行下一盘游戏,如果继续,则从第①步开始进行新的一盘游戏;
2、规则
①积分规则:
1)、猜中1次,积1分;猜错1次,不积分。
2)、1局中连续猜中3次,除正常积分外奖励1分;连续猜错3次,罚1分。
3)、1局全部猜中,除正常积分外奖励3分;1局全部猜错,罚3分。
4)、玩家的最低积分为0,即不出现负分。
② 牌面大小比较规则:每张扑克牌的牌面由花色(梅花Club、方块Diamond、红心Heart和黑桃Spade)和牌点(A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K)组成。
确定两张扑克牌牌面大小的规则有两条:
1)、如果两张牌面的牌点不同,则牌面大小仅与牌点有关,而与牌面的花色无关。牌点的大小顺序为:
2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < 10 < J < Q < K < A
2)、如果两张牌面的牌点相同,则牌面大小仅与牌面的花色有关。花色的大小顺序为:Club < Diamond < Heart < Spade。
程序运行后主界面如下:
![](http://www.vczx.com/article/img/20070630182722_CardGuess01.gif)
图一 Hi_Low游戏界面
分析得知,我设计了三个类,分别是:
① 将扑克牌对象设计为一个类Card,用于定义标识每一张特定扑克牌的牌面(花色和牌点)和显示操作。其中特意说明的属性是 索引标识属性index作为每张扑克牌唯一标识,是确定牌面花色和牌点的依据。它的值域为0 - 53的整数值,每一个index值与一张特定牌面的花色和牌点相对应:
0 - 12对应梅花Club的A 2 3 4 5 6 7 8 9 10 J Q K;
13 - 25对应方块Diamond的A 2 3 4 5 6 7 8 9 10 J Q K;
26 - 38对应红心Heart的A 2 3 4 5 6 7 8 9 10 J Q K;
39 - 51对应黑桃Spade的A 2 3 4 5 6 7 8 9 10 J Q K。
52对应小王牌L Trump,53对应大王牌B Trump
显然,index除以13所得到的整数商可以表示花色,而index模13所得到的余数恰恰是牌点(大小王牌的index值除外) 牌面显示属性face:在图形用户界面的应用程序中该属性是描述牌面图形的 复杂图形类;而在控制台文本界面的应用程序中该属性是字符数组类型,用于存放描述牌面的字符串。例如:“C-A”表示梅花A,“D-6”表示方块6,“H-10” 表示红心10,“S-Q”表示黑桃Q。
② 将计算游戏积分所需要属性和操作封装在一个类中,该类命名为Counter。需要特别说明地是 连续标志属性sequence,用于存放玩家当前猜点操作的连续状态:
连续猜中时,sequence > 0(连续猜中的次数);
连续猜错时,sequence < 0(连续猜错的次数);
即未连续猜中,也未连续猜错时,sequence = 0。
③ 根据扑克牌游戏的玩法和规则,将扑克牌游戏设计成一个类。在类的定义中描述该游戏所需要使用的扑克牌集合(container)和所需要的辅助属性,以及满足游戏玩法和 规则的各种操作。我的扑克牌游戏类直观地命名为HiLow。同样,已用牌索引属性usedIndex:指示container中游戏已经使用过的扑克牌的 索引。每盘游戏开始时,该属性应被初始化为0(container的第一个元素的 下标值);以后每次从container获取一张牌(为玩家发牌,取一张被猜的牌) 后,属性值加1。该属性的值域为0<=usedIndex <=51。玩家牌索引属性playIndex:指示当前玩家手中正在进行猜点操作的牌在container 中的索引。每局游戏开始时,该属性值 = usedIndex+1;以后每次猜点操作完成后, 属性值加1。该属性的值域为0 <=playIndex <=51。
综上,系统类图如下:
![](http://www.vczx.com/article/img/20070630182801_CardGuess02.gif)
图二 Hi_Low系统类图
至于具体的编码实现请参考源代码例子。
该游戏的名称不妨命名为Hi(gh)-Low,其玩法和规则如下:
1、玩法
①洗牌:每盘游戏开始之前,使扑克牌的排列顺序充分随机;
②发牌:每局开始时,从未使用的扑克牌集合中顺序发给玩家5张扑克牌(明牌);
③猜点:从未使用的扑克牌集合中按顺序取出一张扑克牌(即庄家的暗牌),要求玩家将手中的第一张扑克牌和这张庄家的暗牌进行比较,确定哪张牌大?
④积分:玩家确定回答后,翻开被猜的扑克牌(暗牌变成明牌),同时根据玩家回答的正确与否显示相应的提示,并为玩家的游戏成绩积分。然后将这两张 已经比较过的牌回收到已经使用过的扑克牌集合中,玩家手中的下一张克牌成为新的一张扑克牌;
⑤对玩家手中剩余的扑克牌顺序重复第③和④步操作,直至玩家手中不再有剩余的扑克牌时,一局游戏结束;
⑥如果未使用的扑克牌集合中的扑克牌数目多余10张,则从第②步开始进行本盘游戏的下一局;
⑦询问玩家是否继续进行下一盘游戏,如果继续,则从第①步开始进行新的一盘游戏;
2、规则
①积分规则:
1)、猜中1次,积1分;猜错1次,不积分。
2)、1局中连续猜中3次,除正常积分外奖励1分;连续猜错3次,罚1分。
3)、1局全部猜中,除正常积分外奖励3分;1局全部猜错,罚3分。
4)、玩家的最低积分为0,即不出现负分。
② 牌面大小比较规则:每张扑克牌的牌面由花色(梅花Club、方块Diamond、红心Heart和黑桃Spade)和牌点(A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K)组成。
确定两张扑克牌牌面大小的规则有两条:
1)、如果两张牌面的牌点不同,则牌面大小仅与牌点有关,而与牌面的花色无关。牌点的大小顺序为:
2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < 10 < J < Q < K < A
2)、如果两张牌面的牌点相同,则牌面大小仅与牌面的花色有关。花色的大小顺序为:Club < Diamond < Heart < Spade。
程序运行后主界面如下:
![](http://www.vczx.com/article/img/20070630182722_CardGuess01.gif)
图一 Hi_Low游戏界面
分析得知,我设计了三个类,分别是:
① 将扑克牌对象设计为一个类Card,用于定义标识每一张特定扑克牌的牌面(花色和牌点)和显示操作。其中特意说明的属性是 索引标识属性index作为每张扑克牌唯一标识,是确定牌面花色和牌点的依据。它的值域为0 - 53的整数值,每一个index值与一张特定牌面的花色和牌点相对应:
0 - 12对应梅花Club的A 2 3 4 5 6 7 8 9 10 J Q K;
13 - 25对应方块Diamond的A 2 3 4 5 6 7 8 9 10 J Q K;
26 - 38对应红心Heart的A 2 3 4 5 6 7 8 9 10 J Q K;
39 - 51对应黑桃Spade的A 2 3 4 5 6 7 8 9 10 J Q K。
52对应小王牌L Trump,53对应大王牌B Trump
显然,index除以13所得到的整数商可以表示花色,而index模13所得到的余数恰恰是牌点(大小王牌的index值除外) 牌面显示属性face:在图形用户界面的应用程序中该属性是描述牌面图形的 复杂图形类;而在控制台文本界面的应用程序中该属性是字符数组类型,用于存放描述牌面的字符串。例如:“C-A”表示梅花A,“D-6”表示方块6,“H-10” 表示红心10,“S-Q”表示黑桃Q。
② 将计算游戏积分所需要属性和操作封装在一个类中,该类命名为Counter。需要特别说明地是 连续标志属性sequence,用于存放玩家当前猜点操作的连续状态:
连续猜中时,sequence > 0(连续猜中的次数);
连续猜错时,sequence < 0(连续猜错的次数);
即未连续猜中,也未连续猜错时,sequence = 0。
③ 根据扑克牌游戏的玩法和规则,将扑克牌游戏设计成一个类。在类的定义中描述该游戏所需要使用的扑克牌集合(container)和所需要的辅助属性,以及满足游戏玩法和 规则的各种操作。我的扑克牌游戏类直观地命名为HiLow。同样,已用牌索引属性usedIndex:指示container中游戏已经使用过的扑克牌的 索引。每盘游戏开始时,该属性应被初始化为0(container的第一个元素的 下标值);以后每次从container获取一张牌(为玩家发牌,取一张被猜的牌) 后,属性值加1。该属性的值域为0<=usedIndex <=51。玩家牌索引属性playIndex:指示当前玩家手中正在进行猜点操作的牌在container 中的索引。每局游戏开始时,该属性值 = usedIndex+1;以后每次猜点操作完成后, 属性值加1。该属性的值域为0 <=playIndex <=51。
综上,系统类图如下:
![](http://www.vczx.com/article/img/20070630182801_CardGuess02.gif)
图二 Hi_Low系统类图
至于具体的编码实现请参考源代码例子。
相关文章推荐
- ASP.NET一个简易的WebServer,用控制台程序模拟IIS 托起web服务
- 建立一个win32窗口(用于开发游戏)
- 如何使用Createjs来编写HTML5游戏(七)完成一个简单的打飞机游戏(下)
- 用C语言控制台程序模拟一个ATM 机存取款流程
- Html5游戏开发-145行代码完成一个RPG小Demo
- 把一个win32控制台项目转变为一个win32项目
- 一步一步完成一个聚会摇色子游戏
- 一个服务程序框架,并在vc6.0win32控制台工程中嵌入manifest使用uac
- 利用java集合知识完成扑克牌比大小-游戏
- ASP.NET一个简易的WebServer,用控制台程序模拟IIS服务器 托起web服务
- 如何用VS2010新建一个Win32控制台应用程序项目
- 笔试题:一个整数的“真数”,是将它的各个位相加得到的和。写一个函数完成一个数组按真数大小排序
- cocos2d-x 3.0来做一个简单的游戏教程 win32平台 vs2012 详细解释献给初学者们!
- C语言练手游戏-控制台输出一个会移动的坦克
- Html5游戏开发-145行代码完成一个RPG小Demo
- 自己用JavaScript写的一个很简单的骰子大小赌博模拟
- 如何在Win32窗口程序中发命令打开一个控制台,往里面打印(printf())输出一些数据
- 习题7:编写一个控制台应用程序,完成下列功能,并回答提出的问题。
- Html5游戏开发-145行代码完成一个RPG小Demo
- win32框架,GDI图形编程写一个HelloWorld游戏_c语言