Oop 我的(基本)Pacman游戏的OO设计 我试图在C++中创建一个基本的PACMN游戏(在这个问题中,我将使用java语法,因为这更容易演示),但是我找不到一个好的设计选项。

Oop 我的(基本)Pacman游戏的OO设计 我试图在C++中创建一个基本的PACMN游戏(在这个问题中,我将使用java语法,因为这更容易演示),但是我找不到一个好的设计选项。,oop,design-patterns,Oop,Design Patterns,到目前为止,我有4门课: -怪物:可以针对怪物特定行为进行子类化,并包含怪物的所有逻辑 -播放器:包含播放器逻辑 -贴图:包含表示贴图的二维数组。此数组指定哪些位置是墙或Pacman食物 -游戏:包含玩家、地图和怪物列表 为了简单起见: public class Game { Player player; Map map; ArrayList<Monster> monsters; public Game() { player = new Player();

到目前为止,我有4门课:
-怪物:可以针对怪物特定行为进行子类化,并包含怪物的所有逻辑
-播放器:包含播放器逻辑
-贴图:包含表示贴图的二维数组。此数组指定哪些位置是墙或Pacman食物
-游戏:包含玩家、地图和怪物列表

为了简单起见:

public class Game {
  Player player;
  Map map;
  ArrayList<Monster> monsters;

  public Game() {
    player = new Player();
    map = new Map();
    monsters = new ArrayList<Monster();
    monsters.add(new ScaryMonster());
    monsters.add(new DumpMonster());
  }

  public void update() {
    player.update();
    map.update();

    for (Monster monster: monsters) {
      monster.update();
    }

  public void draw() {
    map.draw();
    player.draw();

    for (Monster monster: monsters) {
      monster.draw();
  }
}
公共类游戏{
玩家;
地图;
ArrayList怪物;
公共游戏(){
player=新玩家();
map=新map();

怪物=新阵列列表为什么不尝试映射动作

每一个动作都有一个反应。假设吃豆人击中食物。这是一个动作,“击中食物”,它反过来会有一个反应(通知地图、食物或任何你喜欢的东西),食物已经不存在了

现在想象一下,吃豆人击中了一个怪物,这是另一个动作…对此会有什么反应?它可能会导致怪物死亡(调用BeDeath方法:p)或者它可能会导致吃豆人死亡…无论它是什么,都可以让你在游戏中将动作与反应联系起来

这意味着游戏的逻辑,规则将在游戏类中,此外,游戏类已经知道所有需要的元素,并且可以与每个元素进行通信

编辑:一个简单的例子(非常简单,随着游戏变得越来越复杂,你需要更好地思考动作和反应结构)


请注意,要实现这一点,所有的反应都必须共享一个共同的特征码(即,将一组对象转换为预期参数)

非常感谢您的回答,这听起来是个好主意。但是您将如何实现这样的系统?让update()方法返回操作?但是,如果您使用update()方法-方法在玩家身上,玩家应该能够检查怪物/食物是否被击中,因此它需要这些位置作为参数,仍然会造成真正的混乱…不,更新,计算,绘制。首先调用更新,然后计算对游戏类中发生的事情的反应,最后,一旦一切都调整好,绘制场景。因此,将第一步分为两步两个步骤(一个计算方法)?或者调用update(),然后计算游戏类中的动作?但是在实践中如何检查例如怪物被击中?两个对象的getPosition()方法?或者我的想法是错误的吗?你能举一个非常简单的例子来说明你的意思吗?Tyvm
public void IGameInfo
{
  List<Monster> Monsters {get;}
  Pacman Pacman {get;}
  Map Map {get;}
}

public void ComputeReactions()
{
  foreach (actionChecker in Actions)
  {
    actionChecker.Check(gameInfo);
  }
}

public void ComputeDotEaten(IGameInfo gameInfo)
{
  foreach (dot in gameInfo.Map.Dots)
    if (pacman.location == dot.location)
      dot.MarkEaten();
}

public void ComputeMonsterEaten(IGameInfo gameInfo)
{
  foreach (Monster in gameInfo.monsters)
    if (gameInfo.pacman.location == gameInfo.monster.location &&
        gameInfo.pacman.Invulnerable)
      monster.MarkDeath();
    else
      Game.EndGame();
}
public void ComputeDotEaten(IGameInfo gameInfo)
{
  foreach (dot in gameInfo.Map.Dots)
    if (pacman.location == dot.location)
      Reactions["DotEaten"].Execute(dot);
}