darvd29 Temat założony przez niniejszego użytkownika |
Lekcja 16 Pseudolosowe liczby całkowite » 2012-01-15 20:37:29 Siema. Mam problem z tą lekcją. Otóż zadaniem w tej lekcji jest zrobienie gry liczbowej (autor czyta mi w myśli, już 2 raz każe zrobić to co ja chciałem bez jego zadania :D). Zrobiłem coś takiego, ale po wprowadzeniu 1 liczby program się wyłącza... Tzn. zapętlenie się zepsuło :) Nie wiem też jak "Zabezpieczyć grę przed wprowadzaniem nieprawidłowych informacji". #include <iostream> #include <cstdlib> #include <ctime> int main() { int proba; srand( time( NULL ) ); int wylosowana =( rand() % 10 ); std::cout << "Witaj w grze liczbowej. Gra polega na tym, ze uzytkownik zgaduje liczbe, a program informuje czy sie udalo. Wpisuj liczby od 1 do 10." << std::endl; do { std::cout << "Podaj liczbe: \t"; std::cin >> proba; if( proba > wylosowana ) { std::cout << "Wylosowana liczba jest mniejsza od: " << proba << std::endl; } if( proba < wylosowana ) { std::cout << "Wylosowana liczba jest wieksza od: " << proba << std::endl; } if( proba == wylosowana ) { std::cout << "BRAWO!! Wygrales!!! Wylosowana liczba to: " << wylosowana << std::endl; } } while( proba == wylosowana ); system( "PAUSE" ); return 0; } Próbowałem też "na logikę", bo nie było o tym mowy, zrobić ograniczoną liczbę szans, powiedzmy 5. Zrobiłem to tak: #include <iostream> #include <cstdlib> #include <ctime> int main() { int szansa = 6; to od ilosci szans int proba; srand( time( NULL ) ); int wylosowana =( rand() % 10 ); std::cout << "Witaj w grze liczbowej. Gra polega na tym, ze uzytkownik zgaduje liczbe, a program informuje czy sie udalo. Wpisuj liczby od 0 do 10. Masz 5 szans." << std::endl; do { std::cout << "Pozostalo prob:" << szansa - 1 << std::endl << "Podaj liczbe: \t"; tu powinno mowic ile szans zostalo i wyliczac to: ) std::cin >> proba; if( proba > wylosowana ) { std::cout << "Wylosowana liczba jest mniejsza od: " << proba << std::endl; warunek 1 } if( proba < wylosowana ) { std::cout << "Wylosowana liczba jest wieksza od: " << proba << std::endl; warunek 2 } if( proba == wylosowana ) { std::cout << "BRAWO!! Wygrales!!! Wylosowana liczba to: " << wylosowana << std::endl; warunek 3 } if( szansa == 0 ) { std::cout << "Niestety przegrales. Sprobuj jeszcze raz." << std::endl; warunek 4 } } while( szansa == 0, proba == wylosowana ); tutaj dalem 2 rzeczy do nawiasu bo chcialem zrobic ze jesli jeden z tych warunkow jest spelniony to koniec zapetlenia.Ale pewnie przekombinowalem: P system( "PAUSE" ); return 0; } W tym drugim kodzie jest wiele rzeczy jak mówiłem "na logikę", gdyż ich nie było jeszcze w kursie. Moje pytanie - Jestem blisko rozwiązania czy to już całkiem trudniejszy poziom i będzie to za 15 lekcji :)? Ogólnie program jest chyba ok, ale po 1 ilość szans jest ciągle taka sama (chyba wiem czemu), po 2 zapętlenie także nie działa bo wpisałem 2 warunki czy co to tam jest :), a po 3 nawet jak się wygra to zapętlenie jest dalej. (Tak dokładniej to pkt.3 był a pkt.2 nie było zanim zacząłem kombinować z while i wpisywać 2 argumenty, bo przedtem było chyba while (szansa==0) ale jak pisałem ilość szans jest ciągle taka sama i program się nie kończy, tak samo jak jest while (proba==wylosowana)) Na koniec: wiem że trochę skomplikowałem sprawę, ale jeśli jacyś pomocni userzy są cierpliwi do takich noobów jak ja to proszę o pomoc :D |
|
Dark |
» 2012-01-15 21:23:12 nie powinieneś czasem używać w warunkach znaków logicznych na przykład while( zmienna1 == x && zmienna2 == y )
@down mały błędzik |
|
SeaMonster131 |
» 2012-01-15 21:29:59 @up: = to operator przypisania, == to operator porównania :p |
|
darvd29 Temat założony przez niniejszego użytkownika |
» 2012-01-16 07:45:29 Czyli jak? Ma być: while (szansa = 0, proba = wylosowana ) Czy jak?
PS. Wracam do kursu bo nie wiem co to operator przypisania xD
EDIT. Ok już wiem jaki błąd popełniłem :D Znowu napisałem:
while (coś==coś) a powinno być while (coś!=coś) :D
EDIT2. Ale nadal nie wiem jak naprawić te szanse... jak zrobić żeby określić początkowo tak jak mam: int szansa = 6 i zrobić żeby po każdym zapętleniu odejmowała się 1, czyli tak jak mam: std::cout << "Pozostalo prob:" << szansa - 1 Ale wtedy ciągle jest "Pozostało prob: 5" a chcę żeby to się ciągle zmniejszało, tzn. najpierw 5, potem 4, 3, 2, 1 i przegrana. Czyli chcę zrobić żeby "int szansa" cały czas zmieniało swoją wartość. Jak to wykonać? |
|
SeaMonster131 |
» 2012-01-16 15:00:58 Po podaniu liczby, daj szansa--, co jest równoznaczne z szansa = szansa - 1; . |
|
darvd29 Temat założony przez niniejszego użytkownika |
» 2012-01-16 16:12:07 OK, dzięki, działa. Niestety, nie wszystko. Po 1 kompilator uważa "Pozostało szans: 0" jako ostatnią szansę i nie wyświetla komunikatu o przegranej, a ostatnią szansą ma być "Pozostało szans: 1". Po 2. nawet kiedy się przegra gra się nie kończy, wyświetla się tylko komunikat, a szansa to -1,-2,-3 itd. Oto kod: #include <iostream> #include <cstdlib> #include <ctime> int main() { int proba, wybor; int szansa = 6; int a; do { srand( time( NULL ) ); int wylosowana =( rand() % 10 ); std::cout << "Witaj w grze liczbowej. Wybierz opcje:" << std::endl << "[1] Zasady" << std::endl << "[2] Graj" << std::endl << "[3] Wylacz" << std::endl; std::cin >> wybor; switch( wybor ) { case 1: { std::cout << "1. Komputer losuje liczbe z zakresu od 0 do 10. Ty musisz ja zgadnac." << std::endl; std::cout << "2. Masz 5 szans. Jesli nie zgadniesz - przegrywasz." << std::endl; std::cout << "3. Nie wpisuj liczb innych niz z zakresu podanego wyzej, bo gra sie scrashuje." << std::endl; std::cout << "Wpisz 1 aby rozpoczac gre: \t"; std::cin >> a; std::cout << std::endl << std::endl; } case 2: { do { std::cout << std::endl << "Pozostalo szans: " << szansa - 1 << std::endl << "Podaj liczbe: \t"; std::cin >> proba; szansa = szansa - 1; if( proba > wylosowana ) { std::cout << "Wylosowana liczba jest mniejsza od: " << proba << std::endl << std::endl; } if( proba < wylosowana ) { std::cout << "Wylosowana liczba jest wieksza od: " << proba << std::endl << std::endl; } if( proba == wylosowana ) { std::cout << "BRAWO!! Wygrales!!! Wylosowana liczba to: " << wylosowana << std::endl << std::endl; } if( szansa < 1 ) { std::cout << "Niestety przegrales. Sprobuj jeszcze raz." << std::endl << std::endl; } } while( szansa != 0, proba != wylosowana ); } } } while( wybor != 3 ); if( wybor == 3 ) { std::cout << "Zapraszam ponownie! Autor: Dawid \"darvd29\" Data" << std::endl << std::endl; } system( "PAUSE" ); return 0; } A oto przykładowe działanie programu: Menu główne itp. ... Pozostalo szans: 1 Podaj liczbe: 10 Wylosowana liczba jest mniejsza od: 10 (PS. Już tutaj powinien być komunikat informujący o przegranej) Pozostalo szans: 0 Podaj liczbe: 10 Wylosowana liczba jest mniejsza od: 10 Niestety przegrales. Sprobuj jeszcze raz. Pozostalo szans: -1 Podaj liczbe: 10 Wylosowana liczba jest mniejsza od 10. Niestety przegrales. Sprobuj jeszcze raz. EDIT. OK, problem z ostatnią szansą już naprawiłem. Po prostu musi być if( szansa < 2 ) { std::cout << "Niestety przegrales. Sprobuj jeszcze raz." << std::endl << std::endl; } Przedtem było if (szansa < 2). Teraz jest dobrze z ostatnią szansą, ale nadal mam problem z niezakańczaniem pętli, dalej jest -1, -2, -3 i można zgadywac. |
|
BoBeR |
» 2012-01-16 16:25:12 Musisz w warunku pętli zamiast przecinka dać &&, czyli koniunkcję. |
|
darvd29 Temat założony przez niniejszego użytkownika |
» 2012-01-16 17:29:08 Dzięki już wszystko działa i mogę pograć w moją super gierkę ^^ |
|
« 1 » |