Search code examples
c#text-based

C# Text-Based Game reads as no errors but closes after first choice


This is the example, please go easy on me as this is the first code I've really ever written. I'm not certain the formatting will translate entirely. This code was running fine until the last edit in which I changed the "rand" to "rand1" as if was giving me an error that "rand" was already used. Now when I run it, I get to "fight or hide" and as soon as I enter one of the options, the terminal closes. Yet, Visual Studio shows no errors.

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).");
        }

    }
}

}


Solution

  • When execution of FightLoop method begins playerChoice variable has no value. so execution goes to block 3 as shown below and then exits method.

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

    You need to change the last line of Welcome method so it saves the read string into the playerChoice variable.

    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();
    }
    

    Since you don't use rand1 variable anywhere, you can delete the following line.

    Random rand1 = new Random();
    

    Also, a good practice would be to use methods for "fight" and "hide":

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