Как бы я не использовал здесь оператор goto? - PullRequest
2 голосов
/ 27 марта 2019

Я довольно новичок в программировании на C, и я делаю простую игру в кости. У меня работает вся другая логика, но я не могу понять, как избежать оператора goto. В основном, игрок начинает с 50 долларов в качестве баланса, и программа запрашивает ставку, затем бросают кости и в зависимости от того, каков результат броска, происходят разные вещи. Основная проблема заключается в том, что когда происходит результат, пользователя спрашивают, хотят ли они играть снова, если он говорит «нет», я просто выхожу, но если он говорит «да», мне нужно вернуться к началу и снова попросить ставку.


int main()
{

        START:

    if (FirstRun == 0)
    {
        printf("Your starting balance is $%.2f", Balance);
    }
    if (FirstRun > 0)
    {
        printf("Your new balance is $%.2f", Balance);
    }
    if (Balance <= 0)
    {
        printf("Sorry you are out of money!");
        exit(0);
    }

    do
    {
        ValidBet = 0;
        printf("\nPlease enter your bet:");
        scanf("%lf", &Bet);

        if ((Bet > Balance) || (Bet < 0))
        {
            printf("Your bet is invalid, try again.");
        }
        else 
        {
            ValidBet = 1;
        }
    } while (ValidBet == 0);

    ThrowDicePair();
    printf("DICE #1 WAS %d", SumOfThrows);

    if (SumOfThrows == 7 || SumOfThrows == 11)
    {
        Balance += Bet;
        printf("You win! Would you like to play again? [y/n]");
        C = getch();
        if (C == 'y')
        {
            FirstRun++;
            goto START;
        }
        else if (C == 'n')
        {
            printf("Thanks for playing");
            exit(0);
        }

}

Ответы [ 3 ]

3 голосов
/ 27 марта 2019

просто поместите все в цикл for(;;); goto будет тем случаем, когда вы перезапускаете, в других случаях добавьте return 0; (или exit(0);, как вы предпочитаете и уже используете в некоторых случаях)

int main()
{

  for (;;) { /* ADDED  */
    if (FirstRun == 0)
    {
        printf("Your starting balance is $%.2f", Balance);
    }
    if (FirstRun > 0)
    {
        printf("Your new balance is $%.2f", Balance);
    }
    if (Balance <= 0)
    {
        printf("Sorry you are out of money!");
        exit(0);
    }

    do
    {
        ValidBet = 0;
        printf("\nPlease enter your bet:");
        scanf("%lf", &Bet);

        if ((Bet > Balance) || (Bet < 0))
        {
            printf("Your bet is invalid, try again.");
        }
        else 
        {
            ValidBet = 1;
        }
    } while (ValidBet == 0);

    ThrowDicePair();
    printf("DICE #1 WAS %d", SumOfThrows);

    if (SumOfThrows == 7 || SumOfThrows == 11)
    {
        Balance += Bet;
        printf("You win! Would you like to play again? [y/n]");
        C = getch();
        if (C == 'y')
        {
            FirstRun++;
            /* goto START; removed */
        }
        else if (C == 'n')
        {
            printf("Thanks for playing");
            exit(0);
        }
        else /* ADDED */
          return 0; /* ADDED */
    }
    else /* ADDED */
      return 0; /* ADDED */
  } /* ADDED  */
}

В более сложных / вложенных случаях вы можете использовать continue для повторного входа, но здесь это бесполезно

2 голосов
/ 27 марта 2019

Предполагая, что вы хотите убедиться, что человек играет в игру хотя бы один раз, прежде чем выбрать выход, цикл do ... while будет работать нормально. Просто запустите цикл, в котором вы хотите выполнить итерацию, то есть вашу метку START, а затем перенесите ввод в C в конце вашего цикла, определяя, равен ли ваш вход 'n' или 'N'.

0 голосов
/ 27 марта 2019
int main() {
    while (1) { /* ADDED  */
        if (FirstRun == 0) {
            printf("Your starting balance is $%.2f", Balance);
        }
        if (FirstRun > 0) {
            printf("Your new balance is $%.2f", Balance);
        }
        if (Balance <= 0) {
            printf("Sorry you are out of money!");
            exit(0);
        }

        do {
            ValidBet = 0;
            printf("\nPlease enter your bet:");
            scanf("%lf", &Bet);

            if ((Bet > Balance) || (Bet < 0)) {
                printf("Your bet is invalid, try again.");
            } else {
                ValidBet = 1;
            }
        } while (ValidBet == 0);

        ThrowDicePair();
        printf("DICE #1 WAS %d", SumOfThrows);

        if (SumOfThrows == 7 || SumOfThrows == 11) {
            Balance += Bet;
            printf("You win! Would you like to play again? [y/n]");
            C = getch();
            if (C == 'y') {
                FirstRun++;
                continue; /* ADDED  */
            } else if (C == 'n') {
                printf("Thanks for playing");
                exit(0);
            }
        }
        break; /* ADDED  */
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...