Монополистическая игра в ООД? - PullRequest
23 голосов
/ 02 января 2011

Я нашел это интересное сообщение в блоге через CodingHorror: Мой любимый вопрос для интервью .В двух словах, он рассказывает о проблемах объектно-ориентированного проектирования при разработке игры Monopoly с акцентом на том, как моделировать правила игры.Например, «Если игрок владеет Балтийским проспектом, может ли он добавить к нему дом?»

Интересно, что в нижней части поста он пишет:

Вы можетеВозможно, сэкономите много времени на собеседовании.Вместо всей этой шумихи попросите кандидата описать, когда они фактически использовали шаблоны «Стратегия», «Посетитель» и «Команды» вне рамок.)

... что, вероятно, означает, что вы можете использовать дизайншаблоны для моделирования правил игры (см. выше).Кто-нибудь когда-либо делал это?Разработал игру Monopoly с использованием шаблонов проектирования?Если да, то как это получилось?

Ответы [ 3 ]

24 голосов
/ 26 января 2011

Вот как бы я разработал монополию. Я взял на себя смелость использовать язык с динамической типизацией, так как это делает все проще. Руби конкретно.

У вас есть простой Game объект, который в основном является оберткой размером Array размера 40, плюс несколько удобных методов. Объект Game также отслеживает количество доступных houses и hotels и две стопки карт Шанс и Сундук сообщества. Предусмотрено несколько удобных методов, таких как current_turn и next_turn! - оба возвращают объект Player; next_turn! увеличивает индекс поворота, при необходимости оборачивая до 0.

Все локации, на которые игрок может приземлиться, должны наследоваться от суперкласса Property. Класс Property определяет несколько общих вещей, таких как rent, owner, set, houses, purchasable? и upgradeable?. Свойства rent и owner могут быть nil. Свойство set возвращает Array, содержащее все свойства в группе. Размер set может варьироваться по размеру от 1 до 4. Свойство houses представляет собой отель в виде 5 «домов».

Объект Game имеет Array из Player объектов, каждый из которых имеет поля типа position (целое число от 0 до 39), money (без верхней границы - банк технически никогда не заканчивается) денег '), get_out_of_jail_frees и in_jail? (поскольку для этого недостаточно позиции). Объект Game также имеет индекс для отслеживания, чей это ход.

Все специфичные для свойства правила закодированы в соответствующих подклассах. Так, например, реализация rent на Railroad будет:

def rent
  owned_count = self.set.select { |rr| rr.owner == self.owner }.size
  return 25 * 2 ** (owned_count - 1)
end

Карты Шанс и Сундук сообщества могут быть просто реализованы с помощью множества замыканий, которые принимают игру и объект игрока в качестве параметров. Например:

# Second place in a beauty contest
COMMUNITY_CHEST_CARDS << lambda do |game, player|
  player.money += 10
end

# Advance token to Boardwalk
CHANCE_CARDS << lambda do |game, player|
  game.advance_token!(player, 39)
end

# Advance token to nearest railroad, pay double
CHANCE_CARDS << lambda do |game, player|
  new_position = [5, 15, 25, 35].detect do |p|
    p > player.position
  end || 5
  game.advance_token!(player, new_position)
  # Pay rent again, no-op if unowned
  game.properties[new_position].pay_rent!(player)
end

И так далее. Метод advance_token!, очевидно, обрабатывает такие вещи, как пассы.

Очевидно, есть еще детали - это довольно сложная игра, но, надеюсь, это даст вам правильное представление. Это было бы более чем достаточно для собеседования.

Обновление

Домашние правила можно включить или отключить, добавив house_rules Array к Game объекту. Это позволило бы реализовать свойство FreeParking следующим образом:

class Game
  def house_rules
    @house_rules ||= []
  end

  def kitty
    # Initialize the kitty to $500.
    @kitty ||= 500
  end

  def kitty=(new_kitty)
    @kitty = new_kitty
  end
end

class FreeParking < Property
  def rent
    if self.game.house_rules.include?(:free_parking_kitty)
      # Give the player the contents of the kitty, and then reset it to zero.
      return -(_, self.game.kitty = self.game.kitty, 0)[0]
    else
      return 0
    end
  end
end
5 голосов
/ 05 января 2011

Я думаю, вы здесь идете по неверному пути.

...which probably means that you can use design patterns to model the rules of the game (see above). 

Я думаю, это просто показывает, что вы не совсем понимаете, что такое шаблоны проектирования.Известные шаблоны проектирования - это просто имена, которые мы даем повторяющимся ситуациям при кодировании.В своей повседневной жизни вы никогда не говорите: «Я проснулся в 8 утра, чтобы пойти в 9 утра на место X, программируя весь день до 5 вечера, поэтому они платят мне к концу месяца».Вы говорите: «Сегодня я был на работе».У вас есть проблема желания зарабатывать деньги, и повторяющиеся решения этой проблемы сработают.Итак ... у нас есть образец здесь!Давайте назовем это «Работающим»!

Шаблоны проектирования - это всего лишь куча изученных решений общих проблем.Каждое из этих решений имеет ассоциированное имя (стратегия, посетитель и т. Д.).

Возвращаясь к

...which probably means that you can use design patterns to model the rules of the game 

Это не означает, что вы МОЖЕТЕ ИСПОЛЬЗОВАТЬ шаблоны проектирования для моделирования правилигра, это означает, что что бы вы ни делали в своем решении, оно, вероятно, попадет в некоторые из известных шаблонов проектирования.Тогда вам легче думать о своем решении как о наборе взаимосвязанных шаблонов, чем о необходимости описывать все с нуля.

3 голосов
/ 02 января 2011

Я никогда не разрабатывал правила монополии (слишком просто, я думаю), но я занимался написанием движков для других известных игр для личного удовольствия и с пониманием, что все это академическое упражнение.

Две игры, которые я пытался смоделировать (и продолжаю пробовать): D & D и M: tG .

В D & D акцент делается на очень хороший OOсоздание классов и иерархий классов, которые имеют смысл.

С M: tG вы в основном понимаете, что прямая OO-парадигма для такого рода вещей неполна.В итоге вы работаете с агентами, брокерами событий и создаете действительно сложные наборы правил.

Это все довольно бессмысленно, если вы не дизайнер игры.Хорошо, хотя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...