OOP中的正确方法。游戏示例。Player::walk 还是 Map::playerWalk?

tes*_*411 5 c++ oop class-design

让我们假设有一个游戏。有一个地图类和一个玩家类。地图存储字段,字段存储玩家。这将是在 OOP 中做的正确方法。什么时候负责玩家行走的方法是 Player::walk 或 Map::playerWalk?

关于第一个例子(Player::walk),这似乎是现实生活中正确的做法和类似的做法 - 它的玩家会走路,但是它必须通过地图实例访问目的地字段,检查它是否可以走到那里,从开始字段中删除它并将其添加到目标字段中,我的印象是 Player 会“知道太多”。

Ale*_*vig 3

归根结底,这是一个设计问题,两者都可以很好地适应 OOP 范式。

我倾向于将方法放在语义上最有意义的类上。在这种情况下,这意味着Player::walk,除非地图做了一些事情来使“玩家”移动(即在脚蹼游戏中,游戏板使球[又名“玩家”]移动),然后拥有该实体可能更具语义例如打电话Board::movePlayer

如果您进行设计,您应该将地图实例传递给玩家Player::walk。所以你最终会得到Player::walk(Map &map /*more parameters here, maybe a direction or vector speed?*/).

另一件需要指出的事情是,你应该尝试说的比你问的多。这意味着而不是:

//in Player::walk
if (map.cells[wantToWalkTo] == 0) {
    map.cells[wantToWalkTo] = this.playerId;
}
//TODO: handle failed moves
Run Code Online (Sandbox Code Playgroud)

你应该做类似的事情:

bool moved = map.moveTo(position, this); //encapsulate the logic for moving a player to a position
//TODO: handle failed moves
Run Code Online (Sandbox Code Playgroud)