【发布时间】:2011-06-30 20:27:30
【问题描述】:
我正在尝试用 C++ 创建一个基本的 Pacman 游戏(我将在这个问题中使用 Java 语法,因为这更容易演示),但我找不到一个好的设计选项。
到目前为止,我有 4 节课:
- 怪物:可以针对特定于怪物的行为进行子类化,并包含怪物的所有逻辑
- 播放器:包含播放器逻辑
- 地图:包含表示地图的二维数组。此数组指定哪些位置是墙壁或吃豆人食物
- 游戏:包含玩家、地图和怪物列表。
为了简单起见:
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() 并且玩家(当然是吃豆人)击中食物。在这种情况下,应该通知地图对象(和位置)以从二维数组中移除食物。假设玩家杀死了一个怪物,怪物的位置应该改变(怪物类有一个“位置字段”)。你可以想象更多这样的情况。
一种选择是将地图和怪物对象作为参数传递给玩家对象的 update() 和 draw() 方法。并在地图的方法调用中将玩家和怪物对象作为参数传递。但这听起来肯定不是一个好的 OO 设计。
有什么好的 OO 方法可以解决这个问题?我正在考虑使用观察者模式(所以游戏是主题,玩家,地图和怪物是观察者),但这没有任何意义:这样观察者将不得不让主题知道任何变化,即显然不是正确的使用方式。
非常欢迎任何提示。
非常感谢:)
【问题讨论】:
标签: oop design-patterns