Joguinho de labirinto usando as setas do teclado

Publicado por Denilson 29/05/2008 (última atualização em 16/05/2012)

[ Hits: 29.100 ]

Download 3342.2431

Download labirinto.cpp (versão 2)




Esse é um joguinho de labirinto.

Originalmente escrito por < Tiago Negri >, modificado por < Luís Fred > e agora melhorado pro mim.

Agora o jogo usa as setas do teclado.

  



Versões atualizadas deste script

Versão 2 - Enviado por aaaaa em 14/05/2012

Changelog:
/*
#################################################################################################
# Programa originalmente escrito por #
# #
# Posteriormente modificado por Luís Fred #
# ADICIONADO o fim do Jogo (se o cursor chegar na saida). retorna uma mensagem dizendo qe voce ganhou. Por Rafael Zurawski <www.facebook.com/rafaelzurawski> #
# Comentário de Luíz Fred: este programa consiste num joguinho de laborinto. Originalmente o #
# jogo não tinha uma saida, e onde já se viu um joguinho de labirinto sem uma saida????? :), #
# então resolvi fazer algumas modificações no código, como introduzir uma saida e aumentar o #
# mapa do jogo. #
# #
# Posteriormente modificado por YanyVeyron < denilsonmaxi@gmail.com > #
# Comentário de YankVeyron: Bom, eu apenas tornei o Programa mais dinâmico através do uso das #
# Setas do teclado utilizando a Biblioteca < conoi.h > #
# #
# Caso queiram verificar o código antigo, acessem esse link: #
# www.vivaolinux.com.br/scripts/verFonte.php?codigo=722 #
#################################################################################################
*/

#include
#include
#include

/* Definicoes, para facilitar o uso da funcao para desenhar o mapa */
#define CHAO 0
#define PAREDE 1
#define VOCE 2
#define GRAMA 3
#define SAIDA 4

#define ACIMA 72
#define ABAIXO 80
#define DIREITA 77
#define ESQUERDA 75

#define ESC 27

/*Outras definições para tratamento de erros*/
#define OK 1
#define ERRO 2

/* Usuarios de Windows, troquem "clear" por "cls" */
#define LIMPARTELA "cls"

int coluna_atual = 2,
linha_atual = 2;

/* O Mapa */
int mapa[10][40] = {
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,1,
1,0,0,0,0,1,1,1,0,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,
1,0,0,0,0,3,0,0,0,1,1,0,0,0,0,0,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,
1,0,0,1,3,3,3,0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,
1,0,0,0,0,1,0,0,0,1,1,0,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,
1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,
1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,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,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1};

/* Funcao para desenhar o Mapa */
int desenhar_mapa()
{
int linha,coluna;
for (linha=0;linha<10;linha++) {
for (coluna=0;coluna<40;coluna++) {
if ((linha == linha_atual) && (coluna == coluna_atual)) {
printf("@");
continue;
}
if (mapa[linha][coluna] == CHAO)
printf(" ");
if (mapa[linha][coluna] == PAREDE)
printf("=");
if (mapa[linha][coluna] == GRAMA)
printf(".");
if (mapa[linha][coluna] == SAIDA)
printf("#");

}
printf("\n");
}
return OK;
}

