• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zadanie Jednoreki Bandyta C++

Cloud VPS
0 głosów
994 wizyt
pytanie zadane 14 lutego 2020 w C i C++ przez Lestat Nowicjusz (200 p.)

Witam , od miesiąca ucze się języka C++ ,zakupiłem książkę "Przewodnik dla początkujących C++" Allex Allein .

Zad. Napisz program "symulujący jednorękiego bandytę",który wyświetla użytkownikowi losowe wyniki.Niech każdy z bębnów maszyny przyjmuje co najmniej trzy wartości.Nie przejmuj [... ] po prostu wylosuj wynik,wyświetl go i zaprezentuj wygraną.

Chciałbym abyście ocenili mój kod i pomogli w rozwiązaniu problemu.

1.Otóż męcze się od jakiegoś czasu z kodem i nie wiem jak zrobić ,żeby podczas przegrania pieniędzy ,wartosc(pieniadze) nie spadala ponizej zera

2. Na kilkanascie sposobow probowalem ulozyc warunek aby podczas wprowadzania stawki pobieralo tylko i wylacznie 10,20 lub 30 ,a po wprowadzeniu innej niz te 3 liczby powinno wyswietlic komunikat o wprowadzeniu zlej liczby i poproszeniu o ponownme podanie stawki ,ani razu nie udalo mi sie tego osiagnac.

Oto moj kod:

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <conio.h>
#include <stdio.h>


using namespace std;

int stawka=0;
int kasa=0;
int bilans;
int ilosc[3]={10,20,30};


void menu();
void graj();
void wplata();
int wygrana(int win);
void wprowadz_stawke();
void sprawdzenie();




int main()
{
            menu();
            return 0;
}


void menu() //Menu Gry

{
    cout<<"1_______Graj"<<endl;
    cout<<"2_______Wyjdz"<<endl;

    char wybor;// pierwsza zmienna wyboru opcjii z Menu

        wybor=getch();// automatycznie pobiera znak (po wcisnieciu 1 zagram po wcisnieciu 2 wyjde z programu)

    switch(wybor)
    {
        case '1':
        {
            graj();//funkcja rozgrywki
        }

        break;

        case '2':
        {
            cout<<"Bye Bye"<<endl;
            exit(0);//wyjscie z programu
        }
    }


}

void graj()//funkcja rozgrywki
{
   srand(time(NULL));
    wplata();//funkcja wplata salda na konto do gry

    int tab[3]={};//tablica z trzema wartosciami


        cout<<endl<<"Wcisnij enter,aby grac"<<endl;
        getchar();//czeka na klawisz

    while(true)
    {

        cin.get() == '\n';//czeka na wprowadzenie Entera

        for(int i=0;i<3;i++)//3 x losowanie liczby od 1 do 3
            {
                sprawdzenie();
                wprowadz_stawke();//funkcja wprowadzenia stawki

                cout<<endl;
                tab[0]=rand()%3+1;
                cout<<tab[0];
                tab[1]=rand()%3+1;
                cout<<tab[1];
                tab[2]=rand()%3+1;
                cout<<tab[2];
                cout<<endl<<endl;

                break;
            }


        if(tab[0]==tab[1] && tab[0]==tab[2] && tab[1]==tab[2])//sprawdzenie warunku wygranej
        {
            cout<<endl<<" !!! Wygrales !!!"<<endl;
            cout<<"Twoj bilans wynosi : "<<kasa+wygrana(10)<<endl;
            kasa+=bilans;
        }
        else
        {
        cout<<" Graj dalej -->"<<endl;
        cout<<"Twoj bilans wynosi : "<<(kasa-=stawka)<<endl;//po nie wygranej kolejce bilans maleje
        }



    }
}


void wplata() //funkcja wplaty

{
        cout<<"Wplac pieniadze"<<endl;
        cin >> kasa;
        cout<<"Twoj bilans = "<<kasa<<endl;


}
int wygrana(int win)//Obliczanie wygranej
{
    if(stawka==ilosc[0] || stawka==ilosc[1] ||  stawka==ilosc[2])
    {

            return bilans=win*=stawka;
    }



}
void wprowadz_stawke()//wprowadzanie stawki ,
{


    cout<<endl<<"Podaj swoja stawke(10,20,30)"<<endl;

    cin>>stawka;

}


