Как использовать оператор if, который учитывает int в единственном смысле

#c# #if-statement

#c# #if-statement

Вопрос:

Я новичок в программировании и C #; Итак, мои извинения за общий вопрос.

Я создал базовую игру в угадывание случайных чисел; Однако, когда я пытаюсь поместить операторы if вокруг правильных ответов, кажется, что это не удается.

Если предположение верно с первого раза, я хочу, чтобы в заявлении говорилось: «поздравляю, вам потребовалась 1 попытка»; Если предположение верно с третьего раза, я хочу, чтобы в заявлении говорилось: «поздравляю, вам потребовалось 3 попытки».

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

namespace ConsoleApplication1
{
    class Program
    {

        static void Main(string[] args)
        {
            Random rand = new Random();
            int guess = 0;
            string welcome = "Guess a number between 1 and 10";
            int num = rand.Next(1, 10);
            int guessCount = 0;
            int guessLimit = 3;
            bool outOfGuesses = false;
            Console.WriteLine(welcome);


            int i = 0;

            while (guess != num amp;amp; guessCount < guessLimit)
                
            {
                try
                {
                    guess = Convert.ToInt32(Console.ReadLine());

                    if (guess > num)
                    {
                        Console.WriteLine("Too High");
                        guessCount  ;
                    }
                    if (guess < num)
                    {
                        Console.WriteLine("Too Low");
                        guessCount  ;
                    }
                }

                catch
                {
                    Console.WriteLine("Guess must be a number");
                    i--;
                }


                i  ;
            }
            if (guess == num amp;amp; guessCount != 1)
            {
                Console.WriteLine("Congrats, it took you "   i   " tries");
            }
            if (guess == num amp;amp; guessCount == 1)
            {
                Console.WriteLine("Congrats, it took you "   i   " try");
            }
            if (guess != num amp;amp; !outOfGuesses)
            {
                Console.WriteLine("GAME OVER, you have lost");
            }
            Console.ReadLine();
        }
    }
}
 

Комментарии:

1. Чтобы улучшить свой вопрос, вы должны уточнить, почему он терпит неудачу.

2. Помимо этой проблемы с потоком управления i и условными проверками, у этого кода есть еще 2 проблемы. использование цикла while против цикла do-while (поток управления) и outOfGuesses логическая обработка. Я не думаю, что первое приведет к функциональным проблемам, но более позднее.

3. Не уверен, что я следую @BrettCaswell. Не следует ли устранить предположения? В противном случае я просто жду, когда будет достигнуто значение guessLimit?

4. Это имеет отношение к вашему образцу кода (и, вероятно, к вашим общим усилиям); и в этом отношении его следует рассмотреть. Но это не соответствует тому, как вы задали этот вопрос, и проблеме, с которой вы столкнулись. То есть вы указали, что этот вопрос касается отсутствия логики вокруг правильных ответов, что является хорошей областью для вопроса. (в то время как плохая, широкая область для вопроса о SO — «что не так с моим кодом»)

5. Это имеет смысл, спасибо за разъяснение. Я должен был указать, почему он терпит неудачу, вместо того, чтобы оптимизировать другие части кода. Я должен был также указать, что это не удается, потому что, если логика выполняется (3 или менее догадок) для получения правильного числа, он все равно напишет ту же строку «Поздравляю, это заняло у вас » i » попытки». В то время как он должен писать поздравления, вам потребовалось » i » попробовать, если это первое предположение.

Ответ №1:

Увеличивайте guessCount значение сразу после считывания входных данных. В противном случае он останется 0 после правильного предположения с первой попытки.

 guess = Convert.ToInt32(Console.ReadLine());
guessCount  ;
 

Также вы можете реорганизовать свою условную логику

 if (guess == num) // all successfull results go here
{
    if (guessCount == 1) // show constant message when its 1st try
    {           
       Console.WriteLine("Congrats, it took you 1 try");
    }
    else // Use string interpolation $ to show number of tries
    {           
       Console.WriteLine($"Congrats, it took you {guessCount} tries");
    }       
}
else // you can get here only when player is out of guesses
{
    Console.WriteLine("GAME OVER, you have lost");
}
 

Переменные i и outOfGuesses должны быть удалены.

Комментарии:

1. Спасибо, Сергей!

2. ну .. этот ответ на самом деле не рассматривает то, что was failing всеобъемлющим образом. Это «вероятно», что i (которое используется в литералах записи консоли) увеличивалось до проверки условий на догадки.

3. то есть демонстрация лучшего кодирования с помощью рефакторинга — это нормально, но все, что нужно было сделать, чтобы понять, что поток управления был проблемой для его сбоя. (альтернативой здесь является перемещение всего кода, следующего за try-catch, в блок try (за исключением i )).

Ответ №2:

Хотя алгоритм для создания этой игры мог бы быть лучше, поскольку вы новичок, я не хочу усложнять вам задачу, внося слишком много изменений. Модифицированный код, чтобы следовать вашему алгоритму, чтобы вам было легко понять. Внесены некоторые изменения в последние три условия if с точки зрения порядка проверки условий и самого условия. Кажется, это работает. Пожалуйста, обратитесь к приведенному ниже коду.

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

namespace ConsoleApplication1
{
    class Program
    {

        static void Main(string[] args)
        {
            Random rand = new Random();
            int guess = 0;
            string welcome = "Guess a number between 1 and 10";
            int num = rand.Next(1, 10);
            int guessCount = 0;
            int guessLimit = 3;
            bool outOfGuesses = false;
            Console.WriteLine(welcome);   


            int i = 0;

            while (guess != num amp;amp; guessCount < guessLimit)
            {
                try
                {
                    guess = Convert.ToInt32(Console.ReadLine());

                    if (guess > num)
                    {
                        Console.WriteLine("Too High");
                        guessCount  ;
                    }
                    if (guess < num)
                    {
                        Console.WriteLine("Too Low");
                        guessCount  ;
                    }
                }
                catch
                {
                    Console.WriteLine("Guess must be a number");
                    i--;
                }

                i  ;
            }

            if (guess != num amp;amp; guessCount == guessLimit)
            {
                Console.WriteLine("GAME OVER, you have lost");
            }
            if (guess == num amp;amp; guessCount == 0)
            {
                Console.WriteLine("Congrats, it took you "   i   " try");
            }
            if (guess == num amp;amp; guessCount > 0)
            {
                Console.WriteLine("Congrats, it took you "   i   " tries");
            }           

            Console.ReadLine();
        }
    }
}
 

Комментарии:

1. Спасибо, nccsbim071! Это имеет смысл, и я вижу, что оператор bool также не нужен для получения того же результата.

2. хм… Во-первых, я оставлю тот же комментарий замечание, которое я оставил для ответа Сергея. В вашем ответе всесторонне не рассматривается проблема сбоя — вы просто решаете рабочую проблему. Но также ваши изменения неверны и не обрабатывают то, что не удалось. Вы действительно внесли изменения, которые вызывают дополнительные логические ошибки. т.Е. guessCount будет == 1 или > 1 нет 0

3. @BrettCaswell, задающий вопрос новичок в этом, ему может быть трудно понять слишком много объяснений, поэтому я ответил по шаблону, которому он следует, чтобы ему было легко понять. Рядом с guessCount будет = 0, если пользователь получит число с первой попытки.

4. ах .. моя ошибка.. вы правы.. guessCount кажется, это происходит только тогда, когда предположение неверно… По иронии судьбы, я столкнулся с нехваткой информации о том, что не удалось и как эти ответы не касались этой концепции, что я не смог на самом деле реализовать логику и решения рабочей проблемы здесь.