Логические операторы в C вызывают проблемы с моим циклом? - PullRequest
0 голосов
/ 08 октября 2018

Я делаю игру для задания, в котором есть 2 игрока, и каждый ход игрок бросает 2 кубика.Когда я спрашиваю игрока, хотят ли они бросить снова, все идет на юг.Я запутался, потому что даже если я изменил свой символ rollAgain на 'n', он все равно воспроизводит мой цикл, и я хочу, чтобы он запускался, только если rollAgain равен 'y' или 'Y'.Это моя первая программа на C, ранее я программировал только на Java.Мне кажется, что я должен неправильно проверять логические операторы в цикле while, но, не зная, что я делаю неправильно, я просмотрел весь код несколько раз.

Вот мой код:

#include <stdio.h>
#include <stdlib.h>     // NULL constant, srand() & rand() functions
#include <time.h>       // access your computer’s clock time

// function prototype statements
int rollDice();
int calcPoints(int die1, int die2);
char checkOne(int die1, int die2);

int main()
{
    int p1Score = 0;
    int p2Score = 0;
    int turnTotal = 0;
    char rollAgain = 'Y';
    char rolled1 = 'N';
    int die1;
    int die2;

    printf("Welcome to the Pig Game. Each turn the player rolls two dice repeatedly until a single 1 is rolled or the player holds.\n\n");
    printf("If a single 1 is rolled all points are lost. If the player holds, all earned points are kept.\n");
    printf("If double 1's are rolled 25 points are earned, if any other doubles are rolled the value is doubled.\n");
    printf("Player 1 has an advantage because they get to go first, the youngest player gets to be Player 1.\n\n");
    printf("First player to 100 points wins, let the games begin!!!\n\n");

    do
    {
        //----------------------P1's turn starts----------------------------------------
        while ((rollAgain == 'Y' || rollAgain == 'y') && rolled1 == 'N')
        {
            die1 = rollDice(); //roll die 1
            die2 = rollDice(); //roll die 2

            printf("Player 1 rolls %d, and %d\n", die1, die2);
            rolled1 = checkOne(die1, die2); //check if turn ending 1 is rolled if they did the below while loop will not run and the current while loop will end.

            if(rolled1 == 'N') //if a single 1 wasn't rolled calculate total for the turn
            {
                turnTotal += calcPoints(die1, die2);

                printf("Player 1 your turn total so far is %d. Would you like to roll again?\n", turnTotal);
                fflush(stdin);
                scanf_s("%c", &rollAgain);
            }

        }

        //-------------------------P1's turn is now over---------------------------------
        if (rolled1 == 'Y')   //turnTotal isn't added to p1Score
        {
            printf("Sorry Player 1 your turn is over because you rolled a 1 on a single die :(\n");
            printf("Your total score is now: %d.\n", p1Score);
        }
        else //player1 must have held
        {
            printf("Congratulations on scoring %d point this turn Player 1!\n", turnTotal);
            p1Score += turnTotal;
            printf("Your total score is now: %d.\n", p1Score);
        }

        //reset variables to start p2s turn
        turnTotal = 0;
        rolled1 = 'N';
        rollAgain = 'Y';

        //----------------------P2's turn starts----------------------------------------
        while ((rollAgain == 'Y' || rollAgain == 'y') && rolled1 == 'N' && p1Score < 100) //player2's turn should not start if player 1 has already won the game so we must check p1's score as well
        {
            int die1 = rollDice(); //roll die 1
            int die2 = rollDice(); //roll die 2

            printf("Player 2 rolls %d, and %d\n", die1, die2);
            rolled1 = checkOne(die1, die2); //check if turn ending 1 is rolled if it was the below while loop will not run and the current while loop will end.

            if(rolled1 == 'N') //if a single 1 wasn't rolled calculate total for the turn
            {
                turnTotal += calcPoints(die1, die2);

                printf("Player 2 your turn total so far is %d. Would you like to roll again?\n", turnTotal);
                fflush(stdin);
                scanf_s("%c", &rollAgain);
            }

        }

        //-------------------------P2's turn is now over---------------------------------
        if (rolled1 == 'Y' && p1Score < 100)   //turnTotal isn't added to p1Score
        {
            printf("Sorry Player 2 your turn is over because you rolled a 1 on a single die :(\n");
            printf("Your total score is now: %d.\n", p2Score);
        }
        if (rolled1 == 'N' && p1Score < 100) //player2 must have held, use an if statement rather than else because we don't want this code to play if p1 has already won
        {
            printf("Congratulations on scoring %d point this turn Player 2!\n", turnTotal);
            p2Score += turnTotal;
            printf("Your total score is now: %d.\n", p2Score);
        }

        //reset variables for p1's turn
        turnTotal = 0;
        rolled1 = 'N';
        rollAgain = 'Y';

        //if either player's score is > 100 the game is now over so the game ending code will now play

    } while (p1Score < 100 && p2Score < 100);

    if (p1Score >= 100) //player 1 has won, congratulate them
        printf("Congratulations Player 1, you have won the game! Pat yourself on the back!\n");

    else //player 1 didn't win so player 2 must have won since there are no draws
        printf("Congratulations Player 2, you have won the game! You are awesome!\n");

    return 0; //end main
}

