Concetti Chiave

  • Il codice rappresenta un semplice gioco in console in cui un eroe può muoversi su una mappa definita da un array di caratteri.
  • La mappa è costituita da muri e spazi vuoti, con la possibilità di utilizzare una ricerca in ampiezza (BFS) per trovare un percorso.
  • Il personaggio può muoversi in quattro direzioni, e i movimenti sono gestiti attraverso funzioni dedicate.
  • Il gioco prevede un sistema di punteggio basato sull'interazione con elementi presenti sulla mappa.
  • Le difficoltà del gioco possono essere selezionate dall'utente, influenzando la velocità del personaggio.

#include

#include

#include

#include

#include

using namespace std;

char tmp_map[18][32];

char map[18][32] = {

"+#############################+",

"| |",

"| |",

"|## ########### ## #########|",

"| | |",

"| | |### | | | |",

"| | | | |### | | | |",

"| | #####| | | ## | |",

"| | |### | | |",

"| |##### ### ## |",

"| ###### ####### ###|",

"| |",

"|# ### #### ### #######|",

"| |",

"| |",

"| |",

"| |",

"+#############################+"

};

void ShowMap()

{

for(int i = 0; i

printf("%s\n",map );

}

}

void gotoxy( short x, short y )

{

HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE) ;

COORD position = { x, y } ;

SetConsoleCursorPosition( hStdout, position ) ;

}

class entity {

public:

entity( int x, int y ){

this ->x = x;

this ->y = y;

}

void move_x( int p ){

if( map[y][x+p] == ' ' ) x += p;

}

void move_y( int p ){

if( map[y+p][x] == ' ' ) y += p;

}

void move( int p, int q ){

x += p;

y += q;

}

int get_x(){ return x; }

int get_y(){ return y; }

void draw( char p ){

map[x][y] = p;

gotoxy( x, y ); printf( "%c", p );

}

private:

int x;

int y;

};

struct walk {

short walk_count;

short x;

short y;

short back;

};

struct target {

short x;

short y;

};

vector walk_queue;

vector BFSArray;

void AddArray( int x, int y, int wc , int back ){

if( tmp_map[y][x] == ' ' || tmp_map[y][x] == '.' ){

tmp_map[y][x] = '#';

walk tmp;

tmp.x = x;

tmp.y = y;

tmp.walk_count = wc;

tmp.back = back;

BFSArray.push_back( tmp );

}

}

Funzione FindPath

void FindPath( int sx, int sy, int x, int y ){

memcpy( tmp_map, map, sizeof(map) );

BFSArray.clear();

walk tmp;

tmp.x = sx;

tmp.y = sy;

tmp.walk_count = 0;

tmp.back = -1;

BFSArray.push_back( tmp );

int i = 0;

while( i

if( BFSArray.x == x && BFSArray.y == y ){

walk_queue.clear();

target tmp2;

while( BFSArray.walk_count != 0 ){

tmp2.x = BFSArray.x;

tmp2.y = BFSArray.y;

walk_queue.push_back( tmp2 );

i = BFSArray.back;

}

break;

}

AddArray( BFSArray.x+1, BFSArray.y, BFSArray.walk_count+1, i );

AddArray( BFSArray.x-1, BFSArray.y, BFSArray.walk_count+1, i );

AddArray( BFSArray.x, BFSArray.y+1, BFSArray.walk_count+1, i );

AddArray( BFSArray.x, BFSArray.y-1, BFSArray.walk_count+1, i );

/*

AddArray( BFSArray.x+1, BFSArray.y+1, BFSArray.walk_count+1, i );

AddArray( BFSArray.x-1, BFSArray.y+1, BFSArray.walk_count+1, i );

AddArray( BFSArray.x+1, BFSArray.y+1, BFSArray.walk_count+1, i );

AddArray( BFSArray.x+1, BFSArray.y-1, BFSArray.walk_count+1, i );

AddArray( BFSArray.x+1, BFSArray.y-1, BFSArray.walk_count+1, i );

AddArray( BFSArray.x-1, BFSArray.y-1, BFSArray.walk_count+1, i );

AddArray( BFSArray.x-1, BFSArray.y+1, BFSArray.walk_count+1, i );

AddArray( BFSArray.x-1, BFSArray.y-1, BFSArray.walk_count+1, i );

*/

i++;

}

BFSArray.clear();

}