int main()
{
int tecla;
do{
system(LIMPARTELA);
desenhar_mapa();
printf("\n##################### L A B I R I N T O #####################################\n");
printf("\n\n ( %c )\n\n( %c ) + ( %c )\n\n ( %c )\n",30,17,16,31); /* Imprime as direcoes */
printf("\nPressione ESC para sair\n");
printf("\n------------------------------------------------------------------------------\n");

tecla = getch();

if ( tecla == ACIMA ) {
linha_atual = linha_atual - 1;
/* Se não for chao ou grama ele volta pra posicao anterior */
if ((mapa[linha_atual][coluna_atual] != CHAO) && (mapa[linha_atual][coluna_atual] != GRAMA) && (mapa[linha_atual][coluna_atual] != SAIDA)) {
linha_atual = linha_atual + 1;


}
}
if ( tecla == ABAIXO ) {
linha_atual = linha_atual + 1;
/* Se não for chao ou grama ou saida ele volta pra posicao anterior */
if ((mapa[linha_atual][coluna_atual] != CHAO) && (mapa[linha_atual][coluna_atual] != GRAMA) && (mapa[linha_atual][coluna_atual] != SAIDA)) {
linha_atual = linha_atual - 1;


}
}
if ( tecla == DIREITA ) {
coluna_atual = coluna_atual + 1;
/* Se não for chao ou grama ou saida ele volta pra posicao anterior */
if ((mapa[linha_atual][coluna_atual] != CHAO) && (mapa[linha_atual][coluna_atual] != GRAMA) && (mapa[linha_atual][coluna_atual] != SAIDA)) {
coluna_atual = coluna_atual - 1;


}
}
if ( tecla == ESQUERDA ) {
coluna_atual = coluna_atual - 1;
/* Se não for chao ou grama ou saida ele volta pra posicao anterior */
if ((mapa[linha_atual][coluna_atual] != CHAO) && (mapa[linha_atual][coluna_atual] != GRAMA) && (mapa[linha_atual][coluna_atual] != SAIDA)) {
coluna_atual = coluna_atual + 1;


}
}
if(mapa[linha_atual][coluna_atual]==SAIDA)
{
system("cls");
printf("\n\n\n\n\n\n\nVoce ganhou");
getch();
tecla = ESC;
}


}while( tecla != ESC );

}

Download labirinto.cpp


Esconder código-fonte

/*
#################################################################################################
# Programa originalmente escrito por <Tiago Negri>                                              #
#                                                                                               #
# Posteriormente modificado por Luís Fred <fredwind@terra.com.br>                               #
# Comentário de Luíz Fred: este programa consiste num joguinho de laborinto. Originalmente o    #
# jogo não tinha  uma saida, e onde já se viu um joguinho de labirinto sem uma saida????? :),   #
# então resolvi fazer algumas modificações no código, como introduzir uma saida e aumentar o    #
# mapa do jogo.                                                                                 #
#                                                                                               #
# Posteriormente modificado por YanyVeyron < denilsonmaxi@gmail.com >                           #
# Comentário de YankVeyron: Bom, eu apenas tornei o Programa mais dinâmico através do uso das   #
# Setas do teclado utilizando a Biblioteca < conoi.h >                                          #
#                                                                                               #
# Caso queiram verificar o código antigo, acessem esse link:                                    #
# www.vivaolinux.com.br/scripts/verFonte.php?codigo=722                                         #
#################################################################################################
*/

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

/* Definicoes, para facilitar o uso da funcao para desenhar o mapa */
#define CHAO 0
#define PAREDE 1
#define VOCE 2
#define GRAMA 3
#define SAIDA 4

#define ACIMA 72
#define ABAIXO 80
#define DIREITA 77
#define ESQUERDA 75

#define ESC 27

/*Outras definições para tratamento de erros*/
#define OK 1
#define ERRO 2

/* Usuarios de Windows, troquem "clear" por "cls" */
#define LIMPARTELA "clear"

int    coluna_atual = 2,
    linha_atual = 2;

/* O Mapa */
int mapa[10][40] = {
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,1,
1,0,0,0,0,1,1,1,0,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,
1,0,0,0,0,3,0,0,0,1,1,0,0,0,0,0,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,
1,0,0,1,3,3,3,0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,
1,0,0,0,0,1,0,0,0,1,1,0,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,
1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,
1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,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,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1
};

/* Funcao para desenhar o Mapa */
int desenhar_mapa()
{
    int linha,coluna;
    for (linha=0;linha<10;linha++) {
       for (coluna=0;coluna<40;coluna++) {
          if ((linha == linha_atual) && (coluna == coluna_atual)) {
             printf("@");
             continue;
          }
          if (mapa[linha][coluna] == CHAO)
             printf(" ");
          if (mapa[linha][coluna] == PAREDE)
             printf("=");
          if (mapa[linha][coluna] == GRAMA)
             printf(".");
     if (mapa[linha][coluna] == SAIDA)
        printf("#");

       }
       printf("\n");
    }
    return OK;
}

