Un jeu labyrinthe ou on peut se déplacer en console.

Un jeu labyrinthe ou on peut se déplacer en console.

getch, SetConsoleCursorPosition

Voir version :

Pas de dépendances

Télécharger :

#ifdef _WIN32
#include <windows.h>
#include <conio.h>
#endif
#include <stdio.h>

#define MAX 10

char laby[MAX][MAX] = {
"**********",
"* *      *",
"* ****** *",
"*        *",
"* **** ***",
"*    *   *",
"* ** *** *",
"* ********",
"*        *",
"**********"
};

int MyGetch()
{
#ifdef _WIN32
    return getch();
#endif
// trouver alternative hors Windows.
}

void Locate(int x,int y)
{
#ifdef _WIN32
    HANDLE H=GetStdHandle(STD_OUTPUT_HANDLE);
    COORD C;
    C.X=(SHORT)x;
    C.Y=(SHORT)y;
    SetConsoleCursorPosition(H,C);
#endif
    // trouver alternative hors Windows.
}

void Afficher(int x,int y)
{
    int i,j;
    Locate(0,0);
    for(i=0;i<MAX;i++)
    {
        for(j=0;j<MAX;j++)
        {
            if (i==x && j==y)
                printf("p");
            else
                printf("%c",laby[i][j]);
        }
        printf("\n");
    }
}

void TryMove(int* x,int* y,int vx,int vy)
{
    if (laby[*x+vx][*y+vy]=='*')
        return;
    (*x)+=vx;
    (*y)+=vy;
}

int main()
{
    int x,y;  // position joueur    
    int touche;
    x = y = 1;
    touche = 0;
    while(touche!=27) // ECHAP
    {
        Afficher(x,y);
        touche = MyGetch();
        switch(touche)
        {
        case 'q':
            TryMove(&x,&y,0,-1);
            break;
        case 'd':
            TryMove(&x,&y,0,1);
            break;
        case 'z':
            TryMove(&x,&y,-1,0);
            break;
        case 's':
            TryMove(&x,&y,1,0);
        default:
            break;
        }
    }
    return 0;
}




Commentaires

	Pour illustrer ce qu'on peut faire avec deux fonctions :
	- getch (pour attraper une touche de clavier sans appuyer sur entrée) avec conio
	- SetConsoleCursorPosition (repositionner le curseur) avec Windows.h

	Voici un petit jeu de labyrinthe rapide.
	Regardez le tableau laby en haut : un petit labyrinthe. Je dis que * sont les murs.

	Dans le main, je positionne la position d'un joueur a x=1 et y=1
	(du fait de l'ordre des chaines, il y aura transposition entre les x et y, y sera en abcisse, x en ordonnée)

	Le while est simple :
	J'affiche :

	La fonction affichage met le cuseur en haut à gauche, et dessine le laby, en plaçant le joueur (lettre p)

	Ensuite, avec getch, je prends la touche. Echap pour sortir du while.

	Sinon, on joue avec qsdz. (en minuscule).

	Pour chaque touche, j'envoie la fonction TryMove qui va voir si on peut bouger selon le vecteur passé ou non.
	Je regarde donc si la position finale est une mur. Si elle l'est, je ne bouge pas le joueur.
	Sinon, je bouge le joueur.

	L'erreur qu'il ne faut pas faire, c'est bouger le joueur, puis voir s'il est dans un mur -> trop tard.
	Il faut voir ou on veut aller, voir si cette position finale est acceptable (pas dans un mur), et 
	si c'est le cas, bouger le joueur.

	Cet ordre des choses est important à comprendre. Elle m'a personnellement vallu bien des emmerdes par le passé.
	En effet, si on bouge d'abord, et on voit ensuite si on est dans un mur, et bien... si on y est, c'est parfois
	par simple d'en ressortir...
	Alors que si on garantie de ne jamais y aller, c'est beaucoup plus simple !