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>