C # У меня проблемы с игрой в кости, когда мне нужно увеличивать значение каждый раз, когда пользователь играет в игру, а затем распечатывать его обратно - PullRequest
0 голосов
/ 14 апреля 2019

У меня есть игра в кости, в которой есть две кости, и в результате получается, что одна игра пройдет, а затем у пользователя спросят, хотят ли они играть снова.Если, например, они сказали «да» три раза, то, когда они скажут «нет» в конце, чтобы выйти из игры, они получат вывод, сообщающий им, сколько раз они играли в игру.У меня возникают проблемы при создании кода для него.

У меня нет большого опыта использования параметров и типов возвращаемых данных (это назначение новичка), но в настоящее время у меня есть счетчик, который добавляет 1. Проблемав том, что он начинается с 0 и переходит в 1, а затем остается там.

Вот мой код, который проходит через игру:

namespace MajorAssignment1
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("Hey! Welcome to Ray's Dice Game! Let's Start");
            Console.WriteLine();
            EvenOrOdds();

        }

        public static void EvenOrOdds()
        {

            Random rnd = new Random();

            int die1 = rnd.Next(1, 10);
            int die2 = rnd.Next(1, 10);

            Console.WriteLine("Die 1 = {0} and Die 2 = {1}", die1, die2);
            Console.WriteLine();
            Console.WriteLine("You Rolled {0} and {1}", die1, die2);
            Console.WriteLine();

            if ((die1 + die2) % 2 == 0)
            {
                Console.WriteLine("Evens are better than odd.");
                Console.WriteLine();
            }
            if ((die1 + die2) % 2 > 0 )
            {
                Console.WriteLine("Odds are still cool.");
                Console.WriteLine();
            }


            Console.WriteLine("Do you want to play again? Please enter in all caps YES or NO");
            String UserInput = Console.ReadLine();
            var Counter = 0;
            if (UserInput == "YES")
            {
                EvenOrOdds();

                Counter = Counter + 1;
            }
            else
            {
                Console.WriteLine("The number of times the dice was thrown is:" + Counter);
                Console.WriteLine();
            }



        }

        public static void Outro()
        { 
                Console.WriteLine("Thanks for playing! Come again!");
                Console.WriteLine();

        }
    }
}

Ответы [ 3 ]

1 голос
/ 14 апреля 2019

Вызывая EvenOrOdds () изнутри себя, чтобы «воспроизвести снова», вы фактически создаете рекурсивный вызов функции.

Вы переопределяете Counter в области действия каждого экземпляра EvenOrOdds (), который вы вызываете, в результате чего Counter всегда заканчивается 1.

Один простой вариант - переместить определение Counter в переменную уровня класса, что означает, что оно будет использоваться всеми вашими вызовами EvenOrOdds ()

class MainClass
    {
        //class-level static variable
        private static int Counter;

        public static void Main(string[] args)
        {
            Console.WriteLine("Hey! Welcome to Ray's Dice Game! Let's Start");
            Console.WriteLine();
            EvenOrOdds();

        }

// rest of code here

Это означает, что вы можете удалить определение Counter из вашего кода EvenOrOdds (). Теперь при увеличении счетчика он обновляет переменную уровня класса, что приведет к ожидаемому поведению счетчика.

Console.WriteLine("Do you want to play again? Please enter in all caps YES or NO");
String UserInput = Console.ReadLine();

if (UserInput == "YES")
{
    //increment the counter first
    Counter = Counter + 1;

    //then call the method again for a new game
    EvenOrOdds();

}

Также вы можете изменить «Counter = Counter + 1;» В строке вы используете встроенный оператор инкремента ++: "Counter ++;" который будет делать то же самое.

Примечание : Существуют и другие способы реализации этого типа функции «повторить игру», которые были бы лучше, например, использование циклов и т. Д., Но без переписывания того, что вы уже сделали, моего совета достаточно как незначительное изменение, которое достигает того, что вы хотите сделать. Удачи!

Редактировать: Сначала обновляется счетчик, прежде чем снова вызывать EventOrOdds () - в результате счетчик корректно увеличивается для каждой сыгранной игры.

0 голосов
/ 14 апреля 2019

Я могу предложить два решения

1) использовать приватную переменную на уровне класса.Не забудьте удалить определение для счетчика в вашем методе

class MainClass {
private static int Counter = 0;
...
}

2) отправить параметр ref в ваш метод

public static void EvenOrOdds(ref int counter)

и в основной EventOrOdds (счетчик).то же самое относится и к вашей рекурсии

0 голосов
/ 14 апреля 2019

Проблема с вашим кодом в том, что вы вызываете EvenOrOdds() рекурсивно , а counter никогда не увеличивается.Кроме того, вы делаете простые вещи сложным образом, я упростил несколько вещей.

Рабочий код:

using System;
public class diceCounter
{
    public static void Main(string[] args)
    {
        String UserInput;
        int Counter =1;
        Console.WriteLine("Hey! Welcome to Ray's Dice Game! Let's Start");
        Console.WriteLine();
        do
        {
            EvenOrOdds();
            Console.WriteLine("Do you want to play again? Please enter in all caps YES or NO");
            UserInput = Console.ReadLine();
            if (UserInput.Equals("YES"))
            {
                Counter++;
                EvenOrOdds();
            }
        }while(!(UserInput.Equals("NO")));

        Console.WriteLine("The number of times the dice was thrown is: " + Counter);
        Outro();
    }

    public static void EvenOrOdds()
    {
        Random rnd = new Random();
        int die1 = rnd.Next(1, 10);
        int die2 = rnd.Next(1, 10);

        Console.WriteLine("Die 1 = {0} and Die 2 = {1}", die1, die2);
        Console.WriteLine();
        Console.WriteLine("You Rolled {0} and {1}", die1, die2);
        Console.WriteLine();

        if ((die1 + die2) % 2 == 0)
        {
            Console.WriteLine("Evens are better than odd.");
            Console.WriteLine();
        }
        if ((die1 + die2) % 2 > 0 )
        {
            Console.WriteLine("Odds are still cool.");
            Console.WriteLine();
        }

    }

    public static void Outro()
    { 
        Console.WriteLine("\nThanks for playing! Come again!\n");
    }
}
...