Ir ao conteúdo
  • Cadastre-se
adamastor123321

C Jogo de labirinto em C, nao consigo resolver um detalhe

Recommended Posts

Boa tarde, estou fazendo um jogo de labirinto em C mas estou tendo dificuldade para colocar limitações para quando entrar em uma parede "|" aparece a msg game over, ou para quando chegar no final "$" e acabar o jogo.

 

o codigo é este abaixo:

 

#include <stdio.h>
#include <ncurses.h>
#include <unistd.h>
#include <string.h>

#define lin 13
#define col 100

char mapa[lin][col];
int x=1, y=1;

void imprimir_mapa(int x, int y)
{
	int i, j, mini, minj, maxi, maxj;
	mini = x-3;

	if(mini < 0)
	{
		mini=0;
	}

	minj = y-3;

	if(minj < 0)
	{
		minj=0;
	}

	maxi = x+3;

	if(maxi > 12)
	{
		maxi=12;
	}

	maxj = y+3;

	if(maxj > 99)
	{
		maxj=99;
	}

	for(i=mini;i<maxi;i++)
	{
		for(j=minj;j<maxj;j++)
		{
			mvprintw(i, j, "%c", mapa[i][j]);
		}
	}
}

void ler_movimento()
{
	char p;

	p = getch();
	//armazena posicao atual em variaveis temporarias (x, y)
	if(p=='s')
	{
		x++;

	}
	if(p=='d')
	{
		y++;
	}
	if(p=='a')
	{
		y--;
	}
	if(p=='w')
	{
		x--;
	}

	if(mapa[x][y]=='|')
	{
		printw("GAME OVER"); //volta a posicao temp
	}
	if(mapa[x][y]=='$')
	{
		printw("PARABÉNS voce CHEGOU O FINAL DO LABIRINTO");
	}

}

int main()
{


	char p;

	strcpy(mapa[0], "|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||");
	strcpy(mapa[1], "| ||               ||||||||||||||||||||||||||||||||||||||||||||                                   |");
	strcpy(mapa[2], "| || ||||||||||||| |||||||||||                                        |||||||||||||||||||| ||||||||");
	strcpy(mapa[3], "|         |||||||| ||||||||||| |||||||||||||||||||||||||||||||||||||||||||||||| |||||||||| ||||||||");
	strcpy(mapa[4], "|||| |||| |||||||| ||||||||||| |||||                 ||||||||                   ||||||||||        |");
	strcpy(mapa[5], "|||| |||| |||||||| ||||||||||| |||||||||| |||||||||| ||||||||||||| |||||||||||| |||||||||| ||||||||");
	strcpy(mapa[6], "||||      |||||||| ||||||||||| |||||||||| |||||||||| ||||||||||||| ||||||||||||                   |");
	strcpy(mapa[7], "|||||||||||||||||| ||||||                      ||||| ||||||||||||| ||||||||||||||||||||||||||||||||");
	strcpy(mapa[8], "|||||||            ||||||||||||||||||||||||||||||||| |||||||||                                |||||");
	strcpy(mapa[9], "||||||| ||||||||||||||||                 ||||||||||| ||||||||||||||||||||||||||||||||||| ||||||||||");
	strcpy(mapa[10], "||||||| |||||||||||||||| ||||||||||||||| ||||||||||| |||||||||||||                       ||||||||||");
	strcpy(mapa[11], "|||||                       |||||||||                |||||||||||||||||$||||||||||||||||| ||||||||||");
	strcpy(mapa[12], "|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||");

	initscr();

	while(1)
	{
		clear();
		imprimir_mapa(x, y);
		mvprintw(x,y,"O");
		refresh();
		ler_movimento();

		usleep(50000);

	}

	endwin();

	return 0;

}

 

Se alguem souber o que estou fazendo de errado e puder me avisar eu serei grato!

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@adamastor123321    depois de pegar qual tecla teclou para mover o jogador , você precisa verificar na matriz mapa , na nova posição do jogador , se o jogador está sobre um caractere que representa as paredes , e nesse caso voltar para posição anterior , ou imprime sua mensagem  GAME OVER , mas nesse caso seria impraticável jogar , pois a todo momento o jogador toca na parede , então creio que isso poderia sim , então coloquei desse jeito , mas você pode modificar a seu gosto , e estou usando windows por isso coloquei as funções textcolor  e gotoxy  e som  que só funcionam no windows , sendo que para usar no Linux precisa fazer algumas modificações nelas ,   então seu código poderia ser assim         :

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <windows.h>

#define lin 13
#define col 100

#include <windows.h>/* para ser usado no windows */

/*             0     1    2     3   4      5      6      7         8  */
typedef enum{BLACK,BLUE,GREEN,CYAN,RED,MAGENTA,BROWN,LIGHTGRAY,DARKGRAY,   /* nome das cores */
LIGHTBLUE,LIGHTGREEN,LIGHTCYAN,LIGHTRED,LIGHTMAGENTA,YELLOW,WHITE} COLORS;
/*  9         10         11        12        13         14    15 */

static int __BACKGROUND = 1/*BLACK*/;/*pode ser o numero ou o nome da cor*/
static int __FOREGROUND = LIGHTGRAY;

