• 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]

0 głosów
4,423 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 938 wizyt
+2 głosów
2 odpowiedzi 1,786 wizyt
pytanie zadane 24 listopada 2017 w JavaScript przez Rafal2 Nowicjusz (140 p.)
0 głosów
2 odpowiedzi 841 wizyt

93,604 zapytań

142,527 odpowiedzi

322,995 komentarzy

63,090 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
...