Oop 我的(基本)Pacman游戏的OO设计 我试图在C++中创建一个基本的PACMN游戏(在这个问题中,我将使用java语法,因为这更容易演示),但是我找不到一个好的设计选项。
到目前为止,我有4门课: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();
-怪物:可以针对怪物特定行为进行子类化,并包含怪物的所有逻辑
-播放器:包含播放器逻辑
-贴图:包含表示贴图的二维数组。此数组指定哪些位置是墙或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);
}