C # Text-Based Game читает без ошибок, но закрывается после первого выбора - PullRequest
0 голосов
/ 26 февраля 2019

Это пример, пожалуйста, будьте осторожны со мной, так как это первый код, который я действительно когда-либо написал.Я не уверен, что форматирование переведет полностью.Этот код работал нормально до последнего редактирования, в котором я изменил «rand» на «rand1», как будто выдавал ошибку, что «rand» уже использовался.Теперь, когда я запускаю его, я начинаю «бороться или прятаться», и как только я вхожу в один из вариантов, терминал закрывается.Тем не менее, Visual Studio не показывает ошибок.

namespace Text_Game
{
class Game
{
    static int playerHealth = 125;
    static int playerAttack = 10;
    static string playerName;
    static string playerChoice;

    static int enemyHealth = 100;
    static int enemyAttack = 5;


    static void Main(string[] args)
    {
        Welcome();
        FightLoop();
    }

    private static void Welcome()
    {
        Console.WriteLine("Hello Traveller, What is your name?");
        playerName = Console.ReadLine();

        Console.WriteLine("Well Hello, " + playerName);
        Console.WriteLine("You are alone in a dark dungeon. You can see a room behind you and a long hall in front of you.");
        Console.ForegroundColor = ConsoleColor.DarkRed;
        Console.WriteLine("You hear an enemy nearby...");
        Console.ForegroundColor = ConsoleColor.DarkCyan;
        Console.WriteLine("(fight) or (hide)?");
        Console.ForegroundColor = ConsoleColor.Gray;
        Console.ReadLine();
    }




    private static void FightLoop()
    {
        if (playerChoice == "fight")
        { 
            do
            {
               Console.WriteLine("You have " + playerHealth + "health left");
               Console.WriteLine("Enemy has " + enemyHealth + "health left");
               Console.ForegroundColor = ConsoleColor.DarkCyan;
               Console.WriteLine("(attack) or (defend)?");
               Console.ForegroundColor = ConsoleColor.Gray;
               playerChoice = Console.ReadLine(); Console.WriteLine();

                if (playerChoice == "attack")
                {
                  Random rand = new Random();
                  int attackdamage = (rand.Next(3, 5) * playerAttack);
                  enemyHealth = enemyHealth - attackdamage;

                  Console.ForegroundColor = ConsoleColor.Red;
                  Console.WriteLine("Your attack did {0} damage!", attackdamage);
                  Console.ForegroundColor = ConsoleColor.Gray;

                    //enemy attacks back
                  Console.ForegroundColor = ConsoleColor.Red;
                  Console.WriteLine("The enemy attacked you!");
                  Console.ForegroundColor = ConsoleColor.Gray;

                  Random rand1 = new Random();
                  int enemydamage = (rand.Next(2, 4) * enemyAttack);
                  playerHealth = playerHealth - enemydamage;

                  Console.ForegroundColor = ConsoleColor.Red;
                  Console.WriteLine("The enemy's attack did {0} damage!", enemydamage);
                  Console.ForegroundColor = ConsoleColor.Gray;


                }
                else if (playerChoice == "defend")
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("The enemy attacked you!");
                    Console.ForegroundColor = ConsoleColor.Gray;

                    Random rand = new Random();
                    int enemydamage = (rand.Next(2, 4) * enemyAttack);
                    playerHealth = playerHealth - enemydamage/2;

                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("The enemy's attack did {0} damage!", enemydamage/2);
                    Console.ForegroundColor = ConsoleColor.Gray;
                }
                else
                {
                    Console.WriteLine("Please choose (attack) or (defend).");
                }

            } while (playerHealth > 0 && enemyHealth > 0);


            if (enemyHealth <= 0)
            {
                Console.ForegroundColor = ConsoleColor.Green;
                Console.WriteLine("You have defeated the enemy!");
                Console.ForegroundColor = ConsoleColor.Magenta;
                Console.WriteLine("You were able to escape!");
                Console.ForegroundColor = ConsoleColor.Blue;
                Console.WriteLine("Thanks for playing!");
            }
            if (playerHealth <= 0)
            {
                Console.ForegroundColor = ConsoleColor.Green;
                Console.WriteLine("The enemy has killed you!");
                Console.ForegroundColor = ConsoleColor.Gray;
            }


        }
        else if (playerChoice == "hide")
        {
            Console.WriteLine("You hid in the room behind you, but the enemy heard and is coming!");
            Console.WriteLine("You can see a wardrobe in the corner.");
            Console.ForegroundColor = ConsoleColor.DarkCyan;
            Console.WriteLine("(wardrobe) or (stay)?");
            Console.ForegroundColor = ConsoleColor.Gray;

            if (playerChoice == "wardrobe")
            {
                Console.WriteLine("You are now hidden.");
                Console.WriteLine("The enemy leaves through a secret door. You follow and find yourself outside.");
                Console.ForegroundColor = ConsoleColor.Magenta;
                Console.WriteLine("You have escaped!");
                Console.ForegroundColor = ConsoleColor.Blue;
                Console.WriteLine("Thanks for playing!");

            }
            else if (playerChoice == "stay")
            {
                do
                {
                    Console.WriteLine("You have " + playerHealth + "health left");
                    Console.WriteLine("Enemy has " + enemyHealth + "health left");
                    Console.ForegroundColor = ConsoleColor.DarkCyan;
                    Console.WriteLine("(attack) or (defend)?");
                    Console.ForegroundColor = ConsoleColor.Gray;
                    playerChoice = Console.ReadLine(); Console.WriteLine();

                    if (playerChoice == "attack")
                    {
                        Random rand = new Random();
                        int attackdamage = (rand.Next(3, 5) * playerAttack);
                        enemyHealth = enemyHealth - attackdamage;

                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.WriteLine("Your attack did {0} damage!", attackdamage);
                        Console.ForegroundColor = ConsoleColor.Gray;

                        //enemy attacks back
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.WriteLine("The enemy attacked you!");
                        Console.ForegroundColor = ConsoleColor.Gray;

                        Random rand1 = new Random();
                        int enemydamage = (rand.Next(2, 4) * enemyAttack);
                        playerHealth = playerHealth - enemydamage;

                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.WriteLine("The enemy's attack did {0} damage!", enemydamage);
                        Console.ForegroundColor = ConsoleColor.Gray;


                    }
                    else if (playerChoice == "defend")
                    {
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.WriteLine("The enemy attacked you!");
                        Console.ForegroundColor = ConsoleColor.Gray;

                        Random rand = new Random();
                        int enemydamage = (rand.Next(2, 4) * enemyAttack);
                        playerHealth = playerHealth - enemydamage / 2;

                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.WriteLine("The enemy's attack did {0} damage!", enemydamage / 2);
                        Console.ForegroundColor = ConsoleColor.Gray;
                    }
                    else
                    {
                        Console.WriteLine("Please choose (attack) or (defend).");
                    }

                } while (playerHealth > 0 && enemyHealth > 0);



                if (enemyHealth <= 0)
                {
                    Console.ForegroundColor = ConsoleColor.Green;
                    Console.WriteLine("You have defeated the enemy!");
                    Console.ForegroundColor = ConsoleColor.Magenta;
                    Console.WriteLine("You have escaped!");
                    Console.ForegroundColor = ConsoleColor.Blue;
                    Console.WriteLine("Thanks for playing!");
                }
                if (playerHealth <= 0)
                {
                    Console.ForegroundColor = ConsoleColor.Green;
                    Console.WriteLine("The enemy has killed you!");
                    Console.ForegroundColor = ConsoleColor.Gray;
                }
            }

        }
        else
        {
            Console.WriteLine("Choose (fight) or (hide).");
        }

    }
}

}

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Когда начинается выполнение метода FightLoop переменная playerChoice не имеет значения.поэтому выполнение переходит к блоку 3 , как показано ниже, и затем выходит из метода.

