Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Ccomando que pare o jogo ao digitar um nível inválido

Olá, tudo bem?

Gostaria de adicionar um comando que interrompa o jogo se o usuário digitar uma letra inválida ao escolher o nível de dificuldade. Tentei fazer com o próprio "break;" mas o programa retorna um erro. Há outros comandos que sirvam para este propósito?

Grato desde já <3

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main () {
    cout << "************************************" << endl;
    cout << "* Bem-vindo ao jogo da adivinhacao *" << endl;
    cout << "* ***********************************" << endl;

    cout << "Escolha a sua dificuldade: " << endl;
    cout << "Facil (F), Medio (M) ou Dificil (D)." << endl;

    char dificuldade;
    cin >> dificuldade;

    int numero_tentativas;

    if(dificuldade == 'F') {
        numero_tentativas = 15;
    }
    else if(dificuldade == 'M') {
        numero_tentativas = 10;
    }
    else if(dificuldade == 'D'){
        numero_tentativas = 5;
    }
    else {
        cout << "Digite um nivel valido." << endl;
        break;
    }

    srand(time(0)); //Igual a srand(time(NULL));
    const int NUMERO_SECRETO = rand() % 100;
    //cout << "NS = " << NUMERO_SECRETO << endl;

    bool nao_acertou = true;
    int tentativas = 0;

    double pontos = 1000.0;

    //cout << "O número secreto é o " << NUMERO_SECRETO << ". Não conte a ninguém." << endl;

    for(tentativas = 1; tentativas <= numero_tentativas; tentativas++) {
        int chute;
        cout << "Tentativa: " << tentativas << "." << endl;
        cout << "Qual o seu chute? " << endl;
        cin >> chute;

        double pontos_perdidos = abs(chute - NUMERO_SECRETO) / 2.0;
        pontos = pontos - pontos_perdidos; //Igual a pontos -+ pontos_perdidos;

        cout << "O valor do seu chute foi: " << chute << endl;

        bool acertou = chute == NUMERO_SECRETO;
        bool maior = chute > NUMERO_SECRETO;

        if(acertou) {
            cout << "Excelenteeeee!!! Acertou o numero secreto :)" << endl;
            nao_acertou = false;
            break;
        }
        else if (maior) {
            cout << "Seu chute foi maior que o numero secreto." << endl;
        }
        else {
            cout << "Seu chute foi menor que o numero secreto." << endl;
        }
    }

    cout << "* FIM DE JOGO *" << endl;

    if(nao_acertou) {
        cout << "Perdeuuu :( Tente novamente!" << endl;
        cout << "O numero secreto era o " << NUMERO_SECRETO << "." << endl;
    }
    else {
        cout << "Acertou depois de " << tentativas << " tentativas." << endl;

        cout.precision(2); //Define a quantidde de casas decimais que deseja-se imprimir na tela.
        cout << fixed; //Garante que o número não apareça em notação científica.
        cout << "Sua pontuacao foi de " << pontos << " pontos!" << endl;
    }
}
1 resposta
solução!

Para isso você teria de interromper a função usando o comando return. Não obstante, seu código pode ser reestruturado para não precisar disso. Segue um exemplo de uma versão refatorada.

# Arquivo makefile
CC=clang++
CXXFLAGS=-Wall -std=c++2a -O3
SRC=$(wildcard *.cpp)
OBJ=$(SRC:.cpp=.o)
EXE=jogo

all: $(EXE)

$(EXE): $(OBJ)
    $(CC) $^ -o $@ $(CXXFLAGS)

%.o: %.cpp
    $(CC) -o $@ -c $< $(CXXFLAGS)

.PHONY: clean cleanAll

clean:
    @rm *.o

cleanAll: clean
    @rm jogo
// Arquivo main.cpp

#include <ctime>
#include <iostream>

#include "Game.h"

int main() {
    srand(time(NULL));

    std::cout << "************************************" << std::endl;
    std::cout << "* Bem-vindo ao jogo da adivinhacao *" << std::endl;
    std::cout << "* ***********************************" << std::endl;

    std::cout << "Escolha a sua dificuldade: " << std::endl;
    std::cout << "Facil (F), Medio (M) ou Dificil (D)." << std::endl;

    while (true) {
        char mode;
        std::cin >> mode;

        if (Game::dictionary.contains(mode)) {
            auto game = Game{
                    []() -> int {
                        int guess;
                        std::cin >> guess;
                        return guess;
                    },

                    [](const std::string &s) { std::cout << s << std::endl; },

                    Game::dictionary.at(mode)
            };

            return game.start();
        } else
            std::cout << "Digite um nivel valido." << std::endl;
    }
}
// Arquivo Game.h

#ifndef GAME_H
#define GAME_H

#include <map>
#include <functional>

class Game {
public:
    template<typename T>
    using Input = const std::function<T(void)> &;

    using Output = const std::function<void(const std::string &)> &;

    enum class Mode {
        EASY = 15, MEDIUM = 10, HARD = 5
    };

    enum class Outcome {
        PLAYING, VICTORY, DEFEAT
    };

    explicit Game(Input<int> in, Output out, Game::Mode mode) : in{in}, out{out}, mode{mode} {}

    ~Game() = default;

    int start(Game::Outcome outcome = Game::Outcome::PLAYING);

    static const std::map<char, Mode> dictionary;

private:
    Outcome update(int);

    void hint(int) const;

    [[nodiscard]] int onPlay() const;

    void onVictory() const;

    void onDefeat() const;

    Input<int> in;
    Output out;
    const Mode mode;
    int counter = 1;
    double points = 1000.0;
    const int secret = abs(std::rand()) % 100 + 1; // NOLINT(cert-msc50-cpp)
};

#endif
#include "Game.h"

#include <sstream>

const std::map<char, Game::Mode> Game::dictionary = std::map<char, Game::Mode>{ // NOLINT(cert-err58-cpp)
        {'F', Mode::EASY},
        {'M', Mode::MEDIUM},
        {'D', Mode::HARD}
};

int Game::start(Game::Outcome outcome) {
    if (outcome != Game::Outcome::PLAYING) {
        if (outcome == Game::Outcome::VICTORY)
            onVictory();
        else
            onDefeat();
        return 0;
    } else
        return start(update(onPlay()));
}

Game::Outcome Game::update(int guess) {
    if (guess == secret) {
        return Outcome::VICTORY;
    } else if (counter < static_cast<int>(mode)) {
        hint(guess);

        counter++;
        points -= abs(secret - guess) / 2.0;

        return Outcome::PLAYING;
    } else
        return Outcome::DEFEAT;
}

void Game::hint(int guess) const {
    auto ss = std::stringstream{};

    ss << guess
       << " é "
       << ((guess > secret) ? "maior" : "menor")
       << " que o número secreto"
       << std::endl;

    out(ss.str());
}

int Game::onPlay() const {
    auto ss = std::stringstream{};

    ss << "Tentativa: "
       << counter
       << "."
       << std::endl
       << "Qual o seu chute? "
       << std::endl;

    out(ss.str());

    return in();
}

void Game::onVictory() const {
    auto ss = std::stringstream{};

    ss.precision(2);

    ss << "Você ganhou."
       << std::endl
       << "Sua pontuação foi de "
       << std::fixed
       << points
       << std::endl;

    out(ss.str());
}

void Game::onDefeat() const {
    auto ss = std::stringstream{};

    ss << "Você perdeu, o número secreto era "
       << secret
       << std::endl;

    out(ss.str());
}

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software