Anda di halaman 1dari 54

/*

===============================================================================
=============================
Name
: pacman.c
Author
: Rafael David Quirino, Marlus Lopes Tavares, Felipe Ferreira Borge
s
Version
: 1.0
Date
: June, 26 / 2011
Copyright : Copyright (c) 2011 Rafael David Quirino, Marlus Lopes Tavares, Fe
lipe Ferreira Borges
Description : PacMan - The Game
------------------Este programa destina-se a implementar o famoso jogo Pacman,
produzido pela
NAMCO em 1980. Todas as partes do cdigo contm os nomes dos autor
es das mesmas e comentrios
que descrevem seu objetivo e, quando necessrio, seu funcionamen
to. H tambm comentrios que
especificam a que funo (ou estrutura) se relaciona uma chave de
fechamento de bloco "}",
quando se trata de uma funo (ou estrutura) muito longa.
Para compilar digite a seguinte instruo: gcc pacman.c -o pacman
-lpthread -lncurses
------------------------------------------References :
rozo dos Santos,

O menu do jogo baseado em um artigo escrito por Leonardo Bar


intitulado "Utilizando a biblioteca NCURSES", veiculado no stio

abaixo:
www.vivaolinux.com.br/artigo/Utilizando-a-biblioteca-NCURSES-P
arte-III?pagina=3 .
-----------------------------------------------------------------------------===============================================================================
=============================
*/

// Bibliotecas utilizadas
#include
#include
#include
#include
#include
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define

<stdio.h>
<stdlib.h>
<time.h>
<pthread.h>
<curses.h>
TAMANHO 33
ENTER 10
ESCAPE 27
FALSO 0
VERDADEIRO 1
EM_ANDAMENTO 0
TERMINADO 1
CAMINHO 0
PAREDE 1
PARADO -1

// Biblioteca padro
// Biblioteca padro
// Para gerao de nmeros aleatrios
// Para utilizao de threads e mutexes de sincronizao
// Para tratamento grfico do terminal

#define
#define
#define
#define
#define

NENHUMA -1
CIMA 0
BAIXO 1
ESQUERDA 2
DIREITA 3

// => Autor(es) : Rafael Quirino.


//////////////////////////////////////
// DECLARAO DE CONSTANTES DO JOGO //
//////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
// Caracteres usados na impresso do jogo
//---------------------------------------------------------------------------------------------------------const char CHAR_CAMINHO = ' ', CHAR_MOEDA = '.', CHAR_PAREDE = '#';
const char PAC_CIMA = 'V', PAC_BAIXO = 'A', PAC_ESQUERDA = '>', PAC_DIREITA = '<
', CHAR_FANTASMA = '@';
//---------------------------------------------------------------------------------------------------------// Posies iniciais dos personagens
const int PACMAN_LINHA
= 19, PACMAN_COLUNA
FANTASMA1_LINHA = 17, FANTASMA1_COLUNA
a
FANTASMA2_LINHA = 17, FANTASMA2_COLUNA
a
FANTASMA3_LINHA = 17, FANTASMA3_COLUNA
a
FANTASMA4_LINHA = 15, FANTASMA4_COLUNA
a

= 15, //Posio inicial do Pacman


= 13, //Posio inicial do 1 Fantasm
= 15, //Posio inicial do 2 Fantasm
= 17, //Posio inicial do 3 Fantasm
= 15; //Posio inicial do 4 Fantasm

// Constantes relacionadas ao centro do labirinto, ou seja, a "casinha" dos fant


asmas
// (Nesta "casinha" no se pode inserir moedas...)
const int FANTASMAS_SUPERIOR_ESQUERDO_LINHA = 15, FANTASMAS_SUPERIOR_ESQUERDO_CO
LUNA = 14,
FANTASMAS_SUPERIOR_DIREITO_LINHA = 16, FANTASMAS_SUPERIOR_DIREITO_COLU
NA = 18,
FANTASMAS_INFERIOR_ESQUERDO_LINHA = 18, FANTASMAS_INFERIOR_ESQUERDO_CO
LUNA = 14,
FANTASMAS_INFERIOR_DIREITO_LINHA = 18, FANTASMAS_INFERIOR_DIREITO_COLU
NA = 18;
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////

// => Autor(es) : Felipe Borges.


////////////////////////
// LABIRINTOS PRONTOS //

////////////////////////
const int labirinto_1[TAMANHO][TAMANHO] =
{
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, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1,
1, 0, 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, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1,
0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1,
0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1,
0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1,
0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1,
0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1,
0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0,
0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1,
1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1,
0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1,
0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1,
0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1,

1, 0, 1, 0, 1, 0, 1,
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1,
1, 0, 1, 0, 1, 1, 1,
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1,
1, 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, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
};//labirinto_1
const int labirinto_2[TAMANHO][TAMANHO] =
{
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, 1,
1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1,
0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1,
1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1,
0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1,
0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1,
0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1,
0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1,
0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1,
0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1,
0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1,
0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1,
0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1,
1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1,
0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1,
0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1,
0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1,

1, 1, 1, 1, 1, 1, 1, 1, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0,
1, 1, 1, 1, 1, 1, 1, 1, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0,
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, 1, 0, 1, 0, 1, 0, 1, 0,
0, 1, 0, 1, 0, 1, 0, 1, 0,
0, 1, 0, 1, 0, 1, 0, 1, 0,
0, 1, 0, 1, 0, 0, 0, 0, 0,
0, 1, 0, 1, 0, 1, 1, 1, 1,
0, 1, 0, 1, 0, 0, 0, 0, 0,
0, 1, 0, 1, 1, 1, 1, 1, 1,
0, 1, 0, 1, 0, 0, 0, 0, 0,
0, 1, 0, 1, 0, 1, 1, 1, 1,
0, 1, 0, 1, 0, 0, 0, 0, 0,
0, 1, 0, 1, 0, 1, 0, 1, 0,
0, 1, 0, 1, 0, 1, 0, 1, 0,
0, 1, 0, 1, 0, 0, 0, 0, 0,
0, 1, 0, 1, 0, 0, 1, 1, 1,
0, 1, 0, 1, 0, 0, 1, 0, 0,
0, 1, 0, 1, 0, 0, 1, 0, 0,
0, 1, 0, 1, 0, 0, 1, 1, 1,
0, 1, 0, 1, 0, 0, 0, 0, 0,
0, 1, 0, 1, 0, 0, 0, 0, 0,
0, 1, 0, 1, 1, 1, 1, 1, 1,
0, 1, 0, 1, 0, 0, 0, 0, 0,

0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 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, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
};//labirinto_2
const int labirinto_3[TAMANHO][TAMANHO] =
{
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, 1,
1, 0, 1, 0, 0, 0, 0,
0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1,
1, 0, 1, 0, 0, 1, 1,
0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1,
1, 0, 1, 0, 0, 0, 0,
0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1,
0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1,
0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1,
0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1,
0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1,
0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1,
0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1,
0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1,
0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 0, 0, 1, 0, 1,
0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1,
1, 0, 0, 1, 1, 0, 1,
0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1,
1, 0, 1, 1, 0, 0, 0,
0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1,
1, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1,
1, 0, 1, 1, 0, 0, 0,

0, 1, 0, 1, 0, 1, 0, 1, 0,
0, 1, 0, 1, 0, 1, 0, 1, 0,
0, 1, 0, 1, 0, 1, 0, 1, 0,
0, 1, 0, 1, 0, 1, 0, 1, 0,
0, 1, 0, 1, 0, 1, 0, 1, 0,
0, 1, 0, 1, 0, 1, 0, 1, 0,
0, 1, 0, 1, 0, 1, 0, 1, 0,
0, 1, 0, 1, 0, 0, 0, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
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, 1,
1, 1, 1, 1, 1, 1, 1, 0, 1,
0, 0, 0, 0, 0, 0, 1, 0, 1,
1, 1, 1, 1, 0, 0, 1, 0, 1,
0, 0, 0, 0, 0, 0, 1, 0, 1,
0, 1, 1, 0, 0, 0, 1, 0, 1,
0, 0, 1, 0, 0, 0, 1, 0, 1,
0, 0, 1, 0, 0, 0, 1, 0, 1,
0, 0, 1, 0, 0, 0, 1, 0, 1,
0, 0, 1, 0, 0, 0, 1, 0, 1,
0, 0, 1, 0, 0, 0, 1, 1, 1,
0, 0, 1, 0, 0, 0, 0, 0, 0,
0, 0, 1, 0, 0, 0, 0, 0, 0,
0, 0, 1, 0, 0, 0, 1, 1, 1,
1, 1, 1, 1, 1, 0, 1, 0, 0,
0, 0, 1, 0, 0, 0, 1, 0, 0,

0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1,
1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1,
1, 0, 0, 0, 1, 0, 1, 0, 0, 1,
0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1,
1, 0, 1, 0, 1, 0, 1, 0, 0, 1,
0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1, 0, 0, 1,
0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1, 0, 0, 1,
0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1, 0, 0, 1,
0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1, 0, 1, 1,
0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1, 0, 0, 0,
0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1, 1, 1, 1,
0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1, 0, 0, 0,
0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 0, 0, 0, 1, 1, 1,
0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1,
1, 0, 1, 0, 0, 1, 1, 0, 0, 0,
0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1,
1, 0, 1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 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, 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
};//labirinto_3

0, 0, 0, 1, 1, 1,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 1, 1, 1,
0, 0, 0, 1, 0, 1,
0, 0, 0, 1, 0, 1,
0, 0, 0, 1, 0, 1,
0, 0, 0, 1, 0, 1,
1, 0, 0, 1, 0, 1,
0, 0, 0, 1, 0, 1,
1, 1, 1, 1, 0, 1,
0, 0, 0, 0, 0, 1,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
1, 1, 1, 1, 1, 1,

const int labirinto_4[33][33] =


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, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1, 1, 1, 1, 1, 1, 0, 0, 0, 1,
0, 0, 0, 0, 0, 1, 0, 0, 0, 1,
0, 0, 0, 0, 0, 1, 0, 0, 0, 1,
0, 0, 0, 0, 0, 1, 0, 1, 1, 1,
0, 0, 0, 0, 0, 1, 1, 1, 0, 0,
0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
0, 0, 0, 0, 0, 1, 0, 0, 0, 0,

{
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, 1,
1, 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, 1,
1, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 1,
1, 0, 0, 0, 1, 1, 1,
1, 1, 1, 0, 0, 0, 1,
1, 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, 1,
1, 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, 1,
1, 0, 0, 0, 1, 1, 1,
1, 1, 1, 0, 0, 0, 1,
1, 0, 0, 0, 1, 0, 0,
0, 0, 1, 0, 0, 0, 1,
1, 0, 0, 0, 1, 0, 0,

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, 0, 0, 0, 0, 0,
1, 0, 0, 0, 1, 1, 1, 1, 1,
1, 0, 0, 0, 1, 0, 0, 0, 0,
1, 0, 0, 0, 1, 0, 0, 0, 0,
1, 1, 1, 0, 1, 0, 0, 0, 0,
0, 0, 1, 1, 1, 0, 0, 0, 0,
1, 1, 1, 1, 1, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0, 0, 0, 0,

0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1,
1, 0, 0, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1,
1, 0, 0, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1,
1, 0, 0, 0, 1, 0, 0, 0, 0, 0,
0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1,
1, 0, 0, 0, 0, 0, 1, 1, 1, 1,
0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1,
1, 0, 0, 0, 0, 0, 1, 0, 0, 0,
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1,
1, 0, 0, 1, 1, 1, 1, 0, 0, 0,
1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1,
1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1, 1, 1, 1, 1, 1, 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, 1, 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, 1, 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
1, 0, 0, 0, 1, 1, 1, 1, 1, 1,
0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1,
1, 0, 0, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 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, 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, 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, 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, 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, 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, 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
};//labirinto_4

0, 1, 0, 0, 0, 0,
0, 1, 0, 0, 0, 0,
0, 0, 0, 1, 1, 1,
0, 0, 0, 1, 0, 0,
0, 0, 0, 1, 0, 0,
0, 0, 0, 1, 1, 1,
0, 1, 0, 0, 0, 0,
0, 1, 1, 1, 1, 1,
0, 1, 0, 0, 0, 0,
0, 1, 0, 0, 0, 0,
0, 1, 0, 0, 0, 0,
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, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
1, 1, 1, 1, 1, 1,

const int labirinto_5[33][33] =


