Gioco pacman console C++

di il
14 risposte

Gioco pacman console C++

Salve a tutti. Ho un problema con il mio gioco pacman console programmato con C++. Dopo aver creato la mappa, il giocatore, e il movimento del giocatore a seconda delle freccette premute, non riesco a creare la collisione con le mura. Vorrei che una volta arrivato dinanzi a un muro il giocatore si fermi. Il mio codice che inserisco qui in basso è molto primitivo perchè ho appena iniziato a programmarlo e quindi mancano molte cose come il cibo, i nemici, ecc. Spero possiate aiutarmi. Premetto che conosco le basi del linguaggio, non sono un programmatore... Se qualcuno può aiutarmi gli prego di farlo con le conoscenze basi del linguaggio. Di seguito allego anche uno screen dell'output del gioco. Grazie in anticipo.

Link per guardare l'immagine dell'output del gioco:
https://drive.google.com/file/d/1NA0RRdSIQmuraBW-lz1MPZu_zZPMs_gS/view?usp=sharing
#include <iostream>
#include <windows.h>
#include <conio.h>

using namespace std;

//VARIABILI GLOBALI
char mappa[29][28]=
	{
	{(219),(219),(219),(219),(219),(219),(219),(219),(219),(219),(219),(219),(219),(219),(219),(219),(219),(219),(219),(219),(219),(219),(219),(219),(219),(219),(219),(219)},
	{(219),'.','.','.','.','.','.','.','.','.','.','.','.',(219),(219),'.','.','.','.','.','.','.','.','.','.','.','.',(219)},
	{(219),'.',(219),(219),(219),(219),'.',(219),(219),(219),(219),(219),'.',(219),(219),'.',(219),(219),(219),(219),(219),'.',(219),(219),(219),(219),'.',(219)},
	{(219),'.',(219),' ',' ',(219),'.',(219),' ',' ',' ',(219),'.',(219),(219),'.',(219),' ',' ',' ',(219),'.',(219),' ',' ',(219),'.',(219)},
	{(219),'.',(219),' ',' ',(219),'.',(219),' ',' ',' ',(219),'.',(219),(219),'.',(219),' ',' ',' ',(219),'.',(219),' ',' ',(219),'.',(219)},
	{(219),'.',(219),(219),(219),(219),'.',(219),(219),(219),(219),(219),'.',(219),(219),'.',(219),(219),(219),(219),(219),'.',(219),(219),(219),(219),'.',(219)},
	{(219),'.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.',(219)},
	{(219),'.',(219),(219),(219),(219),'.',(219),(219),'.',(219),(219),(219),(219),(219),(219),(219),(219),'.',(219),(219),'.',(219),(219),(219),(219),'.',(219)},
	{(219),'.',(219),(219),(219),(219),'.',(219),(219),'.',(219),(219),(219),(219),(219),(219),(219),(219),'.',(219),(219),'.',(219),(219),(219),(219),'.',(219)},
	{(219),'.','.','.','.','.','.',(219),(219),'.','.','.','.',(219),(219),'.','.','.','.',(219),(219),'.','.','.','.','.','.',(219)},
	{(219),(219),(219),(219),(219),(219),'.',(219),(219),(219),(219),(219),'.',(219),(219),'.',(219),(219),(219),(219),(219),'.',(219),(219),(219),(219),(219),(219)},
	{' ',' ',' ',' ',' ',(219),'.',(219),(219),(219),(219),(219),'.',(219),(219),'.',(219),(219),(219),(219),(219),'.',(219),' ',' ',' ',' ',' '},
	{' ',' ',' ',' ',' ',(219),'.',(219),(219),' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',(219),(219),'.',(219),' ',' ',' ',' ',' '},
	{' ',' ',' ',' ',' ',(219),'.',(219),(219),' ',(219),(219),(219),' ',' ',(219),(219),(219),' ',(219),(219),'.',(219),' ',' ',' ',' ',' '},
	{(219),(219),(219),(219),(219),(219),'.',(219),(219),' ',(219),' ',' ',' ',' ',' ',' ',(219),' ',(219),(219),'.',(219),(219),(219),(219),(219),(219)},
	{(219),(219),(219),(219),(219),(219),'.',' ',' ',' ',(219),' ',' ',' ',' ',' ',' ',(219),' ',' ',' ','.',(219),(219),(219),(219),(219),(219)},
	{(219),(219),(219),(219),(219),(219),'.',(219),(219),' ',(219),(219),(219),(219),(219),(219),(219),(219),' ',(219),(219),'.',(219),(219),(219),(219),(219),(219)},
	{' ',' ',' ',' ',' ',(219),'.',(219),(219),' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',(219),(219),'.',(219),' ',' ',' ',' ',' '},
	{(219),(219),(219),(219),(219),(219),'.',(219),(219),' ',(219),(219),(219),(219),(219),(219),(219),(219),' ',(219),(219),'.',(219),(219),(219),(219),(219),(219)},
	{(219),'.','.','.','.','.','.','.','.','.','.','.','.',(219),(219),'.','.','.','.','.','.','.','.','.','.','.','.',(219)},
	{(219),'.',(219),(219),(219),(219),'.',(219),(219),(219),(219),(219),'.',(219),(219),'.',(219),(219),(219),(219),(219),'.',(219),(219),(219),(219),'.',(219)},
	{(219),'.',(219),(219),(219),(219),'.',(219),(219),(219),(219),(219),'.',(219),(219),'.',(219),(219),(219),(219),(219),'.',(219),(219),(219),(219),'.',(219)},
	{(219),'.','.','.',(219),(219),'.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.',(219),(219),'.','.','.',(219)},
	{(219),(219),(219),'.',(219),(219),'.',(219),(219),'.',(219),(219),(219),(219),(219),(219),(219),(219),'.',(219),(219),'.',(219),(219),'.',(219),(219),(219)},
	{(219),(219),(219),'.',(219),(219),'.',(219),(219),'.',(219),(219),(219),(219),(219),(219),(219),(219),'.',(219),(219),'.',(219),(219),'.',(219),(219),(219)},
	{(219),'.','.','.','.','.','.',(219),(219),'.','.','.','.',(219),(219),'.','.','.','.',(219),(219),'.','.','.','.','.','.',(219)},
	{(219),'.',(219),(219),(219),(219),(219),(219),(219),(219),(219),(219),'.',(219),(219),'.',(219),(219),(219),(219),(219),(219),(219),(219),(219),(219),'.',(219)},
	{(219),'.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.',(219)},
	{(219),(219),(219),(219),(219),(219),(219),(219),(219),(219),(219),(219),(219),(219),(219),(219),(219),(219),(219),(219),(219),(219),(219),(219),(219),(219),(219),(219)}
	};
