Я думаю, что реальный ответ здесь не столько в том, как вы выполняете итерацию, но в том, как вы должны были сконструировать класс перемещения для работы.Хотя теперь вы можете игнорировать недостаток дизайна и обходить его, гораздо лучше исправить это сейчас и сделать это правильно с самого начала.
Я собираюсь решать проблемы, с которыми вы, возможно, не сталкивалисьсейчас, но они являются лучшими примерами того, почему ваш дизайн имеет недостатки, и они станут проблемой, если вы создаете игру в стиле покемонов.
Проблема :
roster.Add(new Pokemon("Charmander", 3, 52, 50, 39, Elements.Fire, FireMoves));
Здесь вы говорите, что Чармандер относится к типу Elements.Fire
и имеет определенный List<Move>
.
Однако приложение не может узнать, действительно ли эти действия Чармандер может выполнить.Что мешает мне сделать:
roster.Add(new Pokemon("Charmander", 3, 52, 50, 39, Elements.Fire, WaterMoves));
Для вас , это не выглядит проблемой сейчас.Вы можете прочитать имя списка, чтобы определить его тип, верно?Поскольку вы несете ответственность за добавление этого списка в набор движений покемона, вы знаете, что делаете все правильно.Правильно?
Итак, давайте представим, что когда ваше приложение становится больше, у вас есть следующий метод:
public void PerformAttack(Move move, Pokemon attacker, Pokemon defender)
{
}
// Example
PerformAttack(ember, charmander, bulbasaur);
Поскольку Бульбазавр относится к типу травы, он получает дополнительный урон от огненных атак.Но откуда мы знаем, что выбранный ход на самом деле является огненным? Без контекста списка, в котором он хранится, у вас нет возможности узнать, относится ли определенный ход к определенному типу .(И вы не можете использовать attacker.Type
, потому что, если Чармандер выполняет Нормальную атаку, Бульбазавр не получает дополнительного урона от этого, так как Булбазавр не имеет слабости к Нормальным атакам.)проверьте, способен ли покемон выполнить ход, о котором ему говорят, и вам нечего проверить, имеет ли покемон определенную слабость / сопротивление определенным ходам.Это важные элементы игр про покемонов, с которыми вы будете сталкиваться раньше, чем раньше, но ваш дизайн делает невозможным это сделать.
Все это происходит из-за неудачного дизайнерского решения в Move
класс: ходы не имеют типа .Чтобы бороться с этим, вы пытались назвать свои списки:
List<Move> FireMoves = new List<Move>();
List<Move> WaterMoves = new List<Move>();
List<Move> GrassMoves = new List<Move>();
Решение:
Перемещение должно иметь собственный тип:
public class Move
{
public string Name { get; set; }
public Elements Type { get; set; }
}
Теперь вы можете исправить все проблемы, которые я продемонстрировал.Все, что вам нужно сделать, это настроить тип при создании перемещения:
List<Move> FireMoves = new List<Move>();
FireMoves.Add(new Move("Ember", Elements.Fire));
List<Move> WaterMoves = new List<Move>();
WaterMoves .Add(new Move("Bubble", Elements.Water));
Это также означает, что вам больше не нужно иметь отдельные списки на основе типов, вы можете иметь один большой список.
List<Move> Moves = new List<Move>();
Moves.Add(new Move("Ember", Elements.Fire));
Moves.Add(new Move("Bubble", Elements.Water));
И поскольку все ходы теперь являются частью одного и того же списка, на ваш вопрос становится гораздо проще ответить:
До сих пор я определил синтаксический анализ, но не могу понять, какЯ бы перебрал свой список, чтобы увидеть, действительно ли этот шаг действителен.
public bool IsMove(Pokemon target, string userCommand)
{
return target.Moves.Any(move => move.Name.ToLower() == userCommand.ToLower());
}
Который вы затем можете использовать следующим образом:
string userCommand = Console.ReadLine();
if(IsMove(userCurrentPokemon, userCommand))
{
// Handle attack logic
}
else
{
// Handle non-attack logic
}
Обратите внимание, что если вы все еще хотитечтобы иметь отдельные списки по определенной причине, вы все равно можете отфильтровать список ходов:
var fireMoves = Moves.Where(move => move.Type == Elements.Fire).ToList();
var waterMoves = Moves.Where(move => move.Type == Elements.Water).ToList();
var grassMoves = Moves.Where(move => move.Type == Elements.Grass).ToList();
Если кто-то хочет прокомментировать, что этот ответ сосредоточен на существующих функциях покемонов, а не на игре OPЭто правильно, но я решил подойти к этому так, потому что OP работает в этом контексте.Я мог бы привести более нейтральный пример «добавить свойство вместо именования переменной», но это не так легко понять, и я предполагаю, что OP - новичок в области программирования, который может бороться с независимой реализациейслишком обобщенный ответ.