寻求面向对象编程的建议

时间:2011-02-21 10:31:49

标签: java oop design-patterns

我不确定我是否能够以合理的方式表达它。

我正在尝试编写一个简单的非图形游戏。用户将对计算机进行骰子游戏。

(更具体地说,这个游戏:危险骰子游戏Pig的目标是成为第一个达到100分的玩家。每个玩家的回合包括反复掷骰子。每次滚动后,玩家面对两种选择:再次滚动或按住(拒绝再次滚动)。

  • 如果玩家掷出一个1,则该玩家不会得分,它将成为对手的回合。
  • 如果玩家滚动的数字不是1,则该数字会被添加到玩家的回合总数中并且玩家的回合继续。
  • 如果玩家持有,转弯总数,转弯期间的掷骰总和,将被添加到玩家的得分中,并成为对手的回合。)

我编写了程序,但现在我想以面向对象的方式完成它。这是我的问题:

我有一个抽象的Player类。 Human_player类和Computer_player类扩展了Player类。另一个名为Game_Controller的类控制着游戏的流程。假设Computer_Player有一定的策略,除非“初始总数”小于20,否则他会继续掷骰子(这意味着他处于某个循环中)。另一方面,Game_Controller只要他愿意,只要他愿意,就会继续为Computer_Player滚动骰子(这意味着程序的那一部分处于某个循环中)。因此,当Computer_Player滚动“1”时,Game_Controller将转向Human_Player。如何让Compter_Player结束他的循环?

此外,我很难将Computer_Player作为一个具体的播放器实现(因为我是编程新手,而且我在这种交互方面特别陌生)。处理这个问题的正确方法是什么?---也就是说,Game-Controller类与Computer_Player类交互,Computer_Player类与Game_Controller类交互。

感谢您节省时间。

编辑1:这类东西是否有良好的来源(网站,书籍)?我不是在寻找那些先进的游戏编程资源,只是简单而基本的东西。

2 个答案:

答案 0 :(得分:3)

玩家可以是activeinactive。一旦他活跃,他必须做出roll()hold()的决定。每个玩家都有一个制定这个决策过程的策略 - 一个人类玩家有策略,计算机玩家需要一个在代码中实现的策略。此策略可以提供方法:decide(int myScore, int oppenentsScorce)并生成结果:滚动或不滚动

Player类可能如下所示:

 public class Player {
   enum Decision { ROLL, HOLD }
   private Controller gameController;
   public Player(Controller gameController) {
      this.gameController = gameController;
   }

   // this is the real players strategy (-> Strategy pattern)
   abstract Decision decide(int myScore, int opponentsScore); 

   // this method is called by the controller
   public void doTurn() {
     Decision decision = decide(gameController.getScore(this), gameControlle.getOpponentsScore(this);
     if (decision == ROLL)
        gameController.roll(this);
     if (decision == HOLD)
        gameController.hold(this);
   }
 }

HumanPlayer子类可以打开人类玩家的对话框,显示实际结果并提供两个按钮:滚动/保持。 ComputerPlayers实现将使用算法进行决策。

控制器控制游戏,滚动骰子并保持分数。如果有胜利者,控制器会在每次转弯后进行检查。

答案 1 :(得分:0)

如果Player公开了DoYouWantToThrow方法,具体类可以通过决定返回true或false来实现它。如果投掷结果为1,则游戏控制器根本不会调用此方法。对于任何其他值,计算得分并将问题呈现给玩家。如果玩家是人类玩家,则该方法向用户实施问题对话。对于计算机播放器,问题实现为一个看起来像这样的逻辑(伪代码)。

return 
  (self.TurnScore < 20) or // Always throw again if under 20.
  (self.Bravery <= 1 and self.TurnScore < 25) or // Scared
  (self.Bravery = 2 and self.TurnScore < 40) or // Moderate
  (self.Bravery = 3 and self.TurnScore < 70) or // Gambler
  (self.Bravery = 4); // All or nothing

因此计算机播放器实际上没有循环。只询问是否要再次投掷。循环实际上在游戏控制器中,如果投掷结果为1或ThrowAgain返回False或最后一次投掷使玩家达到100,则该循环被破坏。在该示例中,我添加了一些简单的勇敢程度。你也可以添加一些随机性,但实质是相同的:计算机只决定是再次投掷还是交出。循环在游戏控制器中。