alternatywa lub sposób na łączenie typów enum -> zmienna

0

Witam

Pisałem sobie tak system walki turowy (a'la RPG) gracz vs komputer.

Klasy zrobione, mechanika też powoli idzie do przodu ale zastanowiła mnie jedna rzecz która chyba by można było zrobić lepiej ale nie wiem jak...otóż :

Zaczynając od góry mamy :

class Character
{
      List<Attack> attacks = new List<Attack>();
      //
      double magicRes;
      double psyhRes;
}
class Attack
{
      //...
      AttackType attackType = AttackType.NONE;
}
public enum AttackType
{
     MAGIC,
     PSYHICAL,
     NONE,
     // itd...
}

I problem jest taki że podczas liczenia np. obrażeń muszę powiązać jakoś AttackType z odpowiednią odpornością i wychodzi mi tak :

public double ResMaching(AttackType type, Character character)
{
            if (type == AttackType.MAGIC)
            {
                return character.magicRes;
            }
            // itd..
}

Czyli mając np. 20 typów ataków mamy 20 x if / case. Później dodam jakieś efekty (enum) i odporności na efekty(double) (np. FEAR - resFear, CURSE - resCurse), albo buffy konkretnych statystyk i zawsze w połączeniu Enum -> jakaś zmienna będę musiał pisać milion 'statementów' if / case.

Jakaś rada żeby to ładniej zrobić ?

Nie wiedziałem jaki tytuł dać...

1

Zamiast w konkretnych polach, trzymaj odporności w słowniku, np.

//gdzieś w class Character
//u siebie machnij tu gettera jakiegoś fajnego
res = new Dictionary<String, int>() {
    {AttackType.MAGIC, 5},
    {AttackType.PSYHICAL, 1}
};

wtedy załatwisz to w taki sposób:

public double ResMaching(AttackType attackType, Character character) {
    int result = 0;
    character.res.TryGetValue(attackType, out result);
    return result;
}
0

Jeśli nie ma żadnej zależności wprost między tymi zmiennymi, najwygodniej będzie opracować jakiś tekstowy format opisu tych danych i wczytywać je wraz z grą.

0

.wykropkowane.

0

Dzięki, próbuje ze słownikami. Miałem już coś takiego do zmian statystyk o daną wartość a dalej ify dorabiałem :(

Dictionary<Stats, double> statToChange= new Dictionary<Stats, double>();

Szukałem o tych EnumMap ale chyba w C# tego nie ma ? trzeba by było robić coś na wzór tego.

a @Patryk27 rozwiązania nie bardzo rozumiem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0