private static void FightLoop()
{
    if (playerChoice == "fight")
    {
         //block 1
    }
    else if (playerChoice == "hide")
    {
         //block 2
    }
    else
    {
        //block 3
        Console.WriteLine("Choose (fight) or (hide).");
    }
}

Вам нужно изменить последнюю строку метода Welcome , чтобы сохранить чтениевведите в переменную playerChoice .

private static void Welcome()
{
    Console.WriteLine("Hello Traveller, What is your name?");
    playerName = Console.ReadLine();

    Console.WriteLine("Well Hello, " + playerName);
    Console.WriteLine("You are alone in a dark dungeon. You can see a room behind you and a long hall in front of you.");
    Console.ForegroundColor = ConsoleColor.DarkRed;
    Console.WriteLine("You hear an enemy nearby...");
    Console.ForegroundColor = ConsoleColor.DarkCyan;
    Console.WriteLine("(fight) or (hide)?");
    Console.ForegroundColor = ConsoleColor.Gray;
    playerChoice = Console.ReadLine();
}

Поскольку вы нигде не используете переменную rand1 , вы можете удалить следующую строку.

Random rand1 = new Random();

Также хорошей практикой будет использование методов «бой» и «спрятать»:

private static void FightLoop()
{
    if (playerChoice == "fight")
    {
         fight();
    }
    else if (playerChoice == "hide")
    {
         hide();
    }
    else
    {
        Console.WriteLine("Choose (fight) or (hide).");
    }
}
0 голосов
/ 26 февраля 2019

Проблема в вашем Welcome() методе.Вы просите игрока выбрать бой или скрыться, но вы не сохраняете ответ в переменной playerChoice.Поэтому, когда вы проверяете playerChoice на вашем FightLoop, он заканчивается на другом, запустив строку Console.WriteLine("Choose (fight) or (hide).");.Но поскольку вы не ждете нажатия клавиш, программа завершается и закрывается.Чтобы исправить это, вы должны:

Считать выбор игрока по вашему Welcome методу, изменить строку Console.ReadLine(); на playerChoice = Console.ReadLine();

Дождаться любого нажатия клавиши на части elseвашего бойфлота, добавив Console.ReadLine(); после Console.WriteLine("Choose (fight) or (hide).");

...