Завершение цикла, если пользователь выбирает определенную функцию


Привет, мне нужна небольшая помощь с проблемой!

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

Вот мой код:

#include <stdio.h>

void rest_at_inn();
void train();
void battle_demon_lord();
void Quit_Game();

int main() {

    //Declare variable and pointer
    float days_remaining = 8;
    int current_hp = 10;
    int hp_remaining = 10;
    int MAX = 10;
    int experience = 0;
    int selection;

    //Loops a menu that asks the user to make a selectio and repet it until either days or HP are less or equal to zero
    do {
        printf("Days remaining: %f, HP: %d, EXP: %dnn", days_remaining, hp_remaining, experience);
        printf("1 - Rest at Innn");
        printf("2 - Trainn");
        printf("3 - Fight the Demon Lordn");
        printf("4 - Quit Gamenn");
        printf("Select: n");
        scanf("%d", &selection);
        printf("n");

        //Execute the selection
        switch (selection) {
            case 1:
                rest_at_inn(&days_remaining, &hp_remaining, &MAX);
                break;
            case 2:
                train(&days_remaining, &hp_remaining, &experience);
                break;
            case 3:
                battle_demon_lord(&current_hp);
                break;
            case 4:
                Quit_Game();
                break;
        }

    } while (days_remaining > 0 && current_hp > 0);

    return 0;

}

//This function reduces the days by 1 and resets the HP to 10

void rest_at_inn(float *days_remaining, int *hp_remaining, int *MAX) {

    *hp_remaining = 10;
    *days_remaining -= 1;
    if (*days_remaining > 0)
        printf("You rested up the at the innnn");
    else /*(*days_remaining<=0)*/
        printf("Game Over");

}

//This function reduces the days by 0.5 and the HP by 2 and adds 10 to the experience

void train(float *days_remaining, int *hp_remaining, int *experience) {

    *experience += 10;
    *hp_remaining = *hp_remaining - 2;
    *days_remaining = *days_remaining - 0.5;
    printf("You did some training!nn");

}

//This function sets the HP to 0 and prints a string

void battle_demon_lord(int *current_hp) {

    *current_hp = 0;
    printf("He's too strong!nn");
    printf("Game Over!");
}

// This function prints a string

void Quit_Game() {

    printf("Good bye!nn");

}

Я думаю, что это должен быть параметр в do_while, но у меня ничего не получилось.

4 2

4 ответа:

Вам нужно добавить условие выхода, когда пользователь выбирает 4.

Вы можете сделать это:

} while (days_remaining>0 && current_hp>0 && selection != 4);

Или вот это:

case 4 :
    Quit_Game();
    return 0;

Или вот это:

void Quit_Game()  {

    printf ("Good bye!\n\n");
    exit(0);

}

Если switch является последним оператором вашего цикла, добавьте переменную флага mustQuit Перед do вашего цикла.do / while замкните петлю и установите ее на ноль. Когда конечный пользователь выбирает опцию quit, установите mustQuit в 1. Добавьте условие !mustQuit в свой цикл.

int mustQuit = 0;
do {
    ... // some statements here
    switch (selection) {
    ...
    case 4 :
        mustQuit = 1;
        Quit_Game();
        break;
    }
} while (!mustQuit && days_remaining > 0 && current_hp > 0);

Если после switch имеется больше утверждений, то альтернатива с условным break в середине может быть более оптимальной:

do {
    int mustQuit = 0;
    ... // some statements here
    switch (selection) {
    ...
    case 4 :
        mustQuit = 1;
        Quit_Game();
        break; // this breaks the switch
    }
    if (mustQuit) {
        break; // this breaks the loop
    }
    ... // More statements here
} while (days_remaining > 0 && current_hp > 0);

Я ожидаю, что вы хотите избежать цикла в case 4:

Попробуйте использовать goto

    case 4 :
        Quit_Game();
        goto out;
        break;
    }

} while (days_remaining>0 && current_hp>0);
out:
return 0;

(1) Если вы хотите просто выйти из цикла do-while, вы можете добавить булеву переменную, чтобы при вводе последней опции она была ложной, например:

bool quit = false;

(...)

case 4 :
    quit = true;
    printf("Good bye!\n\n");
    break;

И добавьте значение при условии do-while:

while (days_remaining>0 && current_hp>0 && !quit);

Итак, он выйдет из цикла do-while и продолжит код.

(2) Если вы хотите завершить программу, добавьте возвращаемое значение 0 и забудьте о логическом значении, например:

case 4 :
    printf("Good bye!\n\n");
    return 0;

Помните: если вы делаем это на C-коде, он не будет поддерживать зарезервированные слова, такие как, true и false. Вы должны использовать 0 для false и другое число для true, предпочтительно 1.