Animacja elementów tablicy w command window c++
Ostatnio zmodyfikowano 2015-06-22 00:13
kaczor00 Temat założony przez niniejszego użytkownika |
Animacja elementów tablicy w command window c++ » 2015-06-13 16:11:23 Witam, jako że to mój pierwszy post proszę o wyrozumiałość. Ostatnio otrzymałem do opracowania zagadnienie polegające na stworzeniu animacji w konsoli, w której to poruszający się z lewa na prawo dwuelementowy element ma zrzucać inne elementy w sposób losowy. W tym celu dostałem przykładowy kod, który szczerze mówiąc nie przekonał mnie do siebie, niewzruszony postanowiłem go nieco zmodyfikować, aż doszedłem do postaci załączonej poniżej. Mój problem w głównej mierze polega na całkowitym braku stabilności mojego niechlubnego dzieła (spadające elementy się zatrzymują, program się zawiesza itd.) Z góry zakładam, iż w moim programie z pewnością jest pełno niedociągnięć i bzdur wynikających z tego, iż dopiero raczkuję w środowisku c++. Bardzo proszę o pomoc w przedstawionej kwestii, z góry dziękuję. #include <iostream.h> #include <conio.h> #include <cstdlib.h> #include <windows.h>
using namespace std; const int J = 20, K = 50; int tablica[ J ][ K ];
void ustawTablice() { for( int i = 0; i < K; i++ ) { tablica[ 0 ][ i ] = 1; } for( int i = 0; i < K; i++ ) { tablica[ 19 ][ i ] = 1; } tablica[ 0 ][ 0 ] = 2; tablica[ 0 ][ 1 ] = 2; } void przesunTablice( int * wh, unsigned int * wx1, unsigned int * wx2, unsigned int * wx3, unsigned int * wx4, int * wbomb1, int * wbomb2 ) { for( int i = 0; i < J; i++ ) { if(( tablica[ 0 ][ * wx1 ] == 2 ) ||( tablica[ i ][ * wx1 ] == 3 ) ) { tablica[ i ][ * wx1 ] = 0; tablica[ i + 1 ][ * wx1 ] = 3; tablica[ 0 ][ * wx1 ] = 1; break; } } for( int i = 0; i < J; i++ ) { if(( tablica[ 0 ][ * wx2 ] == 2 ) ||( tablica[ i ][ * wx2 ] == 3 ) ) { tablica[ i ][ * wx2 ] = 0; tablica[ i + 1 ][ * wx2 ] = 3; tablica[ 0 ][ * wx2 ] = 1; break; } } for( int i = 0; i < J; i++ ) { if(( tablica[ 0 ][ * wx3 ] == 2 ) ||( tablica[ i ][ * wx3 ] == 3 ) ) { tablica[ i ][ * wx3 ] = 0; tablica[ i + 1 ][ * wx3 ] = 3; tablica[ 0 ][ * wx3 ] = 1; break; } } for( int i = 0; i < J; i++ ) { if(( tablica[ 0 ][ * wx4 ] == 2 ) ||( tablica[ i ][ * wx4 ] == 3 ) ) { tablica[ i ][ * wx4 ] = 0; tablica[ i + 1 ][ * wx4 ] = 3; tablica[ 0 ][ * wx4 ] = 1; break; } } if( * wh != 48 ) { for( int i = 0; i < K - 1; i++ ) { * wbomb1 = i; if( i == 48 ) { * wh = i; tablica[ 0 ][ i + 1 ] = 1; break; } if( tablica[ 0 ][ i ] == 2 ) { tablica[ 0 ][ i ] = 1; tablica[ 0 ][ i + 1 ] = 2; tablica[ 0 ][ i + 2 ] = 2; break; } } } if( * wh == 48 ) { for( int i = 48; i >= 1; i-- ) { * wbomb2 = i; if( i == 1 ) { * wh = i; break; } if( tablica[ 0 ][ i ] == 2 ) { tablica[ 0 ][ i ] = 1; tablica[ 0 ][ i - 1 ] = 2; tablica[ 0 ][ i - 2 ] = 2; break; } } } }
void bomba( int * wbomb1, int * wbomb2, unsigned int * wx1, unsigned int * wx2, unsigned int * wx3, unsigned int * wx4 ) { if(( * wbomb1 == 0 ) ||( * wbomb2 == 48 ) ) { unsigned aLiczby[ 4 ]; for( int i = 0; i < 4; i++ ) { aLiczby[ i ] = 0; } srand( static_cast < int >( time( NULL ) ) ); for( int i = 0; i < 4; ) { aLiczby[ i ] = rand() % 49 + 1; bool bPowtarzaSie = false; for( int j = 0; j < i; ++j ) { if( aLiczby[ j ] == aLiczby[ i ] ) { bPowtarzaSie = true; break; } } if( !bPowtarzaSie ) { ++i; } } * wx1 = aLiczby[ 0 ]; * wx2 = aLiczby[ 1 ]; * wx3 = aLiczby[ 2 ]; * wx4 = aLiczby[ 3 ]; } }
void wyswietlTablice() { for( int i = 0; i < J; i++ ) { for( int j = 0; j < K; j++ ) { if( tablica[ i ][ j ] == 0 ) cout << " "; if( tablica[ i ][ j ] == 2 ) { textcolor( 14 ); putch( 1 ); } if( tablica[ i ][ j ] == 1 ) { textcolor( 10 ); putch( 196 ); } if( tablica[ i ][ j ] == 3 ) { textcolor( 10 ); putch( 65 ); } if( tablica[ i ][ j ] == 4 ) { textcolor( 10 ); putch( 9 ); } } cout << endl; } } int main() { int h = 0, bomb1 = 0, bomb2 = 0; unsigned int x1, x2, x3, x4; int * wh = & h; int * wbomb1 = & bomb1; int * wbomb2 = & bomb2; unsigned int * wx1 = & x1; unsigned int * wx2 = & x2; unsigned int * wx3 = & x3; unsigned int * wx4 = & x4; ustawTablice(); while( 1 ) { if( kbhit() ) { break; } else { wyswietlTablice(); bomba( & bomb1, & bomb2, & x1, & x2, & x3, & x4 ); przesunTablice( & h, & x1, & x2, & x3, & x4, & bomb1, & bomb2 ); Sleep( 100 ); system( "cls" ); } } } |
|
pekfos |
» 2015-06-22 00:13:08 O tak, dziwnych rzeczy to tu jest.. Po pierwsze, nagłówki są sprzed naszej ery, powinno to wyglądać tak #include <iostream> #include <conio.h> #include <cstdlib> #include <ctime> #include <windows.h>
Skoro już piszesz w C++, do argumentów funkcji używaj referencji, a nie wskaźników. int * wh = & h; int * wbomb1 = & bomb1; int * wbomb2 = & bomb2; unsigned int * wx1 = & x1; unsigned int * wx2 = & x2; unsigned int * wx3 = & x3; unsigned int * wx4 = & x4;
|
To jest w ogóle niepotrzebne i nieużywane nigdzie. Dodatkowo ten kod jest straszliwie pogmatwany i przydługi jak na to, co ma robić. Najlepiej będzie to po prostu napisać od nowa, nie spiesząc się za bardzo z podziałem na funkcje, bo tu akurat wyszedł ten podział wyjątkowo nielogicznie. Ciężko stwierdzić, czy to efekt twoich modyfikacji, czy ten kod już miał tyle sensu, co teraz ;) |
|
« 1 » |