void sprawdzenie()//jesli kasa = gra od nowa lub wyjscie
{


    if(kasa==0)
        {
            char wybor2;
            cout <<"Nie masz wystarczajacej ilosci  pieniedzy"<<endl;
            cout<<"1. Graj dalej"<<endl;
            cout<<"2. Wroc do menu"<<endl;

                wybor2=getch();

            switch (wybor2)
                {

                    case '1':{wplata();}

                        break;

                    case '2' :{return menu();}

                }

        }



}

 

1 odpowiedź

+1 głos
odpowiedź 15 lutego 2020 przez Patrycjerz Mędrzec (192,320 p.)

Poprawiłem parę błędów w kodzie:

  1. Niepotrzebnie wywoływałeś funkcję `menu` w funkcji `sprawdzenie`, jeśli gracz chciałby wrócić do menu. Przez to po kilkudziesięciu rozgrywkach doprowadziłbyś do przepełnienia stosu wywołań. Zastosowałem zamiast tego powrót z funkcji `graj`, dzięki czemu gra może trwać nieograniczony czas.
  2. Zabezpieczyłem wprowadzanie stawki tylko do wartości 10, 20 i 30. Uniemożliwiłem także ustawienie aktualnej kwoty na wartość ujemną.
  3. Wprowadziłem drobne poprawki logiki (np. czyszczenie stanu zmiennych po zakończeniu gry).
  4. Poprawiłem formatowanie kodu.
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <conio.h>
#include <stdio.h>

using namespace std;

int stawka = 0;
int kasa = 0;
int bilans;
int ilosc[3] = {10, 20, 30};

void menu();
void graj();
void wplata();
int wygrana(int win);
void wprowadz_stawke();
int sprawdzenie();

int main()
{
	srand(time(NULL));
    menu();
    return 0;
}

void menu() //Menu Gry
{
	while (true) {
        cout << "1_______Graj" << endl;
        cout << "2_______Wyjdz" << endl;
	    
        char wybor; // pierwsza zmienna wyboru opcjii z Menu
	    
        wybor = getch(); // automatycznie pobiera znak (po wcisnieciu 1 zagram po wcisnieciu 2 wyjde z programu)
	    
        switch (wybor) {
        case '1':
            graj(); //funkcja rozgrywki
            break;
        default:
            cout << "Bye Bye" << endl;
            return;
        }
	}
}

void graj() //funkcja rozgrywki
{
    wplata(); //funkcja wplata salda na konto do gry

    int tab[3]; //tablica z trzema wartosciami

    cout << endl << "Wcisnij enter, aby grac" << endl;
    getchar(); //czeka na klawisz

    for (int i = 0; i < 3; i++) {
        cin.get(); //czeka na wprowadzenie Entera

        if (sprawdzenie() == 1) {
			kasa = 0;
			stawka = 0;
			break; // wróć do menu
		}
		
        wprowadz_stawke(); //funkcja wprowadzenia stawki

        cout << endl;
        tab[0] = rand() % 3 + 1;
        cout << tab[0];
        tab[1] = rand() % 3 + 1;
        cout << tab[1];
        tab[2] = rand() % 3 + 1;
        cout << tab[2];
        cout << endl << endl;
	    
        if (tab[0] == tab[1] && tab[0] == tab[2]) //sprawdzenie warunku wygranej
        {
            cout << endl << " !!! Wygrales !!!" << endl;
            cout << "Twoj bilans wynosi : " << kasa + wygrana(10) << endl;
            kasa += bilans;
        } else {
			kasa -= stawka;
			if (kasa < 0) {
				kasa = 0;
			}
            cout << " Graj dalej -->" << endl;
            cout << "Twoj bilans wynosi : " << kasa << endl; //po nie wygranej kolejce bilans maleje
        }
    }
	kasa = 0;
	stawka = 0;
}

void wplata() //funkcja wplaty
{
	while (kasa <= 0) {
        cout << "Wplac pieniadze" << endl;
        cin >> kasa;
	}
    cout << "Twoj bilans = " << kasa << endl;
}

int wygrana(int win) //Obliczanie wygranej
{
    return bilans = win * stawka;
}

void wprowadz_stawke() //wprowadzanie stawki ,
{
    while (stawka != ilosc[0] && stawka != ilosc[1] && stawka != ilosc[2]) {
	    cout << endl << "Podaj swoja stawke (10, 20, 30)" << endl;
        cin >> stawka;
    }
}

