View on GitHub

naval_batle_game

Jogo Batalha Naval implementado em C

naval_batle_game

ArtPhil © 2017

Jogo Batalha Naval desenvolvido para fins acadêmicos

Arthur Phillip Silva (github), </br> graduando em Sistemas de Informação (SI) </br> pelo Departamento de Ciência da Computação (DCC) </br> da Universidade Federal de Minas Gerais (UFMG).

Objetivo

O intuito deste projeto é praticar os conceitos aprendidos durante curso de Sistemas de Informação da UFMG e desenvolver um jogo intuitivo e divertido.

Batalha Naval

Batalha Naval é um jogo para dois jogadores, onde cada jogador que possue um tabuleiro e alguns barcos de tamanhos variados (mesma quantidade e tipo barcos).

Cada jogador posiciona todos seus barcos em seu tabuleiro sem que o adversário veja, e após isso começa a batalha. Os jogadores deveram acertar os barcos inimigos disparando tiros no tabuleiro adversário, cada um tem direito a um tiro por vez e os barcos só são destruídos se todas as suas partes são aingidas.

O primeiro jogador que eliminar todos os barcos do adversário vence a partida.

Instalação

Clone o repositório $ git clone github.com/artphil7/naval_batle_game/ ou faça o download do arquivo .zip e extraia-o.

Compile código com o makefile $ make, pelo shel $ bash compila.sh (colocando seu shel no lugar de bash) ou da forma direta$ gcc -o nav_bat.exe src/main.c src/game.c src/player.c src/board.c src/target.c src/messages.c na pasta raiz.

Recomendo o GCC, para Windows pode ser obtido através da instalação do MinGW.

Execute o comando $ ./nav_bat.exe e seguir as istruções da tela.

*Comandos do linux, para windows ignore $ e ./, para mac faça as adptações necessárias.

Desenvolvimento e organização

Programa desenvolvido na linguagem C.</br> Compilação pelo GCC automatizado por makefile.</br> Sitema de modularização por separação de TAD’s em arquivos (.c .h).</br> Organização do código ataves de principios do Newspaper Order.</br> Nomes de funções e arquivos em inglês, TAD’s e variaveis em português.</br> Padronização de nomes em snake case e chaveamento de funções por brace style K&R (Kernighan & Ritchie)

Arquivos

main

Aqui o programa é iniciado as dependências são inicializadas, como a seleção de sistema operacional e lingua utilizada.</br> main.c</br>

game

Este é a principal parte do programa, onde é definido ou manipulado todo o ferramental necessário para o funcionamento do jogo. </br> Todas as TADs são acessadas a partir desta e aqui estão as funções que manipulam mais de uma TAD como também as definições dos comportamentos automáticos e inteligência do jogo.</br> game.c</br> game.h</br>

player

Onde são definidos os atributos de funções necessárias para a manipulação dos jogadores.</br> player.c</br> player.h</br>

board

Aqui os tabuleiros são definido e manimulados.</br> board.c</br> board.h</br>

target

Definições dos alvos utilizados pelas TADs board e player.</br> target.c</br> target.h</br>

messages

Todos os textos utilizados no jogo são manupulados por essa TAD, possibilitando o uso de outras linguas na utilização do jogo.</br> Os textos utilizados aqui encontram-se na pasta lang/.</br> messages.c</br> messages.h</br>

source

Arquivo, chamado por todos os outros, reune as variáveis globais do prorama, as definições e as inclusões de bibliotecas utilizadas pelos demais arquivos do programa.</br> source.h</br>

makefile

Automatização da compilação e organização de arquivos e objetos.</br> makefile</br>

lang/

linguas em que são possiveis jogar o Batalha Naval.</br> Prortuguês : pt-br</br>

Inteligencia

A Inteligência do jogo consiste em como dispor os barcos no tabuleiro de forma a não ficarem muito fáceis de achar e em como encontrar o barco inimigo de maneira eficiente.

Desafios

A disposição dos barcos deve ser de forma não repetitiva e menos agrupada possivel a fim de de não gerar metodos infaliveis de derrotar a máqiuina.

Para o ataque, os alvos devem ser escolhidos de tal forma que possibilite vencer a batalha no menor numero de rodadas, evitando que o inimigo o faça primeiro.

Implementação

Para evitar repetições previsíveis utilizou-se de aleatoriedade com a função rand() disponivel no C com a semente de aleatoriedade sendo a hora global atual fornecida pela biblioteca time.

Para inserir os barcos no tabuleiro optou-se pela simplicidade, escolhendo a posição e a orientação de forma aleatórias encontrou-se um resultado aceitável para as expectativas iniciais, pois tanto os barcos se configuraram de formas bem distintas a cada partida e como em média se espalhavam pelo tabuleiro de acordo com o esperado.

A Implementação pode ser encontrada na função fill_auto() no arquivo game.c

A escolha do alvo de ataque, a principio, é feita de forma aleatória, porém assim não se aproveita o fato das partes do barco ficarem adjascentes, por isso pensou-se em guardar o ultimo alvo com sucesso, mas se errasse a direção escolhida e o próximo alvo falhasse a busca parava naquele ponto. Para resolver esse problema fez-se uma pilha e a cada sucesso armazenava-se todos os alvos em redor, o que possibilitava atingir o barco inteiro, mas gerava um desperdicio de tiros pois atingia todas as posições ao redor do barco. Por fim decediu-se por fazer uma verificação das casas em redor para selecionar apenas os alvos mais prováveis e chegou-se ao seguinte algoritmo:

Se existe alvos na pilha:

Seleciona proximo alvo.

Senão:

Escolhe um alvo aleatório.

Efetua o disparo.

Se acertou:

Se existe alvos na pilha:

Para cada direção:

Se acertou posição adjascente:

Adiciona posição oposta na pilha.

Senão:

Adiciona todas as pocições adjascentes.

Com isso, quando um barco é encontrado, este é atingido por completo e só são gastos tiros na adjascencia do alvo inicial.

A Implementação pode ser encontrada na função play_auto() no arquivo game.c</br>