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

Gra, troch problemow.

Ostatnio zmodyfikowano 2012-06-12 18:00
Autor Wiadomość
tomcionek15
Temat założony przez niniejszego użytkownika
Gra, troch problemow.
» 2012-06-12 10:51:24
Cześć to znowu ja :D

Gra polega na tym że jest mapa, na samej górze jest przeciwnik a gracz na dole.
No i spadają z góry bloki które muszę omijać ...

Dobra o to kod :

C/C++
//plik main.cpp

/* =============================== */

#include <iostream>
#include <cstdlib>
#include <conio.h>
#include <stdio.h>
#include <ctime>

using namespace std;

/* =============================== */
int a;
struct Position2D {
    int x, y;
};

enum EntityType { PLAYER = 1, ENEMY, WALL_X, WALL_Y, EMPTY, BLOCK };
/* =============================== */

int player_id, enemy_id, block_id[ 10 ];

int nextBlock() {
    if( a >= 9 )
         a = 0;
    else
         a++;
   
    return a;
}


class Game {
private:
    int score, id, MAP[ 30 ][ 20 ], player_moves, player_lives;
    Position2D entity[ 600 ];
   
    /* =============================== */
   
    void nextID()
    {
        id++;
    }
   
    /* =============================== */
   
public:
   
    Game()
        : score( 0 )
        , player_moves( 0 )
        , player_lives( 3 )
    {
        for( int y = 1; y < 20; y++ )
        {
            for( int x = 1; x < 30; x++ )
            {
                if( y == 1 || y == 19 )
                {
                    if((( y == 1 || 19 ) &&( x == 1 || x == 29 ) ) )
                         addEntity( WALL_Y, x, y );
                    else
                         addEntity( WALL_X, x, y );
                   
                }
                else if( y != 1 && y != 19 &&( x == 1 || x == 29 ) )
                     addEntity( WALL_Y, x, y );
                else
                     addEntity( EMPTY, x, y );
               
            }
        }
    }
   
    /* =============================== */
   
    void deleteEntity( int id_ )
    {
        MAP[ entity[ id_ ].x ][ entity[ id_ ].y ] = 5;
    }
    int addEntity( EntityType block, int posX, int posY )
    {
        nextID();
        if( block == PLAYER )
             MAP[ posX ][ posY ] = 1;
       
        if( block == ENEMY )
             MAP[ posX ][ posY ] = 2;
       
        if( block == WALL_X )
             MAP[ posX ][ posY ] = 3;
       
        if( block == WALL_Y )
             MAP[ posX ][ posY ] = 4;
       
        if( block == EMPTY )
             MAP[ posX ][ posY ] = 5;
       
        if( block == BLOCK )
             MAP[ posX ][ posY ] = 6;
       
        setPositionX( id, posX );
        setPositionY( id, posY );
       
        return id;
    }
   
    /* =============================== */
   
    int getPositionX( int id_ ) {
        return entity[ id_ ].x;
    }
   
    int getPositionY( int id_ ) {
        return entity[ id_ ].y;
    }
   
    /* =============================== */
   
    void setPositionX( int id_, int x ) {
        entity[ id_ ].x = x;
    }
   
    void setPositionY( int id_, int y ) {
        entity[ id_ ].y = y;
    }
   
    /* =============================== */
   
    void clearMap() {
        system( "cls" );
    }
   
    void drawMap() {
        for( int y = 1; y < 20; y++ ) {
            for( int x = 1; x < 30; x++ )
            {
                switch( MAP[ x ][ y ] )
                {
                case 1: cout << "#"; break; // PLAYER
                case 2: cout << "@"; break; // ENEMY
                case 3: cout << "_"; break; // WALL_X
                case 4: cout << "|"; break; // WALL_Y
                case 5: cout << " "; break; // EMPTY
                case 6: cout << "$"; break; // BLOCK
                default:
                    continue;
                }
            }
            cout << endl;
        }
       
        printf( "Moves : %d\nLives : %d\nScore : %d", player_moves, player_lives, score );
    }
   
