C++ :: Aufgabe #280

1 Lösung Lösung öffentlich

Galgenraten (hangman)

Anfänger - C++ von JKooP - 18.04.2020 um 12:18 Uhr
Erstelle ein Konsolenspiel in der Form „Galgenraten“.

Spieler 1 gibt verdeckt ein zu erratenes Wort ein.
Regeln: Buchstaben a-z, keine Zahlen, ä = ae, ö = oe, ü = ue, ß = ss

Spieler 2 muss versuchen die richtigen Buchstaben zu erraten.
Dazu wird am Anfang des Spiels jeder Buchstabe des Lösungsworts als „Unterstrich“ dargestellt.
Errät Spieler 2 einen Buchstaben, wird der Unterstrich an allen Positionen an der sich der gefundene Buchstabe befindet durch den jeweiligen Buchstaben ersetzt.
Es sollen am Ende des Spiels die benötigte Zeit und die Anzahl der Versuche ausgegeben werden.
Die Anzahl der Versuche soll ähnlich wie beim Galgenraten begrenzt werden.

Varianten:
Der Spieler 2 kann auch das Lösungswort eingeben. Ist das Wort falsch, wird es als 2 Fehlversuche gewertet.
Als Hilfe könnten die bereits genutzten Buchstaben angezeigt werden.
Aus der Anzahl der benötigten Versuche und der Zeit könnten Gewinnpunkte generiert werden.

Viel Spaß

Lösungen:

vote_ok
von dewe (460 Punkte) - 30.04.2020 um 18:52 Uhr
Quellcode ausblenden C-Code
#include <iostream>
#include <stdlib.h>
#include <time.h>


using namespace std;

void getInput(string &word);
void generateRiddel(string pInput, string &rWord);
void get_player_guess(char &guess);
void check_guess(char guess, string word, string &riddel, bool &check);
bool game_status(string rWord);
bool letter_used(char guess, string guesses);

int main()
{
    string pInput, rWord, guesses;
    char guess;
    long p_start, p_end;

    cout<< "Bitte geben Sie ein Wort ein und bestätigen Sie Ihre eingabe mit Enter \n";
    cout<< "Bitte achten Sie dabei auf folgende Regeln \n";
    cout<< "Ä als AE, Ü als UE, Ö als OE und ß als ss \n";

    getInput(pInput);
    system("cls");

    generateRiddel(pInput, rWord);

    cout<< rWord << "\n";

    int i = 0;

    p_start = time(0);

    while(i < 10 && game_status(rWord) == false)
    {
        bool check = false;

        cout<< "Bitte geben Sie einen Buchstaben ein \n";

        get_player_guess(guess);

        while(letter_used(guess, guesses)==false)
        {
            cout<<"Dieser Buchstabe wurde schon geraten, bitte versuchen Sie einen anderen Buchstaben. \n";
            get_player_guess(guess);
        }

        guesses += guess;

        check_guess(guess, pInput, rWord, check);

        system("cls");

        if(check == false)
        {
            i++;
            cout<< "Sie haben nur noch " << 10-i << " Versuche uebrig. \n";
        }
        else
            cout<< "Sie haben diesen Buchstaben richtig erraten. \nSie haben weiterhin " << 10-i << " Versuche uebrig. \n";

        cout << rWord << "\n";

    }

    p_end = time(0);

    if(game_status(rWord) == false)
        cout<< "Sie haben leider verloren. \n Das Wort waere " << pInput << " gewesen. \n";
    else
    {
        cout<< "Sie haben das Wort erraten. Herzlichen Glueckwunsch!!! \n";
        cout<< "Sie hatten noch " << 10 - i << " Versuche übrig und haben " << p_end - p_start << " Sekunden gebraucht. \nDamit erreichen Sie eine Punktzahl von " << (10-i)*10 - (p_end-p_start);
    }

    return 0;
}

void getInput(string &word)
{
    string *pword = &word;
    getline(cin, *pword);
}

void generateRiddel(string pInput, string &rWord)
{
    string *rword = &rWord;

    for(int i = 0; i < pInput.length(); i++)
        *rword += '-';
}

void get_player_guess(char &guess)
{
    char *pGuess = &guess;
    cin>> *pGuess;
}

void check_guess(char guess, string word, string &riddel, bool &check)
{
    char *pRiddel;
    bool *pCheck = ✓

    for(int i = 0; i < word.length(); i++)
    {
        if(guess == word[i] || toupper(guess) == word[i] || tolower(guess) == word[i])
        {
            *pCheck = true;
            pRiddel = &riddel[i];
            *pRiddel = word[i];
        }
    }
}

bool game_status(string rWord)
{
    bool status = true;

    for(int i = 0; i<rWord.length(); i++)
        if(rWord[i] == '-')
        {
            status = false;
            i = rWord.length();
        }
    return status;
}

bool letter_used(char guess, string guesses)
{
    for(int i = 0; i < guesses.length(); i++)
    {
        if(guess == guesses[i])
        {
            return false;
        }
    }
    return true;
}