2015-01-20 2 views
1

Я работаю над военной игрой, используя java. Эта военная игра имеет разные боевые единицы. Единицами являются, например, «Человек», «Гном» и «Эльф», все из которых имеют свои собственные свойства. Чтобы разместить эти свойства, в настоящее время у меня есть класс для «Человеческий», «Гном» и «Эльф», которые также расширяют абстрактный класс «Единица».Дизайн шаблона для взаимодействия wargame

Теперь я хочу запрограммировать диаграмму повреждений. Например, когда человек атакует карлика, это 56 урона. Когда гном атакует эльф, он наносит 27 урона. и т. д. Каждое взаимодействие между единицами уникально и дает число.

Я ищу шаблон дизайна, который позволяет легко добавить новый блок и обновить диаграмму повреждений, чтобы он взаимодействовал друг с другом. Это также должно облегчить удаление устройства.

Я думал о том, чтобы предоставить каждому модулю уникальный идентификатор и поместить такой метод в каждый блок.

public int getDamage(Unit defender) { 
    switch(defender.getID() { 
     case 0: return 27; 
     case 1: return 50; 
     .... 
    } 
} 

Но это кажется очень неуклюжим, чтобы добавить или удалить блок таким образом, потому что вы должны изменить заявление переключателя в каждом классе, который реализует «Unit». Это также не очень читаемо. Я также подумал о том, чтобы поставить оператор switch в отдельный класс «Damage Chart». Но для этого потребуется также оператор switch для злоумышленника и создаст вложенные операторы switch (что является уродливым).

Есть ли чистый способ решить эту проблему? Может быть, шаблон дизайна уже существует для такого рода проблем?

ответ

1

Эта проблема называется «double dispatch», и для нее существуют различные решения. Например, если у вас есть определенное количество видов, и вы не только заботитесь об атаках между ними, но все большее число различных решений (рисунок, дипломатия, удача и т. Д.), Которые все зависят от реальных видов, вы можете используйте visitor pattern.

+0

Я также предложил шаблон посетителя. В сочетании с дженериками он должен хорошо выполнять эту работу. – Korashen

+0

Это подразумевает AttackVisitor, который посещает атакующего и защитника в разных режимах. Вы должны написать хотя бы один метод для комбинации злоумышленников-защитников. Есть (количество единиц, квадрат) таких комбинаций. Для меня это не очень удобно. – Svante

+0

В конце концов мне пришлось бы ввести n^2 номера. Создание n^2 методов не так сильно отличается. Это также мешает мне использовать id-номера (которые я ненавидел), и он сохраняет код читаемым. Мне все же кажется немного странным, что мои юниты теперь являются посетителями и посетителями. Но я думаю, это лучшее решение! Thnx! – kerel123

0

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

Если у вас много единиц, это становится довольно утомительным. Я бы предложил использовать что-то вроде атак и защитных оценок (например, дварфский акселератор 30/20), единицы мечения с «чем они» (например, эльфы, дварфы) и несколько специальных (например, + 4/+ 1 против эльфов, или - 5/0 против акселеров). Таким образом, вы можете добавить новый блок, применить к нему несколько тегов и специальных предложений, и сделать это, так как остальные простые вычисления.

Другими словами: Я думаю, что у вас есть проблема с данными, а не проблема языка.

Смежные вопросы