1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 1, 0, 1, 1, 0, 1, 1, 0,
0, 1, 1, 0, 1, 1, 0, 1, 1, 0,
0, 1, 1, 0, 1, 1, 0, 1, 1, 0,
0, 1, 1, 0, 1, 1, 0, 1, 1, 0,
0, 1, 1, 0, 1, 1, 0, 1, 1, 0,

{
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, 1,
1, 0, 1, 1, 0, 1, 1,
1, 1, 0, 1, 1, 0, 1,
1, 0, 1, 1, 0, 1, 1,
1, 1, 0, 1, 1, 0, 1,
1, 0, 1, 1, 0, 1, 1,
1, 1, 0, 1, 1, 0, 1,
1, 0, 1, 1, 0, 1, 1,
1, 1, 0, 1, 1, 0, 1,
1, 0, 1, 1, 0, 1, 1,
1, 1, 0, 1, 1, 0, 1,
1, 0, 1, 1, 0, 1, 1,

1 ,1 ,1, 1, 1, 1, 1, 1, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 1, 0, 1, 1, 0, 1, 1,
0, 1, 1, 0, 1, 1, 0, 1, 1,
0, 1, 1, 0, 1, 1, 0, 1, 1,
0, 1, 1, 0, 1, 1, 0, 1, 1,
0, 1, 1, 0, 1, 1, 0, 1, 1,
0, 1, 1, 0, 1, 1, 0, 1, 1,

0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1,
1, 0, 1, 1, 0, 1, 1, 0, 1, 1,
0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1,
1, 0, 1, 1, 0, 1, 1, 0, 1, 1,
0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1,
1, 0, 1, 1, 0, 1, 1, 0, 1, 1,
0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1,
1, 0, 1, 1, 0, 1, 1, 0, 1, 1,
0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 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, 1,
1, 0, 1, 1, 1, 1, 1, 1, 1, 1,
0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1,
1, 0, 1, 1, 1, 1, 1, 1, 1, 1,
0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1,
1, 0, 1, 1, 1, 1, 1, 1, 1, 1,
0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1,
1, 0, 1, 1, 1, 1, 1, 1, 1, 1,
0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1,
1, 0, 1, 1, 1, 1, 1, 1, 1, 1,
0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1,
1, 0, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1,
1, 0, 1, 1, 1, 1, 1, 1, 1, 1,
0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1,
1, 0, 1, 1, 1, 1, 1, 1, 1, 1,
0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 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, 1,
1, 0, 1, 1, 1, 1, 1, 1, 1, 1,
0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1,
1, 0, 1, 1, 1, 1, 1, 1, 1, 1,
0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 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, 1,
1, 0, 1, 1, 0, 1, 1, 0, 1, 1,
0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1,
1, 0, 1, 1, 0, 1, 1, 0, 1, 1,
0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1,
1, 0, 1, 1, 0, 1, 1, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1,
1, 0, 1, 1, 0, 1, 1, 0, 1, 1,
0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1,
1, 0, 1, 1, 0, 1, 1, 0, 1, 1,
0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 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, 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, 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
};//labirinto_5

0, 1, 1, 0, 1, 1,
0, 1, 1, 0, 1, 1,
0, 1, 1, 0, 1, 1,
0, 1, 1, 0, 1, 1,
0, 0, 0, 0, 0, 0,
0, 1, 1, 1, 1, 1,
0, 1, 0, 0, 0, 0,
0, 1, 0, 1, 1, 1,
0, 1, 0, 1, 0, 0,
0, 1, 0, 1, 0, 0,
0, 1, 0, 1, 1, 1,
0, 1, 0, 0, 0, 0,
0, 1, 1, 1, 1, 1,
0, 0, 0, 0, 0, 0,
1, 1, 0, 1, 1, 1,
1, 1, 0, 1, 1, 1,
0, 0, 0, 0, 0, 0,
1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1,
0, 0, 0, 0, 0, 0,
1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
1, 1, 1, 1, 1, 1,

const int labirinto_6[33][33] =


{
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, 0, 1, 1, 1, 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, 0, 1,
1, 0, 1, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1,
1, 0, 1, 0, 1, 1, 1,
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1,
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1,
0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 0, 0, 1, 0, 1,
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1,
1, 0, 1, 0, 0, 0, 1,
0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 0,
0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1,
0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1,
0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1,
0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1,
0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
1, 0, 1, 0, 1, 0, 1,
0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 1, 1, 0, 1,
1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1,
0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1,
0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 0,
0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 0, 0, 1,
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1,
1, 0, 0, 0, 1, 0, 1,
0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1,
1, 0, 1, 0, 1, 0, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1,
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1,
1, 0, 1, 0, 1, 1, 1,
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1,
1, 0, 1, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1,
1, 0, 1, 1, 1, 1, 1,
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1,
1, 0, 0, 0, 0, 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, 0, 0, 0, 0, 1,
1, 1, 1, 1, 1, 1, 1,

0, 0, 0, 0, 0, 0, 0, 0, 0,
1, 1, 1, 1, 1, 1, 1, 1, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0,
1, 1, 1, 1, 1, 1, 1, 1, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 1, 1, 1, 1, 1, 1, 1,
0, 1, 0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 1, 1, 1, 1, 1, 1,
0, 1, 0, 1, 0, 0, 0, 0, 0,
0, 1, 0, 1, 0, 0, 0, 0, 0,
0, 1, 0, 1, 0, 0, 0, 0, 0,
0, 1, 0, 1, 0, 0, 0, 0, 0,
0, 1, 0, 1, 0, 0, 1, 1, 1,
0, 0, 0, 0, 0, 0, 1, 0, 0,
0, 1, 0, 1, 0, 0, 1, 0, 0,
0, 1, 0, 1, 0, 0, 1, 1, 1,
0, 1, 0, 1, 0, 0, 0, 0, 0,
0, 1, 0, 1, 0, 0, 0, 0, 0,
0, 1, 0, 1, 1, 1, 1, 1, 1,
0, 1, 0, 0, 0, 0, 0, 0, 0,
0, 1, 1, 1, 1, 1, 1, 1, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0,
1, 1, 1, 1, 1, 1, 1, 1, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0,
1, 1, 1, 1, 1, 1, 1, 1, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0,
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,
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
};//labirinto_6
const int labirinto_7[33][33] =
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1, 1, 1, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
1, 1, 1, 0, 1, 1, 0, 0, 1, 0,
0, 0, 0, 0, 0, 1, 0, 0, 1, 0,
0, 0, 0, 0, 0, 1, 0, 0, 1, 0,
1, 1, 1, 0, 0, 1, 0, 0, 1, 0,
0, 0, 1, 0, 0, 1, 0, 0, 1, 0,
0, 0, 1, 0, 0, 1, 0, 0, 1, 0,
0, 0, 0, 0, 0, 1, 0, 0, 1, 0,
0, 1, 1, 1, 0, 1, 0, 0, 1, 0,
0, 0, 0, 1, 0, 1, 0, 0, 1, 0,
0, 0, 0, 1, 0, 1, 0, 0, 1, 0,
1, 1, 1, 1, 0, 1, 0, 0, 1, 0,
0, 0, 0, 0, 0, 1, 0, 0, 1, 0,
0, 1, 1, 1, 1, 1, 0, 0, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
1, 1, 1, 0, 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,
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, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 1,
1, 0, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 0, 1,
1, 0, 1, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0, 1,
1, 0, 1, 0, 0, 1, 0,
0, 1, 0, 0, 1, 0, 1,
1, 0, 1, 0, 0, 1, 0,
0, 1, 0, 0, 1, 0, 1,
1, 0, 1, 0, 0, 1, 0,
0, 1, 0, 0, 1, 0, 1,
1, 0, 1, 0, 0, 1, 0,
0, 1, 0, 0, 1, 0, 1,
1, 0, 1, 0, 0, 1, 0,
0, 1, 0, 0, 1, 0, 1,
1, 0, 1, 0, 0, 1, 0,
0, 1, 0, 0, 1, 0, 1,
1, 0, 1, 0, 0, 1, 0,
0, 1, 0, 0, 1, 0, 1,
1, 0, 1, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0, 1,
1, 0, 0, 0, 0, 1, 0,
0, 1, 0, 0, 0, 0, 1,
1, 0, 1, 0, 0, 1, 0,
0, 1, 0, 0, 1, 0, 1,
1, 0, 1, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0, 1,
1, 0, 1, 0, 0, 1, 0,
0, 1, 0, 0, 1, 0, 1,
1, 0, 1, 0, 0, 1, 0,
0, 1, 0, 0, 1, 0, 1,
1, 0, 1, 0, 0, 1, 0,
0, 1, 0, 0, 1, 0, 1,
1, 0, 0, 0, 0, 1, 0,
0, 1, 0, 0, 0, 0, 1,
1, 0, 1, 0, 0, 1, 0,
0, 1, 0, 0, 1, 0, 1,
1, 0, 1, 0, 0, 1, 0,
0, 1, 0, 0, 1, 0, 1,
1, 0, 1, 0, 0, 1, 0,
0, 1, 0, 0, 1, 0, 1,
1, 0, 1, 0, 0, 1, 0,
0, 1, 0, 0, 1, 0, 1,
1, 0, 1, 0, 0, 1, 0,
0, 1, 0, 0, 1, 0, 1,
1, 0, 1, 0, 0, 1, 0,
0, 1, 0, 0, 1, 0, 1,
1, 0, 1, 0, 0, 1, 0,
0, 1, 0, 0, 1, 0, 1,
1, 0, 1, 0, 0, 1, 1,
1, 1, 0, 0, 1, 0, 1,
1, 0, 1, 0, 0, 0, 0,

1 ,1 ,1, 1, 1, 1, 1, 1, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0,
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, 1, 1, 1, 1, 1, 1, 1, 1,
0, 1, 0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 0, 1, 1, 0, 1, 1,
0, 1, 0, 0, 1, 0, 0, 0, 0,
0, 1, 0, 0, 1, 0, 0, 0, 0,
0, 1, 0, 0, 1, 0, 0, 1, 1,
0, 1, 0, 0, 1, 0, 0, 1, 0,
0, 1, 0, 0, 1, 0, 0, 1, 0,
0, 1, 0, 0, 1, 0, 0, 0, 0,
0, 1, 0, 0, 1, 0, 1, 1, 1,
0, 1, 0, 0, 1, 0, 1, 0, 0,
0, 1, 0, 0, 1, 0, 1, 0, 0,
0, 1, 0, 0, 1, 0, 1, 1, 1,
0, 1, 0, 0, 1, 0, 0, 0, 0,
0, 1, 0, 0, 1, 1, 1, 1, 1,
0, 1, 0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 0, 0, 0, 0, 0, 0,
0, 1, 1, 1, 1, 1, 0, 1, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
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, 1, 0, 1,
1, 0, 1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1,
1, 0, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 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, 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, 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
};//labirinto_7

0, 0, 0, 0, 0, 0,
1, 1, 1, 1, 1, 1,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
1, 1, 1, 1, 1, 1,

const int labirinto_8[33][33] =


1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1, 1, 1, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
1, 1, 0, 0, 1, 1, 0, 0, 1, 0,
0, 0, 0, 0, 0, 1, 0, 0, 1, 0,
0, 0, 0, 0, 0, 1, 0, 0, 1, 0,
1, 1, 1, 0, 0, 1, 0, 0, 1, 0,
0, 0, 1, 0, 0, 1, 0, 0, 1, 0,
0, 0, 1, 0, 0, 1, 0, 0, 1, 0,
0, 0, 0, 0, 0, 1, 0, 0, 1, 0,
0, 1, 1, 1, 0, 1, 0, 0, 1, 0,
0, 0, 0, 1, 0, 1, 0, 0, 1, 0,
0, 0, 0, 1, 0, 1, 0, 0, 1, 0,
1, 1, 1, 1, 0, 1, 0, 0, 1, 0,
0, 0, 0, 0, 0, 1, 0, 0, 1, 0,
0, 1, 1, 1, 1, 1, 0, 0, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0, 1, 0,

