这篇博客针对那些以c++语言为基础、刚刚学完面向对象的程序设计的同学们。这篇博客内容作为课程设计很合适。
大牛们可以直接跳过去不看。但是本人也欢迎大牛们提出宝贵意见。
21点游戏是一个牌类游戏。
该游戏由1-7名玩家对战电脑玩家(称为House)。游戏开始时系统将为所有玩家(包括电脑玩家)发2张牌,随后每个玩家(包括电脑玩家)可以按照一定的规则进行加牌。最终,手中牌的点数不超过21点的玩家中,超过电脑玩家点数的玩家获胜。发牌过程中任何超过21点的玩家(包括电脑玩家)将认定为bust(该情况下输得最惨)。
牌面的值:对于数字牌而言,其牌面值为对应数字的值。对于Jack、Queen、King牌而言,其值设定为10。对于Ace牌而言,其值可以判定为1或者11,计算总值时,Ace按照最利于玩家的情况进行取值。
发牌:游戏开始时,系统自动为每个玩家发两张牌。House跟其他玩家不同之处在于:House初始时第一张牌是面朝下的,其他玩家无法知道其值。
要牌:发牌结束后,每位非电脑玩家可以选择是否要牌,如果选择要牌,那么系统将自动发给玩家一张牌。如果添加一张牌之后,所有牌面的总计值超过了21点,则判定为bust。当所有玩家要牌结束之后,进入house要牌阶段。
house要牌:首先house将第一张牌亮出,之后house将自动要牌。如果house的牌面的总计值不超过16点,那么house将继续要牌,直到超过16点。
判断输赢:house要牌结束之后,如果house点数超过了21点,那么判断house为bust,此时所有未bust的玩家判定为获胜。如果house没有bust,那么比house点数少的玩家则判定为lose,跟house点数相等的玩家判定为push(平手),比house点数多并且未bust的玩家则判定为win。
游戏展示:
在控制台类型的project中,展示21点游戏如下图:
上图展示了一个两人游戏,其中一个玩家获胜。另外一个玩家bust。
面向对象的分析
首先我们要对问题中的实体进行抽象和归类。从简介和规则两个模块中,我们可以提出一些实体,并将其抽象为类。
大部分同学可以想到如下的类:
牌(Card)
电脑玩家(House)
人类玩家(Player)
这些类的确比较基础,而且由于题目中的明显暗示,设计出这些类是不难的。
继续想下去,对于每一张牌而言,都有点数和花色之分,并且我们可以想到,由于电脑玩家和人类玩家具有共性和特性,所以可以使用一个基类对两种玩家进行再抽象。
两类玩家的父类GenericPlayer(GenericPlayer)
牌的花色(Suit)
牌的牌值Rank(Rank)
(上面两个高大上的英文名是国际通用的)
大部分同学可以想到,Suit和Rank只是对花色和值的列举,大可不必作为类出现。因此将其处理为全局数组,更好一些的做法是将其作为枚举值放入枚举类型里面。
这时候心急的同学们应该开始在想如何编码了!主函数应该是控制如何洗牌、发牌、判断输赢神马的功能,这些功能都可以写成一个函数。如此这般、三下五除二,编码,搞定了!
但是这样绝对不perfect!
还是看我下面怎么分析吧骚年。
我们抛除上面的分析,先来谈一下牌类游戏。对于牌类游戏来讲,我们是将一副牌分成了不同的部分。分到不同部分的牌,都有一定的排列组合。我们把这个部分的牌称作“手牌(Hand)”。这个“手牌”的概念在牌类游戏的设计中极其重要。因为玩家进行牌类游戏时,判断如何对牌进行操作,其实就是在看自己的手牌情况。手牌中的牌随时可能变化,但是我们还是可以基于手牌的实时变化情况进行判断。
我们可以先这么认为:
手牌(hand)是牌的一种集合(collection)形式
那么手牌有哪些重要作用呢?
知道牌的实时组合以及相应的规则。包括还剩多少张牌,牌的组合形成的达到某种规则的属性(比如在21点游戏中,我们关心的是牌的牌面值总和,又比如斗地主游戏中是否有顺子、飞机、炸弹等等)。
控制牌的“分牌”、“出牌”或者“要牌”等实时变化的情况。
根据牌的组合情况和规则判断游戏胜负。
以上这三个作用奠定了一个牌类游戏的设计基础。但是由于不同的游戏规则,手牌的具体设计是不同的。根据规则制定的角色(role)(比如21点游戏里面的house和player)情况,我们往往要对手牌抽象出的类进行封装继承等面向对象特性的操作,因为不同角色有不同的规则(比如21点游戏里面,house和普通玩家player的要牌规则是不同的,又比如21点游戏里面,house没有胜负之分,只有player有)。
但是基于上面的描述,我们至少可以认为:
将所有角色中手牌的共同特性抽象为手牌类是非常合理的。
但是手牌中的其他特性如何处理,到底不同的角色是继承自手牌类还是将手牌类作为角色的一部分,就要看具体的设计是怎样的了。
总结一下,现在我们有了Card类、Hand类、Player类、House类、GenericPlayer类这几个类,并且定义了Suit和Rank这两个和Card类相关的枚举类型。但是我们的分析还远远没有结束。且看我下回***。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1141次
排名:千里之外400-114-0315
全面接受第三方监督和调解的电商网站
互联网金融
互联网金融
&QQ在线咨询
&不实信息投诉
中国电子商务法律网错误(可在服务器上查看具体错误信息)