Zadanie gra w kości z liczeniem punktów

0

Gracz rzuca dwie kości. Każda z nich ma 6 ścianek. Kiedy kości zostają rzucone, obliczana jest suma
punktów. Jeżeli przy pierwszym rzucie suma wynosi 7 lub 11 gracz wygrywa. Jeśli suma wynosi przy
pierwszym rzucie 2, 3 lub 12 gracz przegrywa. Jeżeli suma wynosi 4, 5, 6, 8, 9 lub 10 przy pierwszym
rzucie, gra jest nierozstrzygnięta, a suma staje się „punktami” gracza.

Aby uzyskać wynik musi kontynuować rzucanie kośćmi, aż do uzyskania „swoich punktów”. Jeżeli
gracz wyrzuci 7 - przegrywa.

Gracz na początku ma 100 zł, każda wygrana to uzyskane 10 zł, przegrana trzeba oddać 15 zł. Gra
kończy się, kiedy gracz nie ma pieniędzy, albo rezygnuje z gry.

Przykład dla jednego gracza:
Gra 1
Rzut 1 – 7 pkt – gracz wygrywa (na koncie gracza 110)
Gra 2
Rzut 1 – 12 pkt – gracz przegrywa (na koncie gracza 95)
Gra 3
Rzut 1 – 6 pkt - trzeba kontynuować rzucanie kostkami
Rzut 2 – 4 pkt – brak wyniku
Rzut 3 – 10 pkt – brak wyniku
Rzut 4 – 7 pkt – gra przegrana ( na koncie gracza 80)
Gra 4
Rzut 1 – 8 pkt - trzeba kontynuować rzucanie kostkami
Rzut 2 – 5 pkt – brak wyniku
Rzut 3 – 10 pkt – brak wyniku
Rzut 4 – 8 pkt – gra wygrana ( na koncie gracza 95)

Stworzyłem takiego potworka i nie mam pomysłu jak ubrać to w pętlę zliczającą ilość gotówki i pozwalającą na grę tak długo aż gotówka nie wyniesie 0 lub sam gracz opuści grę. Może całe moje podejście jest błędne i lepiej napisać to w inny sposób ? Czekam na feedback :P


#include <iostream>
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <cstdlib>
#include <conio.h>

using namespace std;

int pln = 100;

void opcja1();

