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

Jędnoręki bandyta c++ działanie

Cloud VPS
0 głosów
343 wizyt
pytanie zadane 22 stycznia 2018 w C i C++ przez Corson Początkujący (260 p.)
Witam, mam na zaliczenie napisanie gry, temat wybrałem sobie dużo wcześniej. Mam problem iż nie mogę dodać monet do gry, wpisuje np. 3 monety ale program działa ciągle, a powinno po 3 losowaniach się zakończyć. Również nie rozumiem co muszę zmienić żeby nie losowało mi w taki sposób w 2 rzędach na raz chciałbym również to zmienić, załączam tutaj mój kod  :                               

 

#include <iostream>
#include <conio.h>
#include <windows.h>
#include <cstdlib>
#include <time.h>
#include <ctime>
using namespace std;

int main(int argc, char** argv) {
    setlocale(LC_ALL, "");

    
    
    
    int wybor;
    string imie;
    cout<<"Podaj swój nick"<<endl;
    cin>>imie;

    cout<<"Witaj"<<" "<<imie<<endl;
    Sleep (1000);
    system("cls");
    
    
    int moneta;
    cout<<"Podaj ile chcesz wrzucić monet"<<endl;
    cin>>moneta;
    for (int i=0; i<moneta; i++)
    {
    if (moneta==0)
    {
        cout<<"Nie masz pięniedzy na dalszą grę"<<endl;
    }else    
    

    srand (time(NULL));
    
    int tabo[3]={};

    while(true){
    cout<<"1.Nowa gra"<<endl<<"2.Koniec"<<endl;
    cin>>wybor;
    switch (wybor){
        case 1:
            cout<<"Witaj, zaraz rozpocznie sie twoja gra"<<endl;
            Sleep(1000);
            system("cls");
            for (int i=0; i<3; i++){
                 tabo[i]=rand()%9+1;
                 cout<<tabo[i];
            }
            cout<<endl;
            //(tabo[0]==i)&&//
            if ((tabo[1]==tabo[0])&&(tabo[2]==tabo[0])){
            cout<<"Wygrales!"<<endl;
            }else if(tabo[1]==tabo[0]){

                     tabo[2]=rand()%9+1;
                     cout << tabo[0] << tabo[1] << tabo[2] << endl;
                     if(tabo[2]==tabo[0]){
                        cout<<"Wygrales!"<<endl;
                     }

            }else if (tabo[2]==tabo[0]){

                     tabo[1]=rand()%9+1;
                     cout << tabo[0] << tabo[1] << tabo[2] << endl;
                     if(tabo[1]==tabo[0]){
                        cout<<"Wygrales!"<<endl;
                     }

            }else if(tabo[2]==tabo[1]){

                     tabo[0]=rand()%9+1;
                     cout << tabo[0] << tabo[1] << tabo[2] << endl;
                     if(tabo[0]==tabo[1]){
                        cout<<"Wygrales!"<<endl;
                     }

            }else
            cout << tabo[0] << tabo[1] << tabo[2] << endl;
            cout<<"Próbuj dalej"<<endl;
            break;
           

            case 2:
                exit (0);
                break;
    }

}

}

    return 0;
}

1 odpowiedź

0 głosów
odpowiedź 22 stycznia 2018 przez niezalogowany
  1. W kodzie nigdzie nie zmieniasz zmiennej "moneta". Bardziej intuicyjne byłoby gdybyś zamiast pętli for dał taki while z warunkiem (monety-- > 0, lub w skróconym zapisie monety-- )
  2. Pętla while (true) nie jest Ci potrzebna
  3. Dwa razy wypisujesz wynik gdy nie ma kontynuacji. Wyrzuć else przy sprawdzaniu wyników
  4. If sprawdzający czy liczba monet jest równa zero dałem na koniec pętli programu.

Uwagi techniczne:

  1. Używaj bloczku code - to jest duża wygoda czytaniu pytania i kopiowaniu kodu
  2. Inicjowanie generatora liczb losowych funkcją srand powinno odbyć się tylko raz w całym programie (patrz zasada jego działania).
  3. Może lepszy byłby warunek liczba_monet == 0, a zmniejszanie ich następowałoby tylko przy opcji nr1? Gdybyś np dodał jeszcze jakieś inne opcje np saldo to zmniejszanie monet nie miałoby wtedy sensu ;)

Kod:

#include <iostream>
#include <conio.h>
#include <windows.h>
#include <cstdlib>
#include <ctime>
#include <string>
using namespace std;

