2014-11-26 1 views
2

У меня проблема с двумя решениями, которые нужно выбрать. Интересно, какой правильный способ реализации атрибутов в RPG. Будем, ради этого, сказать, что у нас есть три атрибута. Наступательные, Оборонительные и Скорость. У каждого персонажа есть такие. Где-то мне нужно сохранить имя, описание и значения атрибутов. Я полагаю, что это должно быть сделано в Attributes.java. Давая мне следующее Attribute.javaВнедрение систем атрибутов и навыков

public class Attribute 
{ 
    private String name; 
    private String desc; 
    private int value; 

    public Attribute (String name, String desc, int value) { 
     this.name = name; 
     this.desc = desc; 
     this.value = value; 
    } 

    public String getName() { // for desc and value as well 
     return name; 
    } 
} 

Теперь на проблемы, были ли я создавать и хранить эти атрибуты?

Вариант № 1, я создаю их здесь, заполняя ArrayList с ними

Character.java

import java.util.ArrayList; 
import java.util.List; 

public class Character 
{ 
    private List<Attribute> attributes; 

    public Character() { 
     attributes = new ArrayList<Attribute>(); 
    } 

    public List<Attribute> getAttributes() { 
     return attributes; 
    } 
} 

Option # 2, я создаю AttributeSystem

AttributeSystem. java

public class AttributeSystem 
{ 
    private List<Attribute> attributes; 

    public AttributeSystem() { 
     attributes = new ArrayList<Attribute>(); 
     attributes.add (new Attribute ("Offensive", "Your damage.", 5); 
     attributes.add (new Attribute ("Defensive", "Your defense.", 5); 
     attributes.add (new Attribute ("Speed", "Your speed.", 5); 
    } 

    public Attribute getAttribute(int i) { 
     return attributes[i]; 
    } 
} 

Character.java

public class Character 
{ 
    private AttributeSystem attributes; 

    public Character() { 
     attributes = new AttributeSystem(); 
    } 

    public AttributeSystem getAttributes() { 
     return attributes; 
    } 
} 

Заключение

Вариант № 2 делает логически больше смысла для меня. В обоих случаях я могу использовать HashMap вместо ArrayList.

Какой и зачем использовать?


Final Примечание

Это делает не эффекты на вашем персонаже. У него также нет возможности добавлять точки атрибутов. Игнорируйте эти два фактора на данный момент.

+1

Этот вопрос, как представляется, не по теме, поскольку речь идет о проверке кода, вы должны отправить это вопрос на http://codereview.stackexchange.com – LearnCocos2D

+0

Так что codereview было бы лучше? Я не размещал его там, потому что код далеко не полный или реальный. Вопрос в том, какая из двух реализаций лучше использовать? Или, возможно, если есть третий, о котором я не знаю. – Emz

+1

Обзор кода Emz лучше подходит ИМО. У вас нет конкретной проблемы, просто вопрос о том, какое решение выбрать. Это можно рассматривать как, в первую очередь, мнение. – Magnilex

ответ

1

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

В дизайне №2 персонаж никогда не может изменять свои атрибуты. Все они будут 5. Возможно, это всего лишь пример, но с трудом становится труднее работать, когда вы выходите за пределы жестко закодированных значений.

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

class Character { 
    int defensive, offensive, speed; 
} 

Теперь вы можете инкапсулировать модификаторы, такие как оружие, броню и т.д., используя методы геттер следующим образом:

class Character { 
    int defensive, offensive, speed; 

    Item weapon; 
    Item armor; 
    Item shoes; 

    public int getTotalDefensive() { 
     return armor.getDefensive() + defensive; 
    } 

    public int getTotalOffensive() { 
     return weapon.getOffensive() + offensive; 
    } 

    public int getTotalSpeed() { 
     return shoes.getSpeed() + speed; 
    } 

    public List<Attribute> getAttributes() { 
     // if you really need to work with a character like this then you can do that too. 
     List<Attribute> attributes = new ArrayList<Attribute>(); 
     attributes.add(new Attribute("offensive", "How much damage you can do", offensive); 
     attributes.add(new Attribute("defensive", "How much damage you can sustain", defensive); 
     attributes.add(new Attribute("speed", "How fast you can move", offensive); 
     return attributes; 
    } 
} 
+0

Проблема в том, что есть 6 атрибутов и более 40 навыков. Оборудование имеет 14 штук. Класс Attribute намного сложнее, чем я опубликовал. Может быть, я должен отредактировать вопрос и показать весь класс атрибутов? – Emz

+0

Если атрибут является сложным, но вы получаете только 6 из них, я бы просто изменил «int» для «Attribute», и я бы добавил List для навыков, а другой для оборудования, но общая идея заключается в том, что персонаж имеет некоторые атрибуты и доступ к ним должны быть как можно более легкими. –

+0

Если вы делаете повторную проверку кода, дайте нам ссылку здесь, и я перееду туда. Вы можете расширить сложность своего вопроса там, чтобы помочь нам понять, что вы пытаетесь представить. – chubbsondubs

1

Возможно, вы закончили инженерное проектирование. Предполагая, что это классическая RPG, выбранное имя для этих значений (атрибутов) должно дать вам подсказку: если у вас есть объект Character, и у него будут атрибуты ... тогда я бы добавить эти атрибуты самого характера:

class Character { 
    int defensive,offensive,speed; 
    ... //other attributes here, like name, race or whatever you need 

} 

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

Кроме того, не следует смешивать модель и представление: описание каждого атрибута не должно быть частью символа, эта информация не нужна этому объекту и будет дублироваться каждый раз при создании нового символа.

+0

вы не отвечаете на вопрос, так как атрибут - это не просто значение, а кортеж имени и описания значения:/ –

+0

Проверьте мое обновление: на мой взгляд, какие-то значения не должны быть там –

+0

Что вам еще понадобится? ? Как я мог хранить имя и описание атрибута? – Emz

2

Оба варианта кажутся мне законными. Но я бы объявил список атрибутов статичным, поскольку список доступных атрибутов для игрока не изменится ни на что.

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