Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从字符串列表中选择一个完全随机的元素,更简单的C#-Hangman_C# - Fatal编程技术网

从字符串列表中选择一个完全随机的元素,更简单的C#-Hangman

从字符串列表中选择一个完全随机的元素,更简单的C#-Hangman,c#,C#,所以我让我的刽子手启动并运行,但我不喜欢的是我的程序拾取随机单词的方式(它不是完全随机的,可以猜测,伪的) 注意:代码中的某些部分使用斯洛文尼亚语。我把重要的改成了英语 我正试图用一种更简单、更随机的方式来选择这个词。我曾尝试实施其他各种方案,但没有成功 我也不太明白DateTime.Now.Ticks是如何选择一个单词的 using System; using System.Collections.Generic; using System.Linq; using System.Text; u

所以我让我的刽子手启动并运行,但我不喜欢的是我的程序拾取随机单词的方式(它不是完全随机的,可以猜测,伪的)

注意:代码中的某些部分使用斯洛文尼亚语。我把重要的改成了英语

我正试图用一种更简单、更随机的方式来选择这个词。我曾尝试实施其他各种方案,但没有成功

我也不太明白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);
        }

    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用系统线程;
名称空间刽子手//moj imenski prostor
{
班级计划
{
静态void Main(字符串[]参数)
{
Random Random=新随机((int)DateTime.Now.Ticks);
字符串[]字库={“AAAA”、“BBBB”、“CCCC”、“DDDD”、“EEEE”、“FFFF”};
字符串WordToGuess=WORDBANK[random.Next(0,WORDBANK.Length)];
字符串wordtoguesuppercase=WordToGuess.ToUpper();
StringBuilder displayToPlayer=新的StringBuilder(WordToGuess.Length);
for(int i=0;iConsole.WriteLine(“->Imas 5 poizkusov随机数生成器正常运行。
random
构造函数中的记号将在每次程序运行时使用不同的数字为生成器种子。可以预期,没有两个序列是相同的:(请注意,创建新的
Random
实例的速度不得超过勾号计数增量)

请注意,调用构造函数作为
new Random(System.DateTime.Now.Ticks)
与调用无参数构造函数
new Random()几乎相同
,因为在.NET framework的当前实现中,这将使用
环境.TickCount
的值(即自机器启动以来的滴答数)为其种子

伪随机:是。
这里有一大堆的问题,它的理论背景,从这里开始:
关于代码,您在调用
Next
时有一个简单的错误:

而不是

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


前向引用
WordToGuess.Length
不是用C#编译的,您肯定打算使用wordbank数组的长度。第二个int参数是唯一的上界。

我听说DateTime.Now.Ticks不是完全随机的,它是伪随机的。您能解释一下DateTime.Now.Ticks到底是什么吗me.Now:滴答声do?DateTime.Now.滴答声本身根本不是随机的,它只是从0001年1月1日午夜开始的100ns间隔数。但它是一个很好的例子,每次你调用它都会有所不同,至少在同一台机器上,如果没有任何东西干扰时钟的话。当你调用它时,实际的随机情况就会发生。@dlatikay:每次你调用它时,它都会有所不同”——这不完全正确。滴答数的增加速度不够快,无法保证这一点。C程序可以执行大量语句(几十条,如果不是几百条或更多的话)在计数增加之前。同样值得注意的是,明确传递这一点没有任何意义。向OP:你的问题不是很清楚。你在代码示例中使用的
Random
似乎很好,而且不“可猜测”"当然。你的问题应该包括一个可靠地再现你正在寻求帮助的任何特定问题的好代码,以及该代码的详细解释,你希望它做什么,以及你在弄清楚什么方面有困难。@PeterDuniho当然。但我们并不是每一天都谈论新种子实例毫秒-op代码每main()种子一次,正在等待控制台输入等。默认种子为random是我答案的一部分。op代码的真正问题是一个微不足道的变量放错了位置。
string WordToGuess = WORDBANK[random.Next(0, WORDBANK.Length)];