gpt4 book ai didi

oop - 我的(基本)吃 bean 游戏的 OO 设计

转载 作者:行者123 更新时间:2023-12-05 01:17:04 26 4
gpt4 key购买 nike

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

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

为简单起见:

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();
}
}

所以我现在要做的就是创建一个 Game 对象并每次调用它的 update() 和 draw()。很简单。但它不起作用。

假设我在玩家对象上调用 update() 并且玩家(当然是吃 bean 人)击中了食物。在那种情况下,应该通知 map 对象这个(和位置)从二维数组中移除食物。假设玩家杀死了一个怪物,怪物的位置应该改变(怪物类有一个“位置字段”)。您可以想象更多这样的情况。

一个选项是将 map 和怪物对象作为参数传递给玩家对象的 update() 和 draw() 方法。并在 map 的方法调用中将玩家和怪物对象作为参数传递。但这听起来肯定不像是一个好的 OO 设计。

解决此问题的良好 OO 方法是什么?我正在考虑使用观察者模式(所以游戏是主题,玩家, map 和怪物是观察者),但这没有任何意义:观察者必须让观察者知道任何变化,这是显然不是正确的使用方法。

任何提示都将非常受欢迎。

非常感谢:)

最佳答案

为什么不尝试映射操作?

每个 Action 都有反应。假设吃 bean 人击中了食物。这是一个 Action ,“击中食物”,它会使用react(通知 map 、食物或任何你喜欢的)食物不再存在。

现在想象吃 bean 人击中怪物,那是另一个 Action ……对此会有什么 react ?好吧,它可能会导致怪物死亡(调用 BeDeath 方法 :P)或者它可能会导致吃 bean 人死亡……无论它是什么,它都允许您将 Action 与游戏中的 react 联系起来。

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

编辑:一个简单的示例(非常简单,随着游戏变得越来越复杂,您需要更好地考虑 Action 和 react 结构)

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();
}

或者,如果您愿意,您还可以绘制 react 图

public void ComputeDotEaten(IGameInfo gameInfo)
{
foreach (dot in gameInfo.Map.Dots)
if (pacman.location == dot.location)
Reactions["DotEaten"].Execute(dot);
}

请注意,要使其正常工作,您所有的 react 都必须共享一个共同的签名(即,获取一组被转换为预期参数的对象)

关于oop - 我的(基本)吃 bean 游戏的 OO 设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5059067/

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