Numero casuale indovinare gioco non funziona C #

voti
-3

Sto cercando di ottenere questo numero casuale gioco di ipotesi di lavoro. Il programma viene eseguito, ma non dà il messaggio che ha vinto quando si immette il numero corretto e la funzione di suggerimento non dà i feed back che si suppone troppo. Qualsiasi aiuto apprezzato.

using System;

namespace randomNumberGame
{
    class Program
    {
        static void Main(string[] args)
        {
            Random r = new Random();
            var val = r.Next(1, 100);
            var guess = 0;
            bool correct = false;
            var attemptsLeft = 5;


            Console.WriteLine(I'm thinking of a number between 1 and 100.);

            while (!correct && attemptsLeft >=  1)
            {

                Console.Write(You have  + attemptsLeft +  lives left. Please enter your Guess: );
                string input = Console.ReadLine();
                var message = ;
                var difference = val - guess;

                if (!int.TryParse(input, out guess))
                {
                    Console.WriteLine(That's not a number.);
                    continue;
                }
                if (difference == 0)
                {
                    Console.WriteLine(You have won);
                    correct = true;
                }


                else
                {

                    if (Math.Abs(difference) >= 50)
                    {
                        message = Math.Sign(difference) == -1 ? Very High : Very Low;
                    }
                    else if (Math.Abs(difference) < 50 && Math.Abs(difference) >= 20)
                    {
                        message = Math.Sign(difference) == -1 ? High : Low;
                    }
                    else if (Math.Abs(difference) < 20 && Math.Abs(difference) >= 10)
                    {
                        message = Math.Sign(difference) == -1 ? Moderatley High : Moderately Low;
                    }
                    else if (Math.Abs(difference) < 10)
                    {
                        message = Math.Sign(difference) == -1 ? Somewhat High : Somewhat Low;
                    }
                    else Console.WriteLine(???);
                }
                attemptsLeft--;


            }


        }
    }
}
È pubblicato 10/10/2019 alle 00:46
fonte dall'utente
In altre lingue...                            


1 risposte

voti
0

"Non dà il messaggio che ha vinto quando si immette il numero corretto"

In realtà, lo fa! Ma poi il programma esce così in fretta che non si vede. Per risolvere questo problema, aggiungere una riga che attende all'utente di premere un tasto alla fine del vostro Mainmetodo, in modo da poter vedere il risultato finale:

// Add this as the last line of the main method:
Console.ReadKey();

"La funzione di suggerimento non dà il feed back che si suppone troppo"

Questo è perché non hai mai uscita il messaggio suggerimento! Alla fine del whileciclo, aggiungere una riga per farlo:

// Add this as the last line of the while loop:
Console.WriteLine(message);

Queste cose possono essere trovati facilmente se è sufficiente impostare un punto di interruzione nel codice (in Vistal Studio, fare clic sul margine sinistro accanto ad una delle linee e apparirà un punto rosso (o premere F9)). Quindi è possibile eseguire il codice utilizzando F10e si può guardare i valori delle variabili locali cambiamento e vedere cosa sta succedendo step-by-step.


Un altro modo per evitare problemi (e per restringere in cui si verificano) è quello di prendere pezzi di codice che fa qualcosa di specifico e metterlo in un metodo. In questo modo sarà più facile per eseguire il debug nel lungo periodo.

Per esempio, possiamo scrivere i metodi che prendono in una stringa da visualizzare per l'utente come un prompt per l'input e restituire un valore fortemente tipizzato in base al loro ingresso. Possiamo anche avere questi metodi prendono in un metodo di validazione facoltativo che può essere utilizzato per convalidare che l'ingresso entrarono rientra in un intervallo valido (come un numero da 1 a 100, o un nome che non è più di 25 caratteri):

public static string GetStringFromUser(string prompt, 
    Func<string, bool> validator = null)
{
    string result;
    var cursorTop = Console.CursorTop;

    do
    {
        ClearSpecificLineAndWrite(cursorTop, prompt);
        result = Console.ReadLine();
    } while (!(validator?.Invoke(result) ?? true));

    return result;
}

public static int GetIntFromUser(string prompt, 
    Func<int, bool> validator = null)
{
    int result;
    var cursorTop = Console.CursorTop;

    do
    {
        ClearSpecificLineAndWrite(cursorTop, prompt);
    } while (!int.TryParse(Console.ReadLine(), out result) ||
                !(validator?.Invoke(result) ?? true));

    return result;
}

private static void ClearSpecificLineAndWrite(int cursorTop, 
    string message)
{
    Console.SetCursorPosition(0, cursorTop);
    Console.Write(new string(' ', Console.WindowWidth));
    Console.SetCursorPosition(0, cursorTop);
    Console.Write(message);
}

Possiamo anche scrivere un metodo di supporto per ottenere il nostro "stringa differenza", che potrebbe prendere in ipotesi, il numero ei valori minimo e massimo, quindi calcolare una percentuale di quanto fossero vicini e poi tornare la stringa appropriata:

public static string GetDifferenceString(int guess, int number, 
    int minVal, int maxVal)
{
    var percentAway = 
        Math.Abs(guess - number) / (double)(maxVal - minVal) * 100;
    var direction = guess - number > 0 ? "High" : "Low";

    if (percentAway < 10) return $"Very close, but {direction}";
    if (percentAway < 20) return $"Just a little {direction}";
    if (percentAway < 30) return $"Somewhat {direction}";
    if (percentAway < 40) return $"Moderately {direction}";
    if (percentAway < 50) return $"{direction}";
    return $"Very {direction}";
}

Questo semplifica il nostro codice principale, eliminando i loop e controllo dei risultati da lì, e ci permette di concentrarci sulle nostre attività principali:

static void Main(string[] args)
{
    var randomNumber = new Random().Next(1, 101);
    var maxAttempts = 5;
    var guess = 0;

    Console.WriteLine("I'm thinking of a number between 1 and 100.");

    for (int attempt = 0; attempt < maxAttempts; attempt++)
    {
        Console.WriteLine($"You have {maxAttempts - attempt} " + 
            $"out of {maxAttempts} attempts remaining.");

        guess = GetIntFromUser("Please enter your guess (1 - 100): ", 
            i => i > 0 && i < 101);

        if (guess == randomNumber)
        {
            Console.WriteLine($"You have won in {attempt + 1} tries!");
            break;
        }

        Console.WriteLine(GetDifferenceString(guess, randomNumber, 1, 100));
    }

    if (guess != randomNumber)
    {
        Console.WriteLine("Sorry, you lose! The number was: " + 
            $"{randomNumber}");
    }

    GetKeyFromUser("\nDone! Press any key to exit...");
}
Risposto il 10/10/2019 a 01:44
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more