Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[Pytanie] Rand C++


Rekomendowane odpowiedzi

Opublikowano

Witam, uczę się od jakiegoś czasu c++.

Jestem teraz przy temacie pseudolosowania liczb.

Moglibyście osądzić ten kod ' prostej gry ' ?

Widziałem gdzieś takie zadanie, i postanowiłem je napisać.

Jeśli by ktoś mógł dać mi jakieś wskazówki, co poprawić.

Z góry dziękuję, pozdrawiam.

Miałem pomysł zrobienia tego wyboru ze switchem, ale to chyba by nie był dobry pomysł.

 

http://wklej.to/6Fdop

Kocham mpcforum.pl!!!

18706.png

Opublikowano

Osądzić czyli... krytyka? :P
Numeracja przypadkowa.
1.

srand( time( NULL));

wystarczy umieścić w kodzie raz (na początku programu.

2. złe użycie rand.
Pierwszy losuje liczby z zakresu 1-10
Drugi losuje liczby od 49 do 59
Trzeci liczby od 99 do 149 co się nie zgadza w dwóch ostatnich przypadkach z opisem.
Przy zapisie:

z =( rand() %x) +y; 

zmienna z przyjmie wartość losową z zakresu od 0+y do x-1+y.
Tak więc w praktyce jeżeli chcemy losować od 1 do 50 należy użyć:

z=(rand()P)+1; 

3. Zmienne. Cały Twój program mógłby oprzeć się na 2 zmiennych, ty inicjujesz 4. Korzystasz ze zmiennych globalnych co jest prawie zawsze złym rozwiązaniem. Staraj się korzystać ze zmiennych lokalnych.

4. Nie korzystaj z

using namespace std;

dlaczego napisałem tutaj: http://www.mpcforum.pl/topic/973722-c/?p=7810086

5. Zamiast instrukcji warunkowej if korzystaj z case. Dużo optymalniejsza wersja dla programu, if nie jest potrzebny gdyż wchodzisz w niego tylko kiedy wybrałeś konkretny numer.

6. main() zwraca zawsze inta więc nawet jeżeli kompilator jest na to odporny warto pamiętać o return 0; na końcu bądź ewentualnymi innymi numerami w przypadku gdy coś jest nie tak :)

7. korzystaj z funkcji ;)

 

Masz przykład jak rozpocząć poprawę kodu poniżej, na razie jest 1 funkcja która pilnuje żeby podana liczba była zawsze poprawna, zastanów się co jeszcze powinno być w funkcji i jak może to wyglądać.

 

 

#include <iostream>
#include <cstdlib>
#include <ctime>

int wczytaj() 
{
	int a;
	bool dobrze;
	do
	{
		std::cin >> a;
		dobrze=std::cin.fail();
		std::cin.clear();
		std::cin.sync();
	} while (dobrze);
	return a;
}

int main()
{
	using std::cout; using std::endl;
	srand( time( NULL));
	int a,b,c=0;
	cout<< " Witam, zagrajmy w gre " << endl;
	cout<< " Gra bedzie polegala na odgadnieciu liczby " << endl;
	cout<< " ktora wymysli system " << endl;
	cout<< " Wybierz poziom trudnosci " << endl;
	cout<< " [1]. Liczby w zakresie 1-10 " << endl;
	cout<< " [2]. Liczby w zakresie 10-50 " << endl;
	cout<< " [3]. Liczby w zakresie 50-100" << endl;
	cout<< " Podaj poziom trudnosci 1-3 " << endl;
	a=wczytaj();
	switch( a )
        {
        case 1:
	    cout<< " Wybrales pierwszy poziom trudnosci " << endl;
	    cout<< " Program wybierze liczbe w przedziale 1-10 " << endl;
	    a =( rand() %10) +1;
            break;
	case 2:
	    cout<< " Wybrales drugi poziom trudnosci " << endl;
	    cout<< " Program wybierze liczbe w przedziale 10-50 " << endl;
	    a=( rand() %40) +11;
	    break;
	case 3:
		cout<< " Wybrales trzeci poziom trudnosci " << endl;
		cout<< " Program wybierze liczbe w przedziale 50-100 " << endl;
		a =( rand() %50) +51;
		break;
    }
    cout<< " Program wylosowal juz twoja liczbe " << endl;
    cout<< " Teraz musisz ja odgadnac " << endl;
    cout<< a << endl;/*wypisanie było u w twoim kodzie..*/
    do
    {
	b=wczytaj();
	c++;
	if(a<
		cout<<" Podales za duza liczbe " <<endl;
	if(a>
		cout<<" Podales za mala liczbe " <<endl;
    }while (a!=;
    cout<< " Bardzo dobrze ! Liczba prob to : " << c << endl;
} 

dziwny ten znacznik code...

 

 

Opublikowano

btw.

 

switch( poziom )
{
case 1 : a =( rand() %10) +1; break;
case 2 : a =( rand() %40) +11; break;
case 3 : a =( rand() %100) +51; break;
}
if(poziom == 1)
cout<<"Wybrales latwy poziom, liczby w zakresie 1-10 " <<endl;
else if(poziom == 2)
cout<< " Wybrales sredni poziom, liczby w zakresie 10-50" << endl;
else if(poziom == 3 )
cout<< " Wybrales trudny poziom, liczby w zakresie 50-150" << endl;
 

switch i ify w tym wypadku robią to samo

 

przy okazji, zrób aby dało się wrócić do początku gry

Opublikowano

btw.

 

switch( poziom )
{
case 1 : a =( rand() %10) +1; break;
case 2 : a =( rand() %40) +11; break;
case 3 : a =( rand() %100) +51; break;
}
if(poziom == 1)
cout<<"Wybrales latwy poziom, liczby w zakresie 1-10 " <<endl;
else if(poziom == 2)
cout<< " Wybrales sredni poziom, liczby w zakresie 10-50" << endl;
else if(poziom == 3 )
cout<< " Wybrales trudny poziom, liczby w zakresie 50-150" << endl;
 

switch i ify w tym wypadku robią to samo

 

przy okazji, zrób aby dało się wrócić do początku gry

Zgadza się, zaraz zrobię z tym powrotem, ale wracając do tych if'ów - zrobił byś to inaczej na moim miejscu ?

Kocham mpcforum.pl!!!

18706.png

Opublikowano

switch( poziom )

{

case 1 : a =( rand() %10) +1; cout<<"Wybrales latwy poziom, liczby w zakresie 1-10 " <<endl; break;

case 2 : a =( rand() %40) +11; cout<< " Wybrales sredni poziom, liczby w zakresie 10-50" << endl; break;

case 3 : a =( rand() %100) +51; cout<< " Wybrales trudny poziom, liczby w zakresie 50-150" << endl; break;

}


 

Opublikowano


string niewiemjaknazwac[3][2] = {{"latwy", "1-10"}, {"sredni", "10-50"}, {"trudny", "50-150"}};

int values[3][2] = {{10, 1}, {40, 11}, {100, 51}};

a = ( rand() % values[poziom-1][0]) + values[poziom-1][1];

cout << "Wybrales " << niewiemjaknazwac[poziom-1][0] << " poziom, liczby w zakresie " << niewiemjaknazwac[poziom-1][1];

 

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...