Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Animacja elementów tablicy w command window c++

Ostatnio zmodyfikowano 2015-06-22 00:13
Autor Wiadomość
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ę.
C/C++
#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 ); //spowalnia animacje
            system( "cls" ); //czysci ekran
        }
    }
}
P-133515
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
C/C++
#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.

C/C++
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 ;)
P-133906
« 1 »
  Strona 1 z 1