int main()

{

bool running = true;

int x = 15; // hero x

int y = 16; // hero y

int old_x;

int old_y;

int ex = 1;

int ey = 1;

int pts = 0;

printf("Instruzione:\n1. Usare le freccette per muovere il tuo eroe\n2. Mangia i pallini prodotti dal tuo nemico per ottenere punti\n3. Non farti prendere dal tuo nemico\n\n");

printf("H -> Difficile\nN -> Normale\nE -> Facile\n\nInput : ");

char diffi;

int speedmod = 3;

cin >> diffi;

if( diffi == 'N' ){

speedmod = 2;

}else if( diffi == 'H' ){

speedmod = 1;

}

system("cls");

ShowMap();

gotoxy( x, y ); cout

int frame = 0;

FindPath( ex,ey,x,y );

while( running ){

gotoxy( x, y ); cout

old_x = x;

old_y = y;

if ( GetAsyncKeyState( VK_UP ) ){

if( map[y-1][x] == '.' ){ y--; pts++; } else

if( map[y-1][x] == ' ' ) y--;

}

if ( GetAsyncKeyState( VK_DOWN ) ){

if( map[y+1][x] == '.' ){ y++; pts++; } else

if( map[y+1][x] == ' ' ) y++;

}

if ( GetAsyncKeyState( VK_LEFT ) ){

if( map[y][x-1] == '.' ){ x--; pts++; } else

if( map[y][x-1] == ' ' ) x--;

}

if ( GetAsyncKeyState( VK_RIGHT ) ){

if( map[y][x+1] == '.' ){ x++; pts++; } else

if( map[y][x+1] == ' ' ) x++;

}

if( old_x != x || old_y != y ){

FindPath( ex,ey,x,y );

}

gotoxy( x,y ); cout

map[ey][ex] = '.';

gotoxy( ex, ey ); cout

if( frame%speedmod == 0 && walk_queue.size() != 0 ){

ex = walk_queue.back().x;

ey = walk_queue.back().y;

walk_queue.pop_back();

}

gotoxy( ex, ey ); cout

if( ex == x && ey == y ){

break;

}

gotoxy( 32, 18 );

gotoxy( 32, 1 ); cout

Sleep( 100 );

frame++;

}

system("cls");

printf("Hai perso...Il tuo punteggio e' : %i", pts );

cin.get();

cin.get();

cin.get();

cin.get();

cin.get();

cin.get();

cin.get();

cin.get();

return 0;

}

Domande da interrogazione

  1. Qual è la funzione principale del codice fornito?
  2. Il codice implementa un gioco in cui un eroe si muove su una mappa, mangiando pallini e evitando nemici, utilizzando le frecce direzionali per il movimento.

  3. Come viene gestito il movimento dell'entità nel gioco?
  4. Il movimento dell'entità è gestito tramite la classe `entity`, che permette di spostare l'eroe in orizzontale e verticale, controllando se la nuova posizione è valida (cioè se non è un muro).

  5. Qual è il ruolo della funzione `FindPath`?
  6. La funzione `FindPath` cerca di trovare un percorso dalla posizione iniziale a una posizione obiettivo sulla mappa, utilizzando un algoritmo di ricerca in ampiezza (BFS) per esplorare le possibili mosse.

  7. Come viene visualizzata la mappa nel gioco?
  8. La mappa viene visualizzata tramite la funzione `ShowMap`, che stampa ogni riga della mappa su console, permettendo al giocatore di vedere il layout del gioco.

  9. Quali sono le istruzioni fornite all'inizio del gioco?
  10. Le istruzioni indicano di usare le frecce per muovere l'eroe, mangiare i pallini per guadagnare punti e di non farsi prendere dal nemico.

Domande e risposte

Hai bisogno di aiuto?
Chiedi alla community