    void control()
    {
       
        char button = getch();
       
        deleteEntity( player_id );
        deleteEntity( enemy_id );
       
        for( int i = 0; i < a; i++ )
             deleteEntity( block_id[ a ] );
       
        if( score % 6 == 0 ) {
            for( int i = 0; i < 2; i++ )
                 block_id[ nextBlock() ] = addEntity( BLOCK, rand() % 28, 2 );
           
        }
        if( button == 'a' )
        {
            entity[ player_id ].x--;
            player_moves++;
            score += 3;
        }
        if( button == 'd' )
        {
            entity[ player_id ].x++;
            player_moves++;
            score += 3;
        }
       
        if( entity[ player_id ].x > 28 )
             entity[ player_id ].x = 2;
       
        if( entity[ player_id ].x < 2 )
             entity[ player_id ].x = 28;
       
        if( entity[ player_id ].x < entity[ enemy_id ].x )
             entity[ enemy_id ].x--;
       
        if( entity[ player_id ].x > entity[ enemy_id ].x )
             entity[ enemy_id ].x++;
       
       
       
        MAP[ entity[ player_id ].x ][ entity[ player_id ].y ] = 1; // PLAYER
        MAP[ entity[ enemy_id ].x ][ entity[ enemy_id ].y ] = 2; // ENEMY
       
    }
};

int main() {
    Game gra;
    player_id = gra.addEntity( PLAYER, 15, 18 );
    enemy_id = gra.addEntity( ENEMY, 2, 2 );
   
    for(;; )
    {
        gra.clearMap();
        gra.drawMap();
        gra.control();
    }
    return 0;
}

Problem polega na tym, że co każdy ruch ma usuwać z poprzedniego pola bloki, czyli block_id[id].
No więc deleteEntity(int id_) zamienia pozycję ID na puste czyli cout << " " ;

Jak uruchamiam grę to wsystko wygląda OK, naciskam 'a' lub 'd', i gra się wiesza, to znaczy choćby już program się skończył.

A jak usunę to :

C/C++
for( int i = 0; i < a; i++ )
     deleteEntity( block_id[ a ] );


To gra działa, ale tak że co dwa ruchy pojawiają się nowe. No i też dobrze, tylko nachodzą na siebie, a jak przeciwnik najedzie na BLOK to robi się puste pole, bo dałem, że robi odstęp...

To pytanie :

Jak mogę zrobić, że co dwa ruchy dodają się na losowej pozycji X, a pozycji Y BLOKI, i co jeden ruch ten BLOK opada, czyli idzie w dół. ?
P-58288
waxx
» 2012-06-12 11:52:32
for( int i = 0; i < a; i++ )
     deleteEntity( block_id[ a ] );

a nie mialo byc

for( int i = 0; i < a; i++ )
     deleteEntity( block_id[ i ] );

>.>

na przyszlosc jak sie wiesza to debuggerem lecisz zanim na forum
P-58289
tomcionek15
Temat założony przez niniejszego użytkownika
» 2012-06-12 12:04:15
Wiesz debugger nic nie wywalał :D Ok
Teraz jest tak :
C/C++
for( int i = 0; i < a; i++ )
     deleteEntity( block_id[ i ] );


I uruchamiam grę, naciskam 'a' albo 'd' i działa, pojawiają się dwa BLOKI, naciskam kolejny raz - Crash, to samo :/ .Na razie patrzę, jak zauważę coś nietypowego dam znać...


EDIT :

Problem polega w tej pętli :

C/C++
for( int i = 0; i < a; i++ )
     deleteEntity( block_id[ i ] );


bo usunąłem i działa :/
P-58290
waxx
» 2012-06-12 16:11:12
Wywala bo wyskakujesz pewnie za elementy tego kontenera...
Monituj dokladnie co sie dzieje ze zmienna "a".
P-58301
tomcionek15
Temat założony przez niniejszego użytkownika
» 2012-06-12 18:00:48
a działa dobrze, bo co każdy dodany nowy blok, a się podwyższa i jest ok.

Tylko mam pytanie, jakim prawem to się wykonuje :

C/C++
srand( time( NULL ) );
if(( player_moves % 3 ) == 0 ) {
    for( int i = 0; i < 2; i++ )
         block_id[ nextBlock() ] = addEntity( BLOCK, rand() % 26, 2 );
   
}

Skoro ma się wykonywać co 3 ruch gracza.
Tzn, uruchamiam program. wszystko OK, naciskam 'a' lub 'd' i się już dodają bloki.
I się wiesza. Czyli przynajmniej wiem, że problem i tak jest w tym :

C/C++
for( int i = 0; i < a; i++ )
     deleteEntity( block_id[ i ] );

P-58319
« 1 »
  Strona 1 z 1