Jak naprawić błędy w tym prostym kodzie gry?

0

Cześć wszystkim!
Napisałam prostą grę, w której komputer losuje jeden z trzech kubków, a gracz ma zgadnąć który kubek został wylosowany, aby podwoić swoją liczbę monet. W przeciwnym wypadku gra ma się zakończyć i pokazać wynik. Coś jednak jest nie tak, i gra zamiast pokazywać wynik za każdym razem, kiedy gracz przegra, pokazuje go na początku, i po 2 - 3 przegranych. Drugi problem jest taki, że można grać w nieskończoność i trzeba użyć krzyżyka żeby zamknąć okno.

#include <iostream>
#include <time.h>
#include <cstdlib>
#include <stdio.h>
#include <conio.h>
using namespace std;
int kubek, kasa = 1, strzal;
int main()
{
    cout << "Czesc, ukrylem monete w jednym z trzech kubkow." << endl;
    cout << "Posiadasz 1 monete na poczatek.";
    srand (time(NULL));
    kubek = rand () % 3 + 1;

    while (strzal!=kubek)
    {
      cout << endl <<"Zgadnij, ktory to kubek, a podwoje twoja liczbe monet:";
        cin >> strzal;


 if (strzal == kubek)
            {
            kasa = kasa * 2;
            cout << "Twoja kasa sie podwaja! Graj dalej, podaj numer kubka: ";
            cin >> strzal;
            }

    if ((strzal < kubek)&& (strzal >kubek))
    {
       cout << endl << "Koniec gry. Twoj wynik to "<<kasa<<" .";
    }

    }

http://wklej.org/id/3346646/

Proszę o podpowiedź, jak rozwiązać wyżej wymienione problemy z kodem gry.

0

Warunek tego if nigdy nie będzie prawdą:

if ((strzal < kubek) && (strzal > kubek)) { ... }

Strzał nie może być jednocześnie mniejszy i większy od kubka.
Zakładam że chodziło o coś takiego:

if ((strzal < kubek) || (strzal > kubek)) { ... }

Lepiej już

if (strzal != kubek) { ... }
0

Dziękuję, gra już pokazuje wynik za każdym razem kiedy gracz przegra! Co mogę zrobić, aby program kończył działanie po wciśnięciu jakiegoś klawisza, np. ESC? Teraz mam nieskończoną pętlę i nie mogę zakończyć programu inaczej niż przez kliknięcie krzyżyka.

0

Najłatwiej byłoby Ci zaimplementować coś takiego że gdy użytkownik wprowadzi -1 wtedy wychodzisz z pętli gry.

Zrobić to możesz najzwyczajniejszym ifem:

if (strzal == -1)
	break; // Break wychodzi z pętli

Poza tym nie masz nieskończonej pętli.
Załóżmy że kubek przyjmuje wartość 3, jeżeli 2 razy wpiszesz 3 wtedy warunek w pętli nie będzie prawdziwy (bo strzal == kubek) i gra zakończy się.

0

Gra działa poprawnie. Jest tylko bug, który po wprowadzeniu znaku innego niż cyfra powoduje naprawdę nieskończoną pętlę, której nie da się zatrzymać. Czy da się w prosty sposób naprawić tą pętlę?

0

Możesz napisać taką funkcję:

#include <limits>

int get_input()
{
    int input;
    cout << "Podaj liczbe" << endl;
    do
    {
        while(!(cin >> input)) // Dopóki odczytane dane nie będą typu int
        {
            cout << "Nieprawidlowe dane. Sprobuj jeszcze raz" << endl;
            cin.clear(); // Czyści flagę błędu
            cin.ignore(numeric_limits<streamsize>::max(), '\n'); // Ignoruje wszystkie znaki aż do \n
        }
    } while (input < -1 || input > 3);

    return input;
}

Wtedy zamiast

cin >> strzal;

piszesz

strzal = get_input();

I masz pewność że wartość może być od -1 (włącznie) do 3 (włącznie), a gdy pojawi się coś co nie może zostać przekonwertowane na int wtedy program pokaże błąd.

0
#include <iostream>
#include <time.h>
#include <cstdlib>
#include <stdio.h>
#include <limits>
using namespace std;
int kubek, kasa = 1, strzal;
int get_input()
{
    cout << "Czesc, ukrylem monete w jednym z trzech kubkow." << endl;
    cout << "Posiadasz 1 monete na poczatek.";
    srand (time(NULL));
    kubek = rand () % 3 + 1;

    do
    {
      int input;

    do
    {
      while(!(cin >> input))
        {
            cout << "Nieprawidlowe dane. Sprobuj jeszcze raz" << endl;
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
        }


      while (strzal!=kubek)
    {
      cout << endl <<"Zgadnij, ktory to kubek, a podwoje twoja liczbe monet:";
        cin >> strzal;


 if (strzal == kubek)
            {
            kasa = kasa * 2;
            cout << "Twoja kasa sie podwaja! Graj dalej, podaj numer kubka: ";
            cin >> strzal;
            }

    if ((strzal < kubek) || (strzal >kubek))
    {
       cout << endl << "Koniec gry. Twoj wynik to "<<kasa<<" .";
       kasa = 1;
    }
    }
    }while (input < -1 || input > 3)
    return input;

    }
return 0;
}

Kod teraz się nie kompiluje:
||=== Build: Debug in kubki (compiler: GNU GCC Compiler) ===|
C:\Users\Natalia\Desktop\Nowy folder\kubki\main.cpp||In function 'int get_input()':|
C:\Users\Natalia\Desktop\Nowy folder\kubki\main.cpp|52|error: expected 'while' before numeric constant|
C:\Users\Natalia\Desktop\Nowy folder\kubki\main.cpp|52|error: expected '(' before numeric constant|
C:\Users\Natalia\Desktop\Nowy folder\kubki\main.cpp|52|error: expected ')' before ';' token|
||=== Build failed: 3 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

0

Co Ty z tym kodem zrobiłaś? :D

Mówiłem tylko żeby zmienić:

cin >> strzal;

na

strzal = get_input();

Czyli:

#include <iostream>
#include <time.h>
#include <cstdlib>
#include <stdio.h>
#include <limits>

using namespace std;
int kubek, kasa = 1, strzal;

int get_input()
{
    int input;
    cout << "Podaj liczbe" << endl;
    do
    {
        while(!(cin >> input)) // Dopóki odczytane dane nie będą typu int
        {
            cout << "Nieprawidlowe dane. Sprobuj jeszcze raz" << endl;
            cin.clear(); // Czyści flagę błędu
            cin.ignore(numeric_limits<streamsize>::max(), '\n'); // Ignoruje wszystkie znaki aż do \n
        }
    } while (input < -1 || input > 3);

    return input;
}

int main()
{
    cout << "Czesc, ukrylem monete w jednym z trzech kubkow." << endl;
    cout << "Posiadasz 1 monete na poczatek.";
    srand(time(NULL));
    kubek = rand() % 3 + 1;
    printf("%d\n", kubek);

    while (strzal != kubek)
    {
        cout << endl
             << "Zgadnij, ktory to kubek, a podwoje twoja liczbe monet:";
        strzal = get_input(); // << TUTAJ ZMIANA
        if (strzal == kubek)
        {
            kasa = kasa * 2;
            cout << "Twoja kasa sie podwaja! Graj dalej, podaj numer kubka: ";
            strzal = get_input(); // << I TUTAJ
        }

        if ((strzal < kubek) || (strzal > kubek))
        {
            cout << endl
                 << "Koniec gry. Twoj wynik to " << kasa << " .";
        }
    }
}
0

Trudne początki :D
Poprawiłam kod i działa. Dzięki za pomoc! Jak nikt nie ma nic do dodania, to można zamknąć.

1 użytkowników online, w tym zalogowanych: 0, gości: 1