Enviado em 07/07/2014 - 08:18h
Nossa é Verdade
#include <stdio.h>
#include <stdlib.h>
#include <SDL/SDL.h>
/* Definicoes, para facilitar o uso da funcao para desenhar o mapa */
#define PAREDE 1
#define VOCE 2 /* não usado */
#define GRAMA 3
#define SAIDA 4
#define PORTA 5
#define CHAVE 6
/* Desfinicoes da configuracao do Video */
#include <stdio.h>
#include <stdlib.h>
#include <SDL/SDL.h>
/* Definicoes, para facilitar o uso da funcao para desenhar o mapa */
#define PAREDE 1
#define VOCE 2 /* não usado */
#define GRAMA 3
#define SAIDA 4
#define PORTA 5
#define CHAVE 6
/* Desfinicoes da configuracao do Video */
#define LARGURA 400 /* Numero total de colunas*largura_da_parede */
#define ALTURA 400 /* Numero total de linhas*altura_da_parede */
#define BPP 0 /* A Flag SDL_ANYFORMAT se encaregara da resolucao */
/*Outras definições para tratamento de erros*/
#define OK 1
#define ERRO 2
SDL_Surface * tela, * piso, * parede, * player, * final, * grama,*porta,*chave;
int coluna_atual = 1,linha_atual = 1,key,passos,fim=0;
int mapa[20][20] =
{{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,3,3,3,1,3,3,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,3,3,3,1,3,3,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,1,1,1,1,3,3,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,3,3,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,5,1,1,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,3,3,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,3,3,4},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}};
int mapa2[20][20] =
{{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,3,3,3,1,3,3,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,3,3,3,1,3,3,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,1,1,1,1,3,3,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,3,3,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,5,1,1,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,3,3,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,3,3,4},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}};
void controla_fps ( int tempo_inicial )
{
int fps = 1000/60; // converte 60 FPS para milissegundos
int tempo_agora = SDL_GetTicks() - tempo_inicial;
if(tempo_agora < fps)
SDL_Delay(fps - tempo_agora);
}
int carrega_imagens ( )
{
/* Carrega as Imagens */
parede = SDL_LoadBMP("parede_muro.bmp");
if (parede == NULL)
{
printf("Não carregou parede_muro.bmp\n");
return 0;
}
player = SDL_LoadBMP("gamer.bmp");
if (player == NULL)
{
printf("Não carregou gamer.bmp\n");
return 0;
}
final = SDL_LoadBMP("fim.bmp");
if (final == NULL)
{
printf("Não carregou fim.bmp\n");
return 0;
}
grama = SDL_LoadBMP("gramado.bmp");
if (grama == NULL)
{
printf("Não carregou gramado.bmp\n");
return 0;
}
porta = SDL_LoadBMP("Door.bmp");
if(porta == NULL){
printf("Não Carregou Door.bmp");
}
chave = SDL_LoadBMP("Bluekey.bmp");
if(chave == NULL){
printf("Não Carregou Bluekey.bmp");
}
return 1;
}
int gera_chave(){
int Chave = 1,teste1,teste2;
teste1 = rand()%16;
teste2 = rand()%16;
if (((teste1 > 0 )&& (teste2 > 0) &&(mapa[teste1][teste2] != 1)))
{
if((mapa[teste1][teste2] == 0) || (mapa[teste1][teste2] == 3)){
mapa[teste1][teste2] = 6;
Chave +=1;
}else{
teste1 = rand()%16;
teste2 = rand()%16;
mapa[teste1][teste2] = 6;
Chave +=1;
}
}else {
gera_mapa();
}
}
int gera_mapa( )
{
int m, n,x,y,teste,Parede = 0,MaxParede = 70;
for (x = 0;x<20;x++)
{
for(y = 0;y<20;y++)
{
mapa[x][y] = 0;
mapa[x][y] = mapa2[x][y];
}
}
for (m = 0; m < 20;m++)
{
for (n = 0;n<20;n++)
{
teste = rand()%4;
if (((mapa[m][n] == 0)&&(teste == 1)&&(Parede < MaxParede)))
{
mapa[m][n] = teste;
Parede = Parede + 1;
}
else if ((teste == 0)&&(mapa[m][n]== 0))
{
mapa[m][n] = 3;
}
}
}
gera_chave();
}
int desenhar_mapa()
{
int linha,coluna;
SDL_Rect destino;
for (linha=0;linha<20;linha++)
{
destino.y = linha * 20;
for (coluna=0;coluna<20;coluna++)
{
destino.x = coluna * 20;
if (mapa[linha][coluna] == PAREDE)
SDL_BlitSurface(parede, NULL, tela, &destino);
if (mapa[linha][coluna] == GRAMA)
SDL_BlitSurface(grama, NULL, tela, &destino);
if (mapa[linha][coluna] == SAIDA)
SDL_BlitSurface(final, NULL, tela, &destino);
if(mapa[linha][coluna] == PORTA)
SDL_BlitSurface(porta,NULL,tela,&destino);
if(mapa[linha][coluna] == CHAVE)
SDL_BlitSurface(chave,NULL,tela,&destino);
}
printf("\n");
}
return OK;
}
void move_jogador ( SDL_Event event )
{
/*=============== Deslocamento do jogador =====================*/
switch (event.key.keysym.sym)
{
/* Na vertical */
case SDLK_UP:
/* Se o usuario aperta a seta para cima e linha_atual for maior que 0 ... */
if (linha_atual > 0) /* 0 = primeira linha */
{
/* ...subtraia 1 de linha_atual, ou seja, suba uma linha... */
linha_atual = linha_atual - 1;
/* ... e verifique a localizacao do jogador ...*/
if (mapa[linha_atual][coluna_atual] == PAREDE)
linha_atual = linha_atual + 1; /* ... Se for sobre a PAREDE volte para a posição anterior. */
}
break;
case SDLK_DOWN:
if (linha_atual < 19)
{
linha_atual = linha_atual + 1;
if (mapa[linha_atual][coluna_atual] == PAREDE)
linha_atual = linha_atual - 1;
}
break;
/* Na horizontal */
case SDLK_LEFT:
/* Se o usuario aperta a seta para esquerda e coluna_atual for maior que 0 ... */
if (coluna_atual > 0) /* 0 = primeira coluna */
{
/* ...subtraia 1 de coluna_atual, ou seja, recue uma coluna ... */
coluna_atual = coluna_atual - 1;
/* ... e verifique a localizacao do jogador ...*/
if (mapa[linha_atual][coluna_atual] == PAREDE)
coluna_atual = coluna_atual + 1; /* ... Se for sobre a PAREDE adicione 1 a coluna_atual. */
}
break;
case SDLK_RIGHT:
if (coluna_atual < 19)/* 39 = última coluna */
{
coluna_atual = coluna_atual + 1;
if (mapa[linha_atual][coluna_atual] == PAREDE)
coluna_atual = coluna_atual - 1;
}
break;
default:
break;
}
}
int main()
{
srand( (unsigned)time(NULL) );
/*inicializando a SDL e verificando possiveis erros */
_Bool JogadorChave = 0; // Se o Jogador Nao Tiver A Chave entao é false
_Bool PortaAberta = 0;
if(SDL_Init(SDL_INIT_VIDEO) != 0)
{
printf("Erro: %s\n", SDL_GetError());
exit(-1);
}
SDL_Rect destino; /* para blitar o jogador */
SDL_Event evento; /* para os eventos */
/* Carrega as imagens */
if (carrega_imagens() == 0) /* Se não carregou uma ou outra imagem */
{
return 1; /* encerre o programa */
}
/* Configura o Video */
tela = SDL_SetVideoMode(LARGURA, ALTURA, BPP, SDL_SWSURFACE | SDL_ANYFORMAT);
if(tela == NULL)
{
printf("Erro: %s\n", SDL_GetError());
return 1; /* encerre o programa */
}
SDL_WM_SetCaption("Labirinto - SDL By Thihup", NULL);
int tempo_inicial;
gera_mapa();
/* Loop principal */
while (fim == 0) /* Enquanto NÃO for verdadeiro o fim */
{
/* Para a funcao controla_fps */
tempo_inicial = SDL_GetTicks();
/* Loop de eventos */
while(SDL_PollEvent(&evento))
{
if(evento.type == SDL_QUIT)
fim = 1;
/* move o jogador */
if (evento.type == SDL_KEYDOWN)
move_jogador(evento);
}
/* Verifica se o jogador chegou ao ponto final */
if (mapa[linha_atual][coluna_atual] == SAIDA)
{
coluna_atual = 1,linha_atual =1;
destino.x = coluna_atual * 20;
destino.y = linha_atual * 20;
SDL_BlitSurface(player, NULL, tela, &destino);
JogadorChave = 0; // Se o Jogador Nao Tiver A Chave entao é false
PortaAberta = 0;
gera_mapa();
}
if(mapa[linha_atual][coluna_atual] == CHAVE)
{
JogadorChave = 1;
mapa[linha_atual][coluna_atual] = 3;
SDL_UpdateRect(tela,0,0,0,0); /* Atualiza a tela inteira */
}
if(((mapa[linha_atual][coluna_atual] == PORTA)&&(JogadorChave)&&(mapa[linha_atual][coluna_atual] == PORTA))){
PortaAberta = 1;
}
if((PortaAberta)&&(evento.type == SDL_KEYDOWN))
{
// O Jogador Pode Passar
}else if (((!PortaAberta)&&(evento.type == SDL_KEYDOWN))&&(mapa[linha_atual][coluna_atual] == PORTA)){
linha_atual = linha_atual -1;
}
/* Pinta a tela inteira de branco antes de desenhar o mapa, esse branco eh o caminho */
SDL_FillRect(tela, NULL, SDL_MapRGB(tela->format, 255, 255, 255));
/* Desenha o mapa sobre a tela */
desenhar_mapa();
/* blita o jogador na tela */
/* para o jogador: destino.x = coluna_atual*largura_da_imagem e destino.y = linha_atual*altura_da_imagem */
destino.x = coluna_atual * 20;
destino.y = linha_atual * 20;
/* pegue a imagem player completa(NULL) e jogue na tela em destino */
SDL_BlitSurface(player, NULL, tela, &destino);
SDL_UpdateRect(tela,0,0,0,0); /* Atualiza a tela inteira */
controla_fps(tempo_inicial); // controla o FPS
}
/* Finalizando o SDL */
SDL_Quit();
return 0;
}