int x=13, y=22;
int direzione=77;
char testa='O';
bool continua=true;

void stampa_mappa()
{
	for(int i=0;i<=28;i++)
	{
		for(int t=0;t<=27;t++)
		{
			cout<<mappa[i][t];
		}
		cout<<endl;
	}
}

void gotoxy(short x, short y)   //FUNZIONE PER COORDINATE
{
   COORD pos={x,y};
   SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}

main()
{
	stampa_mappa();
	gotoxy(x,y);cout<<testa;
	do
	{
		if(kbhit())
		{
			do{
				direzione=_getch();
			}while(direzione!=72 && direzione!=77 && direzione!=80 && direzione!=75);
		}
		if((direzione==72 && mappa[x][y-1]!=(219)) || 
		   (direzione==80 && mappa[x][y+1]!=(219)) || 
		   (direzione==75 && mappa[x-1][y]!=(219)) || 
		   (direzione==77 && mappa[x+1][y]!=(219)))
		{
			if(direzione==72)y--;
			if(direzione==80)y++;
			if(direzione==75)x--;
			if(direzione==77)x++;
		}
		gotoxy(x,y);cout<<testa;
		_sleep(100);
	}while(continua);
}

14 Risposte

  • Re: Gioco pacman console C++

    Scrivere un programma del genere, anche se non sembra, per chi è alle prime armi, è una cosa complessa.

    Come mai scegli di scriverlo se hai solo le basi del linguaggio?

    Comunque, tutte quelle parentesi in (219) non servono, usa delle costanti.
    [CODE] #define M '\xDB' #define P '.' #define S ' ' //VARIABILI GLOBALI char mappa[29][28] = { { M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M }, { M,P,P,P,P,P,P,P,P,P,P,P,P,M,M,P,P,P,P,P,P,P,P,P,P,P,P,M }, { M,P,M,M,M,M,P,M,M,M,M,M,P,M,M,P,M,M,M,M,M,P,M,M,M,M,P,M }, { M,P,M,S,S,M,P,M,S,S,S,M,P,M,M,P,M,S,S,S,M,P,M,S,S,M,P,M }, { M,P,M,S,S,M,P,M,S,S,S,M,P,M,M,P,M,S,S,S,M,P,M,S,S,M,P,M }, { M,P,M,M,M,M,P,M,M,M,M,M,P,M,M,P,M,M,M,M,M,P,M,M,M,M,P,M }, { M,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,M }, { M,P,M,M,M,M,P,M,M,P,M,M,M,M,M,M,M,M,P,M,M,P,M,M,M,M,P,M }, { M,P,M,M,M,M,P,M,M,P,M,M,M,M,M,M,M,M,P,M,M,P,M,M,M,M,P,M }, { M,P,P,P,P,P,P,M,M,P,P,P,P,M,M,P,P,P,P,M,M,P,P,P,P,P,P,M }, { M,M,M,M,M,M,P,M,M,M,M,M,P,M,M,P,M,M,M,M,M,P,M,M,M,M,M,M }, { S,S,S,S,S,M,P,M,M,M,M,M,P,M,M,P,M,M,M,M,M,P,M,S,S,S,S,S }, { S,S,S,S,S,M,P,M,M,S,S,S,S,S,S,S,S,S,S,M,M,P,M,S,S,S,S,S }, { S,S,S,S,S,M,P,M,M,S,M,M,M,S,S,M,M,M,S,M,M,P,M,S,S,S,S,S }, { M,M,M,M,M,M,P,M,M,S,M,S,S,S,S,S,S,M,S,M,M,P,M,M,M,M,M,M }, { M,M,M,M,M,M,P,S,S,S,M,S,S,S,S,S,S,M,S,S,S,P,M,M,M,M,M,M }, { M,M,M,M,M,M,P,M,M,S,M,M,M,M,M,M,M,M,S,M,M,P,M,M,M,M,M,M }, { S,S,S,S,S,M,P,M,M,S,S,S,S,S,S,S,S,S,S,M,M,P,M,S,S,S,S,S }, { M,M,M,M,M,M,P,M,M,S,M,M,M,M,M,M,M,M,S,M,M,P,M,M,M,M,M,M }, { M,P,P,P,P,P,P,P,P,P,P,P,P,M,M,P,P,P,P,P,P,P,P,P,P,P,P,M }, { M,P,M,M,M,M,P,M,M,M,M,M,P,M,M,P,M,M,M,M,M,P,M,M,M,M,P,M }, { M,P,M,M,M,M,P,M,M,M,M,M,P,M,M,P,M,M,M,M,M,P,M,M,M,M,P,M }, { M,P,P,P,M,M,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,M,M,P,P,P,M }, { M,M,M,P,M,M,P,M,M,P,M,M,M,M,M,M,M,M,P,M,M,P,M,M,P,M,M,M }, { M,M,M,P,M,M,P,M,M,P,M,M,M,M,M,M,M,M,P,M,M,P,M,M,P,M,M,M }, { M,P,P,P,P,P,P,M,M,P,P,P,P,M,M,P,P,P,P,M,M,P,P,P,P,P,P,M }, { M,P,M,M,M,M,M,M,M,M,M,M,P,M,M,P,M,M,M,M,M,M,M,M,M,M,P,M }, { M,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,M }, { M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M } };
    In ogni caso devi controllare il contenuto dell'elemento [x][y] della matrice nella prossima posizione che avrà la testa dello snake (in base alla direzione di avanzamento); se è 219 è il muro, altrimenti è qualcosa di altro. E OCCHIO alle righe e alle colonne ... Quelle if dopo il ciclo di input del tasto dovranno essere tutte sostituite da
    
    		if (direzione == 72 && mappa[y-1][x] != M) y--;
    		if (direzione == 80 && mappa[y+1][x] != M) y++;
    		if (direzione == 75 && mappa[y][x-1] != M) x--;
    		if (direzione == 77 && mappa[y][x+1] != M) x++;
    
    e considera che la testa si muove ma devi gestire l'allungamento e il resto del movimento ...
  • Re: Gioco pacman console C++

    Ciao oregon e grazie mille per la risposta. Il mio gioco vuole essere un pacman-simile e non uno snake-simile. Ho seguito il tuo consiglio per l'utilizzo delle costanti per la matrice della mappa, e ora il codice è molto più ordinato. inoltre ho modificato il ciclo come da tuo consiglio ma il problema rimane. Il personaggio cammina dove vuole anche sopra le mura della mappa. Non c'è collisione e quindi il giocatore prosegue sempre in ogni direzione al premere delle freccette. Spero tu abbia capito il mio problema. Di recente ho creato uno snake-simile ma in quel caso la collisione con le pareti era molto semplici perchè si trattava di un semplice rettangolo e al toccare delle pareti il verme moriva. Con pacman il problema è molto più complesso... Allego il main aggiornato dopo il tuo consiglio:
    main()
    {
    	stampa_mappa();
    	gotoxy(x,y);cout<<testa;
    	do
    	{
    		if(kbhit())
    		{
    			do{
    				direzione=_getch();
    			}while(direzione!=72 && direzione!=77 && direzione!=80 && direzione!=75 && direzione!=27);
    		}
    		if(direzione==72 && mappa[x][y-1]!=M)y--;
    		if(direzione==80 && mappa[x][y+1]!=M)y++;
    		if(direzione==75 && mappa[x-1][y]!=M)x--;
    		if(direzione==77 && mappa[x+1][y]!=M)x++;
    		if(direzione==27)continua=false;
    		if(continua)gotoxy(x,y);cout<<testa;
    		_sleep(100);
    	}while(continua);
    }
  • Re: Gioco pacman console C++

    Guarda meglio le if che ti ho suggerito ... gli indici della mappa hanno prima la y e poi la x
  • Re: Gioco pacman console C++

    E' vero oregon. Errore mio. Ho subito provveduto ad aggiustare quegli if. Il problema però non si è risolto con questa modifica... Il presonaggio continua a camminare ovunque, anche sopra i muri...
  • Re: Gioco pacman console C++

    No ... così va bene ... postami nuovamente tutto il codice modificato, vediamo se è come il mio
  • Re: Gioco pacman console C++

    Grazie tante per il tuo impegno. Ecco il codice:
    #include <iostream>
    #include <windows.h>
    #include <conio.h>
    
    #define M 219
    #define C '.'
    #define V ' '
    
    using namespace std;
    
    //VARIABILI GLOBALI
    char mappa[29][28]=
    	{
    	{M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M},
    	{M,C,C,C,C,C,C,C,C,C,C,C,C,M,M,C,C,C,C,C,C,C,C,C,C,C,C,M},
    	{M,C,M,M,M,M,C,M,M,M,M,M,C,M,M,C,M,M,M,M,M,C,M,M,M,M,C,M},
    	{M,C,M,V,V,M,C,M,V,V,V,M,C,M,M,C,M,V,V,V,M,C,M,V,V,M,C,M},
    	{M,C,M,V,V,M,C,M,V,V,V,M,C,M,M,C,M,V,V,V,M,C,M,V,V,M,C,M},
    	{M,C,M,M,M,M,C,M,M,M,M,M,C,M,M,C,M,M,M,M,M,C,M,M,M,M,C,M},
    	{M,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,M},
    	{M,C,M,M,M,M,C,M,M,C,M,M,M,M,M,M,M,M,C,M,M,C,M,M,M,M,C,M},
    	{M,C,M,M,M,M,C,M,M,C,M,M,M,M,M,M,M,M,C,M,M,C,M,M,M,M,C,M},
    	{M,C,C,C,C,C,C,M,M,C,C,C,C,M,M,C,C,C,C,M,M,C,C,C,C,C,C,M},
    	{M,M,M,M,M,M,C,M,M,M,M,M,C,M,M,C,M,M,M,M,M,C,M,M,M,M,M,M},
    	{V,V,V,V,V,M,C,M,M,M,M,M,C,M,M,C,M,M,M,M,M,C,M,V,V,V,V,V},
    	{V,V,V,V,V,M,C,M,M,V,V,V,V,V,V,V,V,V,V,M,M,C,M,V,V,V,V,V},
    	{V,V,V,V,V,M,C,M,M,V,M,M,M,V,V,M,M,M,V,M,M,C,M,V,V,V,V,V},
    	{M,M,M,M,M,M,C,M,M,V,M,V,V,V,V,V,V,M,V,M,M,C,M,M,M,M,M,M},
    	{M,M,M,M,M,M,C,V,V,V,M,V,V,V,V,V,V,M,V,V,V,C,M,M,M,M,M,M},
    	{M,M,M,M,M,M,C,M,M,V,M,M,M,M,M,M,M,M,V,M,M,C,M,M,M,M,M,M},
    	{V,V,V,V,V,M,C,M,M,V,V,V,V,V,V,V,V,V,V,M,M,C,M,V,V,V,V,V},
    	{M,M,M,M,M,M,C,M,M,V,M,M,M,M,M,M,M,M,V,M,M,C,M,M,M,M,M,M},
    	{M,C,C,C,C,C,C,C,C,C,C,C,C,M,M,C,C,C,C,C,C,C,C,C,C,C,C,M},
    	{M,C,M,M,M,M,C,M,M,M,M,M,C,M,M,C,M,M,M,M,M,C,M,M,M,M,C,M},
    	{M,C,M,M,M,M,C,M,M,M,M,M,C,M,M,C,M,M,M,M,M,C,M,M,M,M,C,M},
    	{M,C,C,C,M,M,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,M,M,C,C,C,M},
    	{M,M,M,C,M,M,C,M,M,C,M,M,M,M,M,M,M,M,C,M,M,C,M,M,C,M,M,M},
    	{M,M,M,C,M,M,C,M,M,C,M,M,M,M,M,M,M,M,C,M,M,C,M,M,C,M,M,M},
    	{M,C,C,C,C,C,C,M,M,C,C,C,C,M,M,C,C,C,C,M,M,C,C,C,C,C,C,M},
    	{M,C,M,M,M,M,M,M,M,M,M,M,C,M,M,C,M,M,M,M,M,M,M,M,M,M,C,M},
    	{M,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,M},
    	{M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M}
    };
    int x=13, y=22;
    int direzione=77;
    char testa='O';
    bool continua=true;
    
    void stampa_mappa()
    {
    	for(int i=0;i<=28;i++)
    	{
    		for(int t=0;t<=27;t++)
    		{
    			cout<<mappa[i][t];
    		}
    		cout<<endl;
    	}
    }
    
    void gotoxy(short x, short y)   //FUNZIONE PER COORDINATE
    {
       COORD pos={x,y};
       SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
    }
    
    main()
    {
    	stampa_mappa();
    	gotoxy(x,y);cout<<testa;
    	do
    	{
    		if(kbhit())
    		{
    			do{
    				direzione=_getch();
    			}while(direzione!=72 && direzione!=77 && direzione!=80 && direzione!=75 && direzione!=27);
    		}
    		if(direzione==72 && mappa[y-1][x]!=M)y--;
    		if(direzione==80 && mappa[y+1][x]!=M)y++;
    		if(direzione==75 && mappa[y][x-1]!=M)x--;
    		if(direzione==77 && mappa[y][x+1]!=M)x++;
    		if(direzione==27)continua=false;
    		if(continua)gotoxy(x,y);cout<<testa;
    		_sleep(100);
    	}while(continua);
    }
  • Re: Gioco pacman console C++

    Occhio ... questo

    #define M '\xDB'

    deve essere così, ovvero un char e non un numero intero.
  • Re: Gioco pacman console C++

    Incredibile oregon. Grazie mille... Mi potresti spiegare cos'è quel '\xDB'? Poi avrei un altra domanda se è possibile
  • Re: Gioco pacman console C++

    E' l'equivalente di 219 come char e non come int
  • Re: Gioco pacman console C++

    Vorrei inoltre che il personaggio cammini sempre finchè non venga premuto un tasto idoneo alla posizione in cui si trova nella mappa. Per esempio se si trova in una strettoia verticale, continua a camminare fino a che non viene premuto un tasto tra freccia sotto e freccia sopra... Io ho provato in questo modo:
    void cambia_direzione()
    {
    	if(kbhit())
    	{
    		if(x==1) //SE SI TROVA ALLA COLONNA 1
    		{
    			if(y==1) //SE SI TROVA NELLA RIGA 1 -- QUINDI COORDINATE (1,1)
    			{
    				do{direzione=_getch();}while(direzione!=77 && direzione!=80 && direzione!=27); //MUOVI DESTRA-SOTTO
    				if(direzione==77 && direzione==80 && direzione==27)continua=direzione;
    			}
    			COSI PER TUTTE LE RIGHE
    		}
    		COSI PER TUTTE LE COLONNE	
    	}
    }
    
    //PROGRAMMA PRINCIPALE
    main()
    {
    	stampa_mappa();
    	gotoxy(x,y);cout<<testa;
    	do
    	{
    		cambia_direzione();
    		if(cammina==72 && mappa[y-1][x]!=M)y--;
    		if(cammina==80 && mappa[y+1][x]!=M)y++;
    		if(cammina==75 && mappa[y][x-1]!=M)x--;
    		if(cammina==77 && mappa[y][x+1]!=M)x++;
    		if(cammina==27)continua=false;
    		if(continua)gotoxy(x,y);cout<<testa;
    		_sleep(100);
    	}while(continua);
    }
    
  • Re: Gioco pacman console C++

    No .. non ho capito ma adesso comunque non potrei rispondere...
  • Re: Gioco pacman console C++

    Oregon il codice di ora quando viene premuto per esempio il tasto freccia destra e il giocatore alla sua destra ha un muro, il giocatore si ferma. Io vorrei che continuasse a camminare nel caso in cui venga premuto un tasto che conduce il giocatore verso il muro... ho allegato quella parte di codice per spiegarmi meglio
  • Re: Gioco pacman console C++

    Mi dispiace continuo a non capire cosa vuoi fare, tanto meno con quel codice che non si comprende (a parte il cammina che non è una variabile mai usata)
  • Re: Gioco pacman console C++

    Ciao oregon. Il problema che ho adesso è il seguente. quando il pacman si trova in una strettoia della mappa, dove per esempio si puo andare o sopra o sotto, tenendo premuto il tasto freccia destra, voglio che quando arriva al primo svincolo, giri a destra. Il funzionamento del gioco c'è, però il problema è che non gira mai al primo svincolo ma al secondo, o al terzo... ripeto, la meccanica funziona, ma c'è un errore credo relativo al kbhit. oregon ora ti allego il nuovo codice completo così potrai giocarci e capire l'errore.
    
    #include <iostream>
    #include <windows.h>
    #include <conio.h>
    
    #define M '\xDB'
    #define C '.'
    #define V ' '
    
    using namespace std;
    
    //VARIABILI GLOBALI
    char mappa[29][28]=
    	{
    	{M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M},
    	{M,C,C,C,C,C,C,C,C,C,C,C,C,M,M,C,C,C,C,C,C,C,C,C,C,C,C,M},
    	{M,C,M,M,M,M,C,M,M,M,M,M,C,M,M,C,M,M,M,M,M,C,M,M,M,M,C,M},
    	{M,C,M,V,V,M,C,M,V,V,V,M,C,M,M,C,M,V,V,V,M,C,M,V,V,M,C,M},
    	{M,C,M,V,V,M,C,M,V,V,V,M,C,M,M,C,M,V,V,V,M,C,M,V,V,M,C,M},
    	{M,C,M,M,M,M,C,M,M,M,M,M,C,M,M,C,M,M,M,M,M,C,M,M,M,M,C,M},
    	{M,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,M},
    	{M,C,M,M,M,M,C,M,M,C,M,M,M,M,M,M,M,M,C,M,M,C,M,M,M,M,C,M},
    	{M,C,M,M,M,M,C,M,M,C,M,M,M,M,M,M,M,M,C,M,M,C,M,M,M,M,C,M},
    	{M,C,C,C,C,C,C,M,M,C,C,C,C,M,M,C,C,C,C,M,M,C,C,C,C,C,C,M},
    	{M,M,M,M,M,M,C,M,M,M,M,M,C,M,M,C,M,M,M,M,M,C,M,M,M,M,M,M},
    	{V,V,V,V,V,M,C,M,M,M,M,M,C,M,M,C,M,M,M,M,M,C,M,V,V,V,V,V},
    	{V,V,V,V,V,M,C,M,M,V,V,V,V,V,V,V,V,V,V,M,M,C,M,V,V,V,V,V},
    	{V,V,V,V,V,M,C,M,M,V,M,M,M,V,V,M,M,M,V,M,M,C,M,V,V,V,V,V},
    	{M,M,M,M,M,M,C,M,M,V,M,V,V,V,V,V,V,M,V,M,M,C,M,M,M,M,M,M},
    	{M,M,M,M,M,M,C,V,V,V,M,V,V,V,V,V,V,M,V,V,V,C,M,M,M,M,M,M},
    	{M,M,M,M,M,M,C,M,M,V,M,M,M,M,M,M,M,M,V,M,M,C,M,M,M,M,M,M},
    	{V,V,V,V,V,M,C,M,M,V,V,V,V,V,V,V,V,V,V,M,M,C,M,V,V,V,V,V},
    	{M,M,M,M,M,M,C,M,M,V,M,M,M,M,M,M,M,M,V,M,M,C,M,M,M,M,M,M},
    	{M,C,C,C,C,C,C,C,C,C,C,C,C,M,M,C,C,C,C,C,C,C,C,C,C,C,C,M},
    	{M,C,M,M,M,M,C,M,M,M,M,M,C,M,M,C,M,M,M,M,M,C,M,M,M,M,C,M},
    	{M,C,M,M,M,M,C,M,M,M,M,M,C,M,M,C,M,M,M,M,M,C,M,M,M,M,C,M},
    	{M,C,C,C,M,M,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,M,M,C,C,C,M},
    	{M,M,M,C,M,M,C,M,M,C,M,M,M,M,M,M,M,M,C,M,M,C,M,M,C,M,M,M},
    	{M,M,M,C,M,M,C,M,M,C,M,M,M,M,M,M,M,M,C,M,M,C,M,M,C,M,M,M},
    	{M,C,C,C,C,C,C,M,M,C,C,C,C,M,M,C,C,C,C,M,M,C,C,C,C,C,C,M},
    	{M,C,M,M,M,M,M,M,M,M,M,M,C,M,M,C,M,M,M,M,M,M,M,M,M,M,C,M},
    	{M,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,M},
    	{M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M}
    };
    int x=13, y=22;
    int direzione=77;
    int cammina=77;
    char testa='O';
    bool continua=true;
    
    void stampa_mappa()
    {
    	for(int i=0;i<=28;i++)
    	{
    		for(int t=0;t<=27;t++)
    		{
    			cout<<mappa[i][t];
    		}
    		cout<<endl;
    	}
    }
    
    void gotoxy(short x, short y)   //FUNZIONE PER COORDINATE
    {
       COORD pos={x,y};
       SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
    }
    
    void cambia_direzione()
    {
    	if(kbhit())
    	{
    		do{direzione=_getch();}while(direzione!=72 && direzione!=77 && direzione!=80 && direzione!=75 && direzione!=27);
    		if(x==1) //SE SI TROVA ALLA COLONNA 1
    		{
    			if(y==1 || y==19 || y==25) 
    			{
    				if(direzione==77 || direzione==80 || direzione==27)cammina=direzione;
    			}
    			else if(y==6) 
    			{
    				if(direzione==72 || direzione==77 || direzione==80 || direzione==27)cammina=direzione;
    			}
    			else if(y==9 || y==22 || y==27)
    			{
    				if(direzione==72 || direzione==77 || direzione==27)cammina=direzione;
    			}
    			else 
    			{
    				if(direzione==72 || direzione==80 || direzione==27)cammina=direzione;
    			}
    		}
    		else if(x==3) //SE SI TROVA ALLA COLONNA 3
    		{
    			if(y==22) 
    			{
    				if(direzione==80 || direzione==75 || direzione==27)cammina=direzione;
    			}
    			else if(y==23 || y==24)
    			{
    				if(direzione==72 || direzione==80 || direzione==27)cammina=direzione;
    			}
    			else if(y==25) 
    			{
    				if(direzione==72 || direzione==77 || direzione==75 || direzione==27)cammina=direzione;
    			}
    			else  
    			{
    				if(direzione==77 || direzione==75 || direzione==27)cammina=direzione;
    			}
    		}
    		else if(x==6) //SE SI TROVA ALLA COLONNA 6
    		{
    			if(y==1) 
    			{
    				if(direzione==77 || direzione==80 || direzione==75 || direzione==27)cammina=direzione;
    			}
    			else if(y==6 || y==19) 
    			{
    				if(direzione==72 || direzione==77 || direzione==80 || direzione==75 || direzione==27)cammina=direzione;
    			}
    			else if(y==9) 
    			{
    				if(direzione==72 || direzione==80 || direzione==75 || direzione==27)cammina=direzione;
    			}
    			else if(y==15 || y==22) 
    			{
    				if(direzione==72 || direzione==77 || direzione==80 || direzione==27)cammina=direzione;
    			}
    			else if(y==25) 
    			{
    				if(direzione==72 || direzione==75 || direzione==27)cammina=direzione;
    			}
    			else if(y==27)  
    			{
    				if(direzione==77 || direzione==75 || direzione==27)cammina=direzione;
    			}
    			else 
    			{
    				if(direzione==72 || direzione==80 || direzione==27)cammina=direzione;
    			}
    		}
    		else if(x==9) //SE SI TROVA ALLA COLONNA 9
    		{
    			if(y==6 || y==22) 
    			{
    				if(direzione==77 || direzione==80 || direzione==75 || direzione==27)cammina=direzione;
    			}
    			else if(y==9 || y==25)
    			{
    				if(direzione==72 || direzione==77 || direzione==27)cammina=direzione;
    			}
    			else if(y==12) 
    			{
    				if(direzione==77 || direzione==80 || direzione==27)cammina=direzione;
    			}
    			else if(y==15) 
    			{
    				if(direzione==72 || direzione==80 || direzione==75 || direzione==27)cammina=direzione;
    			}
    			else if(y==17) 
    			{
    				if(direzione==72 || direzione==77 || direzione==80 || direzione==27)cammina=direzione;
    			}
    			else if(y==19)
    			{
    				if(direzione==72 || direzione==77 || direzione==75 || direzione==27)cammina=direzione;
    			}
    			else if(y==1 || y==27)  
    			{
    				if(direzione==77 || direzione==75 || direzione==27)cammina=direzione;
    			}
    			else 
    			{
    				if(direzione==72 || direzione==80 || direzione==27)cammina=direzione;
    			}
    		}
    		else if(x==12) //SE SI TROVA ALLA COLONNA 12
    		{
    			if(y==1 || y==9 || y==19 || y==25) 
    			{
    				if(direzione==80 || direzione==75 || direzione==27)cammina=direzione;
    			}
    			else if(y==6 || y==12 || y==22 || y==27)
    			{
    				if(direzione==72 || direzione==77 || direzione==75 || direzione==27)cammina=direzione;
    			}
    			else if(y==17)  
    			{
    				if(direzione==77 || direzione==75 || direzione==27)cammina=direzione;
    			}
    			else 
    			{
    				if(direzione==72 || direzione==80 || direzione==27)cammina=direzione;
    			}
    		}
    		else if(x==15) //SE SI TROVA ALLA COLONNA 15
    		{
    			if(y==1 || y==9 || y==19 || y==25) 
    			{
    				if(direzione==77 || direzione==80 || direzione==27)cammina=direzione;
    			}
    			else if(y==6 || y==12 || y==22 || y==27)
    			{
    				if(direzione==72 || direzione==77 || direzione==75 || direzione==27)cammina=direzione;
    			}
    			else if(y==17)  
    			{
    				if(direzione==77 || direzione==75 || direzione==27)cammina=direzione;
    			}
    			else 
    			{
    				if(direzione==72 || direzione==80 || direzione==27)cammina=direzione;
    			}
    		}
    		else if(x==18) //SE SI TROVA ALLA COLONNA 18
    		{
    			if(y==6 || y==22) 
    			{
    				if(direzione==77 || direzione==80 || direzione==75 || direzione==27)cammina=direzione;
    			}
    			else if(y==9 || y==25) 
    			{
    				if(direzione==72 || direzione==75 || direzione==27)cammina=direzione;
    			}
    			else if(y==12) 
    			{
    				if(direzione==80 || direzione==75 || direzione==27)cammina=direzione;
    			}
    			else if(y==15) 
    			{
    				if(direzione==72 || direzione==77 || direzione==80 || direzione==27)cammina=direzione;
    			}
    			else if(y==17) 
    			{
    				if(direzione==72 || direzione==80 || direzione==75 || direzione==27)cammina=direzione;
    			}
    			else if(y==19)
    			{
    				if(direzione==72 || direzione==77 || direzione==75 || direzione==27)cammina=direzione;
    			}
    			else if(y==1 || y==27)  
    			{
    				if(direzione==77 || direzione==75 || direzione==27)cammina=direzione;
    			}
    			else 
    			{
    				if(direzione==72 || direzione==80 || direzione==27)cammina=direzione;
    			}
    		}
    		else if(x==21) //SE SI TROVA ALLA COLONNA 21
    		{
    			if(y==1) 
    			{
    				if(direzione==77 || direzione==80 || direzione==75 || direzione==27)cammina=direzione;
    			}
    			else if(y==6 || y==19) 
    			{
    				if(direzione==72 || direzione==77 || direzione==80 || direzione==75 || direzione==27)cammina=direzione;
    			}
    			else if(y==9) 
    			{
    				if(direzione==72 || direzione==77 || direzione==80 || direzione==27)cammina=direzione;
    			}
    			else if(y==15 || y==22) 
    			{
    				if(direzione==72 || direzione==80 || direzione==75 || direzione==27)cammina=direzione;
    			}
    			else if(y==25)
    			{
    				if(direzione==72 || direzione==77 || direzione==27)cammina=direzione;
    			}
    			else if(y==27)  
    			{
    				if(direzione==77 || direzione==75 || direzione==27)cammina=direzione;
    			}
    			else 
    			{
    				if(direzione==72 || direzione==80 || direzione==27)cammina=direzione;
    			}
    		}
    		else if(x==24) //SE SI TROVA ALLA COLONNA 24
    		{
    			if(y==22) 
    			{
    				if(direzione==77 || direzione==80 || direzione==27)cammina=direzione;
    			}
    			else  if(y==23 || y==24)
    			{
    				if(direzione==72 || direzione==80 || direzione==27)cammina=direzione;
    			}
    			else if(y==25)
    			{
    				if(direzione==72 || direzione==77 || direzione==75 || direzione==27)cammina=direzione;
    			}
    			else  
    			{
    				if(direzione==77 || direzione==75 || direzione==27)cammina=direzione;
    			}
    		}
    		else if(x==26) //SE SI TROVA ALLA COLONNA 26
    		{
    			if(y==1 || y==19 || y==25) 
    			{
    				if(direzione==80 || direzione==75 || direzione==27)cammina=direzione;
    			}
    			else if(y==6) 
    			{
    				if(direzione==72 || direzione==80 || direzione==75 || direzione==27)cammina=direzione;
    			}
    			else if(y==9 || y==22 || y==27) 
    			{
    				if(direzione==72 || direzione==75 || direzione==27)cammina=direzione;
    			}
    			else 
    			{
    				if(direzione==72 || direzione==80 || direzione==27)cammina=direzione;
    			}
    		}
    		else  //SE SI TROVA NELLE COLONNE RIMANENTI
    		{
    			if(direzione==77 || direzione==75)cammina=direzione; //MUOVI DESTRA-SINISTRA
    		}
    	}
    }
    
    main()
    {
    	stampa_mappa();
    	gotoxy(x,y);cout<<testa;
    	do
    	{
    		cambia_direzione();
    		if(cammina==72 && mappa[y-1][x]!=M)y--;
    		if(cammina==80 && mappa[y+1][x]!=M)y++;
    		if(cammina==75 && mappa[y][x-1]!=M)x--;
    		if(cammina==77 && mappa[y][x+1]!=M)x++;
    		if(cammina==27)continua=false;
    		if(continua)gotoxy(x,y);cout<<testa;
    		_sleep(50);
    	}while(continua);
    }
    
Devi accedere o registrarti per scrivere nel forum
14 risposte