int main()
{
    int tecla;
    do{
       system(LIMPARTELA);
       desenhar_mapa();
       printf("\n##################### L A B I R I N T O #####################################\n");
       printf("\n\n    ( %c )\n\n( %c ) + ( %c )\n\n    ( %c )\n",30,17,16,31); /* Imprime as direcoes */
       printf("\nPressione ESC para sair\n");
       printf("\n------------------------------------------------------------------------------\n");

       tecla = getch();

       if ( tecla == ACIMA ) {
          linha_atual = linha_atual - 1;
          /* Se não for chao ou grama ele volta pra posicao anterior */
          if ((mapa[linha_atual][coluna_atual] != CHAO) && (mapa[linha_atual][coluna_atual] != GRAMA) && (mapa[linha_atual][coluna_atual] != SAIDA)) {
             linha_atual = linha_atual + 1;


          }
       }
       if ( tecla == ABAIXO ) {
          linha_atual = linha_atual + 1;
          /* Se não for chao ou grama ou saida ele volta pra posicao anterior */
          if ((mapa[linha_atual][coluna_atual] != CHAO) && (mapa[linha_atual][coluna_atual] != GRAMA) && (mapa[linha_atual][coluna_atual] != SAIDA)) {
             linha_atual = linha_atual - 1;


          }
       }
       if ( tecla == DIREITA ) {
          coluna_atual = coluna_atual + 1;
          /* Se não for chao ou grama ou saida ele volta pra posicao anterior */
          if ((mapa[linha_atual][coluna_atual] != CHAO) && (mapa[linha_atual][coluna_atual] != GRAMA) && (mapa[linha_atual][coluna_atual] != SAIDA)) {
             coluna_atual = coluna_atual - 1;


          }
       }
       if ( tecla == ESQUERDA ) {
          coluna_atual = coluna_atual - 1;
          /* Se não for chao ou grama ou saida ele volta pra posicao anterior */
          if ((mapa[linha_atual][coluna_atual] != CHAO) && (mapa[linha_atual][coluna_atual] != GRAMA) && (mapa[linha_atual][coluna_atual] != SAIDA)) {
             coluna_atual = coluna_atual + 1;


          }
       }
    }while(  tecla != ESC );

}

Scripts recomendados

Campo Minado em C

Emulador de Chip8 (com gráficos)

Tipos de Dados Abstrato - TDA - Números Complexos

Biblioteca math.h

Jogo Windows Invaders (com gráficos)


  

Comentários
[1] Comentário enviado por pintofree em 29/05/2008 - 19:26h

muito massa eheheh curto esses joguinhos simples

[2] Comentário enviado por DarkSign em 30/05/2008 - 14:25h

Interessante. Me ajudou a entender um pouco mais da lógica de jogos, principalmente de labirintos, coisa que ainda n achei muito material disponível.

Só uma ressalva: além de trocar Clear por Cls no Windows, lembrar que a biblioteca <conio.h> e as funções que permitem que uma tecla seja pressionada sem precisar dar o Enter, apenas funcionam no Windows, sendo necessário achar soluções alternativas para o Linux.

[3] Comentário enviado por hunz em 24/04/2009 - 10:15h

Como o DarkSign falou, a biblioteca conio.h não existe - até onde eu sei - para Linux.

Apesar um detalhe, meu nome é com H (Thiago Negri), rs.

Este código é antigo (2005), mas quem quiser um joguinho de labirinto com interface gráfica (SDL) pode pegar deste link: http://server.codigolivre.org.br/dudurox/dudurox3-src/dudurox3-0.3/

Aviso: O código está cheio de gambiarra e foi desenvolvido ao estilo Megazord (um unico arquivo). Peguem leve, foi um dos primeiros jogos que fiz.

[4] Comentário enviado por removido em 16/05/2012 - 12:05h

Tem um projeto de <conio.h> substitutiva para Linux aqui no VOL.
Estava por aqui há um mês atrás, contando desta data.

[5] Comentário enviado por Jonas1311 em 22/05/2012 - 09:54h

Seguinte, creio que não seja necessário tantos testes na condição de colisão

if ((mapa[linha_atual][coluna_atual] != CHAO) && (mapa[linha_atual][coluna_atual] != GRAMA) && (mapa[linha_atual][coluna_atual] != SAIDA)) {

basta escrever...

if(mapa[linha_atual][coluna_atual] == PAREDE){

pois querendo ou não, o que não é CHAO, nem GRAMA e nem SAIDA é PAREDE. E se vcs forem ver, a cada novo objeto que eu queira colocar no mapa, eu vou ter que adicionar && (mapa[linha_atual][coluna_atual] != NOVO OBJETO )


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts