2

だから私はここに次のコードを持っています...私は5つのユーザー提供の単語を提供し、5つをランダム化し、推測のためにそれらのいずれかを与える必要がありますtries = word length + 2. 私が抱えている主な問題は、チェック全体をループして、2番目、3番目の推測などを埋めることです.1番目の推測は問題ありません。「_」文字として推測されなかった文字を保持しながら、正しく推測された文字をループして保持するにはどうすればよいでしょうか。

例 -Word was "Heaven" - User Enters "e" - Produces - _ e _ _ e _ スペースなし。試行回数は、6(語長) + 2 = 8 回の試行に等しくなります。

int tries = 0;
Random rand = new Random();
int randomword = rand.Next(1, 5);
string word = "";

Console.WriteLine("Please Enter 5 Words into the System");
Console.WriteLine();

for (int i = 0; i < 5; i++)
{
    words.Add(Console.ReadLine());
    Console.Clear();
}

Console.WriteLine("For Display Purposes. Here are Your 5 Words");
Console.WriteLine("===========================================");
Console.WriteLine();
foreach (var item in words)
{
    Console.WriteLine(item);
}

Console.WriteLine();
Console.WriteLine("Now Guess The word given Below");
Console.WriteLine();

switch (randomword)
{
    case 1:
        //Gets the List index 0 - 1st word in the list
        word = words[0];
        tries = word.Length;
        break;
    case 2:
        word = words[1];
        tries = word.Length;
        break;
    case 3:
        word = words[2];
        tries = word.Length;
        break;
    case 4:
        word = words[3];
        tries = word.Length;
        break;
    case 5:
        word = words[4];
        tries = word.Length;
        break;
    default:
        break;
}
//Default + addition to the Length
tries += 2;

Console.WriteLine();
Console.WriteLine("You Have {0} + tries",tries );
//Works for the 1st Guess
do
{
    char guess = char.Parse(Console.ReadLine());
    if (word.Contains(guess))
    {
        foreach (char item in word)
        {
            if (item == guess)
            {
                Console.Write(item);
            }
            else
            {
                Console.Write("_");
            }
        }
    }
    Console.WriteLine();
} 
//If my word contains A "_" i will keep looping
while (word.Contains("_"));

Console.ReadKey();
4

7 に答える 7

0

試行回数について言及していますが、使用後にコードで使用することはありません。おそらく、次のことを行いたいと考えています。

  • ランダムな単語を選択します (この場合、ユーザーから提供された 5 つの単語のうちの 1 つを選択しています)
  • 単語の長さに 2 を加えた数に等しい推測 (試行?) の数を設定します。存在する文字を推測した場合、それは無料です。文字が存在しない場合、彼らは推測の1つを失います。
  • 各推測の前に、推測されなかったすべての文字を「_」に置き換えて単語を表示します。
  • ユーザーが存在する文字を推測したら、表示された単語の「_」をその文字に置き換えます。

動作するはずのサンプルコードを次に示します (テストされていません)。

    string displayword = String.Copy(word);
    for (int j = 0; j < displayword.length; j++) displayword[j]='_';
    do {
        // Display the word so far.
        Console.WriteLine("Word is {0}", displayword);

        // Get a guess from the user
        char guess = char.Parse(Console.ReadLine());
        if (word.Contains(guess)) {
            for (j=0; j<word.length; j++) {
              if (word[j] == guess) displayword[j]=guess;
            }
        } else {
          // Decrease the tries.
          tries--;
        }
    } while (displayword.Contains("_") && (tries > 0));
于 2013-07-24T13:29:56.620 に答える
0

あなたの主な問題は、以前のすべての推測ではなく、現在の推測のみを追跡していることです。a を使用しHashSetて、以前の推測を追跡できます。したがってHashSet<char> guessedLetters、ループの前に変数を定義し、 do「推測」 do を解析した後、ループの2行目に変数を定義しますguessedLetters.Add(guess)if(item==guess)次に、で置き換えif(guessedLetters.Contains(item))ます。Viola、わずか3行のコード変更!

最後に、終了条件はwhile (word.Any(c=>!guessedChars.Contains(c)) && --tries != 0);.

于 2013-07-24T13:19:25.333 に答える
0

既存のコードを使用してはどうですか。

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

namespace ConsoleApplication3
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            List<string> words = new List<string>();
            int tries = 0;
            Random rand = new Random();
            var currentLetters = new List<char>();
            int randomword = rand.Next(1, 5);
            string word = "";

            Console.WriteLine("Please Enter 5 Words into the System");
            Console.WriteLine();

            for (int i = 0; i < 5; i++)
            {
                words.Add(Console.ReadLine());
                Console.Clear();
            }

            Console.WriteLine("For Display Purposes. Here are Your 5 Words");
            Console.WriteLine("===========================================");
            Console.WriteLine();
            foreach (var item in words)
            {
                Console.WriteLine(item);
            }

            Console.WriteLine();
            Console.WriteLine("Now Guess The word given Below");
            Console.WriteLine();

            switch (randomword)
            {
                case 1:
                    //Gets the List index 0 - 1st word in the list
                    word = words[0];
                    tries = word.Length;
                    break;
                case 2:
                    word = words[1];
                    tries = word.Length;
                    break;
                case 3:
                    word = words[2];
                    tries = word.Length;
                    break;
                case 4:
                    word = words[3];
                    tries = word.Length;
                    break;
                case 5:
                    word = words[4];
                    tries = word.Length;
                    break;
                default:
                    break;
            }
            //Default + addition to the Length
            tries += 2;

            Console.WriteLine();
            Console.WriteLine("You Have {0} + tries", tries);
            //Works for the 1st Guess
            do
            {
                char guess = char.Parse(Console.ReadLine());
                if (!currentLetters.Contains(guess))
                {
                    currentLetters.Add(guess);
                    foreach (var l in word.ToCharArray().Intersect(currentLetters).ToArray())
                    {
                        word = word.Replace(l, '_');
                    }
                }
                Console.WriteLine(word);
            } //If my word contains A "_" i will keep looping
            while (word.Contains("_"));

        Console.ReadKey();
    }
}

}

