2015-05-31 8 views
0

Итак, я работаю над текстовым приключением, чтобы улучшить свои навыки программирования (только новичок), и я работал над новой боевой системой, потому что старая была очень скучной. Таким образом, я наткнулся на систему ножниц для каменной бумаги, но мне нужно было что-то, что использовало ножницы для каменной бумаги, такие как система с 5 вариантами для игрока на выбор, а также противник или монстр, атакующий игрока.Есть ли способ сделать это более эффективным?

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

 public static void ResultsOfMoves(string PlayerMove, string MonsterMove, Monster CurrentMonster, Weapon CurrentWeapon, Armor CurrentArmor, Player CurrentPlayer) 
    { 
     //Monster Responses to Player 
     if (PlayerMove == "dodge" && MonsterMove == "heavy"||MonsterMove == "stealth") 
     { 
      if (MonsterMove == "heavy") { MonsterHeavyAttack(); } 
      if (MonsterMove == "stealth") { MonsterStealthAttack(); } 
     } 
     else if (PlayerMove == "charge" && MonsterMove == "dodge"||MonsterMove == "stealth") 
     { 
      if (MonsterMove == "dodge") { MonsterDodge(); } 
      if (MonsterMove == "stealth") { MonsterStealthAttack(); } 
     } 
     else if (PlayerMove == "block" && MonsterMove == "charge" || MonsterMove == "dodge") 
     { 
      if (MonsterMove == "charge") { MonsterChargeAttack(); } 
      if (MonsterMove == "dodge") { MonsterDodge(); } 
     } 
     else if (PlayerMove == "heavy" && MonsterMove == "block" || MonsterMove == "charge") 
     { 
      if (MonsterMove == "block") { MonsterBlock(); } 
      if (MonsterMove == "charge") { MonsterChargeAttack(); } 
     } 
     else if (PlayerMove == "stealth" && MonsterMove == "heavy" || MonsterMove == "block") 
     { 
      if (MonsterMove == "heavy") { MonsterHeavyAttack(); } 
      if (MonsterMove == "block") { MonsterBlock(); } 
     } 

     //Players Responses To Monster 
     if (MonsterMove == "dodge" && PlayerMove == "heavy" || PlayerMove == "stealth") 
     { 
      if (PlayerMove == "heavy") { MonsterHeavyAttack(); } 
      if (PlayerMove == "stealth") { MonsterStealthAttack(); } 
     } 
     else if (MonsterMove == "charge" && PlayerMove == "dodge" || PlayerMove == "stealth") 
     { 
      if (PlayerMove == "dodge") { MonsterDodge(); } 
      if (PlayerMove == "stealth") { MonsterStealthAttack(); } 
     } 
     else if (MonsterMove == "block" && PlayerMove == "charge" || PlayerMove == "dodge") 
     { 
      if (PlayerMove == "charge") { MonsterChargeAttack(); } 
      if (PlayerMove == "dodge") { MonsterDodge(); } 
     } 
     else if (MonsterMove == "heavy" && PlayerMove == "block" || PlayerMove == "charge") 
     { 
      if (PlayerMove == "block") { MonsterBlock(); } 
      if (PlayerMove == "charge") { MonsterChargeAttack(); } 
     } 
     else if (MonsterMove == "stealth" && PlayerMove == "heavy" || PlayerMove == "block") 
     { 
      if (PlayerMove == "heavy") { MonsterHeavyAttack(); } 
      if (PlayerMove == "block") { MonsterBlock(); } 
     } 

    } 
+1

Есть много способов сделать это более эффективным. Например, если вы использовали перечисления вместо строк, вы были бы гораздо более компактными. Также вы можете создавать таблицы указателей функций (делегаты в C#) и просто искать следующее действие в словаре и выполнять его в одной строке кода. Я позволю кому-то более актуальному на C# проиллюстрировать это с помощью кода. –

+0

Это может быть лучше помещено в Exchange Programmers. –

+0

@Makoto: Это может быть C++, чей 'std :: string class' поддерживает сравнения, используя' == '. OP, можете ли вы добавить языковой тег? –

ответ

1

Сначала создайте Move перечисление, а не с использованием строк:

public enum Moves 
{ 
    Charge, 
    Dodge, 
    Heavy, 
    Steath, 
    Block 
} 

Далее используйте Dictionary для определения движения:

var moveResolution = new Dictionary<Tuple<Moves, Moves>, Action> 
{ 
    { new Tuple<Moves, Moves>(Moves.Dodge, Moves.Heavy), MonsterHeavyAttack }, 
    { new Tuple<Moves, Moves>(Moves.Dodge, Moves.Steath), MonsterStealthAttack }, 
    { new Tuple<Moves, Moves>(Moves.Charge, Moves.Dodge), MonsterDodge }, 
    ... 
}; 

Затем, чтобы определить соответствующий ход, просто do:

var moveCombination = new Tuple<Moves, Moves>(playerMove, monsterMove); 
if (moveResolution.ContainsKey(moveCombination)) 
{ 
    moveResolution[moveCombination](); 
} 

Этот код затем может быть дополнительно улучшен путем замены ленивого Tuple<Moves, Moves> на структуру MoveCombination. Примечание, используйте struct, чтобы убедиться, что часть moveResolution.ContainsKey(moveCombination) работает так, как вам нужно сравнивать по значению, а не по ссылке.

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