//function rollDice rolles the dice for the player using a random number between 1-6.
int rollDice()
{
    // seed the random number generator using the computers clock
    srand(time(0));

    //generate a random number between 1-6
    int num = (rand() % 6) + 1;

    return num;
}

//function calcPoints that calculates how many points the player earned.
int calcPoints(int die1, int die2)
{
    int points;

    if (die1 == die2) //check if doubles were rolled
    {
        //snake eyes = 25 points
        if (die1 == 1)
            points = 25;
        //regular doubles = the value on the dice *2
        else
            points = (die1 + die2) * 2;
    }
    else //doubled weren't rolled
        points = die1 + die2;

    return points;
}

//function checkOne that checks if the player rolled a single 1 during their turn.
char checkOne(int die1, int die2)
{
    if (die1 == 1 && die2 != 1)
        return 'Y';
    else if (die1 != 1 && die2 == 1)
        return 'Y';
    else
        return 'N';
}

Ход игроков должен закончиться, если выпадет 1.Я был бы очень признателен за любую помощь, я не уверен, где я иду не так.Код просто имеет собственный разум после того, как он спрашивает, хочу ли я снова катиться.

Player 1 rolls 2, and 2
Player 1 your turn total so far is 8. Would you like to roll again?
y
Player 1 rolls 3, and 3
Player 1 your turn total so far is 20. Would you like to roll again?
Congratulations on scoring 20 point this turn Player 1!
Your total score is now: 20.
Player 2 rolls 3, and 3
Player 2 your turn total so far is 12. Would you like to roll again?

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

    Player 1 rolls 3, and 3
Player 1 your turn total so far is 12. Would you like to roll again?
n
Congratulations on scoring 12 point this turn Player 1!
Your total score is now: 12.
Player 2 rolls 1, and 1
Player 2 your turn total so far is 25. Would you like to roll again?
Congratulations on scoring 25 point this turn Player 2!
Your total score is now: 25.
Player 1 rolls 1, and 1
Player 1 your turn total so far is 25. Would you like to roll again?

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

1 Ответ

0 голосов
/ 08 октября 2018

В вашем коде есть несколько классических проблем:

  • fflush(stdin); имеет неопределенное поведение.Просто удалите этот оператор, он не использует ожидающий ввод в stdin.
  • scanf_s("%c", &rollAgain); будет читать ожидающую новую строку во входном потоке.Чтобы пропустить это, вы можете просто добавить пробел в строку формата и вы должны проверить, удалось ли scanf_s избежать неопределенного поведения в конце файла:

    if (scanf_s(" %c", &rollAgain) != 1) {
        exit(1);   // unexpected end of file or some other error
    }
    
  • Вы не должныпереинициализируйте генератор случайных чисел каждый раз, когда вы бросаете матрицу, только один раз в начале программы (переместите вызов функции srand() в начало функции main и передайте его clock(), который изменяется гораздо быстрее, чемtime(NULL)):

    //function rollDice rolls the die for the player using a random number between 1-6.
    int rollDice() {
        //generate a random number between 1-6
       return (rand() % 6) + 1;
    }
    
...