Goku145 Temat założony przez niniejszego użytkownika |
Gra szubienica/wisielec » 2014-03-12 18:51:39 Cześć! :) Próbuję stworzyć taką mini grę pt. wisielec. Napisałem już część, gdzie strzelając właściwą literę zamieniana jest ze znakiem "-", ale nie mogę poprawnie sformułować zakończenia pętli, które powinno odbywać się gdy tablica ze znakami ---- jest równa pomocniczej tablicy ze znakami ---- (czyli, jeżeli wszystkie poprawne litery zamienią się z tablicą znaków, to pętla powinna się zakończyć). Póki co zrobiłem wyraz jako typ char, ale później zamienię to na stringa, aby łatwiej dodać więcej wyrazów (może spróbuję dodać wyrazy w pliku). Próbowałem z tą pętlą różnymi sposobami, w tym z strcmp (czy jakoś tak), ale dalej nic nie pomaga. Dodatkowo jak wszystkie litery się zamienią i podam cały wyraz wyskakuje, aby podać kolejne litery kilka razy. Oto mój kod (jeżeli zauważycie jeszcze jakieś błędy lub macie jakieś rady bardzo bym prosił o podzielenie się :))
#include <iostream> #include <cstdlib> #include <string.h> #include <cctype> #include <cstdio> using namespace std;
int main() { char wyraz[ 6 ] = "kajak"; int dlugosc = strlen( wyraz ); char znaki[ 6 ]; char znaki_warunek[ 6 ]; int i; int zycia = 5; cout << "Gra wisielec. \nSprobuj zgadnac wyraz zgadujac wystepujace w nim litery." << endl; cout << "W kazdej chwili mozesz rowniez sprobowac odgadnac caly wyraz." << endl; cout << "Kazda pomylka odejmuje jedno zycie, na poczatku gry posiadasz 5 zyc." << endl; cout << "Sprobuj zgadnac ponizszy wyraz: " << endl; for( i = 0; i < dlugosc; i++ ) { znaki[ i ] = '-'; znaki_warunek[ i ] = '-'; } cout << znaki << endl; char litera; i = 0; char znak; do { cout << endl << "Podaj litere: "; cin >> litera; for( i = 0; i < dlugosc; i++ ) if( litera == wyraz[ i ] ) { cout << endl; swap( znaki[ i ], wyraz[ i ] ); cout << znaki; } } while( wyraz != znaki_warunek ); cout << "Koniec."; return 0; }
|
|
Goku145 Temat założony przez niniejszego użytkownika |
» 2014-03-14 20:09:45 Odświeżam... |
|
szymeczek31 |
» 2014-03-14 22:02:14 Zakonczylem petle po zgadnieciu i napisalem co jest bez sensu reszte sam pokombinuj...
#include <iostream> #include <cstdlib> #include <string.h> #include <cctype> #include <cstdio> using namespace std;
int main() { int l1, l2, l3; char wyraz[ 6 ] = "kajak"; int dlugosc = strlen( wyraz ); char znaki[ 6 ]; char znaki_warunek[ 6 ]; int i; int zycia = 5; cout << "Gra wisielec. \nSprobuj zgadnac wyraz zgadujac wystepujace w nim litery." << endl; cout << "W kazdej chwili mozesz rowniez sprobowac odgadnac caly wyraz." << endl; cout << "Kazda pomylka odejmuje jedno zycie, na poczatku gry posiadasz 5 zyc." << endl; cout << "Sprobuj zgadnac ponizszy wyraz: " << endl << endl; for( i = 0; i < dlugosc; i++ ) { znaki[ i ] = '-'; znaki_warunek[ i ] = '-'; } cout << znaki << endl; char litera; i = 0; char znak; int i10 = 1; do { cout << endl << "Podaj litere: "; cin >> litera; if( litera == 'k' ) l1 = 1; if( litera == 'a' ) l2 = 1; if( litera == 'j' ) l3 = 1; for( i = 0; i < dlugosc; i++ ) if( litera == wyraz[ i ] ) { cout << endl; swap( znaki[ i ], wyraz[ i ] ); cout << znaki; } if( l1 == 1 && l2 == 1 && l3 == 1 ) break; } while( i10 ); cout << "\nKoniec."; cin.ignore(); getchar(); return 0; }
|
|
szymeczek31 |
» 2014-03-14 22:05:06 I polecam dołączyć bibliotekę #include <windows.h> i polecenie w main SetConsoleTitle( "Wisielec" ); znacznie poprawi czytelność (to zmiana tytulu konsoli) |
|
MrPoxipol |
» 2014-03-14 22:45:12 znacznie poprawi czytelność |
Czego? |
|
Goku145 Temat założony przez niniejszego użytkownika |
» 2014-03-15 19:24:39 To tak, dziękuję za odpowiedź, ale wydaje mi się, że da się to zrobić prościej, bo chcę aby w przyszłości można było dodać więcej wyrazów, a twój sposób tworzy if do każdej litery, no i w sumie nie rozumiem tego zapisu. Programuję na laptopie z ubuntu, więc biblioteka windowsa nie będzie działała :)
Może ktoś inny ma jakąś propozycję? |
|
Goku145 Temat założony przez niniejszego użytkownika |
» 2014-03-22 22:11:13 To tak, udało mi się już to zrobić swoim sposobem. Miałem trochę problemów na koniec z liczbą żyć bo schodziło na liczby ujemne mimo warunku, ale przerobiłem to na if i zakończenie pętli poprzez break. I teraz chciałbym zrobić, aby łatwo można było dodać kilka innych wyrazów, mógłby mnie ktoś jakoś nakierować jak to zrobić? Tutaj obecny kod: #include <iostream> #include <cstring> #include <string> using namespace std;
int main() { char wyraz[ 6 ] = "kajak"; string napis = wyraz; int dlugosc = strlen( wyraz ); char znaki[ 6 ]; int i = 0; char temp[ 6 ]; cout << "Gra wisielec. \nSprobuj zgadnac wyraz zgadujac wystepujace w nim litery.\n"; cout << "W kazdej chwili mozesz rowniez sprobowac odgadnac caly wyraz.\n"; cout << "Kazda pomylka odejmuje jedno zycie, na poczatku gry posiadasz 5 zyc.\n"; cout << "Sprobuj zgadnac ponizszy wyraz: \n\n"; for( i = 0; i < dlugosc; i++ ) { znaki[ i ] = '-'; temp[ i ] = '-'; } cout << znaki << endl; char litera; int liczbaZyc = 5; do { cout << endl << "Podaj litere: "; cin >> litera; for( i = 0; i < dlugosc; i++ ) if( litera == wyraz[ i ] ) { cout << endl; swap( znaki[ i ], wyraz[ i ] ); cout << znaki; } size_t znalezionaPozycja = napis.find( litera ); if( znalezionaPozycja == string::npos ) { cout << "Pudlo !" << endl << "Zostalo ci jeszcze: " << liczbaZyc - 1 << " zyc." << endl; liczbaZyc--; if( liczbaZyc == 0 ) { cout << endl << "Przegrales!" << endl; break; } } if( strcmp( temp, wyraz ) == 0 ) cout << endl << "Gratulacje! Wygrałeś!" << endl; } while( strcmp( temp, wyraz ) != 0 ); cout << "Koniec gry!" << endl; return 0; }
|
|
OczkoSX |
» 2014-03-23 09:35:29 Ale zagmatwane. Zamień tablice charow na string i tam laduj wyrażenia. Co do odczyt z pliku to pobieraj całe linie, jedn linia = jedno wyrażenie. I wtedy będziesz potrzebował tablicę dynamiczną lub vektor. Bym to zrobił na klasach i funkcjach. |
|
« 1 » 2 |