{
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, 1,
1, 0, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 0, 1,
1, 0, 1, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0, 1,
1, 0, 0, 0, 0, 1, 0,
0, 1, 0, 0, 1, 0, 1,
1, 0, 1, 0, 0, 1, 0,
0, 1, 0, 0, 1, 0, 1,
1, 0, 1, 0, 0, 1, 0,
0, 1, 0, 0, 1, 0, 1,
1, 0, 0, 0, 0, 1, 0,
0, 1, 0, 0, 1, 0, 1,
1, 0, 1, 0, 0, 1, 0,
0, 1, 0, 0, 1, 0, 1,
1, 0, 1, 0, 0, 1, 0,
0, 1, 0, 0, 1, 0, 1,
1, 0, 0, 0, 0, 1, 0,
0, 1, 0, 0, 1, 0, 1,
1, 0, 1, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0, 1,
1, 0, 0, 0, 0, 1, 0,
0, 1, 0, 0, 0, 0, 1,
1, 0, 1, 0, 0, 1, 0,
0, 1, 0, 0, 1, 0, 1,
1, 0, 1, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0, 1,
1, 0, 0, 0, 0, 1, 0,
0, 1, 0, 0, 1, 0, 1,
1, 0, 1, 0, 0, 1, 0,
0, 0, 0, 0, 1, 0, 1,
1, 0, 1, 0, 0, 1, 0,
0, 1, 0, 0, 1, 0, 1,
1, 0, 0, 0, 0, 1, 0,
0, 1, 0, 0, 0, 0, 1,
1, 0, 1, 0, 0, 1, 0,
0, 1, 0, 0, 1, 0, 1,
1, 0, 1, 0, 0, 1, 0,
0, 1, 0, 0, 1, 0, 1,
1, 0, 1, 0, 0, 1, 0,
0, 0, 0, 0, 1, 0, 1,
1, 0, 1, 0, 0, 1, 0,

1 ,1 ,1, 1, 1, 1, 1, 1, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0,
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, 1, 1, 1, 1, 1, 1, 1, 1,
0, 1, 0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 0, 1, 1, 0, 1, 1,
0, 1, 0, 0, 1, 0, 0, 0, 0,
0, 1, 0, 0, 1, 0, 0, 0, 0,
0, 1, 0, 0, 1, 0, 0, 1, 1,
0, 1, 0, 0, 1, 0, 0, 1, 0,
0, 1, 0, 0, 1, 0, 0, 1, 0,
0, 1, 0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 0, 1, 0, 1, 1, 1,
0, 1, 0, 0, 1, 0, 1, 0, 0,
0, 1, 0, 0, 1, 0, 1, 0, 0,
0, 1, 0, 0, 0, 0, 1, 1, 1,
0, 1, 0, 0, 1, 0, 0, 0, 0,
0, 1, 0, 0, 1, 1, 1, 1, 1,
0, 1, 0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 0, 0, 0, 0, 0, 0,

0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1,
1, 0, 0, 0, 0, 1, 0, 0, 1, 1,
1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1,
1, 0, 1, 0, 0, 1, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1,
1, 0, 1, 0, 0, 1, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1,
1, 0, 1, 0, 0, 1, 1, 1, 1, 1,
1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 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, 1, 0, 1,
1, 0, 1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1,
1, 0, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 0, 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, 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, 0, 0, 0, 0, 0, 0, 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
};//labirinto_8

1, 1, 1, 0, 1, 1,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
1, 1, 1, 1, 1, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
1, 1, 1, 1, 1, 1,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
1, 1, 1, 1, 1, 1,

// => Autor(es) : Rafael Quirino, Marlus Tavares, Felipe Borges.


//////////////////////////////////////////////////////////////////////////////
// DECLARAO DAS ESTRUTURAS UTILIZADAS PARA CONTROLE DOS ELEMENTOS DO JOGO //
//////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
//-------------------------------------------------------------------------------------------------------------------//PACMAN
//-------------------------------------------------------------------------------------------------------------------typedef struct
{
int linha;
// Posio linha do pacman
int coluna;
// Posio coluna do pacman
int direcao;
// Direo escolhida pelo usurio
int movimento;
// Movimento efetivamente realizado
int velocidade;
// Velocidade do pacman (tempo de espera em n
anosegundos)
char char_representante;
a, baixo, esquerda, direita)

// Caracter usado para impresso do pacman (cim

}Pacman;
//-------------------------------------------------------------------------------------------------------------------//-------------------------------------------------------------------------------------------------------------------//FANTASMA

//-------------------------------------------------------------------------------------------------------------------typedef struct
{
int linha;
// Posio linha do fantasma
int coluna;
// Posio coluna do fantasma
int direcao;
// Direcao pretendida pelo fanta
sma
int movimento;
// Movimento realizado pelo fantasma
int velocidade;
// Velocidade do fantasma
char char_representante;

// Caracter usado para impresso do fantas

ma
}Fantasma;
//-------------------------------------------------------------------------------------------------------------------//-------------------------------------------------------------------------------------------------------------------//TABULEIRO
//-------------------------------------------------------------------------------------------------------------------typedef struct
{
int labirinto[33][33];
// Labirinto do mapa
int matriz_moedas[33][33];
// Posies das moedas
int numero_moedas;
// Nmero de moedas em um determ
inado momento
int numero_maximo_moedas;
// Nmero inicial de moedas
int estado;
// Estado do jogo , necessrio p
ara notificao de finalizao das threads
int vitorias;
// Nmero de vitrias do jogador
int zerado;
// Para saber se um jogo foi "
zerado" (se houve 8 vitrias seguidas)
int pausado;
// Para saber se o jogo est pau
sado ou no
Fantasma
Fantasma
Fantasma
Fantasma

fantasma1;
fantasma2;
fantasma3;
fantasma4;

Pacman pacman;

//
//
//
//

Fantasma
Fantasma
Fantasma
Fantasma

1
2
3
4

// Pacman

}Mapa;
//-------------------------------------------------------------------------------------------------------------------////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////

// => Autor(es) : Rafael Quirino.


////////////////////////////////////////////////////////////////////////////////
///

// Prottipo das funes de inicializao e finalizao dos componentes curses.h //


////////////////////////////////////////////////////////////////////////////////
///
//-------------------------------------------------------------------------------------------------------------------------------------------// Funes auxiliares
//-------------------------------------------------------------------------------------------------------------------------------------------void copiar_matriz(const int[TAMANHO][TAMANHO], int[TAMANHO][TAMANHO]);
// Copia a matriz do 1 argumento na matriz do 2 argumento
void imprimir_vitoria(void);
// Imprime a mensagem de vitria na tela
void imprimir_derrota(void);
// Imprime a mensagem de derrota na tela
void imprimir_inicio(void);
// Animao de abertura
void imprimir_final(void);
// Animao de final de jogo
void *imprimir_pausa(void*);
// Animao de pausa (Thread separada)
void contagem_regressiva(void);
// Contagem regressiva para o incio da "partida"
//-------------------------------------------------------------------------------------------------------------------------------------------//------------------------------------------------------------------------------// Funes bsicas de inicializao
//------------------------------------------------------------------------------void init(void);
// Inicia as funes grficas da biblioteca curses.h
void end(void);
// Finaliza as funes grficas da biblioteca curses.h
//------------------------------------------------------------------------------//------------------------------------------------------------------------------// Funes relacionadas aos menus
//------------------------------------------------------------------------------void criar_menu(WINDOW*);
// Cria barra de menu
WINDOW **criar_itens_menu(int);
// Cria a janela de itens
void deletar_itens_menu(WINDOW**,int); // Deleta a janela de itens
int scroll_menu(WINDOW**, int, int);
// Permite rolagem
//------------------------------------------------------------------------------////////////////////////////////////////////////
// Prottipo das funes relacionadas ao jogo //
////////////////////////////////////////////////
//-------------------------------------------------------------------------------------------------------------------------------------------// Funes relacionadas ao pacman
//-------------------------------------------------------------------------------------------------------------------------------------------void init_pacman(Pacman*);
// Inicializa uma struct Pacman
void choose_char_pacman(Mapa*);
// Escolhe um char para
o Pacman (cima, baixo, esquerda, direita)
int is_possible_pacman(Mapa*);
// Testa se possvel reali
zar o movimentos solicitado pelo usurio
//--------------------------------------------------------------------------------------------------------------------------------------------

// Funes relacionadas ao fantasma


//-------------------------------------------------------------------------------------------------------------------------------------------void init_fantasma(Fantasma*, int);
// Inicializa um
a struct Fantasma
int is_possible_fantasma(Mapa*, int);
// Testa a possibilidade
de um movimento calculado para o fantasma "int"
void atualiza_posicao_fantasma(Mapa*, int);
// Atualiza a posio do fantasma "i
nt"
void choose_direction(Mapa*, int);
// Calcula um mo
vimento para o fantasma "int"
//-------------------------------------------------------------------------------------------------------------------------------------------// Funes relacionadas ao mapa
//-------------------------------------------------------------------------------------------------------------------------------------------void init_mapa(int[TAMANHO][TAMANHO], Mapa*, Pacman*, Fantasma*, Fantasma*, Fant
asma*, Fantasma*); // Inicializa uma struct Mapa
void escolher_mapa_rand(int[TAMANHO][TAMANHO], Mapa*);
// E
scolhe um mapa randomicamente
void draw_mapa(Mapa*);
// Imprime o jogo na tela
//-------------------------------------------------------------------------------------------------------------------------------------------// Funes relacionadas ao funcionamento do jogo, em um nvel mais alto, por assim diz
er...
//-------------------------------------------------------------------------------------------------------------------------------------------void play(int);
// Funo inicializao do jogo,
que controla as aes do Pacman
//-------------------------------------------------------------------------------------------------------------------------------------------// Threads do jogo
//-------------------------------------------------------------------------------------------------------------------------------------------void *thread_fantasma1(void*);
// Funo de controle do 1 fantasma
void *thread_fantasma2(void*);
// Funo de controle do 2 fantasma
void *thread_fantasma3(void*);
// Funo de controle do 3 fantasma
void *thread_fantasma4(void*);
// Funo de controle do 4 fantasma
void iniciar_threads(Mapa *);
// Funo que inicia os threads
void terminar_threads();
// Funo que finaliza os threads
//--------------------------------------------------------------------------------------------------------------------------------------------

// => Autor(es) : Rafael Quirino


/////////////////////////////////////
// Declarao de variveis globais //
/////////////////////////////////////
//-------------------------------------------------------------------------------------------------------------------------------------------// Pontos do jogador acumulados durante partidas vencidas sucessivamente
//-------------------------------------------------------------------------------------------------------------------------------------------int pontos = 0;
//------------------------------------------------------------------------------

--------------------------------------------------------------// Threads dos fantasmas e um Mutex para sincronizao das threads do jogo
// (Todas as threads acessam a funo draw_mapa(Mapa*), o que leva a necessidade de
sincronizao do acesso a mesma)
//-------------------------------------------------------------------------------------------------------------------------------------------pthread_t f1, f2, f3, f4, pausa;
pthread_mutex_t mutex_mapa;
//--------------------------------------------------------------------------------------------------------------------------------------------

// => Autor(es) : Rafael Quirino.


// Funo principal do programa
int main()
{
int key;
int item_selecionado = -1;
WINDOW **itens_menu;
WINDOW *menu;
srand(time(NULL));
init();
// Inicializao das funes grficas da biblioteca curses.h
imprimir_inicio();
clear();
do {
menu = subwin(stdscr, 1, 80, 0, 0);
criar_menu(menu);
move(3,1);
printw("F5 - Novo Jogo");
move(4,1);
printw("ESC - Sair");
refresh();
key = getch();
if (key == KEY_F(5)) {
itens_menu = criar_itens_menu(0);
item_selecionado = scroll_menu(itens_menu, 9, 0);
deletar_itens_menu(itens_menu, 10);
if (item_selecionado < 0) {
printw("\n\n\n\nNenhum item foi selecionado.");
refresh();
}
else {
play(item_selecionado + 1);
}
touchwin(stdscr);
refresh();
}

delwin(menu);
clear();
}while(key != ESCAPE);
pthread_mutex_destroy(&mutex_mapa);
end(); // Finalizao das funes grficas da biblioteca curses.h
return 0;
}//int main()

// => Autor(es) : Rafael Quirino.


// Copia a matriz_a na matriz_b
void copiar_matriz(const int matriz_a[TAMANHO][TAMANHO], int matriz_b[TAMANHO][T
AMANHO])
{
int i, j;
for(i = 0; i < TAMANHO; i++)
for(j = 0; j < TAMANHO; j++)
matriz_b[i][j] = matriz_a[i][j];
}

// => Autor(es) : Rafael Quirino.