int main()
{
    char wybor;

    while (true)
    {
        cout << "   Witaj w grze k6 dice game  ! " << endl;
        cout << "   Wybierz forme gry lub wyjdz: " << endl;
        cout << "   _____________________________" <<  endl;
        cout << "   Graj              --> wybierz (1) " << endl;     
        cout << "   Wyjscie           --> wybierz (0) " << endl;

        wybor = _getch();

        switch (wybor)
        {
            case '1': opcja1();  break;   
            case '0': exit(0);   break;

            default: cout << "  Blad ! Podales zla liczbe ! Wybierz ponownie" << endl;
        }
        cout << endl;
        cout << endl;
        cout << "   Wcisnij dowolny klawisz, zeby zresetowac !!!" << endl;

        _getch();

        system("cls");
    }
}
void opcja1()
{  
        srand(time(NULL));

        
        int k1 = rand() % 6 + 1;
        int k2 = rand() % 6 + 1;
        int w1 = k1 + k2;
        char wybor = 't';


        if (w1 == 7 || w1 == 11)
        {
            cout << endl;
            cout << "   ____________________" << endl;
            cout << "   Kosc numer jeden: " << k1 << endl;
            cout << "   ____________________" << endl;
            cout << "   Kosc numer dwa: " << k2 << endl;
            cout << "   ____________________" << endl;
            cout << "   Wygrales !!!" << endl;
            cout << "   ____________________" << endl;
            cout << "   Twoj wynik to: " << w1 << endl;
            cout << "   ____________________" << endl;
            pln = pln + 10;
            
            cout << "   pln: " << pln << endl;
            
        }
        else if (w1 == 2 || w1 == 3 || w1 == 12)
        {
            cout << endl;
            cout << "   ____________________" << endl;
            cout << "   Kosc numer jeden: " << k1 << endl;
            cout << "   ____________________" << endl;
            cout << "   Kosc numer dwa: " << k2 << endl;
            cout << "   ____________________" << endl;
            cout << "   Przegrales !!!" << endl;
            cout << "   ____________________" << endl;
            cout << "   Twoj wynik to: " << w1 << endl;
            cout << "   ____________________" << endl;
            pln = pln - 15
            cout << "   pln: " << pln << endl;
            
        }
        else
        {
            cout << endl;
            cout << "   ____________________" << endl;
            cout << "   Kosc numer jeden: " << k1 << endl;
            cout << "   ____________________" << endl;
            cout << "   Kosc numer dwa: " << k2 << endl;
            cout << "   ____________________" << endl;
            cout << "   Gra nierozstrzygnieta ! Musi powtorzyc rzut !" << endl;
            cout << "   ____________________" << endl;
            cout << "   Twoj wynik to: " << w1 << endl;
            cout << "   ____________________" << endl;
            cout << "   pln: " << pln << endl;

            do
            {

                int k3 = rand() % 6 + 1;
                int k4 = rand() % 6 + 1;
                int w2 = k3 + k4;

                cout << endl;
                cout << "    Czy chcesz kontynuowac gre ? Wybierz (t/n):" << endl;

                cin >> wybor;

                if (wybor == 't')
                {
                    if (w2 == 7)
                    {
                        cout << endl;
                        cout << "   ____________________" << endl;
                        cout << "   Kosc numer jeden:" << k3 << endl;
                        cout << "   ____________________" << endl;
                        cout << "   Kosc numer dwa:" << k4 << endl;
                        cout << "   ____________________" << endl;
                        cout << "   Przegrales !!!" << endl;
                        cout << "   ____________________" << endl;
                        cout << "   Twoj wynik to:" << w2 << endl;
                        pln = pln - 15;
                        cout << "   pln: " << pln << endl;
                    }
                    else if (w1 == w2)
                    {
                        cout << endl;
                        cout << "   ____________________" << endl;
                        cout << "   Kosc numer jeden:" << k3 << endl;
                        cout << "   ____________________" << endl;
                        cout << "   Kosc numer dwa:" << k4 << endl;
                        cout << "   ____________________" << endl;
                        cout << "   Wygrales !!!" << endl;
                        cout << "   ____________________" << endl;
                        cout << "   Twoj wynik to:" << w2 << endl;
                        pln = pln + 10;
                        cout << "   pln: " << pln << endl;

                    }
                    else
                    {
                        cout << endl;
                        cout << "   ____________________" << endl;
                        cout << "   Brak rozstrzygniecia ! Trzeba powtorzyc rzut !" << endl;
                        cout << "   ____________________" << endl;
                        cout << "   Twoj wynik to:" << w2 << endl;
                        cout << "   pln: " << pln << endl;
                    }
                }
                else if (wybor == 'n')
                {
                    cout << "    Zakonczyles gre !" << endl;
                    cout << "    Ilosc Twojej gotowki jest rowna: " << pln << endl;
                }
                else
                {
                    cout << "    Nie ma takiej opcji ! Wybierz ponownie !" << endl;
                }
            }             while (pln == 100);
        }
    
} 
2

Całe podejście jest błędne i tak, lepiej napisać to w inny sposób.
Pisząc kod w ten sposób bardzo ciężko będzie Ci go potem rozszerzać (co zresztą już zacząłeś odczuwać, skoro przychodzisz na forum z takim pytaniem).

Spróbuj stworzyć model tego, co dzieje się z Twoim systemem/programem/grą. Stwórz klasy modelujące byty, wtedy pisz logikę operującą na ich obiektach.
Wiem, że dla niektórych to trochę przeżytek, ale zerknij na UML, mi pomógł zrozumieć podejście obiektowe.


W odpowiedzi na komentarz @MarekR22
Jest w tym trochę racji, dlatego żeby ułatwić ogarnięcie mojej odpowiedzi daję autorowi ( @Dado21 ) przykład tego, co mam na myśli:

Prosty model kości do gry, którą możemy rzucić (metoda Roll) oraz sprawdzić jej ostatni wynik (metoda LastResult)

class Dice
{
public:
    Dice() : lastResult{0}
    {}

    unsigned int Roll()
    {
        lastResult = rand() % diceMax + diceMin;
        return lastResult;
    }

    unsigned int LastResult()
    {
        return lastResult;
    }

private:
    unsigned int lastResult;
    const int diceMax = 6;
    const int diceMin = 1;
}

Teraz można stworzyć dwa obiekty tej klasy i wykorzystywać je do symulowania rzutów.
Analogicznie można zrobić z klasą Player, Table itp...

3

Dziel kod na funkcje, im mniejsze tym lepiej.
Możesz, to robić tak jak proponuje Bartosz36 używając klas, ale wystarczy jak użyjesz tylko funkcji. Np definiując takie funkcje:

bool isGameWon(int diceA, diceB);
bool isGameLost(int diceA, diceB);
void playSingleGame();
bool canPlay(int money);
bool stopPlaying();
void playMany();
```
Najlepiej jeśli w `main` jest tylko 1-5 linijek kodu.
0

@Bartosz36 @MarekR22: Bardzo dziękuję za opinie :)

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