szymon2432 Temat założony przez niniejszego użytkownika |
[c++] Tablice dynamiczne, probem z deklaracją » 2015-11-25 19:01:21 Witam, robię projekt, który polega na stworzeniu gry w labirynt w konsoli i zatrzymałem się na samym początku. Program ma wczytywać domyślny labirynt po wciśnięciu "i", inne "labirynty" też mają się wczytywać po ich wybraniu, ale to mniej ważne. Głównie chodzi o to, że kiedy po wciśnięciu klawisza "i" wywołuje się funkcja domyslny(): int szer, wys;
void domyslny() { FILE * f = fopen( "domyslny.txt", "r" ); fscanf( f, "%i", & wys ); fscanf( f, "%i", & szer ); gotoxy( 40, 3 ); printf( "%i %i", wys, szer ); tab = new char *[ wys ]; for( int i = 0; i < wys; ++i ) { tab[ i ] = new char[ szer ]; for( int j = 0; j <= szer; ++j ) { tab[ i ][ j ] = getc( f ); gotoxy( 55 + j, 4 + i ); printf( "%c", tab[ i ][ j ] ); } } gotoxy( 1, 1 ); printf( "%c", tab[ 0 ][ 20 ] ); fclose( f ); }
void gra() { int zn, x = 40, y = 12, attr = 7; do { textcolor( 7 ); gotoxy( 55, 1 ); cputs( "q = wyjscie, i = domyslna plansza" ); gotoxy( 55, 2 ); cputs( "strzalki = poruszanie" ); gotoxy( 55, 3 ); cputs( "spacja = zmiana koloru" ); gotoxy( x, y ); textcolor( attr ); putch( '*' ); zn = getch(); if( zn == 0 ) { zn = getch(); if( zn == 0x48 ) y--; else if( zn == 0x50 ) y++; else if( zn == 0x4b ) x--; else if( zn == 0x4d ) x++; } else if( zn == 'i' ) domyslny(); else if( zn == ' ' ) attr =( attr + 1 ) % 16; } while( zn != 'q' ); }
int main() { settitle( "imie nazwisko nr_indeksu" ); textbackground( BLACK ); _setcursortype( 0 ); gra(); return 0; } to wszystko jest spoko, ALE, program działa w pętli, która za każdym razem czyści ekran clrscr(), więc z automatu piękny labirynt znika, więc pomyślałem, żeby po wciśnięciu klawisza "i" wywołać funkcję, która tworzy tablice dynamiczną dwuwymiarową, a potem za każdym razem w pętli do...while będzie wywoływana np. funkcja rysuj(); która pobierze tą tablicę i ją wyrysuje, więc mam taki kodzik: int szer, wys;
void domyslny( char ** tab ) { FILE * f = fopen( "domyslny.txt", "r" ); fscanf( f, "%i", & wys ); fscanf( f, "%i", & szer ); gotoxy( 40, 3 ); printf( "%i %i", wys, szer ); tab = new char *[ wys ]; for( int i = 0; i < wys; ++i ) { tab[ i ] = new char[ szer ]; for( int j = 0; j <= szer; ++j ) { tab[ i ][ j ] = getc( f ); } } gotoxy( 1, 1 ); printf( "%c", tab[ 0 ][ 20 ] ); fclose( f ); }
void gra() { char ** tab; int zn, x = 40, y = 12, attr = 7; do { textcolor( 7 ); gotoxy( 55, 1 ); cputs( "q = wyjscie, i = domyslna plansza" ); gotoxy( 55, 2 ); cputs( "strzalki = poruszanie" ); gotoxy( 55, 3 ); cputs( "spacja = zmiana koloru" ); gotoxy( x, y ); textcolor( attr ); putch( '*' ); zn = getch(); if( zn == 0 ) { zn = getch(); if( zn == 0x48 ) y--; else if( zn == 0x50 ) y++; else if( zn == 0x4b ) x--; else if( zn == 0x4d ) x++; } else if( zn == 'i' ) domyslny( tab ); else if( zn == ' ' ) attr =( attr + 1 ) % 16; } while( zn != 'q' ); }
int main() { settitle( "imie nazwisko nr_indeksu" ); textbackground( BLACK ); _setcursortype( 0 ); gra(); return 0; } Funkcji rysuj(); jeszcze nie napisałem, bo nie wiem jak przekazać wskaźnik **tab do funkcji domyslny(), żeby w tej funkcji utworzyło mi tablice o danych wymiarach (wymiary to dwie pierwsze linie w pliku tekstowym), może ktoś ma jakiś inny pomysł na rozwiązanie tego problemu? byłbym bardzo wdzięczny. EDIT: żeby lepiej zrozumieć: Czy da się zadeklarować taki wskaźnik **tab, potem przekazać go jako argument funkcji domyslny(tab); która wygląda tak: void domyslny(char **tab) i ma za zadanie stworzyć tablicę dynamiczną dwuwymiarową? |
|
Monika90 |
» 2015-11-25 19:21:32 Ale dlaczego chcesz go do funkcji przekazać, czy nie możesz go zwrócić? Wtedy w funkcji gra miałbyś char ** tab = domyslny();
|
|
szymon2432 Temat założony przez niniejszego użytkownika |
» 2015-11-25 19:26:07 Wtedy char **tab deklarowałby się za każdym razem, chyba. Ale co musiałbym zmienić w funkcji domyslny()? Zmieniłem trochę kod i działa przekazywanie, ale labirynt pokazuje się na 1ms może. int szer, wys;
void rysuj( char **& tab ) { for( int i = 0; i < wys; ++i ) { for( int j = 0; j <= szer; ++j ) { gotoxy( 55 + j, 4 + i ); printf( "%c", tab[ i ][ j ] ); } } }
void domyslny( char **& tab ) { FILE * f = fopen( "domyslny.txt", "r" ); fscanf( f, "%i", & wys ); fscanf( f, "%i", & szer ); gotoxy( 40, 3 ); printf( "%i %i", wys, szer ); tab = new char *[ wys ]; for( int i = 0; i < wys; ++i ) { tab[ i ] = new char[ szer ]; for( int j = 0; j <= szer; ++j ) { tab[ i ][ j ] = getc( f ); } } gotoxy( 1, 1 ); printf( "%c", tab[ 0 ][ 20 ] ); fclose( f ); }
void gra() { char ** tab; int zn, x = 40, y = 12, attr = 7; do { clrscr(); textcolor( 7 ); gotoxy( 55, 1 ); cputs( "q = wyjscie, i = domyslna plansza" ); gotoxy( 55, 2 ); cputs( "strzalki = poruszanie" ); gotoxy( 55, 3 ); cputs( "spacja = zmiana koloru" ); gotoxy( x, y ); textcolor( attr ); putch( '*' ); zn = getch(); if( zn == 0 ) { zn = getch(); if( zn == 0x48 ) y--; else if( zn == 0x50 ) y++; else if( zn == 0x4b ) x--; else if( zn == 0x4d ) x++; } else if( zn == 'i' ) domyslny( tab ); else if( zn == ' ' ) attr =( attr + 1 ) % 16; rysuj( tab ); } while( zn != 'q' ); }
int main() { settitle( "imie nazwisko nr_indeksu" ); textbackground( BLACK ); _setcursortype( 0 ); gra(); return 0; } |
|
Monika90 |
» 2015-11-25 19:42:12 for( int j = 0; j <= szer; ++j ) { |
Tu masz nieprawidłowy warunek, przez co j wychodzi poza zakres tablicy. |
|
szymon2432 Temat założony przez niniejszego użytkownika |
» 2015-11-25 19:46:08 A wiedziałem, że ktoś zauważy :P niby nieprawidłowy, ale jak mam samo "<" to mi ucina ostatnią kolumnę, nie wiem czemu :O |
|
Monika90 |
» 2015-11-25 19:51:25 Pewnie dlatego, że w pliku z planszą masz białe znaki, np. znaki przejścia do nowej linii, musisz je pomijać przy wczytywaniu. |
|
szymon2432 Temat założony przez niniejszego użytkownika |
» 2015-11-25 19:53:53 Tak, nie dodałem warunku w przypadku znaku nowej linii, w labirynt rysuje się w 1 przebiegu funkcji, ale w następnych już znika, tak jakby funkcja rysuj() dostawała pustą tablicę :/
Może to strukturą jakąś załatwić? Pytam bo już nie wiem co robić, jakiś trop by się przydał :P |
|
« 1 » |