Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 一款纸牌游戏的OOP设计问题_Java_Class_Oop_Interface - Fatal编程技术网

Java 一款纸牌游戏的OOP设计问题

Java 一款纸牌游戏的OOP设计问题,java,class,oop,interface,Java,Class,Oop,Interface,我对自己的编程技能越来越有信心,所以我决定重新开始以前开始的纸牌游戏。这个程序的要点是,现在我已经很好地掌握了程序流程、变量、条件等,我想加深对OOP的理解 所以我需要一些关于面向对象设计的建议 我的纸牌游戏将有5个等级: 主要 卡片 卡片组(has-a卡片阵列列表) 玩家(has-从牌组对象接收的牌对象列表) 经销商 我想知道将Dealer类作为接口是否是合适的OOP。所有玩家都应该能够扮演庄家的角色,但不用说,每轮牌只有一个庄家。让玩家类实现庄家可以执行的方法(例如dealGame())可以

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

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

我的纸牌游戏将有5个等级:

  • 主要
  • 卡片
  • 卡片组(has-a卡片阵列列表)
  • 玩家(has-从牌组对象接收的牌对象列表)
  • 经销商
  • 我想知道将Dealer类作为接口是否是合适的OOP。所有玩家都应该能够扮演庄家的角色,但不用说,每轮牌只有一个庄家。让玩家类实现庄家可以执行的方法(例如dealGame())可以吗?即使给定回合中8个玩家对象中有7个没有使用他们实现的方法,而且,当时也不被视为庄家?还是让dealGame()方法属于Deck类并调用Deck来处理游戏更好?如果这是一个愚蠢的问题,我很抱歉,但我对OOP的原理有点粗略,希望得到一些建议,让我第一次就学会正确操作

    我也想过让庄家扩展玩家,但我认为这是错误的,因为我需要玩家扮演一个动态的庄家角色,而不是以不变的方式被宣布为庄家对象。在这种情况下-如果庄家扩展玩家-我想我需要声明游戏中的所有玩家都是庄家

    所以基本上我在问:

  • 如果你用这5个等级制作一个纸牌游戏,你会把庄家等级作为一个界面,而把其他的常规等级作为一个界面吗?为什么
  • 我是否在OOP的正确轨道上,还是完全迷失了方向

  • 这在很大程度上取决于程序是如何工作的,你期望每个类能够做什么,以及每个对象的生命周期是如何工作的(例如,玩家能否在以后的回合中成为庄家)


    你写的第一印象是,你需要一个基类“person”,玩家和庄家从中继承,但这只是根据有限的信息进行猜测。

    庄家并不是一种特殊类型的玩家。这只是一个球员在同一时间有特殊责任的例子。我认为你在正确的轨道上,但你可能想为你正在玩的特定游戏创建一个类


    假设你在写一个扑克游戏。在这种情况下,经销商偶尔会影响比赛顺序(取决于风格)。但如果你在打仗,庄家只是一个发牌的人,你真的不在乎。在这种情况下,“谁是庄家”和“庄家应该如何处理游戏”的概念是游戏本身的责任,而不是玩家的责任。

    你有很好的方法,但仍有一些工作要做:)。所有的课程都很好,但德莱尔不是

    首先-如果玩家是一轮庄家,第二轮是另一个庄家,我看不到扩展类或接口的意义

    事实上,一开始,我不会让任何球员成为庄家,这会让事情变得复杂

    处理这个问题的最简单和最好的方法是创建5.0版游戏。游戏有牌组和所有玩家,它的工作方式和庄家类似。它等待玩家响应,在应该的时候显示卡片等等

    如果你真的想让玩家成为经销商,那就更复杂了:)。你也需要游戏类,因为
    游戏
    必须决定谁作为经销商开始,它应该剥夺或给予玩家经销商的权利(我不明白这有什么意义,但如果你想…:)

    如何做到这一点?
    游戏
    玩家庄家
    变量。If应该有类似于
    registerDealer(Player)
    的方法。然后,您需要某种接口来在
    游戏
    玩家
    之间进行通信。 如果希望
    玩家
    游戏
    负全部责任,可以使用
    访客模式
    。(它允许<代码>庄家在游戏实例中“潜入”并执行任何公共方法可以执行的操作)

    否则,您可以让
    游戏
    询问
    经销商
    该做什么,然后等待玩家输入。应该通过调用类似于
    dealer.askWhatToDo()
    的方法并使用返回值来执行操作。它允许验证输入。。。然而,如果我是对的,扑克中的有效输入总是只有一个,所以我看不出有什么区别,如果
    游戏
    本身决定做什么


    我看到的唯一原因是,如果庄家可以洗牌或提高底牌或诸如此类的东西,那么它就可以做到。。。或者,如果您想与扑克玩家和经销商模拟扑克游戏,他们可以做一些无效的事情,如在现实生活中:)。

    您似乎基本上走上了正确的道路。不过,我对
    经销商的
    级别不太清楚。也许一个更好的主意可能是一个
    游戏
    类,它跟踪元内容。它处理牌组中的牌的实际交易,跟踪哪些玩家已经折叠,等等,哪个玩家是庄家,记录分数等等。我知道在现实生活中玩家交易,但这在现实生活的模拟中是必要的吗?我的意思是,玩家作为玩家的身份是否与他们作为dealerFor的身份有关?对于我来说,dealGame()等方法属于其他与游戏相关的类。玩家是否是庄家只是一个布尔标志的问题,这将允许他们在某种游戏或桌面对象上调用这些方法。事实上,第9个实体可以独立于8个玩家中的任何一个进行交易。这似乎是最好的方式。游戏的想法有一个玩家类型的经销商实例变量是非常有意义的,其他想法也是如此。谢谢你的建议!