我对自己的编程技能越来越有信心,所以我决定重新启动以前开始的纸牌游戏。现在,该程序的要点是我对程序流程,变量,条件等有了很好的了解,我想加深对OOP的理解

所以我需要一些有关面向对象设计的建议

我的纸牌游戏将有5个 class :

  • Deck(具有卡ArrayList)
  • Player(具有从Deck对象接收的Card对象的Card ArrayList)
  • 经销商

  • 我想知道将Dealer类用作接口是否适当的OOP。所有玩家都应该能够扮演发牌人的角色,但是不用说,每轮发牌只有一名发牌人。使Player类实现发牌者可以执行的方法(例如DealGame())是否可行,即使在任何给定回合中8个Player对象中有7个将不使用其实现的方法,而且不当时被认为是经销商?还是让DealGame()方法属于Deck类并调用平台来进行游戏会更好?抱歉,这是一个愚蠢的问题,但是我对OOP的原则有些粗略,希望有人建议您在第一时间学会正确的做法。

    我还考虑过让Dealer扩展Player,但我认为这是错误的,因为我需要玩家即时扮演Dealer的角色,而不是以不可更改的方式被声明为Dealer对象。在这种情况下-如果Dealer扩展了Player-我想我需要将游戏的所有玩家声明为Dealers。

    所以基本上我在问:
  • 如果您要使用这5个类制作纸牌游戏,您是否会将Dealer类和其他常规类设置为接口,为什么或为什么不呢?
  • 我通常在使用OOP时走正确的路吗?还是我完全迷路了?
  • 最佳答案

    您有很好的方法,但是仍然需要做一些工作:)。所有的 class 都很好,但Delaer却不是。

    首先-如果玩家是一个回合的发牌人,第二个人是发牌人,则我看不到扩展类或界面的意义。

    实际上,一开始,我不会让任何玩家成为经销商,这会使事情变得复杂。

    解决这个问题的最简单,最好的方法是创建5.Game。游戏拥有Deck和所有玩家,并且其运作方式与庄家相似。它等待玩家做出反应,并在需要时显示纸牌等。

    如果您真的想让玩家成为发牌人,那会更加复杂:)。好吧,您也需要Game类,因为Game必须确定谁作为发牌人开始,它应该带走或赋予玩家发牌人的权利(我不明白这一点,但如果您想要... :)) 。

    以及如何做到这一点? Game具有Player dealer变量。如果应该有类似registerDealer(Player player)方法的东西。然后,您需要某种接口在GamePlayer之间进行通信。
    如果您希望Player具有Game的所有职责,则可以使用Visitor pattern。 (它允许dealer在游戏实例内部“潜行”并执行公共方法可以做的一切)。

    否则,您可以让Game询问dealer该做什么并等待玩家输入。应该通过调用诸如dealer.askWhatToDo()之类的方法并使用返回值来执行操作。它允许验证输入...但是,如果我是对的,那么扑克中的有效输入总是只有一个,因此,如果Game本身决定要做什么,我看不出任何区别...

    我看到的唯一原因是,如果dealer可以像这样洗牌或提高底数或东西,那么就可以完成...或者如果您想与扑克玩家模拟扑克游戏,而发牌者可以执行无效的操作,例如现实生活 :)。

    10-04 14:05