// Imprime uma mensagem de vitria na tela
void imprimir_vitoria()
{
move(4, 102);
printw("+-----------------+");
move(5, 102);
printw("| VOCE GANHOU !!! |");
move(6, 102);
printw("+-----------------+");
move(8, 102);
printw("Pressione <enter> para sair...");
}

// => Autor(es) : Rafael Quirino.


// Imprime uma mensagem de derrota na tela
void imprimir_derrota()
{
move(4, 102);

printw("+-----------------+");
move(5, 102);
printw("| VOCE PERDEU ... |");
move(6, 102);
printw("+-----------------+");
move(8, 102);
printw("Pressione <enter> para sair...");
}

// => Rafael Quirino


// Animao de entrada
void imprimir_inicio()
{
int i;
move(0,0);
printw("MAXIMIZE O TERMINAL!");
move(1,0);
printw("--------------------");
refresh();
usleep(5000000);
move(0,0);
printw("
");
printw("
");
refresh();
for(i = 0; i < 15; i++)
{
move(i, 67);
printw("+-------------------+");
move(i + 1, 67);
printw("| PACMAN - THE GAME |");
move(i + 2, 67);
printw("+-------------------+");
refresh();
usleep(50000);
move(i, 67);
printw("
move(i + 1, 67);
printw("
move(i + 2, 67);
printw("
refresh();
}
move(15, 67);
printw("+-------------------+");
move(16, 67);
printw("| PACMAN - THE GAME |");

");
");
");

move(17, 67);
printw("+-------------------+");
refresh();
usleep(3000000);
}//void imprimir_inicio()

// => Rafael Quirino


// Imprime a mensagem de final de jogo
void imprimir_final()
{
int i;
for(i = 28; i > 0; i--)
{
move(i, 67);
printw("+--------------+");
move(i + 1, 67);
printw("| PARABENS !!! |");
move(i + 2, 67);
printw("+--------------+");
move(i + 4, 71);
printw("Autores");
move(i + 6, 65);
printw("Rafael David Quirino");
move(i + 8, 65);
printw("Marlus Lopes Tavares");
move(i + 10, 65);
printw("Felipe Ferreira Borges");
refresh();
usleep(400000);
move(i, 67);
printw("
move(i + 1, 67);
printw("
move(i + 2, 67);
printw("
move(i +
printw("
move(i +
printw("
move(i +
printw("
move(i +
printw("

");
");
");

4, 71);
");
6, 65);
");
8, 65);
");
10, 65);

refresh();

");

}
}//void imprimir_final()

// => Autor(es) : Rafael Quirino


// Imprime a mensagem de pausa
void *imprimir_pausa(void *arg)
{
move(7, 102);
printw("Pressione 'p' para continuar ...");
while(VERDADEIRO)
{
move(5, 102);
printw("

PAUSA");

refresh();
usleep(500000);
move(5, 102);
printw("

");

refresh();
usleep(500000);
}
return NULL;
}//void *imprimir_pausa(void *arg)

// => Autor(es) : Rafael Quirino


// Contagem regressiva para o incio de uma "partida"
void contagem_regressiva()
{
int i;
move(4, 102);
printw("Prepare-se ...");
for(i = 0; i < 5; i++)
{
move(5, 102);
printw("
%d", 5 - i);
printf("\a");
refresh();
usleep(1000000);
}

move(4, 102);
printw("Vai !!!
move(5, 102);
printw("
");

");

refresh();
usleep(1000000);
}//void contagem_regressiva()

// => Autor(es) : Rafael Quirino.


// Essa funo faz inicializao de certos componentes da biblioteca ncurses
void init()
{
initscr();
// Inicializando as funes grficas da biblioteca curses.h
start_color(); // Tornando o uso das cores possveis
//////////////////////////////////
// Definio dos pares de cores //
//////////////////////////////////
//--------------------------------------// Fundo preto
//--------------------------------------// Texto branco / Fundo preto
init_pair(1,COLOR_WHITE,COLOR_BLACK);
//--------------------------------------// Texto azul / Fundo preto
init_pair(2,COLOR_BLUE,COLOR_BLACK);
//--------------------------------------// Texto verde / Fundo preto
init_pair(3,COLOR_GREEN,COLOR_BLACK);
//--------------------------------------// Texto magenta / Fundo preto
init_pair(4,COLOR_MAGENTA,COLOR_BLACK);
//--------------------------------------// Texto vermelho / Fundo preto
init_pair(5,COLOR_RED,COLOR_BLACK);
//--------------------------------------// Texto amarelo / Fundo preto
init_pair(6,COLOR_YELLOW,COLOR_BLACK);
//--------------------------------------// Fundo branco
//--------------------------------------// Texto preto / Fundo branco
init_pair(7,COLOR_BLACK,COLOR_WHITE);
//--------------------------------------// Texto azul / Fundo branco
init_pair(8,COLOR_BLUE,COLOR_WHITE);
//--------------------------------------bkgd(COLOR_PAIR(1));

// Define como padro o 1 par de cores

curs_set(0);

// Faz com que o cursor fsico fique invisv

el
noecho();
na tela
keypad(stdscr,TRUE);

// Impede que as teclas digitadas apaream


// Ativa as teclas de funo

}//void init()

// => Autor(es) : Rafael Quirino.


//Finaliza os componentes da biblioteca ncurses
void end()
{
endwin();
exit(0);
}

// => Autor(es) : Rafael Quirino, Leonardo Barrozo dos Santos.


// Cria a barra de menu
void criar_menu(WINDOW *menubar) //Funo encarregada de criar um menu em nosso sis
tema
{
wbkgd(menubar,COLOR_PAIR(7));
// Altera a cor de fundo do menu
waddstr(menubar,"Novo Jogo");
// Esta funo adiciona nomes aos menus
wattron(menubar,COLOR_PAIR(8));
// Altera o par de cores para 3
waddstr(menubar," F5 ");
wattroff(menubar,COLOR_PAIR(8)); // Retornando para o par de cor 2.
}

// => Autor(es) : Rafael Quirino, Leonardo Barrozo dos Santos.


// Desenha os itens do menu quando a tecla F5 pressionada
// (a tecla F1 j pertence ao Terminal do Ubuntu...)
WINDOW **criar_itens_menu(int coluna)
{
//////////////////////////////////////////////////////////////////////////////
////////////////
// - Cria uma janela itensmenu[0] para conter os itens como sub-janelas.
//
// - Cria 10 itens como sub-janelas da janela itensmenu[0].
//
// - Os 10 itens so criados para poder mostrar o item selecionado no menu.
//
// - Para um item de menu parecer selecionado basta tornar a sua cor de fundo
diferente. //
//////////////////////////////////////////////////////////////////////////////

////////////////
int i;
WINDOW **itensmenu;
itensmenu=(WINDOW **)malloc(10*sizeof(WINDOW *));
itensmenu[0] = newwin(11, 19, 1, coluna);
wbkgd(itensmenu[0], COLOR_PAIR(7));
//box(itensmenu[0], ACS_VLINE, ACS_HLINE);
itensmenu[1]
itensmenu[2]
itensmenu[3]
itensmenu[4]
itensmenu[5]
itensmenu[6]
itensmenu[7]
itensmenu[8]
itensmenu[9]

=
=
=
=
=
=
=
=
=

subwin(itensmenu[0],
subwin(itensmenu[0],
subwin(itensmenu[0],
subwin(itensmenu[0],
subwin(itensmenu[0],
subwin(itensmenu[0],
subwin(itensmenu[0],
subwin(itensmenu[0],
subwin(itensmenu[0],

1,
1,
1,
1,
1,
1,
1,
1,
1,

18,
18,
18,
18,
18,
18,
18,
18,
18,

2, coluna+1);
3, coluna+1);
4, coluna+1);
5, coluna+1);
6, coluna+1);
7, coluna+1);
8, coluna+1);
9, coluna+1);
10, coluna+1);

for (i = 1; i < 9; i++)


wprintw(itensmenu[i], "* Mapa %d",i);
wprintw(itensmenu[9], "* Mapa aleatorio");
wbkgd(itensmenu[1], COLOR_PAIR(1));
wrefresh(itensmenu[0]);
return itensmenu;
}//WINDOW **criar_itens_menu(int coluna)

// => Autor(es) : Leonardo Barrozo dos Santos.


// Apaga os itens da menu criado pela funo acima
void deletar_itens_menu(WINDOW **itensmenu,int numero_itens)
{
int i;
for (i = 0; i < numero_itens; i++)
delwin(itensmenu[i]);
free(itensmenu);
}

// => Autor(es) : Leonardo Barrozo dos Santos.


//Permite fazer scroll entre e dentro dos menus
int scroll_menu(WINDOW **itens_menu, int numero_itens, int coluna_inicial)
{
//////////////////////////////////////////////////////////////////////////////
//////////////////////
// * L as teclas pressionadas com a funo getch.

//
// * Se as setas baixo ou cima so pressionadas ento os itens abaixo ou acima so s
elecionados //
// tornando a cor do fundo do items diferente dos demais.
//
// * Se a tecla ENTER for pressionada, ento o item selecionado retornado.
//
// * Se a tecla ESC pressionada, os menus so fechados.
//
//////////////////////////////////////////////////////////////////////////////
//////////////////////
int key;
int selecionado = 0;
while(VERDADEIRO)
{
key = getch();
if (key == KEY_DOWN || key == KEY_UP)
{
wbkgd(itens_menu[selecionado + 1], COLOR_PAIR(7));
wnoutrefresh(itens_menu[selecionado + 1]);
if (key == KEY_DOWN)
{
selecionado = (selecionado + 1) % numero_itens;
}
else
{
selecionado = (selecionado + numero_itens-1) % numero_itens;
}
wbkgd(itens_menu[selecionado + 1],COLOR_PAIR(1));
wnoutrefresh(itens_menu[selecionado + 1]);
doupdate();
}
else if (key == ESCAPE)
{
return -1;
}
else if (key == ENTER)
{
return selecionado;
}
}
}//int scroll_menu(WINDOW **itens_menu, int numero_itens, int coluna_inicial)

// => Autor(es) : Rafael Quirino.


// Inicializa uma struct Pacman
void init_pacman(Pacman *pacmanPtr)
{
pacmanPtr->linha = PACMAN_LINHA;
pacmanPtr->coluna = PACMAN_COLUNA;

pacmanPtr->direcao = NENHUMA;
pacmanPtr->movimento = PARADO;
pacmanPtr->velocidade = 200000;
pacmanPtr->char_representante = PAC_CIMA;
}

// => Autor(es) : Rafael Quirino.


// Escolhe um char para o pacman baseado em sua direo
void choose_char_pacman(Mapa *mapaPtr)
{
if(mapaPtr->pacman.direcao == PARADO)
mapaPtr->pacman.char_representante = '<';
else if(mapaPtr->pacman.direcao == CIMA)
mapaPtr->pacman.char_representante = PAC_CIMA;
else if(mapaPtr->pacman.direcao == BAIXO)
mapaPtr->pacman.char_representante = PAC_BAIXO;
else if(mapaPtr->pacman.direcao == ESQUERDA)
mapaPtr->pacman.char_representante = PAC_ESQUERDA;
else if(mapaPtr->pacman.direcao == DIREITA)
mapaPtr->pacman.char_representante = PAC_DIREITA;
}

// => Autor(es) : Rafael Quirino.


// Testa a possibilidade de certo movimento do pacman no jogo
int is_possible_pacman(Mapa *mapaPtr)
{
if(mapaPtr->pacman.direcao == CIMA)
{
if(mapaPtr->labirinto[mapaPtr->pacman.linha - 1][mapaPtr->pacman
.coluna + 1] == CAMINHO)
return VERDADEIRO;
else
return FALSO;
}
else if(mapaPtr->pacman.direcao == BAIXO)
{
if(mapaPtr->labirinto[mapaPtr->pacman.linha + 1][mapaPtr->pacman
.coluna + 1] == CAMINHO)
return VERDADEIRO;
else
return FALSO;
}
else if(mapaPtr->pacman.direcao == ESQUERDA)
{
if(mapaPtr->labirinto[mapaPtr->pacman.linha][mapaPtr->pacman.col
una] == CAMINHO)
return VERDADEIRO;

else
return FALSO;
}
else if(mapaPtr->pacman.direcao == DIREITA)
{
if(mapaPtr->labirinto[mapaPtr->pacman.linha][mapaPtr->pacman.col
una + 2] == CAMINHO)
return VERDADEIRO;
else
return FALSO;
}
else
return FALSO;
}//is_possible_pacman(Mapa *mapaPtr)

// => Autor(es) : Rafael Quirino.


// Inicializa uma struct Fantasma
void init_fantasma(Fantasma *fantasmaPtr, int flag)
{
if(flag == 1)
{
fantasmaPtr->linha = FANTASMA1_LINHA;
fantasmaPtr->coluna = FANTASMA1_COLUNA;
fantasmaPtr->direcao = NENHUMA;
fantasmaPtr->movimento = PARADO;
fantasmaPtr->velocidade = 450000;
fantasmaPtr->char_representante = CHAR_FANTASMA;
}
else if(flag == 2)
{
fantasmaPtr->linha = FANTASMA2_LINHA;
fantasmaPtr->coluna = FANTASMA2_COLUNA;
fantasmaPtr->direcao = NENHUMA;
fantasmaPtr->movimento = PARADO;
fantasmaPtr->velocidade = 420000;
fantasmaPtr->char_representante = CHAR_FANTASMA;
}
else if(flag == 3)
{
fantasmaPtr->linha = FANTASMA3_LINHA;
fantasmaPtr->coluna = FANTASMA3_COLUNA;
fantasmaPtr->direcao = NENHUMA;
fantasmaPtr->movimento = PARADO;
fantasmaPtr->velocidade = 380000;
fantasmaPtr->char_representante = CHAR_FANTASMA;
}
else if(flag == 4)
{
fantasmaPtr->linha = FANTASMA4_LINHA;
fantasmaPtr->coluna = FANTASMA4_COLUNA;

fantasmaPtr->direcao = NENHUMA;
fantasmaPtr->movimento = PARADO;
fantasmaPtr->velocidade = 350000;
fantasmaPtr->char_representante = CHAR_FANTASMA;
}
}//void init_fantasma(Fantasma *fantasmaPtr, int flag)

// => Autor(es) : Rafael Quirino.


// Testa a possibilidade de certo movimento de um fantasma no jogo
int is_possible_fantasma(Mapa *mapaPtr, int flag)
{
if(flag == 1)
{
if(mapaPtr->fantasma1.direcao == CIMA)
{
if(mapaPtr->labirinto[mapaPtr->fantasma1.linha - 1][mapa
Ptr->fantasma1.coluna + 1] == CAMINHO)
return VERDADEIRO;
else
return FALSO;
}
else if(mapaPtr->fantasma1.direcao == BAIXO)
{
if(mapaPtr->labirinto[mapaPtr->fantasma1.linha + 1][mapa
Ptr->fantasma1.coluna + 1] == CAMINHO)
return VERDADEIRO;
else
return FALSO;
}
else if(mapaPtr->fantasma1.direcao == ESQUERDA)
{
if(mapaPtr->labirinto[mapaPtr->fantasma1.linha][mapaPtr>fantasma1.coluna] == CAMINHO)
return VERDADEIRO;
else
return FALSO;
}
else if(mapaPtr->fantasma1.direcao == DIREITA)
{
if(mapaPtr->labirinto[mapaPtr->fantasma1.linha][mapaPtr>fantasma1.coluna + 2] == CAMINHO)
return VERDADEIRO;
else
return FALSO;
}
}//if(flag == 1)
else if(flag == 2)
{

if(mapaPtr->fantasma2.direcao == CIMA)
{
if(mapaPtr->labirinto[mapaPtr->fantasma2.linha - 1][mapa
Ptr->fantasma2.coluna + 1] == CAMINHO)
return VERDADEIRO;
else
return FALSO;
}
else if(mapaPtr->fantasma2.direcao == BAIXO)
{
if(mapaPtr->labirinto[mapaPtr->fantasma2.linha + 1][mapa
Ptr->fantasma2.coluna + 1] == CAMINHO)
return VERDADEIRO;
else
return FALSO;
}
else if(mapaPtr->fantasma2.direcao == ESQUERDA)
{
if(mapaPtr->labirinto[mapaPtr->fantasma2.linha][mapaPtr>fantasma2.coluna] == CAMINHO)
return VERDADEIRO;
else
return FALSO;
}
else if(mapaPtr->fantasma2.direcao == DIREITA)
{
if(mapaPtr->labirinto[mapaPtr->fantasma2.linha][mapaPtr>fantasma2.coluna + 2] == CAMINHO)
return VERDADEIRO;
else
return FALSO;
}
}//else if(flag == 2)
else if(flag == 3)
{
if(mapaPtr->fantasma3.direcao == CIMA)
{
if(mapaPtr->labirinto[mapaPtr->fantasma3.linha - 1][mapa
Ptr->fantasma3.coluna + 1] == CAMINHO)
return VERDADEIRO;
else
return FALSO;
}
else if(mapaPtr->fantasma3.direcao == BAIXO)
{
if(mapaPtr->labirinto[mapaPtr->fantasma3.linha + 1][mapa
Ptr->fantasma3.coluna + 1] == CAMINHO)
return VERDADEIRO;
else
return FALSO;
}
else if(mapaPtr->fantasma3.direcao == ESQUERDA)
{

if(mapaPtr->labirinto[mapaPtr->fantasma3.linha][mapaPtr>fantasma3.coluna] == CAMINHO)
return VERDADEIRO;
else
return FALSO;
}
else if(mapaPtr->fantasma3.direcao == DIREITA)
{
if(mapaPtr->labirinto[mapaPtr->fantasma3.linha][mapaPtr>fantasma3.coluna + 2] == CAMINHO)
return VERDADEIRO;
else
return FALSO;
}
}//else if(flag == 3)
else if(flag == 4)
{
if(mapaPtr->fantasma4.direcao == CIMA)
{
if(mapaPtr->labirinto[mapaPtr->fantasma4.linha - 1][mapa
Ptr->fantasma4.coluna + 1] == CAMINHO)
return VERDADEIRO;
else
return FALSO;
}
else if(mapaPtr->fantasma4.direcao == BAIXO)
{
if(mapaPtr->labirinto[mapaPtr->fantasma4.linha + 1][mapa
Ptr->fantasma4.coluna + 1] == CAMINHO)
return VERDADEIRO;
else
return FALSO;
}
else if(mapaPtr->fantasma4.direcao == ESQUERDA)
{
if(mapaPtr->labirinto[mapaPtr->fantasma4.linha][mapaPtr>fantasma4.coluna] == CAMINHO)
return VERDADEIRO;
else
return FALSO;
}
else if(mapaPtr->fantasma4.direcao == DIREITA)
{
if(mapaPtr->labirinto[mapaPtr->fantasma4.linha][mapaPtr>fantasma4.coluna + 2] == CAMINHO)
return VERDADEIRO;
else
return FALSO;
}
}//else if(flag == 4)
}//int is_possible_fantasma(Mapa *mapaPtr, int flag)

// => Autor(es) : Rafael Quirino


// Atualiza a posio do fantasma especificado pela flag
void atualiza_posicao_fantasma(Mapa *mapaPtr, int flag)
{
if(flag == 1)
{
if(mapaPtr->fantasma1.movimento == CIMA)
mapaPtr->fantasma1.linha--;
else if(mapaPtr->fantasma1.movimento == BAIXO)
mapaPtr->fantasma1.linha++;
else if(mapaPtr->fantasma1.movimento == ESQUERDA)
mapaPtr->fantasma1.coluna--;
else if(mapaPtr->fantasma1.movimento == DIREITA)
mapaPtr->fantasma1.coluna++;
}
else if(flag == 2)
{
if(mapaPtr->fantasma2.movimento == CIMA)
mapaPtr->fantasma2.linha--;
else if(mapaPtr->fantasma2.movimento == BAIXO)
mapaPtr->fantasma2.linha++;
else if(mapaPtr->fantasma2.movimento == ESQUERDA)
mapaPtr->fantasma2.coluna--;
else if(mapaPtr->fantasma2.movimento == DIREITA)
mapaPtr->fantasma2.coluna++;
}
else if(flag == 3)
{
if(mapaPtr->fantasma3.movimento == CIMA)
mapaPtr->fantasma3.linha--;
else if(mapaPtr->fantasma3.movimento == BAIXO)
mapaPtr->fantasma3.linha++;
else if(mapaPtr->fantasma3.movimento == ESQUERDA)
mapaPtr->fantasma3.coluna--;
else if(mapaPtr->fantasma3.movimento == DIREITA)
mapaPtr->fantasma3.coluna++;
}
else if(flag == 4)
{
if(mapaPtr->fantasma4.movimento == CIMA)
mapaPtr->fantasma4.linha--;
else if(mapaPtr->fantasma4.movimento == BAIXO)
mapaPtr->fantasma4.linha++;
else if(mapaPtr->fantasma4.movimento == ESQUERDA)
mapaPtr->fantasma4.coluna--;
else if(mapaPtr->fantasma4.movimento == DIREITA)
mapaPtr->fantasma4.coluna++;
}
}//void atualiza_posicao_fantasma(Mapa *mapaPtr, int flag)

// => Autor(es) : Rafael Quirino, Marlus Tavares


// Escolhe a direo do fantasma especificado pela flag
// (Nota-se que se todos os fantasmas seguirem cegamente o Pacman, ser muito fcil
pois todos o seguiro em
// "fila indiana"; portanto melhor que se tenha o fator randmico atuando sobre o
movimento dos fantasmas.)
void choose_direction(Mapa *mapaPtr, int flag)
{
if(flag == 1)
{
int i;
mapaPtr->fantasma1.direcao = NENHUMA;
mapaPtr->fantasma1.movimento = PARADO;
if(mapaPtr->fantasma1.linha == mapaPtr->pacman.linha)
{
if(mapaPtr->fantasma1.coluna < mapaPtr->pacman.coluna)
{
mapaPtr->fantasma1.direcao = DIREITA;
if(is_possible_fantasma(mapaPtr, flag) == VERDAD
EIRO)
mapaPtr->fantasma1.movimento = mapaPtr->
fantasma1.direcao;
}
else if(mapaPtr->fantasma1.coluna > mapaPtr->pacman.colu
na)
{
mapaPtr->fantasma1.direcao = ESQUERDA;
if(is_possible_fantasma(mapaPtr, flag) == VERDAD
EIRO)
mapaPtr->fantasma1.movimento = mapaPtr->
fantasma1.direcao;
}
}
else if(mapaPtr->fantasma1.coluna == mapaPtr->pacman.coluna)
{
if(mapaPtr->fantasma1.linha < mapaPtr->pacman.linha)
{
mapaPtr->fantasma1.direcao = BAIXO;
if(is_possible_fantasma(mapaPtr, flag) == VERDAD
EIRO)
mapaPtr->fantasma1.movimento = mapaPtr->
fantasma1.direcao;
}
else if(mapaPtr->fantasma1.linha > mapaPtr->pacman.linha
)
{
mapaPtr->fantasma1.direcao = CIMA;
if(is_possible_fantasma(mapaPtr, flag) == VERDAD
EIRO)
mapaPtr->fantasma1.movimento = mapaPtr->
fantasma1.direcao;
}
}
if(mapaPtr->fantasma1.movimento == PARADO)
{
int randomico = (rand()%4);

while(randomico == mapaPtr->fantasma1.direcao)
randomico = (rand()%4);
mapaPtr->fantasma1.direcao = randomico;
while(is_possible_fantasma(mapaPtr, flag) == FALSO)
{
while(randomico == mapaPtr->fantasma1.direcao)
randomico = (rand()%4);
mapaPtr->fantasma1.direcao = randomico;
}
mapaPtr->fantasma1.movimento = mapaPtr->fantasma1.direca
o;
}
atualiza_posicao_fantasma(mapaPtr, flag);
}//if(flag == 1)
else if(flag == 2)
{
int i;
mapaPtr->fantasma2.direcao = NENHUMA;
mapaPtr->fantasma2.movimento = PARADO;
if(mapaPtr->fantasma2.linha == mapaPtr->pacman.linha)
{
if(mapaPtr->fantasma2.coluna < mapaPtr->pacman.coluna)
{
mapaPtr->fantasma2.direcao = DIREITA;
if(is_possible_fantasma(mapaPtr, flag) == VERDAD
EIRO)
mapaPtr->fantasma2.movimento = mapaPtr->
fantasma2.direcao;
}
else if(mapaPtr->fantasma2.coluna > mapaPtr->pacman.colu
na)
{
mapaPtr->fantasma2.direcao = ESQUERDA;
if(is_possible_fantasma(mapaPtr, flag) == VERDAD
EIRO)
mapaPtr->fantasma2.movimento = mapaPtr->
fantasma2.direcao;
}
}
else if(mapaPtr->fantasma2.coluna == mapaPtr->pacman.coluna)
{
if(mapaPtr->fantasma2.linha < mapaPtr->pacman.linha)
{
mapaPtr->fantasma2.direcao = BAIXO;
if(is_possible_fantasma(mapaPtr, flag) == VERDAD
EIRO)
mapaPtr->fantasma2.movimento = mapaPtr->
fantasma2.direcao;
}

else if(mapaPtr->fantasma2.linha > mapaPtr->pacman.linha


)
{
mapaPtr->fantasma2.direcao = CIMA;
if(is_possible_fantasma(mapaPtr, flag) == VERDAD
EIRO)
mapaPtr->fantasma2.movimento = mapaPtr->
fantasma2.direcao;
}
}
if(mapaPtr->fantasma2.movimento == PARADO)
{
int randomico = (rand()%4);
while(randomico == mapaPtr->fantasma2.direcao)
randomico = (rand()%4);
mapaPtr->fantasma2.direcao = randomico;
while(is_possible_fantasma(mapaPtr, flag) == FALSO)
{
while(randomico == mapaPtr->fantasma2.direcao)
randomico = (rand()%4);
mapaPtr->fantasma2.direcao = randomico;
}
mapaPtr->fantasma2.movimento = mapaPtr->fantasma2.direca
o;
}
atualiza_posicao_fantasma(mapaPtr, flag);
}//else if(flag == 2)
else if(flag == 3)
{
int i;
mapaPtr->fantasma3.direcao = NENHUMA;
mapaPtr->fantasma3.movimento = PARADO;
if(mapaPtr->fantasma3.linha == mapaPtr->pacman.linha)
{
if(mapaPtr->fantasma3.coluna < mapaPtr->pacman.coluna)
{
mapaPtr->fantasma3.direcao = DIREITA;
if(is_possible_fantasma(mapaPtr, flag) == VERDAD
EIRO)
mapaPtr->fantasma3.movimento = mapaPtr->
fantasma3.direcao;
}
else if(mapaPtr->fantasma3.coluna > mapaPtr->pacman.colu
na)
{
mapaPtr->fantasma3.direcao = ESQUERDA;
if(is_possible_fantasma(mapaPtr, flag) == VERDAD
EIRO)

mapaPtr->fantasma3.movimento = mapaPtr->
fantasma3.direcao;
}
}
else if(mapaPtr->fantasma3.coluna == mapaPtr->pacman.coluna)
{
if(mapaPtr->fantasma3.linha < mapaPtr->pacman.linha)
{
mapaPtr->fantasma3.direcao = BAIXO;
if(is_possible_fantasma(mapaPtr, flag) == VERDAD
EIRO)
mapaPtr->fantasma3.movimento = mapaPtr->
fantasma3.direcao;
}
else if(mapaPtr->fantasma3.linha > mapaPtr->pacman.linha
)
{
mapaPtr->fantasma3.direcao = CIMA;
if(is_possible_fantasma(mapaPtr, flag) == VERDAD
EIRO)
mapaPtr->fantasma3.movimento = mapaPtr->
fantasma3.direcao;
}
}
if(mapaPtr->fantasma3.movimento == PARADO)
{
int randomico = (rand()%4);
while(randomico == mapaPtr->fantasma3.direcao)
randomico = (rand()%4);
mapaPtr->fantasma3.direcao = randomico;
while(is_possible_fantasma(mapaPtr, flag) == FALSO)
{
while(randomico == mapaPtr->fantasma3.direcao)
randomico = (rand()%4);
mapaPtr->fantasma3.direcao = randomico;
}
mapaPtr->fantasma3.movimento = mapaPtr->fantasma3.direca
o;
}
atualiza_posicao_fantasma(mapaPtr, flag);
}//else if(flag == 3)
else if(flag == 4)
{
int i;
mapaPtr->fantasma4.direcao = NENHUMA;
mapaPtr->fantasma4.movimento = PARADO;
if(mapaPtr->fantasma4.linha == mapaPtr->pacman.linha)
{
if(mapaPtr->fantasma4.coluna < mapaPtr->pacman.coluna)

{
mapaPtr->fantasma4.direcao = DIREITA;
if(is_possible_fantasma(mapaPtr, flag) == VERDAD
EIRO)
mapaPtr->fantasma4.movimento = mapaPtr->
fantasma4.direcao;
}
else if(mapaPtr->fantasma4.coluna > mapaPtr->pacman.colu
na)
{
mapaPtr->fantasma4.direcao = ESQUERDA;
if(is_possible_fantasma(mapaPtr, flag) == VERDAD
EIRO)
mapaPtr->fantasma4.movimento = mapaPtr->
fantasma4.direcao;
}
}
else if(mapaPtr->fantasma4.coluna == mapaPtr->pacman.coluna)
{
if(mapaPtr->fantasma4.linha < mapaPtr->pacman.linha)
{
mapaPtr->fantasma4.direcao = BAIXO;
if(is_possible_fantasma(mapaPtr, flag) == VERDAD
EIRO)
mapaPtr->fantasma4.movimento = mapaPtr->
fantasma4.direcao;
}
else if(mapaPtr->fantasma4.linha > mapaPtr->pacman.linha
)
{
mapaPtr->fantasma4.direcao = CIMA;
if(is_possible_fantasma(mapaPtr, flag) == VERDAD
EIRO)
mapaPtr->fantasma4.movimento = mapaPtr->
fantasma4.direcao;
}
}
if(mapaPtr->fantasma4.movimento == PARADO)
{
int randomico = (rand()%4);
while(randomico == mapaPtr->fantasma4.direcao)
randomico = (rand()%4);
mapaPtr->fantasma4.direcao = randomico;
while(is_possible_fantasma(mapaPtr, flag) == FALSO)
{
while(randomico == mapaPtr->fantasma4.direcao)
randomico = (rand()%4);
mapaPtr->fantasma4.direcao = randomico;
}
mapaPtr->fantasma4.movimento = mapaPtr->fantasma4.direca
o;
}

atualiza_posicao_fantasma(mapaPtr, flag);
}//else if(flag == 4)
}//void choose_direction(Mapa *mapaPtr, int flag)

// => Autor(es) : Rafael Quirino.


// Inicializa uma struct Mapa
void init_mapa(int labirinto[TAMANHO][TAMANHO], Mapa *mapaPtr, Pacman *pacmanPtr
,
Fantasma *fantasma1Ptr,
Fantasma *fantasma2Ptr,
Fantasma *fantasma3Ptr,
Fantasma *fantasma4Ptr )
{
int i, j;
mapaPtr->numero_moedas = 0;
for(i = 0; i < TAMANHO; i++)
{
for(j = 0; j < TAMANHO; j++)
{
mapaPtr->labirinto[i][j] = labirinto[i][j];
if(mapaPtr->labirinto[i][j] == CAMINHO)
{
// Teste para impedir que se imprima moedas dent
ro da "casinha" dos fantasmas
if( (i>=FANTASMAS_SUPERIOR_ESQUERDO_LINHA && i<=
FANTASMAS_INFERIOR_DIREITO_LINHA) &&
(j>=FANTASMAS_SUPERIOR_ESQUERDO_COLUNA && j<
=FANTASMAS_SUPERIOR_DIREITO_COLUNA) )
mapaPtr->matriz_moedas[i][j] = FALSO;
else
{
mapaPtr->matriz_moedas[i][j] = VERDADEIR
O;
mapaPtr->numero_moedas++;
}
}
}
}
mapaPtr->matriz_moedas[PACMAN_LINHA][PACMAN_COLUNA+1] = FALSO;
mapaPtr->numero_moedas--;
mapaPtr->numero_maximo_moedas = mapaPtr->numero_moedas;
mapaPtr->pacman = (*pacmanPtr);
mapaPtr->fantasma1 = (*fantasma1Ptr);

mapaPtr->fantasma2 = (*fantasma2Ptr);
mapaPtr->fantasma3 = (*fantasma3Ptr);
mapaPtr->fantasma4 = (*fantasma4Ptr);
mapaPtr->estado = EM_ANDAMENTO;
mapaPtr->vitorias = 0;
mapaPtr->zerado = FALSO;
}//void init_mapa(int labirinto[TAMANHO][TAMANHO], Mapa *mapaPtr, Pacman *pacman
Ptr)

// => Autor(es) : Rafael Quirino.


// Escolhe um mapa aleatoriamente, dentre os oito pre-existentes
void escolher_mapa_rand(int labirinto[TAMANHO][TAMANHO], Mapa *mapaPtr)
{
int randomico;
randomico = 1 + (rand() % 8);
switch(randomico)
{
case 1:
copiar_matriz(labirinto_1, labirinto);
break;
case 2:
copiar_matriz(labirinto_2, labirinto);
break;
case 3:
copiar_matriz(labirinto_3, labirinto);
break;
case 4:
copiar_matriz(labirinto_4, labirinto);
break;
case 5:
copiar_matriz(labirinto_5, labirinto);
break;
case 6:
copiar_matriz(labirinto_6, labirinto);
break;
case 7:
copiar_matriz(labirinto_7, labirinto);
break;
case 8:
copiar_matriz(labirinto_8, labirinto);
break;
default:
break;
}
}//void escolher_mapa_rand(int[TAMANHO][TAMANHO] labirinto, Mapa *mapaPtr)

// => Autor(es) : Rafael Quirino, Felipe Borges.


// Imprime o tabuleiro do jogo na tela, baseado nas informaes contidas no Mapa
// apontado pelo ponteiro fornecido funo
void draw_mapa(Mapa *mapaPtr)
{
int i, j, printed_pacman = FALSO, printed_fantasma = FALSO;
clear();
attron(A_BOLD);
//attron(COLOR_PAIR(6));
for(i = 0; i < TAMANHO; i++)
{
for(j = 0; j < TAMANHO; j++)
{
if(mapaPtr->labirinto[i][j] == PAREDE)
{
if(printed_pacman == VERDADEIRO)
{
//attroff(COLOR_PAIR(6));
printw("%c%c", CHAR_PAREDE, CHAR_PAREDE)
;
printed_pacman = FALSO;
//attron(COLOR_PAIR(6));
}
else if(printed_fantasma == VERDADEIRO)
{
//attroff(COLOR_PAIR(6));
printw("%c%c", CHAR_PAREDE, CHAR_PAREDE)
;
printed_fantasma = FALSO;
//attron(COLOR_PAIR(6));
}
else
{
//attroff(COLOR_PAIR(6));
printw("%c%c%c", CHAR_PAREDE, CHAR_PARED
E, CHAR_PAREDE);
//attron(COLOR_PAIR(6));
}
}
else if(mapaPtr->labirinto[i][j] == CAMINHO)
{
if(printed_pacman == VERDADEIRO)
{
if(mapaPtr->matriz_moedas[i][j] == VERDA
DEIRO)
{
//attron(COLOR_PAIR(6));
//attron(A_BOLD);
printw("%c", CHAR_MOEDA);
//attroff(A_BOLD);
//attroff(COLOR_PAIR(6));
printed_pacman = FALSO;
}
else

{
printw("%c", CHAR_CAMINHO);
printed_pacman = FALSO;
}
}
else if(printed_fantasma == VERDADEIRO)
{
printw("%c", CHAR_CAMINHO);
printed_fantasma = FALSO;
}
else
{
if(mapaPtr->matriz_moedas[i][j] == VERDA
DEIRO)
{
//attron(COLOR_PAIR(6));
//attron(A_BOLD);
printw(" %c ", CHAR_MOEDA);
//attroff(A_BOLD);
//attroff(COLOR_PAIR(6));
if(printed_pacman == VERDADEIRO)
printed_pacman = FALSO;
if(printed_fantasma == VERDADEIR
O)
printed_fantasma = FALSO
;
}
else
{
printw(" %c ", CHAR_CAMINHO);
if(printed_pacman == VERDADEIRO)
printed_pacman = FALSO;
if(printed_fantasma == VERDADEIR
O)
printed_fantasma = FALSO
;
}
}
}
if((i == mapaPtr->pacman.linha) && (j == mapaPtr->pacman
.coluna))
{
attron(COLOR_PAIR(6));
//attron(A_BOLD);
printw(" %c", mapaPtr->pacman.char_representante
);
//attroff(A_BOLD);
attroff(COLOR_PAIR(6));
printed_pacman = VERDADEIRO;
// Captura as moedas
if(mapaPtr->matriz_moedas[i][j + 1] == VERDADEIR
O)
{

mapaPtr->matriz_moedas[i][j + 1] = FALSO
;
mapaPtr->numero_moedas--;
pontos++;
printf("\a"); // "Barulhinho" , bell d
o sistema
}
}
else if((i == mapaPtr->fantasma1.linha) && (j == mapaPtr
->fantasma1.coluna))
{
//attroff(COLOR_PAIR(6));
attron(COLOR_PAIR(2));
//attron(A_BOLD);
printw(" %c", mapaPtr->fantasma1.char_representa
nte);
//attroff(A_BOLD);
attroff(COLOR_PAIR(2));
//attron(COLOR_PAIR(6));
printed_fantasma = VERDADEIRO;
}
else if((i == mapaPtr->fantasma2.linha) && (j == mapaPtr
->fantasma2.coluna))
{
//attroff(COLOR_PAIR(6));
attron(COLOR_PAIR(3));
//attron(A_BOLD);
printw(" %c", mapaPtr->fantasma2.char_representa
nte);
//attroff(A_BOLD);
attroff(COLOR_PAIR(3));
//attron(COLOR_PAIR(6));
printed_fantasma = VERDADEIRO;
}
else if((i == mapaPtr->fantasma3.linha) && (j == mapaPtr
->fantasma3.coluna))
{
//attroff(COLOR_PAIR(6));
attron(COLOR_PAIR(4));
//attron(A_BOLD);
printw(" %c", mapaPtr->fantasma3.char_representa
nte);
//attroff(A_BOLD);
attroff(COLOR_PAIR(4));
//attron(COLOR_PAIR(6));
printed_fantasma = VERDADEIRO;
}
else if((i == mapaPtr->fantasma4.linha) && (j == mapaPtr
->fantasma4.coluna))
{
//attroff(COLOR_PAIR(6));
attron(COLOR_PAIR(5));
//attron(A_BOLD);
printw(" %c", mapaPtr->fantasma4.char_representa

nte);
//attroff(A_BOLD);
attroff(COLOR_PAIR(5));
//attron(COLOR_PAIR(6));
printed_fantasma = VERDADEIRO;
}
}
printw("\n");
}
//attroff(COLOR_PAIR(6));
attroff(A_BOLD);
move(14, 102);
printw("=> Pontos: %d", pontos);
move(16, 102);
printw("=> Moedas restantes: %d", mapaPtr->numero_moedas);
refresh();
}//void draw_map(Mapa *mapaPtr)

// => Autor(es) : Rafael Quirino.


// Funo que executa uma "partida" do jogo
void play(int item_selecionado)
{
//////////////////////////////
// Declaraes de variveis //
//////////////////////////////
//---------------------------------------------------------------------------------------int key;
// Entrada do usurio
int labirinto[TAMANHO][TAMANHO];

// Labirinto

Fantasma fantasma1, *fantasma1Ptr, // 1 fantasma


fantasma2, *fantasma2Ptr,
// 2 fantasma
fantasma3, *fantasma3Ptr,
// 3 fantasma
fantasma4, *fantasma4Ptr;
// 4 fantasma
Pacman pacman, *pacmanPtr;
// Pacman
Mapa mapa, *mapaPtr;
// Mapa do jogo
//---------------------------------------------------------------------------------------////////////////////////////////////////////
// Atribuies de endereos aos ponteiros //
////////////////////////////////////////////
//-----------------------------------------fantasma1Ptr = &fantasma1;
fantasma2Ptr = &fantasma2;

fantasma3Ptr = &fantasma3;
fantasma4Ptr = &fantasma4;
pacmanPtr = &pacman;
mapaPtr = &mapa;
//-----------------------------------------///////////////////////////////////////
// Inicializao das structs do jogo //
///////////////////////////////////////
//-------------------------------------------------------------init_fantasma(fantasma1Ptr, 1);
init_fantasma(fantasma2Ptr, 2);
init_fantasma(fantasma3Ptr, 3);
init_fantasma(fantasma4Ptr, 4);
init_pacman(pacmanPtr);
switch(item_selecionado)
{
case 1:
copiar_matriz(labirinto_1, labirinto);
break;
case 2:
copiar_matriz(labirinto_2, labirinto);
break;
case 3:
copiar_matriz(labirinto_3, labirinto);
break;
case 4:
copiar_matriz(labirinto_4, labirinto);
break;
case 5:
copiar_matriz(labirinto_5, labirinto);
break;
case 6:
copiar_matriz(labirinto_6, labirinto);
break;
case 7:
copiar_matriz(labirinto_7, labirinto);
break;
case 8:
copiar_matriz(labirinto_8, labirinto);
break;
case 9:
escolher_mapa_rand(labirinto, mapaPtr);
break;
}
init_mapa(labirinto, mapaPtr, pacmanPtr, fantasma1Ptr,
fantasma2Ptr,
fantasma3Ptr,
fantasma4Ptr);
//--------------------------------------------------------------

pthread_mutex_lock(&mutex_mapa);
draw_mapa(mapaPtr);
// Impresso inicial do mapa
refresh();
// Atualiza a tela (inerente biblioteca

curses.h)
pthread_mutex_unlock(&mutex_mapa);

contagem_regressiva(); // Contagem regressiva para o incio da "partida"

iniciar_threads(mapaPtr); // Criao e inicializao das threads

// Funcionamento do Pacman
do
{
key = getch();
if(key == KEY_UP)
{
mapaPtr->pacman.direcao = CIMA;
if(is_possible_pacman(mapaPtr) == VERDADEIRO)
{
mapaPtr->pacman.linha = mapaPtr->pacman.linha 1;
mapaPtr->pacman.movimento = CIMA;
choose_char_pacman(mapaPtr);
pthread_mutex_lock(&mutex_mapa);
draw_mapa(mapaPtr);
refresh();
pthread_mutex_unlock(&mutex_mapa);
}
}
else if(key == KEY_DOWN)
{
mapaPtr->pacman.direcao = BAIXO;
if(is_possible_pacman(mapaPtr) == VERDADEIRO)
{
mapaPtr->pacman.linha = mapaPtr->pacman.linha +
1;
mapaPtr->pacman.movimento = BAIXO;
choose_char_pacman(mapaPtr);
pthread_mutex_lock(&mutex_mapa);
draw_mapa(mapaPtr);
refresh();
pthread_mutex_unlock(&mutex_mapa);
}
}

else if(key == KEY_LEFT)


{
mapaPtr->pacman.direcao = ESQUERDA;
if(is_possible_pacman(mapaPtr) == VERDADEIRO)
{
mapaPtr->pacman.coluna = mapaPtr->pacman.coluna
- 1;
mapaPtr->pacman.movimento = ESQUERDA;
choose_char_pacman(mapaPtr);
pthread_mutex_lock(&mutex_mapa);
draw_mapa(mapaPtr);
refresh();
pthread_mutex_unlock(&mutex_mapa);
}
}
else if(key == KEY_RIGHT)
{
mapaPtr->pacman.direcao = DIREITA;
if(is_possible_pacman(mapaPtr) == VERDADEIRO)
{
mapaPtr->pacman.coluna = mapaPtr->pacman.coluna
+ 1;
mapaPtr->pacman.movimento = DIREITA;
choose_char_pacman(mapaPtr);
pthread_mutex_lock(&mutex_mapa);
draw_mapa(mapaPtr);
refresh();
pthread_mutex_unlock(&mutex_mapa);
}
}
// 80 : 'p' -ou- 112 : 'P'
else if(key == 80 || key == 112)
{
terminar_threads();
pthread_create(&pausa, NULL, imprimir_pausa, NULL);
do
{
key = getch();
}while(key != 80 && key != 112);
pthread_cancel(pausa);
pthread_detach(pausa);
iniciar_threads(mapaPtr);
}

// Testa se houve encontro entre o pacman e algum fantasma


if( (mapaPtr->pacman.linha == mapaPtr->fantasma1.linha && mapaPt
r->pacman.coluna == mapaPtr->fantasma1.coluna) ||
(mapaPtr->pacman.linha == mapaPtr->fantasma2.linha && mapaPt
r->pacman.coluna == mapaPtr->fantasma2.coluna) ||
(mapaPtr->pacman.linha == mapaPtr->fantasma3.linha && mapaPt
r->pacman.coluna == mapaPtr->fantasma3.coluna) ||
(mapaPtr->pacman.linha == mapaPtr->fantasma4.linha && mapaPt
r->pacman.coluna == mapaPtr->fantasma4.coluna)
)
{
mapaPtr->estado = TERMINADO;
break;
}
}while(mapaPtr->numero_moedas != 0 && mapaPtr->estado != TERMINADO);
// Condies de parada da "partida"

terminar_threads();

if(mapaPtr->numero_moedas == 0)
{
imprimir_vitoria();
mapaPtr->vitorias++;
}
else
imprimir_derrota();
if(mapaPtr->vitorias == 8)
{
mapaPtr->vitorias = 0;
mapaPtr->zerado = VERDADEIRO;
imprimir_final();
}
do
{
key = getch();
}while(key != ENTER);

if(mapaPtr->numero_moedas == 0)
{
if(mapaPtr->zerado == VERDADEIRO){
mapaPtr->zerado = FALSO;
imprimir_final();
}
else
play((item_selecionado + 1) % 8);
}
// As vitrias devem ser consecutivas para que se acumule pontos

// e para que o jogo seja "zerado"


mapaPtr->vitorias = 0;
mapaPtr->zerado = FALSO;
pontos = 0;
}//void play(int item_selecionado)

// => Autor(es) : Rafael Quirino.


// Tread que controla o fantasma 1
void *thread_fantasma1(void *arg)
{
int i;
Mapa *mapaPtr;
mapaPtr = (Mapa*)arg;
while(VERDADEIRO)
{
choose_direction(mapaPtr, 1);
if(mapaPtr->fantasma1.movimento == CIMA)
{
while((mapaPtr->fantasma1.linha > mapaPtr->pacman.linha)
&& (is_possible_fantasma(mapaPtr, 1) == VERDADEIRO))
{
pthread_mutex_lock(&mutex_mapa);
draw_mapa(mapaPtr);
refresh();
pthread_mutex_unlock(&mutex_mapa);
usleep(mapaPtr->fantasma1.velocidade);
atualiza_posicao_fantasma(mapaPtr, 1);
mapaPtr->fantasma1.movimento = CIMA;
}
}
else if(mapaPtr->fantasma1.movimento == BAIXO)
{
while((mapaPtr->fantasma1.linha < mapaPtr->pacman.linha)
&& (is_possible_fantasma(mapaPtr, 1) == VERDADEIRO))
{
pthread_mutex_lock(&mutex_mapa);
draw_mapa(mapaPtr);
refresh();
pthread_mutex_unlock(&mutex_mapa);
usleep(mapaPtr->fantasma1.velocidade);
atualiza_posicao_fantasma(mapaPtr, 1);
mapaPtr->fantasma1.movimento = BAIXO;
}

}
else if(mapaPtr->fantasma1.movimento == ESQUERDA)
{
while((mapaPtr->fantasma1.coluna > mapaPtr->pacman.colun
a) && (is_possible_fantasma(mapaPtr, 1) == VERDADEIRO))
{
pthread_mutex_lock(&mutex_mapa);
draw_mapa(mapaPtr);
refresh();
pthread_mutex_unlock(&mutex_mapa);
usleep(mapaPtr->fantasma1.velocidade);
atualiza_posicao_fantasma(mapaPtr, 1);
mapaPtr->fantasma1.movimento = ESQUERDA;
}
}
else if(mapaPtr->fantasma1.movimento == DIREITA)
{
while((mapaPtr->fantasma1.coluna < mapaPtr->pacman.colun
a) && (is_possible_fantasma(mapaPtr, 1) == VERDADEIRO))
{
pthread_mutex_lock(&mutex_mapa);
draw_mapa(mapaPtr);
refresh();
pthread_mutex_unlock(&mutex_mapa);
usleep(mapaPtr->fantasma1.velocidade);
atualiza_posicao_fantasma(mapaPtr, 1);
mapaPtr->fantasma1.movimento = DIREITA;
}
}

// Testa se houve encontro entre o pacman e algum fantasma


if( (mapaPtr->pacman.linha == mapaPtr->fantasma1.linha && mapaPt
r->pacman.coluna == mapaPtr->fantasma1.coluna) ||
(mapaPtr->pacman.linha == mapaPtr->fantasma2.linha && mapaPt
r->pacman.coluna == mapaPtr->fantasma2.coluna) ||
(mapaPtr->pacman.linha == mapaPtr->fantasma3.linha && mapaPt
r->pacman.coluna == mapaPtr->fantasma3.coluna) ||
(mapaPtr->pacman.linha == mapaPtr->fantasma4.linha && mapaPt
r->pacman.coluna == mapaPtr->fantasma4.coluna)
)
{
mapaPtr->estado = TERMINADO;
break;
}
}//while(VERDADEIRO)

imprimir_derrota();

refresh();
terminar_threads();
return NULL;
}//void *thread_fantasma1(void *arg)

// => Autor(es) : Rafael Quirino.


// Tread que controla o fantasma 2
void *thread_fantasma2(void *arg)
{
int i;
Mapa *mapaPtr;
mapaPtr = (Mapa*)arg;
while(VERDADEIRO)
{
choose_direction(mapaPtr, 2);
if(mapaPtr->fantasma2.movimento == CIMA)
{
while((mapaPtr->fantasma2.linha > mapaPtr->pacman.linha)
&& (is_possible_fantasma(mapaPtr, 2) == VERDADEIRO))
{
pthread_mutex_lock(&mutex_mapa);
draw_mapa(mapaPtr);
refresh();
pthread_mutex_unlock(&mutex_mapa);
usleep(mapaPtr->fantasma2.velocidade);
atualiza_posicao_fantasma(mapaPtr, 2);
mapaPtr->fantasma2.movimento = CIMA;
}
}
else if(mapaPtr->fantasma2.movimento == BAIXO)
{
while((mapaPtr->fantasma2.linha < mapaPtr->pacman.linha)
&& (is_possible_fantasma(mapaPtr, 2) == VERDADEIRO))
{
pthread_mutex_lock(&mutex_mapa);
draw_mapa(mapaPtr);
refresh();
pthread_mutex_unlock(&mutex_mapa);
usleep(mapaPtr->fantasma2.velocidade);
atualiza_posicao_fantasma(mapaPtr, 2);
mapaPtr->fantasma2.movimento = BAIXO;

}
}
else if(mapaPtr->fantasma2.movimento == ESQUERDA)
{
while((mapaPtr->fantasma2.coluna > mapaPtr->pacman.colun
a) && (is_possible_fantasma(mapaPtr, 2) == VERDADEIRO))
{
pthread_mutex_lock(&mutex_mapa);
draw_mapa(mapaPtr);
refresh();
pthread_mutex_unlock(&mutex_mapa);
usleep(mapaPtr->fantasma2.velocidade);
atualiza_posicao_fantasma(mapaPtr, 2);
mapaPtr->fantasma2.movimento = ESQUERDA;
}
}
else if(mapaPtr->fantasma2.movimento == DIREITA)
{
while((mapaPtr->fantasma2.coluna < mapaPtr->pacman.colun
a) && (is_possible_fantasma(mapaPtr, 2) == VERDADEIRO))
{
pthread_mutex_lock(&mutex_mapa);
draw_mapa(mapaPtr);
refresh();
pthread_mutex_unlock(&mutex_mapa);
usleep(mapaPtr->fantasma2.velocidade);
atualiza_posicao_fantasma(mapaPtr, 2);
mapaPtr->fantasma2.movimento = DIREITA;
}
}

// Testa se houve encontro entre o pacman e algum fantasma


if( (mapaPtr->pacman.linha == mapaPtr->fantasma1.linha && mapaPt
r->pacman.coluna == mapaPtr->fantasma1.coluna) ||
(mapaPtr->pacman.linha == mapaPtr->fantasma2.linha && mapaPt
r->pacman.coluna == mapaPtr->fantasma2.coluna) ||
(mapaPtr->pacman.linha == mapaPtr->fantasma3.linha && mapaPt
r->pacman.coluna == mapaPtr->fantasma3.coluna) ||
(mapaPtr->pacman.linha == mapaPtr->fantasma4.linha && mapaPt
r->pacman.coluna == mapaPtr->fantasma4.coluna)
)
{
mapaPtr->estado = TERMINADO;
break;
}
}//while(VERDADEIRO)

imprimir_derrota();

refresh();
terminar_threads();
return NULL;
}//void *thread_fantasma2(void *arg)

// => Autor(es) : Rafael Quirino.


// Tread que controla o fantasma 3
void *thread_fantasma3(void *arg)
{
int i;
Mapa *mapaPtr;
mapaPtr = (Mapa*)arg;
while(VERDADEIRO)
{
choose_direction(mapaPtr, 3);
if(mapaPtr->fantasma3.movimento == CIMA)
{
while((mapaPtr->fantasma3.linha > mapaPtr->pacman.linha)
&& (is_possible_fantasma(mapaPtr, 3) == VERDADEIRO))
{
pthread_mutex_lock(&mutex_mapa);
draw_mapa(mapaPtr);
refresh();
pthread_mutex_unlock(&mutex_mapa);
usleep(mapaPtr->fantasma3.velocidade);
atualiza_posicao_fantasma(mapaPtr, 3);
mapaPtr->fantasma3.movimento = CIMA;
}
}
else if(mapaPtr->fantasma3.movimento == BAIXO)
{
while((mapaPtr->fantasma3.linha < mapaPtr->pacman.linha)
&& (is_possible_fantasma(mapaPtr, 3) == VERDADEIRO))
{
pthread_mutex_lock(&mutex_mapa);
draw_mapa(mapaPtr);
refresh();
pthread_mutex_unlock(&mutex_mapa);
usleep(mapaPtr->fantasma3.velocidade);
atualiza_posicao_fantasma(mapaPtr, 3);
mapaPtr->fantasma3.movimento = BAIXO;

}
}
else if(mapaPtr->fantasma3.movimento == ESQUERDA)
{
while((mapaPtr->fantasma3.coluna > mapaPtr->pacman.colun
a) && (is_possible_fantasma(mapaPtr, 3) == VERDADEIRO))
{
pthread_mutex_lock(&mutex_mapa);
draw_mapa(mapaPtr);
refresh();
pthread_mutex_unlock(&mutex_mapa);
usleep(mapaPtr->fantasma3.velocidade);
atualiza_posicao_fantasma(mapaPtr, 3);
mapaPtr->fantasma3.movimento = ESQUERDA;
}
}
else if(mapaPtr->fantasma3.movimento == DIREITA)
{
while((mapaPtr->fantasma3.coluna < mapaPtr->pacman.colun
a) && (is_possible_fantasma(mapaPtr, 3) == VERDADEIRO))
{
pthread_mutex_lock(&mutex_mapa);
draw_mapa(mapaPtr);
refresh();
pthread_mutex_unlock(&mutex_mapa);
usleep(mapaPtr->fantasma3.velocidade);
atualiza_posicao_fantasma(mapaPtr, 3);
mapaPtr->fantasma3.movimento = DIREITA;
}
}

// Testa se houve encontro entre o pacman e algum fantasma


if( (mapaPtr->pacman.linha == mapaPtr->fantasma1.linha && mapaPt
r->pacman.coluna == mapaPtr->fantasma1.coluna) ||
(mapaPtr->pacman.linha == mapaPtr->fantasma2.linha && mapaPt
r->pacman.coluna == mapaPtr->fantasma2.coluna) ||
(mapaPtr->pacman.linha == mapaPtr->fantasma3.linha && mapaPt
r->pacman.coluna == mapaPtr->fantasma3.coluna) ||
(mapaPtr->pacman.linha == mapaPtr->fantasma4.linha && mapaPt
r->pacman.coluna == mapaPtr->fantasma4.coluna)
)
{
mapaPtr->estado = TERMINADO;
break;
}
}//while(VERDADEIRO)

imprimir_derrota();
refresh();
terminar_threads();
return NULL;
}//void *thread_fantasma3(void *arg)

// => Autor(es) : Rafael Quirino.


// Tread que controla o fantasma 4
void *thread_fantasma4(void *arg)
{
int i;
Mapa *mapaPtr;
mapaPtr = (Mapa*)arg;
while(VERDADEIRO)
{
choose_direction(mapaPtr, 4);
if(mapaPtr->fantasma4.movimento == CIMA)
{
while((mapaPtr->fantasma4.linha > mapaPtr->pacman.linha)
&& (is_possible_fantasma(mapaPtr, 4) == VERDADEIRO))
{
pthread_mutex_lock(&mutex_mapa);
draw_mapa(mapaPtr);
refresh();
pthread_mutex_unlock(&mutex_mapa);
usleep(mapaPtr->fantasma4.velocidade);
atualiza_posicao_fantasma(mapaPtr, 4);
mapaPtr->fantasma4.movimento = CIMA;
}
}
else if(mapaPtr->fantasma4.movimento == BAIXO)
{
while((mapaPtr->fantasma4.linha < mapaPtr->pacman.linha)
&& (is_possible_fantasma(mapaPtr, 4) == VERDADEIRO))
{
pthread_mutex_lock(&mutex_mapa);
draw_mapa(mapaPtr);
refresh();
pthread_mutex_unlock(&mutex_mapa);
usleep(mapaPtr->fantasma4.velocidade);
atualiza_posicao_fantasma(mapaPtr, 4);

mapaPtr->fantasma4.movimento = BAIXO;
}
}
else if(mapaPtr->fantasma4.movimento == ESQUERDA)
{
while((mapaPtr->fantasma4.coluna > mapaPtr->pacman.colun
a) && (is_possible_fantasma(mapaPtr, 4) == VERDADEIRO))
{
pthread_mutex_lock(&mutex_mapa);
draw_mapa(mapaPtr);
refresh();
pthread_mutex_unlock(&mutex_mapa);
usleep(mapaPtr->fantasma4.velocidade);
atualiza_posicao_fantasma(mapaPtr, 4);
mapaPtr->fantasma4.movimento = ESQUERDA;
}
}
else if(mapaPtr->fantasma4.movimento == DIREITA)
{
while((mapaPtr->fantasma4.coluna < mapaPtr->pacman.colun
a) && (is_possible_fantasma(mapaPtr, 4) == VERDADEIRO))
{
pthread_mutex_lock(&mutex_mapa);
draw_mapa(mapaPtr);
refresh();
pthread_mutex_unlock(&mutex_mapa);
usleep(mapaPtr->fantasma4.velocidade);
atualiza_posicao_fantasma(mapaPtr, 4);
mapaPtr->fantasma4.movimento = DIREITA;
}
}

// Testa se houve encontro entre o pacman e algum fantasma


if( (mapaPtr->pacman.linha == mapaPtr->fantasma1.linha && mapaPt
r->pacman.coluna == mapaPtr->fantasma1.coluna) ||
(mapaPtr->pacman.linha == mapaPtr->fantasma2.linha && mapaPt
r->pacman.coluna == mapaPtr->fantasma2.coluna) ||
(mapaPtr->pacman.linha == mapaPtr->fantasma3.linha && mapaPt
r->pacman.coluna == mapaPtr->fantasma3.coluna) ||
(mapaPtr->pacman.linha == mapaPtr->fantasma4.linha && mapaPt
r->pacman.coluna == mapaPtr->fantasma4.coluna)
)
{
mapaPtr->estado = TERMINADO;
break;
}
}

imprimir_derrota();
refresh();
terminar_threads();
return NULL;
}//void *thread_fantasma4(void *arg)

// => Autor(es) : Rafael Quirino


// Inicia os threads
void iniciar_threads(Mapa *mapaPtr)
{
pthread_create(&f1, NULL, thread_fantasma1,
pthread_create(&f2, NULL, thread_fantasma2,
pthread_create(&f3, NULL, thread_fantasma3,
pthread_create(&f4, NULL, thread_fantasma4,

mapaPtr);
mapaPtr);
mapaPtr);
mapaPtr);

}//void iniciar_threads(Mapa *mapaPtr)

// => Autor(es) : Rafael Quirino


// Finaliza todos os threads em caso de vitria ou derrota
void terminar_threads()
{
pthread_cancel(f1);
pthread_detach(f1);
pthread_cancel(f2);
pthread_detach(f2);
pthread_cancel(f3);
pthread_detach(f3);
pthread_cancel(f4);
pthread_detach(f4);
}//void terminar_threads()

Anda mungkin juga menyukai