Как я могу сделать несколько вражеских боев в консольной игре C #? - PullRequest
0 голосов
/ 13 мая 2018

Я работаю над консольной игрой, чтобы изучить материал, и у меня есть боевая система, но я хочу создать что-то вроде Final Fantasy, где вы сражаетесь с более чем одним врагом.

Прямо сейчас у меня есть это:

public void randomEncounter()
    {
        Console.Clear();
        enemy = null;
        int enemyType = rand.Next(1, 4);

        switch (enemyType)
        {
            case 1:
                enemy = new Enemy("Troll", 1, this);
                enemy.setExpGiven(rand.Next(20, 30));
                Console.WriteLine($"A troll appears. \n");
                break;
            case 2:
                enemy = new Enemy("Orc", 1, this);
                enemy.setExpGiven(rand.Next(30, 50));
                Console.WriteLine($"A orc appears. \n");
                break;
            case 3:
                enemy = new Enemy("Ogre", 1, this);
                enemy.setExpGiven(rand.Next(50, 70));
                Console.WriteLine($"A ogre appears. \n");
                break;
        }
    }

А вот меню, в котором я управляю встречей:

public void encounterMenu()
    {
        randomEncounter();
        do
        {
            drawHealth();

            Console.WriteLine("1.   Fight");
            Console.WriteLine("2.    Heal ");
            Console.WriteLine("3.  Level Up");
            Console.WriteLine("4.   Flee \n");

            try
            {
                Console.Write("What do you wish to do? : ");
                choice = Convert.ToInt32(Console.ReadLine());
                Console.WriteLine();

                switch (choice)
                {
                    case 1:
                        fight();
                        break;
                    case 2:
                        heal();
                        break;
                    case 3:
                        player.levelUp();
                        break;
                    case 4:
                        Console.Clear();
                        mainMenu();
                        break;
                    default:
                        Console.WriteLine("Invalid choice! \n");
                        break;
                }
            }
            catch
            {
                Console.WriteLine("\nNo choice entered! \n");
            }

            pause();
            Console.Clear();

            if(enemy.isDead())
            {
                randomEncounter();
            }
        } while (choice != 0);
    }

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

1 Ответ

0 голосов
/ 13 мая 2018

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

Начинающие часто застревают, потому что они не разбили свою проблему на решаемые шаги.В программировании вы обычно разбиваете проблему на этапы, создавая классы.Вы создали класс для врагов, но если вы хотите «сделать что-то ... где вы сражаетесь более чем с одним врагом», вам нужно создать класс для этого.

public class Encounter
{
    Player player;
    IEnumerable<Enemy> enemies;

    public Encounter(Player player)
    {
        if (player == null) throw new ArgumentNullException(nameof(player));

        this.player = player;
        enemies = new List<Enemy>();
    }
}

Теперь вместо того, чтобы сражаться с врагамивы боретесь со встречами:

var encounter = new Encounter(player);

У вас есть много неопределенных идентификаторов в вашем примере.Я предполагаю, что это статические переменные.Вы не должны использовать их, вы должны создавать переменные и методы класса;Ваш encounterMenu метод должен выглядеть примерно так:

switch (choice)
{
    case 1:
        player.Attack(encounter);
        encounter.Attack(player);
        break;

    case 2:
        encounter.Attack(player);
        player.Heal();
        break;

}

Вы также не должны жестко программировать консольные команды в своей логике.Если вам нужно напечатать имя или запрос, вы должны сделать это в своем пользовательском интерфейсе:

Console.WriteLine($"A {encounter.name} appears!");
...