21点游戏c++版(一)

面向读者

这篇博客针对那些以c++语言为基础、刚刚学完面向对象的程序设计的同学们。这篇博客内容作为课程设计很合适。

大牛们可以直接跳过去不看。但是本人也欢迎大牛们提出宝贵意见。


游戏简介

  • 21点游戏是一个牌类游戏。

  • 该游戏由1-7名玩家对战电脑玩家(称为House)。游戏开始时系统将为所有玩家(包括电脑玩家)发2张牌,随后每个玩家(包括电脑玩家)可以按照一定的规则进行加牌。最终,手中牌的点数不超过21点的玩家中,超过电脑玩家点数的玩家获胜。发牌过程中任何超过21点的玩家(包括电脑玩家)将认定为bust(该情况下输得最惨)。


游戏规则

  1. 牌面的值:对于数字牌而言,其牌面值为对应数字的值。对于Jack、Queen、King牌而言,其值设定为10。对于Ace牌而言,其值可以判定为1或者11,计算总值时,Ace按照最利于玩家的情况进行取值。
  2. 发牌:游戏开始时,系统自动为每个玩家发两张牌。House跟其他玩家不同之处在于:House初始时第一张牌是面朝下的,其他玩家无法知道其值。
  3. 要牌:发牌结束后,每位非电脑玩家可以选择是否要牌,如果选择要牌,那么系统将自动发给玩家一张牌。如果添加一张牌之后,所有牌面的总计值超过了21点,则判定为bust。当所有玩家要牌结束之后,进入house要牌阶段。
  4. house要牌:首先house将第一张牌亮出,之后house将自动要牌。如果house的牌面的总计值不超过16点,那么house将继续要牌,直到超过16点。
  5. 判断输赢: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)形式

    那么手牌有哪些重要作用呢?

    1. 知道牌的实时组合以及相应的规则。包括还剩多少张牌,牌的组合形成的达到某种规则的属性(比如在21点游戏中,我们关心的是牌的牌面值总和,又比如斗地主游戏中是否有顺子、飞机、炸弹等等)。
    2. 控制牌的“分牌”、“出牌”或者“要牌”等实时变化的情况。
    3. 根据牌的组合情况和规则判断游戏胜负。

    以上这三个作用奠定了一个牌类游戏的设计基础。但是由于不同的游戏规则,手牌的具体设计是不同的。根据规则制定的角色role)(比如21点游戏里面的house和player)情况,我们往往要对手牌抽象出的类进行封装继承等面向对象特性的操作,因为不同角色有不同的规则(比如21点游戏里面,house和普通玩家player的要牌规则是不同的,又比如21点游戏里面,house没有胜负之分,只有player有)。

    但是基于上面的描述,我们至少可以认为:

    将所有角色中手牌的共同特性抽象为手牌类是非常合理的。

    但是手牌中的其他特性如何处理,到底不同的角色是继承自手牌类还是将手牌类作为角色的一部分,就要看具体的设计是怎样的了。


总结一下,现在我们有了Card类、Hand类、Player类、House类、GenericPlayer类这几个类,并且定义了Suit和Rank这两个和Card类相关的枚举类型。但是我们的分析还远远没有结束。且看我下回分解。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值