2017-04-02 6 views
0

私はハングマンを起動して実行していますが、私のプログラムはランダムな単語を選択する方法です(これは完全にランダムではなく、擬似)。文字列リストから完全に無作為な要素を選んで、より単純なC# - Hangman

注:コードの一部はスロベニア語です。私は重要なものを英語に変更しました。

私は、その単語を選択するために、より単純で実際にランダムな方法を試みています。私はさまざまなオプションを実装しようとしましたが、成功しませんでした...

また、私はDateTime.Now.Ticksが単語を選ぶ方法を本当に理解していません。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading; 

namespace HANGMAN //moj imenski prostor 

{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Random random = new Random((int)DateTime.Now.Ticks); 

     string[] WORDBANK = { "AAAA", "BBBB", "CCCC", "DDDD", "EEEE", "FFFF" }; 

     string WordToGuess = WORDBANK[random.Next(0, WORDBANK.Length)]; 
     string WordToGuessUppercase = WordToGuess.ToUpper(); 

     StringBuilder displayToPlayer = new StringBuilder(WordToGuess.Length); 
     for (int i = 0; i < WordToGuess.Length; i++) 
      displayToPlayer.Append('_'); 

     List<char> correctGuesses = new List<char>(); 
     List<char> incorrectGuesses = new List<char>(); 

     Console.ForegroundColor = ConsoleColor.Cyan; 
     Console.WriteLine("__________________________________________________________________"); 
     Console.WriteLine(); 
     Console.Write("VISLICE - Maturitetna Naloga pri predmetu Informatika"); 
     Console.WriteLine(); 
     Console.WriteLine("__________________________________________________________________"); 
     Console.WriteLine(); 
     Console.WriteLine("-> Imas 5 poizkusov <-"); 
     Console.WriteLine(); 
     Thread.Sleep(500); 

     int lives = 5; 
     bool won = false; 
     int lettersRevealed = 0; 

     string input; 
     char Guess; 

     while (!won && lives > 0) 
     { 
      Thread.Sleep(500); 
      Console.WriteLine(); 
      Console.ForegroundColor = ConsoleColor.White; 
      Console.WriteLine("Ugani besedo, izberi crko: "); 
      Console.WriteLine(); 


      input = Console.ReadLine().ToUpper(); 
      Ugib = input[0]; 

      if (correctGuesses.Contains(Guess)) 
      { 
       Thread.Sleep(500); 
       Console.WriteLine(); 
       Console.ForegroundColor = ConsoleColor.Green; 
       Console.WriteLine("Crko '{0}' si ze uporabil, bila je pravilna!", Guess); 
       Console.WriteLine("____________________________________________"); 
       continue; 
      } 

      else if (nepravilniUgibi.Contains(Ugib)) 
      { 
       Thread.Sleep(500); 
       Console.WriteLine(); 
       Console.ForegroundColor = ConsoleColor.Red; 
       Console.WriteLine("Crko '{0}' si ze uporabil, bila je napacna!", Guess); 
       Console.WriteLine("___________________________________________"); 
       continue; 
      } 

      if (WordToGuessUppercase.Contains(Guess)) 
      { 
       pravilniUgibi.Add(Ugib); 

       for (int i = 0; i < WordToGuess.Length; i++) 
       { 
        if (WordToGuessUppercase[i] == Guess) 
        { 
         displayToPlayer[i] = WordToGuess[i]; 
         lettersRevealed++; 
        } 
       } 

       if (lettersRevealed == WordToGuess.Length) 
        won = true; 
      } 
      else 
      { 
       incorrectGuesses.Add(Guess); 

       Console.WriteLine(); 
       Console.ForegroundColor = ConsoleColor.Red; 
       Console.WriteLine("Narobe, crke '{0}', ni v besedi!", Guess); 
       Console.WriteLine("________________________________"); 
       Console.WriteLine(); 
       poizkusi--; 
      } 

      Console.WriteLine(displayToPlayer.ToString()); 
     } 

     if (won) 
     { 
      Console.WriteLine(); 
      Thread.Sleep(500); 
      Console.ForegroundColor = ConsoleColor.Green; 
      Console.WriteLine("Zmaga!"); 
      Console.WriteLine(); 
      Thread.Sleep(1000); 
      Console.WriteLine("KONEC IGRE"); 
     }  
     else 
     { 
      Console.ForegroundColor = ConsoleColor.Red; 
      Console.WriteLine(); 
      Thread.Sleep(1000); 
      Console.WriteLine("Zal si to igro zgubil. Poskusi ponovno! Pravilna beseda je bila '{0}'", WordToGuess); 
     } 

    } 
} 

}

+0

さて、私は、DateTime.Now.Ticksは完全にランダムではなく、その疑似ランダムであると言われましたか? また、DateTime.Now:Ticksの正確な内容についても説明できますか? –

+0

DateTime.Now.Ticks自体は全くランダムではありません。それは0001年1月1日の真夜中から100nsの間隔です。しかし、これは良い[乱数ジェネレータシード](https://referencesource.microsoft。 com /#mscorlib/system/random.cs、92e3cf6e56571d5a、参考文献を参照してください)、それはあなたがそれを呼び出すたびに、少なくとも同じマシン上で、時計に何も触れていないならば異なっています。実際のランダムな処理は、[Next()](https://referencesource.microsoft.com/#mscorlib/system/random.cs,ddd1e9e09c70bab5,references)を呼び出すと発生します。 – dlatikay

+0

@dlatikay:_ "それはあなたがそれを" _と呼ぶたびに違うでしょう - これはあまり真実ではありません。ティックカウントは、これを保証するのに十分速く増加しません。 C#プログラムは、カウントが増加する前に多数のステートメント(数百またはそれ以上ではありません)を実行できます。 [Randomの既定のシードは既にクロックティックカウントを使用しています](https://referencesource.microsoft.com/#mscorlib/system/random.cs,5d22f8880fc9f8d9)、実際には何のポイントもありませんそれを明示的に渡します。 –

答えて

0

乱数発生器は結構です。 Randomコンストラクタのティックは、プログラムが実行されるたびにジェネレータに異なる数値を設定します。 2つのシーケンスは同じではありません:C# - Random number with seed(ティックカウントのインクリメントよりも速いRandomの新しいインスタンスを作成しないように注意してください)。

Environment.TickCountの値を持つので、それは種子をnew Random(System.DateTime.Now.Ticks)としてコンストラクタを呼び出すことは、ほとんどパラメータのないコンストラクタ、new Random()を呼び出すと同じであることに注意してください - マシンが起動するのでティック数である - の現在の実装で。ネットフレームワーク。

擬似ランダム:はい。
the implementation、その理論的背景、そしてtrue random sourcesを扱う質問の全体の束があり、ここで起動します。https://stackoverflow.com/a/4440760/1132334


コードについて、あなたは Nextへの呼び出しで単純なミスを持っている:

代わりの

string WordToGuess = WORDBANK[random.Next(0, WordToGuess.Length)]; 

string WordToGuess = WORDBANK[random.Next(0, WORDBANK.Length)]; 

forwa書きますrd参照WordToGuess.LengthはC#ではコンパイルされませんが、ワードバンク配列の長さを確実に使用することを意図していました。 2番目のint引数は、排他的な上限であるdocumented hereです。

関連する問題