kevindurant95 Temat założony przez niniejszego użytkownika |
» 2014-11-30 02:15:26 Mam już kod poprawiony, włożyłem w niego dużo czasu i radziłem się wielu mądrych głów, w tym tych z tego forum. Mam jeszcze pytanie dotyczące tego, w jaki sposób "zabezpieczyć się" przed zapętleniem programu, gdy w rubrykę "podaj wiersz" w konsoli wpiszę się dowolną literę. I też jeszcze, jak przyspieszyć działanie funkcji rand? Na początku działania programu, konkretne pole wylosowane jest dość szybko, im dalej w las tym trochę z tym gorzej. Co powinienem zmienić? Oto mój kod (mam dwa rozwiązania dla funkcji wybierz_pole2, stąd jedno jest skomentowane): #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[ MAX_WIERSZ ][ MAX_KOLUMNA ] ) { for( int i = 0; i < MAX_WIERSZ; i++ ) { for( int j = 0; j < MAX_KOLUMNA; j++ ) plansza[ i ][ j ] = ' '; } }
void rysuj_plansze( const char plansza[ MAX_WIERSZ ][ MAX_KOLUMNA ] ) { 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 << endl; }
bool sprawdz_pole( const char plansza[ MAX_WIERSZ ][ MAX_KOLUMNA ], int wiersz, int kolumna ) { if( wiersz < 1 || wiersz > MAX_WIERSZ ) { cout << "Nieprawidlowy wiersz" << endl; return false; } if( kolumna < 1 || kolumna > MAX_KOLUMNA ) { cout << "Nieprawidlowa kolumna" << endl; return false; } if( plansza[ wiersz - 1 ][ kolumna - 1 ] != ' ' ) { cout << "Pole jest zajete, podaj inne wspolrzedne: " << endl; return false; } return true; }
void wybierz_pole1( char plansza[ MAX_WIERSZ ][ MAX_KOLUMNA ] ) { char litera; int wiersz; int kolumna; do { cout << "Podaj wiersz: "; cin >> wiersz; cout << "Podaj kolumne (A-F): "; cin >> litera; litera = toupper( litera ); kolumna = litera - 'A' + 1; } while( !sprawdz_pole( plansza, wiersz, kolumna ) ); plansza[ wiersz - 1 ][ kolumna - 1 ] = '#'; cout << "wybrane pole to: " << wiersz << litera << endl; }
void wybierz_pole2( char plansza[ MAX_WIERSZ ][ MAX_KOLUMNA ] ) { srand( time( NULL ) ); int wiersz = rand() % 6 + 1; int kolumna = rand() % 6 + 1; char litera; if( kolumna == 1 ) litera = 'A'; if( kolumna == 2 ) litera = 'B'; if( kolumna == 3 ) litera = 'C'; if( kolumna == 4 ) litera = 'D'; if( kolumna == 5 ) litera = 'E'; if( kolumna == 6 ) litera = 'F'; while( !sprawdz_pole( plansza, wiersz, kolumna ) ); plansza[ wiersz - 1 ][ kolumna - 1 ] = '#'; cout << "wybrane pole to: " << wiersz << litera << endl; }
bool sprawdz_dostepnosc( char plansza[ MAX_WIERSZ ][ MAX_KOLUMNA ] ) { 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[ MAX_WIERSZ ][ MAX_KOLUMNA ]; inicjuj_plansze( plansza ); while( !sprawdz_dostepnosc( plansza ) ) { rysuj_plansze( plansza ); wybierz_pole1( plansza ); system( "cls" ); rysuj_plansze( plansza ); wybierz_pole2( plansza ); } rysuj_plansze( plansza ); system( "pause" ); return 0; }
|
|
Tomek_z_W11 |
» 2014-11-30 12:27:11 Jeżeli użytkownik wprowadzi liczbe z zakresu <65,90> lub <97,122>, to musisz to jakos obsluzyc. Liczby 65, 90 i 97 122 oznaczaja liczbowe odpowiedniki liter w kodzie ASCII: 97 - 'a' 98 - 'b' 99 - 'c' . . . 122 - 'z' 65 - 'A' 66 - 'B' 67 - 'C' . . . 90 - 'Z' Po prostu w jakiejs funkcji, dodaj ifa: if(( wprowadzona_liczba >= 65 && wprowadzona_liczba <= 90 ) ||( wprowadzona_liczba >= 97 && wprowadzona_liczba <= 122 ) ) { cout << "Wprowadzone pole jest niepoprawne" << endl;
Oprócz tego w funkcji: bool sprawdz_pole( const char plansza[ MAX_WIERSZ ][ MAX_KOLUMNA ], int wiersz, int kolumna ) { if( wiersz < 1 || wiersz >= MAX_WIERSZ ) { cout << "Nieprawidlowy wiersz" << endl; return false; } if( kolumna < 1 || kolumna >= MAX_KOLUMNA ) { cout << "Nieprawidlowa kolumna" << endl; return false; } if( plansza[ wiersz - 1 ][ kolumna - 1 ] != ' ' ) { cout << "Pole jest zajete, podaj inne wspolrzedne: " << endl; return false; } return true; }
|
|
kevindurant95 Temat założony przez niniejszego użytkownika |
» 2014-12-01 22:58:17 A miałbyś może jakieś sugestie dotyczące liczenia punktów? void policz_punkty( char plansza[ MAX_WIERSZ ][ MAX_KOLUMNA ] ) { int wiersz; int kolumna; int punkty = 0; int licznik = 0; for( int i = 0; i < 6; i++ ) { if( plansza[ wiersz ][ i ] == '#' ) licznik++; } if( licznik == 3 ) punkty = punkty + 1; else if( licznik == 6 ) punkty = punkty + 2; licznik = 0; for( int i = 0; i < 6; i++ ) { if( plansza[ i ][ kolumna ] == '#' ) licznik++; } if( licznik == 3 ) punkty = punkty + 1; else if( licznik == 6 ) punkty = punkty + 2; licznik = 0; if( wiersz == kolumna ) { for( int i = 0; i < 6; i++ ) { if( plansza[ i ][ i ] == '#' ) licznik++; } if( licznik == 3 ) punkty = punkty + 1; else if( licznik == 6 ) punkty = punkty + 2; licznik = 0; } if( wiersz + kolumna == 5 ) { for( int i = 0; i < 6; i++ ) { if( plansza[ i ][ i ] == '#' ) licznik++; } if( licznik == 3 ) punkty = punkty + 1; else if( licznik == 6 ) punkty = punkty + 2; } return punkty; }
Ale na dobrą sprawę chyba nie wiele mi to daje. Punkty są przyznawane graczom, gdy po ich ruchu na planszy ustawione są 3 kamienie obok siebie pionowo, poziomo lub na skos (główna przekątna)(1 punkt) i gdy jest to 6 kamieni to pionowo, poziomo lub na skos(2 punkty). |
|
Tomek_z_W11 |
» 2014-12-02 10:23:26 Co do pętli "dla kolumn" to bym ją trochę pozmieniał. for( int i = 0; i < 6; i++ ) { for( j = 0; j < 6; j++ ) { if( plansza[ j ][ i ] == '#' ) licznik++; } }
Jeżeli chodzi o wiersze, to też będziesz musiał zrobić pętle w pętli, bo trzeba przeszukać wszystkie wiersze, a w każdym z tych wierszów wszystkie komórki - analogicznie jak w przypadku kolumn, na jednej pętli tego nie zrobisz. for( int i = 0; i < 6; i++ ) { for( j = 0; j < 6; j++ ) { if( plansza[ i ][ j ] == '#' ) licznik++; } }
Co pętli od przekątnych, to jak na moje oko jest w porządku, nie rozumiem jedynie tego zzapisu: if( wiersz == kolumna )
if( wiersz + kolumna == 5 )
Z tego co się orientuje to wiesz i kolumna nie mają nadanej wartości, kompilator nie wyświetla Ci ostrzeżeń? Wcześniej przy pomocy tych zmiennych przechodziłeś po komórkach tablicy. A ta ostatnia pętla "dla drugiej, jeżeli do niej należy" to chodzi o drugą przekątną prawy górny -> lewy dolny? |
|
kevindurant95 Temat założony przez niniejszego użytkownika |
» 2014-12-02 11:49:47 Tak, o tą o tą. Spróbuję dziś coś pozmieniać. |
|
1 « 2 » |