void textcolor (int letras, int fundo){/*para mudar a cor de fundo mude o background*/
    __FOREGROUND = letras;
    __BACKGROUND = fundo;
    SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),
    letras + (__BACKGROUND << 4));
}

void gotoxy(int x, int y){
    COORD c;
    c.X = x;
    c.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);
}
void som(int f){
    Beep(f,150);
}
char mapa[lin][col];
int x=10, y=1,xt=40,yt=1,xt2,i,j;
int ant_xm,ant_ym,xm=10,ym=1,xti;
void imprimir_mapa(int x, int y){
    if( xm<1  )xm = ant_xm;
    if( xm>98 )xm = ant_xm;
    if( ym<1  )ym = ant_ym;
    if( ym>12 )ym = ant_ym;
    if(mapa[ym][xm]!=' ' && mapa[ym][xm]!='O'){
        xm=ant_xm;
        ym=ant_ym;
    }
    else{
        mapa[ant_ym][ant_xm]=' ';
        mapa[ym][xm]='O';
    }
    if(xm<20){
        if(xm>=10)xti=xm-10;/* xti é posição da coluna inicial da tela */
    }
    if(xti<0)xti=0;
    if(xm>80){
        if(xm<99)xti=xm-70;
    }
    if(xti>19)xti=19;
    if(xm>=20 && xm<=80)xti=10;
	gotoxy(0,0);
	for(i=0;i<13;i++){
        for(j=xti;j<xti+80;j++){
            if(mapa[i][j]=='|')
                printf("%c",219);
            else{
                if(mapa[i][j]=='O')textcolor(11,0 );
                if(mapa[i][j]=='$')textcolor(12,14);
                printf("%c", mapa[i][j]);
                textcolor(7,0);
            }
        }
    }
}
int ler_movimento(){
	char p='u';
	if(kbhit()    )p = getch();
	if((int)p==224)p = getch();
	ant_xm = xm;
	ant_ym = ym;
	//armazena posicao atual em variaveis temporarias (x, y)
	if(   p  =='d')xm++;
	else if(p=='s')ym++;
	else if(p=='w')ym--;
	else if(p=='a')xm--;

	if (xm>99)xm=99;
	else if(xm<1)xm=1;
	if (ym<1)ym=1;
	else if(ym>13)ym=13;
	if(mapa[ym][xm] == '$'){   /* ym é linha da matriz  xm é coluna da matriz */
	    mapa[ym][xm]=' ';
	    imprimir_mapa(xm,ym);
	    textcolor(12,15);
	    printf("\n\n                                           \n");
		printf("PARAB%cNS voc%c CHEGOU O FINAL DO LABIRINTO  \n",210,136);
		printf("           Tecle   ESC Para Sair           \n");
		printf("                                           \n");
		for(j=1;j<4;j++)
		    som(800*j);
		textcolor(7,0);
    }
    return p;
}

int main(){
	char p;
    int op;
    som(1100);
	strcpy(mapa[ 0], "|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||");
	strcpy(mapa[ 1], "| ||               ||||||||||||||||||||||||||||||||||||||||||||                                   |");
	strcpy(mapa[ 2], "| || ||||||||||||| |||||||||||                                        |||||||||||||||||||| ||||||||");
	strcpy(mapa[ 3], "|         |||||||| ||||||||||| |||||||||||||||||||||||||||||||||||||||||||||||| |||||||||| ||||||||");
	strcpy(mapa[ 4], "|||| |||| |||||||| ||||||||||| |||||                 ||||||||                   ||||||||||        |");
	strcpy(mapa[ 5], "|||| |||| |||||||| ||||||||||| |||||||||| |||||||||| ||||||||||||| |||||||||||| |||||||||| ||||||||");
	strcpy(mapa[ 6], "||||      |||||||| ||||||||||| |||||||||| |||||||||| ||||||||||||| ||||||||||||                   |");
	strcpy(mapa[ 7], "|||||||||||||||||| ||||||                      ||||| ||||||||||||| ||||||||||||||||||||||||||||||||");
	strcpy(mapa[ 8], "|||||||            ||||||||||||||||||||||||||||||||| |||||||||                                |||||");
	strcpy(mapa[ 9], "||||||| ||||||||||||||||                 ||||||||||| ||||||||||||||||||||||||||||||||||| ||||||||||");
	strcpy(mapa[10], "||||||| |||||||||||||||| ||||||||||||||| ||||||||||| |||||||||||||                       ||||||||||");
	strcpy(mapa[11], "|||||                       |||||||||                |||||||||||||||||$||||||||||||||||| ||||||||||");
	strcpy(mapa[12], "|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||");

	/*initscr();*/

    som(1200);
	while(1){
		/*clear();*/

		imprimir_mapa(xm, ym);/* xm é coluna na matriz   ym é linha na matriz */
		/*mvprintw(x,y,"O");*/
		/*refresh();*/
		op=ler_movimento();
		gotoxy(78,24);
        if(op == 27 )exit(0);
		Sleep(5);
		/*usleep(50000);*/

	}
	/*endwin();*/
	return 0;
}

 

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×