kevindurant95 Temat założony przez niniejszego użytkownika |
problem ze sprawdzeniem pola i losowym graniem jednego playera » 2014-11-28 01:25:03 Cześć, wcześniej już posiłkowałem się tym forum, żeby rozwiązać swoje problemy z takim programem: #include <cstdlib> #include <iostream> #include <iomanip> #include <windows.h>
using namespace std; const int MAX_WIERSZ = 6; const int MAX_KOLUMNA = 6;
void inicjuj_plansze( char ** plansza ); void rysuj_plansze( char ** plansza ); void wybierz_pole1( int * numer_wiersza, int * numer_kolumny ); void rysuj_kamien( char ** plansza, int * numer_wiersza, int * numer_kolumny ); bool sprawdzenie_miejsca( char ** plansza );
void inicjuj_plansze( char ** plansza ) { for( int i = 0; i < MAX_WIERSZ; i++ ) { for( int j = 0; j < MAX_KOLUMNA; j++ ) plansza[ i ][ j ] = ' '; } } void rysuj_plansze( char ** plansza ) { for( int i = 0; i < MAX_WIERSZ; i++ ) { cout << " +-----+-----+-----+-----+-----+-----+" << endl; cout << i + 1 << "|"; for( int j = 0; j < MAX_KOLUMNA; j++ ) if( plansza[ i ][ j ] == '#' ) cout << " ### |"; else cout << " |"; cout << endl; cout << " |"; for( int j = 0; j < MAX_KOLUMNA; j++ ) if( plansza[ i ][ j ] == '#' ) cout << " ### |"; else cout << " |"; cout << endl; } cout << " +-----+-----+-----+-----+-----+-----+" << endl; cout << " A B C D E F " << endl; cout << endl; } void wybierz_pole1( int * numer_wiersza, int * numer_kolumny ) { char litera; cout << "podaj wiersz: "; cin >> * numer_wiersza; cout << "podaj kolumne (A=1, B=2, C=3, D=4, E=5, F=6): "; cin >> * numer_kolumny; if( * numer_kolumny == 1 ) { litera = 'A'; } if( * numer_kolumny == 2 ) { litera = 'B'; } if( * numer_kolumny == 3 ) { litera = 'C'; } if( * numer_kolumny == 4 ) { litera = 'D'; } if( * numer_kolumny == 5 ) { litera = 'E'; } if( * numer_kolumny == 6 ) { litera = 'F'; } if( * numer_wiersza >= 1 && * numer_wiersza <= MAX_WIERSZ && * numer_kolumny >= 1 && * numer_kolumny <= MAX_KOLUMNA ) { cout << "wybrane pole to: " << * numer_wiersza << litera << endl << endl << endl; Sleep( 1000 ); } else { cout << "takie pole nie istnieje, podaj inne pole: " << endl << endl << endl; Sleep( 1000 ); } }
void rysuj_kamien( char ** plansza, int * numer_wiersza, int * numer_kolumny ) { if( * numer_wiersza >= 1 and * numer_wiersza <= MAX_WIERSZ and * numer_kolumny >= 1 and * numer_kolumny <= MAX_KOLUMNA ) plansza[ * numer_wiersza - 1 ][ * numer_kolumny - 1 ] = '#'; cout << plansza[ MAX_WIERSZ - 1 ][ MAX_KOLUMNA - 1 ]; } bool sprawdzenie_miejsca( char ** plansza ) { for( int i = 0; i < MAX_WIERSZ; i++ ) { for( int j = 0; j < MAX_KOLUMNA; j++ ) { if( plansza[ i ][ j ] == ' ' ) return false; } } return true; }
int main() { char ** plansza = new char *[ MAX_WIERSZ ]; for( int i = 0; i < MAX_WIERSZ; i++ ) plansza[ i ] = new char[ MAX_KOLUMNA ]; int * numer_wiersza = new int; int * numer_kolumny = new int; inicjuj_plansze( plansza ); for( int i = 0; i < 36; i++ ) { cout << endl; rysuj_plansze( plansza ); wybierz_pole1( numer_wiersza, numer_kolumny ); sprawdzenie_miejsca( plansza ); rysuj_kamien( plansza, numer_wiersza, numer_kolumny ); system( "cls" ); } system( "pause" ); return 0; }
Jak mogę skorygować funkcję 'bool sprawdzenie_miejsca' tak, żeby program wyświetlał mi "to pole jest zajete", gdy na podanym przez niego polu stoi już jakiś symbol (kamień)? Drugim moim pytaniem jest sposób, w jaki drugi gracz ma losowo wybierać pole, które ma zająć. Jak to zrobić? |
|
darko202 |
» 2014-11-28 07:32:35 Musisz gdzieś przechowywać informację o bieżącym stanie planszy np. w tablicy dwuwymiarowej
mógłbyś pomyśleć też nad stworzeniem odpowiednie klasy/klas i umieszczeniem tam ww. informacji i stworzonych już funkcji. |
|
NopeDotAvi |
» 2014-11-28 07:38:04 1. Słabo opisane pytanie. Zrozumiałem to na dwa sposoby: a) By wypisało gdy gracz chce tam się ruszyć b) By wypisywało cały czas Jako iż te drugie trochę bez sensu to dla a: najlepiej będzie podczas ruchu gracza po prostu tak: void ruszGraczem( ) { if( plansza[ wiersz ][ kolumna ] != znakPrzeciwnika ) { } else cout << "Te pole jest zajete" << endl;
2. Najłatwiej będzie Ci zrobić, by po prostu losował dwie liczby z przedziału 1-6 i potem sprawdzał czy zajęte, jeżeli tak to caly czas losował dopóki miejsce wylosowane byłoby nie zajęte. |
|
Tomek_z_W11 |
» 2014-11-28 13:26:36 Co do pierwszego pytania, po pierwsze, to do funkcji musisz dać jakiś argument JAKIE pole wybrał gracz, bo w tym momencie to dajesz tablice dwuwymiarową, ale co z tego, skoro nie wiadomo co wybrał gracz. Po drugie robisz typ zwracany bool, a potem tego "nie przechwytujesz" w mainie, czyli co z tego, że funkcja zwróci false, jak Ty tego nie interpretujesz w mainie. Funkcja sie wywola, zwroci false i nic sie nie dzieje. W jaki sposób wykorzystać? Chociażby tak: if( sprawdzenie == true ) rysuj_plansze;
Czyli po modyfikacji, wyglądałoby to pi x drzwi tak: bool sprawdzenie_miejsca( char ** plansza, numer_wiersza, numer_kolumny ) { if( plansza[ numer_wiersza ][ numer_kolumny ] == '#' ) { cout << "To pole jest juz zajete" << endl; return false; } return true; }
int main() { char ** plansza = new char *[ MAX_WIERSZ ]; for( int i = 0; i < MAX_WIERSZ; i++ ) plansza[ i ] = new char[ MAX_KOLUMNA ]; int * numer_wiersza = new int; int * numer_kolumny = new int; inicjuj_plansze( plansza ); for( int i = 0; i < 36; i++ ) { cout << endl; rysuj_plansze( plansza ); wybierz_pole1( numer_wiersza, numer_kolumny ); if( sprawdzenie_miejsca( plansza, numer_wiersza, numer_kolumny ) ); rysuj_kamien( plansza, numer_wiersza, numer_kolumny ); system( "cls" ); } system( "pause" ); return 0; }
Jezeli chodzi o losowe wybieranie pola - masz funkcje zywcem ze stackoverflow. Funkcja losuje liczbe calkowita z przedzialu <fMin, fMax> int fRand( int fMin, int fMax ) { return fMin +( rand() %( int )( fMax - fMin + 1 ) ); }
|
|
kevindurant95 Temat założony przez niniejszego użytkownika |
» 2014-11-29 19:29:32 Wszystko się zgadza, ale nadal po powtórnym wpisaniu po sobie pola np. 4D, program nie wypisuje mi komunikatu: "to pole jest juz zajete". Jak mogę to zmienić? |
|
NopeDotAvi |
» 2014-11-29 19:56:49 Podaj aktualny kod |
|
kevindurant95 Temat założony przez niniejszego użytkownika |
» 2014-11-29 20:01:44 #include <cstdlib> #include <iostream> #include <iomanip> #include <windows.h> #include <ctime>
using namespace std; const int MAX_WIERSZ = 6; const int MAX_KOLUMNA = 6;
void inicjuj_plansze( char ** plansza ); void rysuj_plansze( char ** plansza ); void wybierz_pole1( char ** plansza, int * numer_wiersza, int * numer_kolumny ); bool sprawdzenie_miejsca( char ** plansza, int * numer_wiersza, int * numer_kolumny ); void wybierz_pole2( char ** plansza, int * numer_wiersza, int * numer_kolumny );
void inicjuj_plansze( char ** plansza ) { for( int i = 0; i < MAX_WIERSZ; i++ ) { for( int j = 0; j < MAX_KOLUMNA; j++ ) plansza[ i ][ j ] = ' '; } }
void rysuj_plansze( char ** plansza ) { for( int i = 0; i < MAX_WIERSZ; i++ ) { cout << " +-----+-----+-----+-----+-----+-----+" << endl; cout << i + 1 << "|"; for( int j = 0; j < MAX_KOLUMNA; j++ ) if( plansza[ i ][ j ] == '#' ) cout << " ### |"; else cout << " |"; cout << endl; cout << " |"; for( int j = 0; j < MAX_KOLUMNA; j++ ) if( plansza[ i ][ j ] == '#' ) cout << " ### |"; else cout << " |"; cout << endl; } cout << " +-----+-----+-----+-----+-----+-----+" << endl; cout << " A B C D E F " << endl; cout << endl; } void wybierz_pole1( char ** plansza, int * numer_wiersza, int * numer_kolumny ) { char litera; cout << "podaj wiersz: "; cin >> * numer_wiersza; cout << "podaj kolumne (A=1, B=2, C=3, D=4, E=5, F=6): "; cin >> * numer_kolumny; if( * numer_kolumny == 1 ) litera = 'A'; if( * numer_kolumny == 2 ) litera = 'B'; if( * numer_kolumny == 3 ) litera = 'C'; if( * numer_kolumny == 4 ) litera = 'D'; if( * numer_kolumny == 5 ) litera = 'E'; if( * numer_kolumny == 6 ) litera = 'F'; if( * numer_wiersza >= 1 && * numer_wiersza <= MAX_WIERSZ && * numer_kolumny >= 1 && * numer_kolumny <= MAX_KOLUMNA ) { cout << "wybrane pole to: " << * numer_wiersza << litera << endl << endl << endl; Sleep( 750 ); } else { cout << "takie pole nie istnieje, podaj inne pole: " << endl << endl << endl; Sleep( 750 ); } if( * numer_wiersza >= 1 and * numer_wiersza <= MAX_WIERSZ and * numer_kolumny >= 1 and * numer_kolumny <= MAX_KOLUMNA ) plansza[ * numer_wiersza - 1 ][ * numer_kolumny - 1 ] = '#'; cout << plansza[ MAX_WIERSZ - 1 ][ MAX_KOLUMNA - 1 ]; }
bool sprawdzenie_miejsca( char ** plansza, int * numer_wiersza, int * numer_kolumny ) { if( plansza[ * numer_wiersza ][ * numer_kolumny ] == '#' ) { cout << "To pole jest juz zajete" << endl; return false; } return true; }
void wybierz_pole2( char ** plansza, int * numer_wiersza, int * numer_kolumny ) { srand( time( NULL ) ); int numer_wiersza2 = rand() % 6 + 1; int numer_kolumny2 = rand() % 6 + 1; char litera; if( numer_kolumny2 == 1 ) litera = 'A'; if( numer_kolumny2 == 2 ) litera = 'B'; if( numer_kolumny2 == 3 ) litera = 'C'; if( numer_kolumny2 == 4 ) litera = 'D'; if( numer_kolumny2 == 5 ) litera = 'E'; if( numer_kolumny2 == 6 ) litera = 'F'; if( numer_wiersza2 >= 1 && numer_wiersza2 <= MAX_WIERSZ && numer_kolumny2 >= 1 && numer_kolumny2 <= MAX_KOLUMNA ) { cout << "wybrane pole to: " << numer_wiersza2 << litera << endl << endl << endl; Sleep( 750 ); } else { cout << "takie pole nie istnieje, podaj inne pole: " << endl << endl << endl; Sleep( 750 ); } plansza[ numer_wiersza2 - 1 ][ numer_kolumny2 - 1 ] = '#'; cout << plansza[ MAX_WIERSZ - 1 ][ MAX_KOLUMNA - 1 ]; }
int main() { char ** plansza = new char *[ MAX_WIERSZ ]; for( int i = 0; i < MAX_WIERSZ; i++ ) plansza[ i ] = new char[ MAX_KOLUMNA ]; int * numer_wiersza = new int; int * numer_kolumny = new int; inicjuj_plansze( plansza ); for( int i = 0; i < 36; i++ ) { cout << endl << " Gracz 1" << endl; rysuj_plansze( plansza ); wybierz_pole1( plansza, numer_wiersza, numer_kolumny ); Sleep( 500 ); system( "cls" ); cout << endl << " Gracz 2" << endl; rysuj_plansze( plansza ); wybierz_pole2( plansza, numer_wiersza, numer_kolumny ); Sleep( 500 ); system( "cls" ); } system( "pause" ); return 0; }
Moje pytanie brzmi: Jak zaznaczyć, że to pole jest zajęte? Bo nie wychodzi. Opcję z losowaniem pola przez komputer ogarnąłem, jednak często pola się powielają i nie jest to nijak ograniczone. |
|
Tomek_z_W11 |
» 2014-11-29 23:33:17 Ufff.. Po funkcji wybierz_pole() sprawdzasz przy pomocy funkcji sprawdzenie_miejsca(), czy pole jest zajete, jezeli jest zajete, nie rysujesz planszy i przy pomocy slowka continue "przechodzisz" do poczatku petli, zobacz sobie przy pomocy tego prostego programu jak dziala continue dla petli: #include <iostream>
using namespace std;
int main() { int i; for( i = 0; i < 10; i++ ) { if( i > 5 ) continue; cout << i << endl; } return 0; }
Jezeli pole nie jeste zajete - rysujesz plansze: int main() { char ** plansza = new char *[ MAX_WIERSZ ]; for( int i = 0; i < MAX_WIERSZ; i++ ) plansza[ i ] = new char[ MAX_KOLUMNA ]; int * numer_wiersza = new int; int * numer_kolumny = new int; inicjuj_plansze( plansza ); for( int i = 0; i < 36; i++ ) { cout << endl << " Gracz 1" << endl; rysuj_plansze( plansza ); wybierz_pole1( plansza, numer_wiersza, numer_kolumny ); if( sprawdzenie_miejsca == false ) continue; Sleep( 500 ); system( "cls" ); cout << endl << " Gracz 2" << endl; rysuj_plansze( plansza ); wybierz_pole2( plansza, numer_wiersza, numer_kolumny ); Sleep( 500 ); system( "cls" ); } system( "pause" ); return 0; }
|
|
« 1 » 2 |