于 2013-07-24T13:23:19.137 に答える
0

どうですか:

static void Main(string[] args)
{

    string[] words = new string[] { "Apple", "Banana", "Pear", "Pineapple", "Melon"};
    Random random = new Random();

    string wordToGuess = words[random.Next(5)].ToLower();
    char[] currentLetters = new char[wordToGuess.Length];
    for (int i = 0; i < currentLetters.Length; i++) currentLetters[i] = '_';
    int numTries = currentLetters.Length + 1;
    bool hasWon = false;
    do
    {
        string input = Console.ReadLine().ToLower();
        if (input.Length == 1) //guess a letter
        {
            char inputChar = input[0];
            for (int i = 0; i < currentLetters.Length; i++)
            {
                if (wordToGuess[i] == inputChar)
                {
                    currentLetters[i] = inputChar;
                }
            }
            if (!currentLetters.Contains('_'))
            {
                hasWon = true;
            }
            else
            {
                Console.WriteLine(new string(currentLetters));
            }
        }
        else
        {
            if (input == wordToGuess)
            {
                hasWon = true;
            }
            else
            {
                Console.WriteLine("Incorrect!");
                Console.WriteLine(new string(currentLetters));
            }
        }

        numTries--;

    } while (new string(currentLetters) != wordToGuess && numTries > 0 && !hasWon);

    if (hasWon)
    {
        Console.WriteLine("Congratulations, you guessed correctly.");
    }
    else
    {
        Console.WriteLine("Too bad! Out of tries");
    }
}
于 2013-07-24T13:10:57.713 に答える
0

作業例:

        List<string> words = new List<string>();
        int tries = 0;
        Random rand = new Random();
        int randomword = rand.Next(1, 5);
        string word = "";

        Console.WriteLine("Please Enter 5 Words into the System");
        Console.WriteLine();

        for (int i = 0; i < 5; i++)
        {
            words.Add(Console.ReadLine());
            Console.Clear();
        }

        Console.WriteLine("For Display Purposes. Here are Your 5 Words");
        Console.WriteLine("===========================================");
        Console.WriteLine();
        foreach (var item in words)
        {
            Console.WriteLine(item);
        }

        Console.WriteLine();
        Console.WriteLine("Now Guess The word given Below");
        Console.WriteLine();

        switch (randomword)
        {
            case 1:
                //Gets the List index 0 - 1st word in the list
                word = words[0];
                tries = word.Length;
                break;
            case 2:
                word = words[1];
                tries = word.Length;
                break;
            case 3:
                word = words[2];
                tries = word.Length;
                break;
            case 4:
                word = words[3];
                tries = word.Length;
                break;
            case 5:
                word = words[4];
                tries = word.Length;
                break;
            default:
                break;
        }
        //Default + addition to the Length
        tries += 2;

        Console.WriteLine();
        Console.WriteLine("You Have {0} + tries", tries);

        List<char> guesses = new List<char>();
        string guessedWord = "";

        for(int i=0;i<word.Length;i++)
        {
            guessedWord += "_";
        }

        //Works for the 1st Guess
        do
        {
            char guess = char.Parse(Console.ReadLine());

            if (word.Contains(guess))
            {
                guesses.Add(guess);
            }

            foreach (char storedGuess in guesses)
            {
                if(word.Contains(storedGuess))
                {
                    int index = word.IndexOf(storedGuess);
                    while(index > -1)
                    {
                        StringBuilder sb = new StringBuilder(guessedWord);
                        sb[index] = storedGuess;
                        guessedWord = sb.ToString();

                        index = word.IndexOf(storedGuess, index+1);
                    }
                }
            }

            Console.WriteLine(guessedWord);
        }
        while (guessedWord.Contains("_"));

        Console.ReadKey();
于 2013-07-24T13:31:53.130 に答える
0

入力された単語とこれまでの結果を区別する必要があります。結果をアンダースコアで初期化し、人々が推測したとおりに結果に文字を追加します。result文字列の代わりに char 配列を作成すると、少し簡単になります。

        var result = new string('_', word.Length).ToCharArray();
        do
        {
            char guess = char.Parse(Console.ReadLine());
            for (var i = 0; i < word.Length; ++i)
            {
                if(word[i] == guess)
                {
                    result[i] = guess;
                }
            }
            Console.WriteLine(new string(result));
        }
        //If my word contains A "_" i will keep looping
        while (result.Contains('_') && --tries != 0); 
于 2013-07-24T14:02:57.320 に答える