我对自己的编程技能越来越有信心,所以我决定重新启动以前开始的纸牌游戏。现在,该程序的要点是我对程序流程,变量,条件等有了很好的了解,我想加深对OOP的理解
所以我需要一些有关面向对象设计的建议
我的纸牌游戏将有5个 class :
我想知道将Dealer类用作接口是否适当的OOP。所有玩家都应该能够扮演发牌人的角色,但是不用说,每轮发牌只有一名发牌人。使Player类实现发牌者可以执行的方法(例如DealGame())是否可行,即使在任何给定回合中8个Player对象中有7个将不使用其实现的方法,而且不当时被认为是经销商?还是让DealGame()方法属于Deck类并调用平台来进行游戏会更好?抱歉,这是一个愚蠢的问题,但是我对OOP的原则有些粗略,希望有人建议您在第一时间学会正确的做法。
我还考虑过让Dealer扩展Player,但我认为这是错误的,因为我需要玩家即时扮演Dealer的角色,而不是以不可更改的方式被声明为Dealer对象。在这种情况下-如果Dealer扩展了Player-我想我需要将游戏的所有玩家声明为Dealers。
所以基本上我在问:
最佳答案
您有很好的方法,但是仍然需要做一些工作:)。所有的 class 都很好,但Delaer却不是。
首先-如果玩家是一个回合的发牌人,第二个人是发牌人,则我看不到扩展类或界面的意义。
实际上,一开始,我不会让任何玩家成为经销商,这会使事情变得复杂。
解决这个问题的最简单,最好的方法是创建5.Game。游戏拥有Deck和所有玩家,并且其运作方式与庄家相似。它等待玩家做出反应,并在需要时显示纸牌等。
如果您真的想让玩家成为发牌人,那会更加复杂:)。好吧,您也需要Game类,因为Game
必须确定谁作为发牌人开始,它应该带走或赋予玩家发牌人的权利(我不明白这一点,但如果您想要... :)) 。
以及如何做到这一点? Game
具有Player dealer
变量。如果应该有类似registerDealer(Player player)
方法的东西。然后,您需要某种接口在Game
和Player
之间进行通信。
如果您希望Player
具有Game
的所有职责,则可以使用Visitor pattern
。 (它允许dealer
在游戏实例内部“潜行”并执行公共方法可以做的一切)。
否则,您可以让Game
询问dealer
该做什么并等待玩家输入。应该通过调用诸如dealer.askWhatToDo()
之类的方法并使用返回值来执行操作。它允许验证输入...但是,如果我是对的,那么扑克中的有效输入总是只有一个,因此,如果Game
本身决定要做什么,我看不出任何区别...
我看到的唯一原因是,如果dealer
可以像这样洗牌或提高底数或东西,那么就可以完成...或者如果您想与扑克玩家模拟扑克游戏,而发牌者可以执行无效的操作,例如现实生活 :)。