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

Zadanie Jednoreki Bandyta C++

Object Storage Arubacloud
0 głosów
551 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ź 340 wizyt
pytanie zadane 27 stycznia 2018 w C i C++ przez Corson Początkujący (260 p.)
0 głosów
1 odpowiedź 262 wizyt
pytanie zadane 22 stycznia 2018 w C i C++ przez Corson Początkujący (260 p.)
0 głosów
1 odpowiedź 174 wizyt
pytanie zadane 24 stycznia 2018 w C i C++ przez Corson Początkujący (260 p.)

92,580 zapytań

141,433 odpowiedzi

319,665 komentarzy

61,966 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...