int main(int argc, char** argv) {
	setlocale(LC_ALL, "");
	srand(time(NULL));

	int wybor;
	string imie;
	cout << "Podaj swój nick" << endl;
	cin >> imie;

	cout << "Witaj" << " " << imie << endl;
	Sleep(1000);
	system("cls");

	int liczba_monet;
	cout << "Podaj ile chcesz wrzucić monet" << endl;
	cin >> liczba_monet;
	while (liczba_monet--){
		int tabo[3] = {};
		cout << "1.Nowa gra" << endl
			<< "2.Koniec" << endl;
		cin >> wybor;
		switch (wybor) {
		case 1:
			cout << "Witaj, zaraz rozpocznie sie twoja gra" << endl;
			Sleep(1000);
			system("cls");
			for (int i = 0; i<3; i++) {
				tabo[i] = rand() % 9 + 1;
				cout << tabo[i];
			}
			cout << endl;

			if ((tabo[1] == tabo[0]) && (tabo[2] == tabo[0])) {
				cout << "Wygrales!" << endl;
			}
			else if (tabo[1] == tabo[0]) {

				tabo[2] = rand() % 9 + 1;
				cout << tabo[0] << tabo[1] << tabo[2] << endl;
				if (tabo[2] == tabo[0]) {
					cout << "Wygrales!" << endl;
				}
			}
			else if (tabo[2] == tabo[0]) {

				tabo[1] = rand() % 9 + 1;
				cout << tabo[0] << tabo[1] << tabo[2] << endl;
				if (tabo[1] == tabo[0]) {
					cout << "Wygrales!" << endl;
				}
			}
			else if (tabo[2] == tabo[1]) {

				tabo[0] = rand() % 9 + 1;
				cout << tabo[0] << tabo[1] << tabo[2] << endl;
				if (tabo[0] == tabo[1]) {
					cout << "Wygrales!" << endl;
				}
			}
			cout << "Próbuj dalej" << endl;
			break;

		case 2:
			exit(0);
			break;
		}

		if (liczba_monet == 0)
		{
			cout << "Nie masz pięniedzy na dalszą grę" << endl;
		}

	}

	return 0;
}

 

komentarz 22 stycznia 2018 przez Corson Początkujący (260 p.)
A próbuje teraz zrobić żeby po przegranej grze wracało mi do wrzucenia monet ponownie, ale jak umieszczam po ifie i {}goto menu to po prostu po kazdym losowaniu mam pytanie o wrzucenie ilości monet. Nie chciałbym żeby po skończeniiu monet, program się wyłączał tylko ponownie spytał o wrzucenie monet.
komentarz 22 stycznia 2018 przez niezalogowany
Jak już to w ifie umieść, ale ogólnie nie używaj goto jak możesz to zrobić pętlą.
komentarz 22 stycznia 2018 przez Corson Początkujący (260 p.)
A w czym gorsze jest goto?
komentarz 22 stycznia 2018 przez niezalogowany

Pogarsza czytelność kodu. Gdy masz pętle od razu widzisz gdzie są klamry, a etykietę można łatwo przeoczyć (jak masz ich dużo). Używając goto możesz wykonać skok do miejsca gdzie nie powinieneś, a błędy nie będą aż tak czytelne jak w przypadku zgubienia klamry dla pętli. Często też używanie goto wymaga więcej kodu np w takim przykładzie:

label_name:
cin >> r;
if (r == 0)
{
	cout << "Podano bledna wartosc promienia, podaj prawidlowa: " << endl;
	goto label_name;
};

To samo pętlą (przykład z tego tematu - jest tam też fajne wyjaśnienie):

while(cin >> r, r == 0 )
{
    cout << "Podano bledna wartosc promienia, podaj prawidlowa: "<<endl;
    cin >> r;
}

Zawsze odradza się początkującym używanie goto.

Podobne pytania

0 głosów
1 odpowiedź 349 wizyt
pytanie zadane 24 stycznia 2018 w C i C++ przez Corson Początkujący (260 p.)
0 głosów
1 odpowiedź 1,000 wizyt
pytanie zadane 14 lutego 2020 w C i C++ przez Lestat Nowicjusz (200 p.)
0 głosów
1 odpowiedź 552 wizyt
pytanie zadane 27 stycznia 2018 w C i C++ przez Corson Początkujący (260 p.)

93,488 zapytań

142,422 odpowiedzi

322,773 komentarzy

62,908 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
...