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

[c++] [gra w kamień, nożyce, papier]

Object Storage Arubacloud
0 głosów
3,737 wizyt
pytanie zadane 22 września 2017 w C i C++ przez Geralt_z_Rivii Nowicjusz (240 p.)

Hej, 
robię w C++ program do gry w "kamień, nożyce, papier". 
Mój problem polega na tym, że w przypadku remisu uruchamiany jest if (wybor==typ), a następnie else (linia 43).
Oczywiście jest to bez sensu, proszę o pomoc w znalezieniu przyczyny

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


using namespace std;

int main()
{
    int liczba;                                     // 'wylosowana' przez komputer
    string typ;                                     //typ komputera uzalezniony od wylosowanej liczby
    string wybor,k,n,p;
    cout << "Witaj w grze ;-)" << endl;

for(;;)
{


    cout << "Wybierz jedna z opcji: kamien (k), nozyce (n), papier (p)"<<endl;
    cin>>wybor;
    srand(time(NULL));      //losowanie
    liczba=rand()%3+1;      //zapisywanie do zmiennej 'liczba'
   cout<<liczba<<endl;

    switch(liczba)
    {
        case 1: typ="k"; break;
        case 2: typ="n"; break;
        case 3: typ="p"; break;
    }


    if (wybor==typ)
    {
        cout<<"Remis. Jeszcze raz: "<<endl;
    }
    if (((wybor=="k")&&(typ=="n"))||((wybor=="n")&&(typ=="p"))||((wybor=="p")&&(typ=="k")))
    {
        cout<<"Wygrales!"<<endl;
        cout<<"Tym komputera: "<<typ<<"     Twoj typ :"<<wybor<<endl;
    }
    else
    {
        cout<<"Przegrales"<<endl;
        cout<<"Tym komputera: "<<typ<<"     Twoj typ: "<<wybor<<endl;
    }

getchar();getchar();        //po wyswietleniu wyniku nalezy wcisnac ENTER
system("cls");              //czysci ekran
}
    return 0;
}

 

1 odpowiedź

+2 głosów
odpowiedź 22 września 2017 przez niezalogowany
edycja 22 września 2017

Użyj else if - inaczej ify są traktowane osobno:

   if (wybor == typ)
		{
			cout << "Remis. Jeszcze raz: " << endl;
		}
		else if (((wybor == "k") && (typ == "n")) || ((wybor == "n") && (typ == "p")) || ((wybor == "p") && (typ == "k")))
		{
			cout << "Wygrales!" << endl;
			cout << "Tym komputera: " << typ << "     Twoj typ :" << wybor << endl;
		}
		else
		{
			cout << "Przegrales" << endl;
			cout << "Tym komputera: " << typ << "     Twoj typ: " << wybor << endl;
		}

PS. Srand powinien być wykonany w programie tylko raz. Wrzuć go przed pętlę. Srand nie losuje liczb - on inicjuje generator liczb pseudolosowych (i nadaje mu ziarno).

komentarz 22 września 2017 przez Geralt_z_Rivii Nowicjusz (240 p.)

Super, dzięki! laugh

A dlaczego srand można użyć tylko raz? przy zapętleniu gry, właściwie to pozbawia ją sensu, bo już po pierwszej 'potyczce' można się domyślić jaki był typ komputera

komentarz 22 września 2017 przez niezalogowany

Akurat dodałem edita:
Srand nie losuje liczb - on inicjuje generator liczb pseudolosowych (i nadaje mu ziarno). To rand wydobywa liczbę.

W Twoim programie chyba nie widać z tego powodu problemów, ale nie ma sensu inicjować generatora cały czas. Patrz taki przykład:

int main()
{
	for (int i=0;i<10;i++)
	{
		srand(time(NULL));
		std::cout << rand() % 10 << "\n";
	}
	return 0;
}

Gdy generator jest znowu ustawiany na to samo ziarno okazuje się, że losowane liczby będę takie same / podobne. Zależy to też od czasu pomiędzy losowaniami. Jeżeli jest taki sam to wybrane zostaną takie same liczby. 

komentarz 22 września 2017 przez Geralt_z_Rivii Nowicjusz (240 p.)
Rozumiem intencję, chodzi zapewne o zbytnie nieobciążanie pamięci.
Dzięki za wyczerpującą odpowiedź

Podobne pytania

0 głosów
0 odpowiedzi 761 wizyt
+2 głosów
2 odpowiedzi 1,126 wizyt
pytanie zadane 24 listopada 2017 w JavaScript przez Rafal2 Nowicjusz (140 p.)
0 głosów
2 odpowiedzi 397 wizyt

92,572 zapytań

141,422 odpowiedzi

319,644 komentarzy

61,959 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!

...