gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:53:00 25 4
gpt4 key购买 nike

假设有一场比赛。有一个 map 类和一个玩家类。 map 存储字段,字段存储玩家。这将是在 OOP 中做的正确方法。什么时候负责玩家行走的方法是 Player::walk 或 Map::playerWalk?

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

最佳答案

最终这是一个设计问题,两者都可以很好地适应 OOP 范例。

我倾向于将方法放在语义上最有意义的类上。在这种情况下,这意味着 Player::walk,除非 map 做了一些让“玩家”移动的事情(即在脚蹼游戏中,游戏板让球 [aka 'player'] 移动)然后让该实体调用例如 Board::movePlayer 可能更具语义。

如果您选择 Player::walk 设计,您应该将 map 实例传递给玩家。所以你最终得到 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

你应该这样做:

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

关于c++ - OOP 中的正确方法。游戏示例。 Player::walk 还是 Map::playerWalk?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26717919/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com