Почему бы вам не попробовать составить карту действий?
Каждое действие имеет реакцию.Допустим, пакман бьет едой.Это действие, «ударяя еду», которое, в свою очередь, реагирует (уведомляя карту, или еду, или все, что вам нравится), что еды больше нет.
Теперь представьте, что пакман поражаетмонстр, это еще одно действие ... какова будет реакция на это?Что ж, это может привести к смерти монстра (вызов метода BeDeath: P), или это может привести к смерти пакмана ... что бы это ни было, это позволит вам связывать действия с реакциями в игре.
Это означает, что логика игры, правила должны быть в классе игры, который, кроме того, уже знает все необходимые элементы и может общаться с каждым из них.
Редактировать: простой пример (очень простой,по мере того, как игра становится все более сложной, вам нужно больше думать о структуре действий и реакций)
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);
}
Обратите внимание, что длячто для выполнения всех ваших реакций необходимо использовать общую сигнатуру (т. е. брать массив объектов, приведенных к ожидаемым параметрам)