2016-11-22 193 views
-3

所以当我到达程序的结尾时,如果一个宠物小精灵出现在任何地方,它会反复重复同一个宠物小精灵。 例如我遇到Mr.Mime 我打败Mr.Mime 我安全 我安全 我遇到Mr.Mime 我死 我遇到Mr.Mime 我死 我安全 我遇到Mr.Mime 我败Mr.MimeC#控制台应用程序 -

我该如何解决这个问题?

我的代码:

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

回答

0

问题就在这条线上。

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

你每次都得到相同的随机值,因为Random()构造是基于系统时间,并且它不是在通话之间有足够的改变。

Random Class文档下面引用

...但是,由于时钟具有有限的分辨率,使用 参数的构造函数来创建紧密 相继不同的随机对象的创建产生相同随机数生成器 随机数序列。以下示例说明两个连续实例化的随机对象如何生成一个相同的一系列随机数。在大多数Windows系统上,相互间15毫秒内创建的对象可能有 具有相同的种子值。

要解决这个问题请尝试以下

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

感谢您的帮助ComradeJoecool –

+0

@Arron戴维斯没问题! – ComradeJoecool