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 »  |