A primeira versão do jogo Batalha Naval pode ser visualizada no seguinte Código Fonte. Essa versão foi desenvolvida em OpenGL no ambiente Linux e possui as seguintes características:
Os navios foram desenhados utilizando o software Maya 6.0. Abaixo podem ser vistos os três tipos de navios criados no Maya 6.0.
Os navios foram gravados no formato .OBJ. Esse formato pode ser lido e usado em opengl através da biblioteca glm que faz parte do GLUT. Abaixo estão os comandos que são utilizados para ler os arquivos contendo as imagens 3D.
GLMmodel *model2;O jogo é composto basicamente de 2 matrizes 15x15. Uma matriz do usuário e outra destinada ao computador. Na matriz do computador os navios serão distribuídos aleatoriamente, enquanto que na outra matriz o usuário entrará com a posição dos navios manualmente via teclado.
As matrizes são formadas por um tipo criado denominado "navio" que contém as seguintes variáveis:
Onde:
Ao se iniciar o jogo, o computador sorteia a posição onde serão armazenados os navios através do seguinte código:
for (Navio.tipo=2; Navio.tipo<=4; Navio.tipo++)A função "putNavio" tem como argumentos a matriz que se deseja colocar o navio, a posição onde o navio será inserido e o tipo de navio. Essa função retornará falso caso a posição em que se deseja adicionar um navio já esteja ocupada ou então caso o navio não consiga preencher todas as posições da matriz (de acordo com o seu tamanho).
O Tamanho inicial da janela escolhido é de 800x600. O volume de visualização escolhido é de:
As duas matrizes foram definidas através dos seguintes vértices:
GLfloat vertices[8*3] = {
-30.0,0.0,7.0,
-3.0,0.0,7.0,
-3.0,2.5,7.0,
-30.0,2.5,7.0,
-30.0,0.0,-8.0,
-3.0,0.0,-8.0,
-3.0,2.5,-8.0,
-30.0,2.5,-8.0
};
GLfloat vertices2[8*3] = {
3.0,0.0,7.0,
30.0,0.0,7.0,
30.0,2.5,7.0,
3.0,2.5,7.0,
3.0,0.0,-8.0,
30.0,0.0,-8.0,
30.0,2.5,-8.0,
3.0,2.5,-8.0
};
Após o usuário entrar com a posição dos navios (função putNavio) para ser armazenado na matriz o jogo começa. As jogadas são alternadas entre o usuário e o computador. A matriz em que o usuário fará as jogadas é a da esquerda (pode ser visto na seção de Telas do Jogo mais abaixo). O computador atribui posições aleatoriamente para suas jogadas e nessa primeira versão não foi utilizada nenhuma heurística caso o computador acerte uma parte do navio.
Para cada jogada, tanto do computador quanto do usuário, o seguinte algoritmo é utilizado:
No fluxograma acima está demonstrado a jogada do usuário, mas o código para a jogada do computador é o mesmo.
Após cada jogada, a tela do sistema é re-pintada e as posições são desenhadas de acordo com as informações das matrizes (através da função desenhaJogo). A função desenhaJogo percorre as duas matrizes inteiras e verifica:
A variável deslocaX terá um valor diferente para cada tipo de navio, fazendo com que o navio seja transladado para a posição correta da matriz
O fluxograma abaixo demonstra o algoritmo utilizado para o desenho do jogo
Após cada jogada, é verificado se foi atingido o final do jogo. Isso é feito através da função acabouJogo(int matriz). Essa função percorre toda a matriz e verifica se todas as peças possuem o valor visible = 1. Se essa informação se confirmar, então o jogo está encerrado.
Foram utilizados os seguintes valores para simular um ambiente diurno no jogo.
GLfloat dia_amb[]={0.7, 0.7, 0.7, 1.0};
GLfloat dia_dif[]={1.0, 1.0, 1.0, 1.0};
GLfloat dia_spe[]={1.0, 1.0, 1.0, 1.0};
A fonte de luz está posicionada em:
Para simular um abiente noturno, foram utilizados os seguintes valores:
Para simular luzes acesas nos navios quando o ambiente for noturno, foi utilizado o parâmetro GL_EMISSION do objeto, com as seguintes características:
A tecla 'd' ativa o ambiente diurno enquanto a 'n' ativa o noturno
Para selecionar a posição através do cursor foi necessário criar um ID para cada quadrado que identifica a posição da jogada no tabuleiro. Através da função glLoadName é então atribuído um nome para cada objeto. Para saber qual objeto o usuário clicou, foi criada uma função denominada PICK, que retorna o objeto clicado pelo usuário.
Para a parte de texturas, foram feitos 5 tipos de texturas: de metal, de rocha, de madeira, de água e de concreto. As texturas são lidas de um arquivo BMP. A biblioteca utilizada nesse projeto, a GLM, possui um método para atribuir as coordenadas de textura. Portanto, não é necessário fazer essa atribuição para os objetos lidos dos arquivos .OBJ.
Primeiro, indica-se a quantidade de texturas que será utilizada através do comando glGenTextures, nesse caso são 5. O comando glTexImage2D foi utilizado para armazenar os dados RGB de cada textura. Para selecionar cada textura separadamente, utiliza-se o comando glBindTexture.
Para compilar o código fonte é utilizada a seguinte linha:
cc naval.c glm.c -o naval -lGL -lGLU -lglut