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 :
#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; case 2: cout << "@"; break; case 3: cout << "_"; break; case 4: cout << "|"; break; case 5: cout << " "; break; case 6: cout << "$"; break; 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; MAP[ entity[ enemy_id ].x ][ entity[ enemy_id ].y ] = 2; } };
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 : 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ół. ? |
|
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 |
|
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 : 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 : for( int i = 0; i < a; i++ ) deleteEntity( block_id[ i ] );
bo usunąłem i działa :/ |
|
waxx |
» 2012-06-12 16:11:12 Wywala bo wyskakujesz pewnie za elementy tego kontenera... Monituj dokladnie co sie dzieje ze zmienna "a". |
|
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 : 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 : for( int i = 0; i < a; i++ ) deleteEntity( block_id[ i ] );
|
|
« 1 » |