Arron Davies Arron Davies - 13 days ago 4
C# Question

C# Console Application -

So when I reach the end of the program where it chooses if a Pokemon appears out of nowhere it repeats the same Pokemon again and again.
e.g. I encounter Mr.Mime
I defeat Mr.Mime
I am safe
I am safe
I encounter Mr.Mime
I die
I encounter Mr.Mime
I die
I am safe
I encounter Mr.Mime
I defeat Mr.Mime

How would I stop this?

My Code:

using System;
using System.Linq;
using System.Threading;

public class Program
{
public static void Main()
{
// Due to dotnetfiddle.net limitations I cannot store the pokémons data to a file
Console.WriteLine("---------------------------------------------------------------------------------------------------------------------");
Console.WriteLine("| Hello there! Welcome to the world of pokémon! My name is Oak! People call me the pokémon Prof! |");
Console.WriteLine("|This world is inhabited by creatures called pokémon! For some people, pokémon are pets. Others use them for fights.|");
Console.WriteLine("| Myself...I study pokémon as a profession. |");
Console.WriteLine("---------------------------------------------------------------------------------------------------------------------");
Console.WriteLine(" | Would you like to start (S)? |");
Console.WriteLine(" | |");
Console.WriteLine(" -------------------------------------------------------------------------------");
String fog = Console.ReadLine();
String [] random = {"Pidgeot", "Jigglypuff", "Beedrill", "Caterpie", "Squirtle", "Charizard", "Charmander", "Bulbasaur", "Rattata", "Diglett", "Meowth", "Psyduck", "Dugtrio", "Magnemite", "Mr. Mime", "Gyarados", "Magikarp", "Onix", "Drowzee"};
String [] gen = {"♂", "♀"};
String [] name = {"Charmander", "Bulbasaur", "Squirtle"};
if (fog == "s" || fog == "S" || fog == "start" || fog == "Start")

{
Random rnd = new Random();
int HP = rnd.Next(20, 20);
int Atk = rnd.Next(20, 20);
int Def = rnd.Next(20, 20);
int Lvl = rnd.Next(5, 5);
int PN = rnd.Next(1, 721);
Console.WriteLine("You have chosen to generate a pokémon's!");
Console.WriteLine(" Your pokémon's Name is: " + name[new Random().Next(0, name.Length)]);
Console.WriteLine(" Your pokémon's ㏋ is: " + HP);
Console.WriteLine(" Your pokémon's Attack is: " + Atk);
Console.WriteLine(" Your pokémon's Defense is: " + Def);
Console.WriteLine(" Your pokémon's Lvl is: " + Lvl);
Console.WriteLine(" Your pokémon's Gender is: " + gen[new Random().Next(0, gen.Length)]);
Console.WriteLine(" Your pokémon's Pokédex number is: " + PN);

Console.Write("Loading");
for(int i = 0; i < 10; i++)
{

Console.Write(".");
Thread.Sleep(200);
}
Console.WriteLine(" ");
Console.WriteLine("---------------------------------------------------------------------------------------------------------------------");
Console.WriteLine("| You exit the proffesors lab to journey into the world of pokemon |");
Console.WriteLine("| Throughout your journey you may encounter wild pokemon that wish to fight and trainers |");
Console.WriteLine("| |");
Console.WriteLine("---------------------------------------------------------------------------------------------------------------------");
Console.WriteLine("So your journey begins... 30 paces to the gym type (s)"); // Loop 30 times with random chance of battleing
string lf = Console.ReadLine();
if (lf == "s" || lf == "S" || lf == "start" || lf == "Start")

Enumerable.Repeat<Action>(() =>
{
int Find = rnd.Next(1, 3);
if (Find == 1)
{
Console.WriteLine("You Encountered a pokémon");
int HP2 = rnd.Next(1, 100);
int Atk2 = rnd.Next(1, 60);
int Def2 = rnd.Next(1, 40);
int Lvl2 = rnd.Next(1, 100);
int PN2 = rnd.Next(1, 721);

if (Atk >= Def2)
{
Console.WriteLine("You defeated " + random[new Random().Next(0, random.Length)]);
}
else
{
Console.WriteLine("Your pokémon died... Luckily a stranger appeared out of nowhere and revivded it for you so you can continue to battle");
}
}
else
{
Console.WriteLine("You are safe this time");
}
}, 30).ToList().ForEach(x => x());

}


else
{
Console.WriteLine("Sorry to see you go so soon. I hope to meey you one day ~Oak");
}
}
}

Answer

The problem lies on this line.

Console.WriteLine("You defeated " + random[new Random().Next(0, random.Length)]);

You are getting the same random value each time because the Random() constructor is based on the system time, and it is not changing enough in between calls.

See the Random Class documentation quoted below

...However, because the clock has finite resolution, using the parameterless constructor to create different Random objects in close succession creates random number generators that produce identical sequences of random numbers. The following example illustrates how two Random objects that are instantiated in close succession generate an identical series of random numbers. On most Windows systems, Random objects created within 15 milliseconds of one another are likely to have identical seed values.

To fix this try the following

Console.WriteLine("You defeated " + random[rnd.Next(0, random.Length)]);
Comments