int sprawdzenie() //jesli kasa = gra od nowa lub wyjscie
{
    if (kasa <= 0) {
        char wybor;
        cout << "Nie masz wystarczajacej ilosci pieniedzy" << endl;
        cout << "1. Graj dalej" << endl;
        cout << "2. Wroc do menu" << endl;
	   
        wybor = getch();
	   
        switch (wybor) {
        case '1':
            wplata();
            return 0;
        default:
            return 1;
        }
    }
	return 0;
}

Oczywiście można poprawić o wiele więcej, m.in. w strukturze samego kodu, ale ja jedynie wprowadziłem konieczne poprawki w działaniu programu.

komentarz 15 lutego 2020 przez Lestat Nowicjusz (200 p.)

Dziękuje serdecznie za odpowiedź i udzieloną pomoc.

Poprawiłem swój kod :

#include<iostream>
#include<cstdlib>
#include<conio.h>
#include<ctime>
#include<stdio.h>


using namespace std;


int kasa;
int liczba1,liczba2,liczba3;
int stawka;
int ilosc[3]={10,20,30};
int bilans;

void menu();
void wplata();
void losowanie();
void sprawdzenie_wygranej();
void stawkowanie();
void koniec_kasy();

int wygrana(int a);


int main()

{
    srand(time(NULL));//generacja liczb losowych

    menu();
    wplata();
    losowanie();



    return 0;
}

void menu()//menu glowne

{
    cout<< "1.Graj" <<endl;
    cout<< "2.Exit" <<endl;
    char wybor;

    wybor=getch();

    switch(wybor)
        {
            case '1': cout<<"---G--A--M--E----O--N---"<<endl;

                break;

            case '2':   exit(8);
        }

}

void wplata()//wplacanie pieniedzy

{

    cout << "Wplac pieniadze aby grac:" <<endl;
        cin >> kasa;
    cout << "Saldo Twojego Konta : " << kasa <<endl;

    cout<<endl<<endl;


}

void losowanie()//losowonie trzech wartosci od 1 do 3
{
    cout << "Wcisnij Enter aby grac"<<endl;
    getchar();

    while(true)
     {
        getchar();

        stawkowanie();//wprowadza stawke przed losowniem

        for(int i=0;i<3;i++)
        {

            cout<<endl;
            liczba1=rand()%3+1;
            cout<<liczba1;
            liczba2=rand()%3+1;
            cout<<liczba2;
            liczba3=rand()%3+1;
            cout<<liczba3;
            break;
        }
        cout<<endl;

        if (liczba1==liczba2 && liczba1==liczba3 && liczba2==liczba3)
            {
                cout <<endl<< "!!! WYGRALES !!!" <<endl;
                cout <<"Twoje nowe saldo to "<<wygrana(10)+kasa<<endl;
                kasa+=bilans;
            }
        else
            {
                cout <<endl<< "Graj dalej -->" <<endl;
                cout <<"Twoje nowe saldo to "<<(kasa-=stawka) <<endl;
            }
        if (kasa<=0)//jesli pienidze sie skonczyly wykona funkcje
        {
           koniec_kasy();
        }


    }
}

void stawkowanie()//wprowadzenie stawki 10 20 lub 30
{

    cout<< "Wprowadz  stawke (10,20,30)"<<endl;

    cin >> stawka;

    while(stawka!=ilosc[0] && stawka!=ilosc[1] && stawka!=ilosc[2])
    {
        cout<<"Zla stawka  ";
        cin >> stawka;

    }

}

int wygrana(int a) //obliczanie wygranej
{
    bilans=a*stawka;
    return bilans;
}

void koniec_kasy()//gdy pieniadze sie skoncza ..
{

    cout<<endl;
    cout<<"(1)  Wplac pieniadze aby grac dalej"<<endl;
    cout<<"(2)  Zakoncz" <<endl;

    char wybor2;

    wybor2=getch();

    switch(wybor2)
        {
            case '1':{wplata();}

                break;

            case '2':{exit(0);}
        }
}

 

Podobne pytania

0 głosów
1 odpowiedź 537 wizyt
pytanie zadane 27 stycznia 2018 w C i C++ przez Corson Początkujący (260 p.)
0 głosów
1 odpowiedź 334 wizyt
pytanie zadane 22 stycznia 2018 w C i C++ przez Corson Początkujący (260 p.)
0 głosów
1 odpowiedź 335 wizyt
pytanie zadane 24 stycznia 2018 w C i C++ przez Corson Początkujący (260 p.)

93,482 zapytań

142,415 odpowiedzi

322,761 komentarzy

62,895 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...