Jogo de Estratégia Militar.
Transcrição
Jogo de Estratégia Militar.
CRISTIANO PALMER MARIO CESAR MELNIK JOGO DE ESTRATÉGIA MILITAR Curitiba 1º Semestre / 2005 CRISTIANO PALMER MARIO CESAR MELNIK JOGO DE ESTRATÉGIA MILITAR Trabalho de Conclusão do Curso de Bacharelado em Ciência da Computação, do Centro Universitário Campos de Andrade – UNIANDRADE, como requisito final à obtenção do título de Bacharel em Ciência da Computação. Orientador: Prof. M.Sc. Edson Luiz Machado. Curitiba 1º Semestre / 2005 AGRADECIMENTOS A Deus. Ao Prof. M.Sc. Felipe Marcon, por esclarecer as dúvidas que ocorreram até o momento referentes à parte teórica do projeto e normas, auxiliando-nos para melhorá-lo. Ao Prof. M.Sc. Edson Luiz Machado, por esclarecer as dúvidas que ocorreram até o momento referentes à parte prática do projeto, sanando muitas dúvidas referentes às técnicas de Inteligência Artificial. Ao Prof. M.Sc. Ionildo José Sanches, pelo material e ajuda prática sobre as bibliotecas de OPEN-GL, auxiliando no que diz respeito a computação gráfica existente no nosso projeto final. Ao amigo e colega de trabalho Cesar Augusto Felber pelo auxílio no que diz respeito a desenvolvimento de jogos, por já possuir conhecimento prático e teórico em desenvolvimento dessa natureza. ii SUMÁRIO LISTA DE ABREVIATURAS E SIGLAS .............................................................................viii RESUMO ..................................................................................................................................ix ABSTRACT .................................................................................................................................x 1 INTRODUÇÃO....................................................................................................................... 1 1.1 CONTEXTUALIZAÇÃO ................................................................................................ 1 1.2 DESCRIÇÃO DO PROBLEMA ...................................................................................... 1 1.3 MOTIVAÇÕES ................................................................................................................ 2 1.4 OBJETIVO GERAL......................................................................................................... 2 1.5 OBJETIVOS ESPECÍFICOS ........................................................................................... 2 1.6 FINALIDADE .................................................................................................................. 3 1.7 VISÃO GERAL DO TRABALHO .................................................................................. 3 2 FUNDAMENTAÇÃO TEÓRICA .......................................................................................... 5 2.1 INTELIGÊNCIA ARTIFICIAL ....................................................................................... 5 2.1.1 Definições de IA......................................................................................................... 5 2.1.2 Lógica ........................................................................................................................ 6 2.1.2.1 Histórico ............................................................................................................. 6 2.1.3 Árvore BSP................................................................................................................ 7 2.1.4 Métodos de Busca...................................................................................................... 7 2.1.4.1 Busca Heurística ................................................................................................. 8 2.1.4.1.1 Busca em profundidade: ............................................................................... 8 2.1.4.1.2 Busca em largura: ......................................................................................... 8 2.1.4.1.3 Gera e Testa:................................................................................................. 9 2.1.4.1.4 Busca em feixe: ............................................................................................ 9 2.1.4.1.5 Subindo o morro: ........................................................................................ 10 2.1.4.2 Utilização da Busca Heurística......................................................................... 10 2.1.5 Inteligência Artificial Aplicada em Jogos .............................................................. 10 2.1.5.1 Mini Max .......................................................................................................... 11 2.1.5.2 Alfa Beta........................................................................................................... 12 2.2 LINGUAGEM DE PROGRAMAÇÃO.......................................................................... 12 2.2.1 Linguagem C ............................................................................................................ 13 2.2.2 Linguagem C++........................................................................................................ 13 iii 2.3 COMPUTAÇÃO GRÁFICA.......................................................................................... 13 2.3.1 OPEN-GL ................................................................................................................. 14 2.4 ANÁLISE DE PROJETO ESTRUTURADO ................................................................ 14 2.5 JOGOS ELETRÔNICOS ............................................................................................... 15 3 DESENVOLVIMENTO........................................................................................................ 17 3.1 RECURSOS NECESSÁRIOS........................................................................................ 17 3.2 ESPECIFICAÇÃO E DESENVOLVIMENTO DO PROJETO .................................... 18 3.2.1 Especificações Técnicas .......................................................................................... 18 3.2.2 Diagrama de desenvolvimento ................................................................................ 19 3.3 AMBIENTE DE EXECUÇÃO DO PROJETO.............................................................. 21 3.4 PONTOS FORTES E FRACOS..................................................................................... 22 3.5 CRONOGRAMA DE ATIVIDADES............................................................................ 22 3.5.1 Detalhamento do Cronograma.................................................................................. 23 4 RESULTADOS ..................................................................................................................... 26 4.1 INTRODUÇÃO.............................................................................................................. 26 4.2 DISTRIBUIÇÃO DE PEÇAS ........................................................................................ 26 4.3 REALIZAÇÃO DE JOGADAS ..................................................................................... 28 4.4 INTERFACE GRÁFICA................................................................................................ 29 5 DISCUSSÃO E CONCLUSÕES .......................................................................................... 32 5.1 ANÁLISE DOS RESULTADOS ................................................................................... 32 5.2 CONCLUSÕES .............................................................................................................. 33 5.3 TRABALHOS FUTUROS ............................................................................................. 33 REFERÊNCIAS BIBLIOGRÁFICAS ..................................................................................... 34 GLOSSÁRIO............................................................................................................................ 37 APENDICE A: MANUAL ..................................................................................................... 38 1.REQUISITOS DO JOGO...................................................................................................... 42 2.INSTALAÇÃO...................................................................................................................... 42 3.TABULEIRO ........................................................................................................................ 45 4.DISPONIBILIZAÇÃO DAS PEÇAS ................................................................................... 47 5.JOGADAS ............................................................................................................................. 49 6.ATAQUE............................................................................................................................... 50 7.QUEM GANHA O JOGO..................................................................................................... 52 8.SAIR ...................................................................................................................................... 52 iv 9.DICAS IMPORTANTES ...................................................................................................... 52 APENDICE B: FONTES DO JOGO DE ESTRATÉGIA MILITAR................................55 v LISTA DE FIGURAS 1 Busca em Profundidade...................................................................................... 8 2 Busca em Amplitude.......................................................................................... 9 3 Corte Beta........................................................................................................... 12 4 Simbologia utilizada para Análise Estruturada / Análise Essencial................... 15 5 Modelo Ambiental.............................................................................................. 20 6 Tela com peças................................................................................................... 29 7 Jogada sobre Jogador.......................................................................................... 30 8 Movimentação de bomba.................................................................................... 30 vi LISTA DE TABELAS 1 Forma geral............................................................................................................. 14 2 Custos referentes ao desenvolvimento do projeto................................................... 17 3 Custos para execução do sistema............................................................................ 21 4 Etapas de desenvolvimento do projeto.................................................................... 22 5 Teste de Posicionamento da Torre.......................................................................... 26 6 Teste de posicionamento de peças.......................................................................... 27 7 Jogada do soldado................................................................................................... 28 8 Execução do maior valor......................................................................................... 28 vii LISTA DE ABREVIATURAS E SIGLAS 2D - Bidimensional API - Aplication Programming Interface (Interface de Programação de Aplicativo) BSP - Binary Space Partitionig Truee (Árvore Binaria de Partição de Espaço) CD-ROM - Compact Disc Read Only Memory (Disco Compacto de Memória Somente Leitura) FIFO - First In First Out (Primeiro a Entrar Primeiro a Sair) GNU/GPL - General Public License (Licença Pública Geral) GCC - GNU Compiler Collection (Coleção de Compiladores GNU) IA - Inteligência Artificial ISO - International Standards Organization (Organização de Padrões Internacionais) OPEN-GL - Open Graphics Library (Biblioteca Gráfica Aberta) POO - Programação Orientada a Objeto SO - Sistema Operacional VGA - Video Graphics Array (Dispositivo Gráfico de Vídeo) viii RESUMO Este projeto visa o desenvolvimento de um algoritmo que utiliza técnicas de Inteligência Artificial, aplicadas a um software recreativo baseado em um jogo tradicional, denominado COMBATE. A utilização de técnicas de Inteligência Artificial visa melhorar determinados aspectos do jogo, além de melhorar a estratégia de jogo, aplicando algoritmos que determinam os melhores caminhos para alcançar o objetivo. Constituiu-se de várias alterações em contexto do jogo original para ser aplicado a este trabalho. PALAVRAS CHAVES Jogos, Inteligência Artificial, Computação Gráfica. ix ABSTRACT This project aims at the development of an algorithm that uses techniques of Artificial Intelligence, applying them in a based recreation software in a traditional game, called STRATEGO. The use of techniques of Artificial Intelligence aims at to improve definitive aspects do game, besides improving the game strategy, applying algorithms that determine the best ways to reach the objective. The original game had some alterations in its context to be applied to this work. KEY-WORDS Games, Artificial Intelligence, Graphical Computation. x 1 CAPÍTULO 1 INTRODUÇÃO 1.1 CONTEXTUALIZAÇÃO A Inteligência Artificial (IA) é um ramo na Ciência da Computação que foi construído a partir de idéias filosóficas, científicas e tecnológicas herdadas de outras ciências, como por exemplo, lógica, matemática, psicologia, lingüística, neurociências, etc. (BITTENCOURT, 1996). O objetivo geral da Inteligência Artificial é a criação de teorias e modelos para a capacidade cognitiva. Esses modelos são implementados utilizando-se como ferramenta o computador. A validade de um modelo ou de uma teoria de IA é demonstrada diretamente através da ação inteligente do programa computacional. Os jogos eletrônicos desenvolvidos na atualidade fazem uso das técnicas de IA em muitas de suas aplicações, como por exemplo, controle das ações que os agentes envolvidos nos jogos devem tomar. Os primeiros jogos eletrônicos, mostravam a capacidade das máquinas eletrônicas de representar “ações” onde os homens poderiam participar. Em 1962, foi feita a demonstração de “Space War”, o primeiro jogo eletrônico, tendo um monitor como “interface de visualização”. Na década de 70, foi apresentada uma versão para o grande público de “Space War”, chamado “Computer Space”, e com esse jogo Nolan Bushnell passou a ser considerado o pai dos jogos eletrônicos. Os jogos eletrônicos abriram o caminho para que a interatividade entrasse nas massas, principalmente nas décadas de 80 e 90 em suas versões em CD-ROM (Compact Disc Read Only Memory) (LEMOS,2004). 1.2 DESCRIÇÃO DO PROBLEMA Desenvolver um algoritmo para o jogador eletrônico, introduzir novas regras, e utilizar técnicas de IA como previsão (heurística) ou dedução de localização de peças inimigas, a partir de certa altura do jogo, pois inicialmente o algoritmo só terá a localização das peças controladas por ele. 2 1.3 MOTIVAÇÕES A oportunidade de pesquisar uma área vasta como a IA, capaz de proporcionar boa base e experiência para uma especialização no assunto. Aplicar as técnicas aprendidas em outros jogos, já que a área de IA e de desenvolvimento de jogos é promissora, possuindo um interesse muito grande, principalmente do público jovem. 1.4 OBJETIVO GERAL O propósito do projeto é a criação de um software destinado ao entretenimento, complementando e melhorando o jogo tradicional. Para isto, tem-se o objetivo de desenvolver um algoritmo que tem por função executar o posicionamento inicial das peças, movimentação e ataque das mesmas, até o término do jogo com a tomada da torre, uma vez que o objetivo foi alterado para proporcionar um novo desafio, sabendo-se que o jogo Combate é apenas uma base para este trabalho. Serão de grande utilidade as técnicas de IA durante decorrer do jogo, pois permitirão escolher os melhores caminhos para alcançar o objetivo, ou seja, ampliando possibilidade de ganhar o jogo. O principal atrativo na utilização destas estratégias é o desconhecimento do valor das peças adversárias que ao decorrer do jogo são desvendadas através do confronto direto dos combatentes. 1.5 OBJETIVOS ESPECÍFICOS Desenvolvimento de um software com interface 2D (bidimensional) no qual são utilizadas técnicas de IA e computação gráfica. Construir graficamente um tabuleiro com dimensões 15 linhas por 15 colunas: O tabuleiro constituído de forma gráfica apresenta a interface principal entre o usuário e o software. Construir um algoritmo que utilize técnicas inteligentes para a realização de posicionamento de peças do computador, este algoritmo não deve repetir o mesmo posicionamento. Construir um algoritmo que utilize técnicas de inteligência Artificial para a realização de jogadas do computador. 3 Este jogo tem como principal atribuição o duelo entre as partes integrantes: computador X homem. O software é apresentado em forma de um tabuleiro, tendo esse como sua interface principal. Tanto a análise quanto o desenvolvimento serão baseados em forma estruturada, a fim de facilitar a compreensão do domínio do problema, permitindo a visualização do sistema de uma forma realista através dos mesmos. Normalmente na análise estruturada esta visualização está direcionada aos processos, o que dificulta o entendimento e a abstração dos dados. O jogo disponibiliza as peças do computador no tabuleiro para um melhor aproveitamento das jogadas, possuindo um algoritmo desenvolvido para isso. De modo a evitar que o computador utilize sempre a mesma formação, o algoritmo executará rotinas de distribuição evitando a mesma formação sempre que um novo jogo for iniciado. Deve existir um algoritmo para tratar especialmente das jogadas, assim como das estratégias de defesa e ataque que deverão ser utilizadas. Na análise do estado atual do tabuleiro é verificado se o jogo chegou em seu fim ou se pode continuar a partida, e sempre que o jogador ou o computador jogar deve haver essa verificação. Essa análise é de suma importância, pois é com ela que o computador fará a verificação do vencedor ou se ocorreu um empate. A IA também irá atuar na situação em que existe um objetivo a ser alcançado no jogo, porém esse objetivo poderá ser alcançada através de dedução de peças não reveladas, para então verificar as jogadas possíveis e escolher a melhor. 1.6 FINALIDADE Apresentar algoritmos que através de IA tenham reações coerentes com seu objetivo sem ao menos conhecê-lo, podendo escolher caminhos no decorrer do jogo (heurística). Inclusão do jogador eletrônico, com o objetivo de divertimento de pessoas de várias idades, contribuindo para o desenvolvimento do raciocínio lógico do jogador, criando estratégias para vencer o seu oponente (o computador), que tem por função executar desde o posicionamento inicial das peças, condução das jogadas até a conclusão do jogo. 1.7 VISÃO GERAL DO TRABALHO No Capítulo 1 é apresentada uma breve introdução, a motivação e foi detalhado os objetivos do trabalho. 4 No Capítulo 2 é feita a apresentação e fundamentação do trabalho, apresentando técnicas utilizadas em uso tanto nos jogos quanto na IA. No Capítulo 3 são apresentados os recursos utilizados para o seu desenvolvimento, tanto teórico quanto prático, o ambiente que o software deve ser instalado, e o Cronograma das atividades. No Capítulo 4 é apresentado os resultados esperados e obtidos do projeto como um todo. No Capítulo 5 é feita uma conclusão do trabalho até o momento citando projetos futuros que podem ser realizados. 5 CAPÍTULO 2 FUNDAMENTAÇÃO TEÓRICA 2.1 INTELIGÊNCIA ARTIFICIAL O avanço da ciência em determinadas áreas provoca reações que têm origem no medo da inversão da ordem natural das coisas. O avanço nas experiências genéticas, por exemplo, faz muitas pessoas ficarem admiradas, prevendo diversas aplicações benéficas, e no entanto, faz outros tantos reagirem de forma negativa, antevendo o incorreto uso deste conhecimento (FERNANDES,2003). Na IA não foi diferente. Se por um lado, algumas pessoas tinham expectativas benéficas muito elevadas, outras não acreditavam que fosse possível criar máquinas com inteligência e, mesmo que fosse possível, isso seria algo extremamente negativo. No entanto, a ciência avançou alheia às críticas, e seu avanço se deu justamente pela capacidade do homem de ignorar as críticas e ousar (SIMONS,1998). Embora o estudo sobre a inteligência tenha se iniciado dentro do campo da filosofia, o mesmo extrapolou o âmbito filosófico e a inteligência passou a ser estudada de forma científica por outros campos do saber humano, tais como engenharia, psicologia, pedagogia, ciência cognitiva, neurologia, lingüística, computação, entre outros, visando aspectos práticos e comerciais (GANASCIA,1993). Da mesma maneira que ocorreu com outras ciências, que antes pertenciam ao campo da filosofia e depois se tornaram ciências independentes ou ramos de outras ciências, aconteceu com o estudo da inteligência, que hoje é alvo de estudo da ciência conhecida como IA. A IA tem se destacado na busca por compreender a inteligência e englobar diversos campos do conhecimento com o objetivo de simular a inteligência (GANASCIA,1993). 2.1.1 Definições de IA “O objetivo da IA é o estudo e a modelagem da inteligência tratada como um fenômeno. A inteligência é algo extremamente complexo, resultado de milhões de anos de evolução. Entendê-la não é tarefa fácil. Embora existam muitas conclusões relevantes, ainda há muito a 6 ser desvendado, uma vez que não existe uma teoria completa sobre a mente humana e os processos de raciocínio” (FERNANDES, 2003). “IA é a parte da Ciência da Computação que compreende o projeto de sistemas computacionais que exibam características associadas à inteligência no comportamento humano - compreensão de linguagem, aprendizagem, raciocínio, resolução de problemas, e assim por diante” (BARR, FEIGENBAUM, 1981). “Se nós podemos imaginar um artefato capaz de colecionar, conciliar, de escolher entre, de compreender, de distinguir e de saber, então temos a inteligência artificial” (FEIGENBAUM, MCCORDUCK, 1983). “A IA é o uso de programas de computadores e técnicas de programação para clarificar os princípios da inteligência em geral e do pensamento humano em particular” (BODEN, 1977). As definições convergem para um mesmo ponto: o estudo de conceitos que permitem aos computadores exibirem comportamento inteligentes. 2.1.2 Lógica A adequação da lógica como método de representação de conhecimento é discutida desde os primórdios da IA. Os primeiros sistemas que receberam o qualificativo de aplicações de IA foram sistemas baseados em lógica, e ainda hoje grande parte das pesquisas na área estão ligadas direta ou indiretamente à lógica (BITTENCOURT, 2001). A lógica tema a vatagem pedagógica de ser um exemplo simples de representação para agentes baseados em conhecimento, mas ela representa algumas limitações severas (RUSSELL, NORVIG, 1995).. 2.1.2.1 Histórico A lógica possui uma longa história, mais de 23 séculos, que remonta aos antigos filósofos gregos, principalmente Aristóteles, que estabeleceu os fundamentos da lógica de maneira sistemática (BITTENCOURT, 2001). Os conceitos fundamentais da lógica são: verdade e prova. Estes conceitos foram investigados durante séculos por filósofos. A lógica entra para o campo da matemática em 1847, uma linguagem formal que permite a realização de inferências. A lógica moderna tem início em 1879, quando foi publicada a primeira versão do que é conhecido hoje como cálculo de predicados. No fim do século XIX, a lógica passou a ser utilizada como base formal para 7 outros campos matemática, e seus métodos e limites passaram a ser estudados com rigor (BITTENCOURT, 2001). Em lógica, a definição é mais precisa. A semântica da linguagem define a verdade de cada sentença com relação a cada mundo possível (RUSSELL, NORVIG, 1995). De maneira geral, um sistema lógico consiste em um conjunto de fórmulas e um conjunto de regras de inferência. As fórmulas são sentenças pertencentes a uma linguagem formal cuja sintaxe é dada. Cada fórmula pode ser associada a um valor verdadeiro, isto é, ao valor verdadeiro (V) ou ao falso (F). A parte da lógica que estuda os valores verdade é chamada teoria de modelos. Dois problemas importantes estão relacionados com o valor verdade de uma fórmula: o problema da validade, isto é, se é possível que uma dada fórmula apresente o valor verdadeiro, e o problema da tautologia, isto é, se uma fórmula é ou não sempre verdadeira (BITTENCOURT, 2001). As regras de inferência fornecem uma estrutura dedutiva à linguagem lógica. Uma regra de inferência é uma regra sintática que, quando aplicada repetidamente a uma ou mais fórmulas verdadeiras, gera apenas novas fórmulas verdadeiras. As regras de inferência fornecem uma estrutura dedutiva à linguagem lógica. A seqüência de fórmulas geradas através da aplicação de regras de inferência sobre um conjunto inicial de fórmulas é chamada de prova. A parte da lógica que estudas as provas é chamada de teoria de provas (BITTENCOURT, 2001). A teoria da resolução parte da transformação da expressão a ser provada para a forma canônica conhecida como forma normal conjuntiva ou forma clausal. O método é baseado em uma regra de inferência única, chamada regra de resolução, e utiliza intensivamente um algoritmo de casamento de padrões chamado algoritmo de unificação (BITTENCOURT, 2001). 2.1.3 Árvore BSP Apresenta uma estrutura de dados que proporciona a subdivisão do espaço em volumes livres de obstáculos (SANTOS, 2002). A Árvore BSP (Binary Space Partitioning Truee) particiona o espaço dividindo-o em duas partes a cada nível utilizando um plano de divisão (SANTOS, 2002). No campo da Computação Gráfica, tem aplicações na remoção de superfícies ocultas. 2.1.4 Métodos de Busca 8 Muitos problemas de IA necessitam de métodos de casamento (matching) e busca (search), durante o processo de solução (NASCIMENTO, YONEYAMA, 2000). 2.1.4.1 Busca Heurística Dentre as técnicas de IA, tem-se a busca heurística. A busca heurística proporciona um meio de solucionar problemas complexos, para os quais não há disponível uma abordagem mais direta nem uma estrutura na qual qualquer técnica direta disponível possa ser inserida. A heurística é um procedimento para resolver problemas através de um enfoque intuitivo, em geral racional, no qual a estrutura do problema passa a ser interpretada e explorada inteligentemente para obter uma solução razoável. Para os estudiosos de IA, as heurísticas são critérios, métodos ou princípios para decidir, entre vários cursos de ação alternativos, aquele que parecer mais atraente para atingir algum objetivo. As técnicas de busca heurísticas são (FERNANDES,2003): 2.1.4.1.1 Busca em profundidade: É também denominada de “primeiro em profundidade” (ou depth first) e explora o caminho para o objetivo, dando preferência aos nós que estão mais distantes da raiz da árvore de busca. É aplicável quando as soluções são total e igualmente desejadas ou quando, em uma varredura prévia, direções incorretas são detectadas. Conforme figura 1, que mostra a ordem em que os nodos são visitados. Figura 1. Busca em Profundidade. 2.1.4.1.2 Busca em largura: Esta é o oposto de depth first e trabalha com o critério FIFO (First In First Out). É também denominada de busca em amplitude, em nível ou breadth first. Todos os nós de certo 9 nível da árvore são examinados antes dos níveis abaixo, caso exista uma solução e se o grafo é finito, a solução será encontrada. Existem alguns inconvenientes na utilização desta técnica: requer muita memória (pois o número de nós é exponencial em relação à profundidade); exige um esforço computacional relativamente grande se o comprimento dos caminhos não for pequeno, o esforço com os operadores de pouca importância assume as mesmas proporções que com os operadores mais importantes. Na figura 2, observa-se como é feita essa varredura pelo algoritmo, que escolhe visitar os nodos mais próximos do nodos iniciais, mantendo sempre um conjunto de caminhos candidatos que é a verdadeira podendo ser estendida até algum nodo objetivo. Figura 2. Busca em Amplitude. 2.1.4.1.3 Gera e Testa: É um procedimento de busca em profundidade, pois as soluções devem estar completas para serem testadas. A sua forma aleatória, não garante que alguma solução seja encontrada e também que todas elas sejam geradas. A forma mais adequada de implementar o método é usar a busca em profundidade adicionando backtracking (ato de retroceder na busca a um nível anterior, em geral com o objetivo de tentar uma outra alternativa de solução). É aceitável quando se trata da solução de problemas simples ou quando for usado como método auxiliar de outra técnica. 2.1.4.1.4 Busca em feixe: É uma alternativa do método de busca em largura. Existe uma restrição ao número de nós que serão considerados em cada nível. Por exemplo, se este número não ultrapassar três, então, no máximo será explorada três vezes a profundidade de nós. Isto reduz o esforço de busca e proporciona bons resultados quando houver bons critérios para escolha de nós. 10 2.1.4.1.5 Subindo o morro: Também chamada de subida de encosta (ou subida da montanha, ou Hill Climbing) pode ser uma variante do gera e testa, acrescentando-se as informações que ajudam a decidir em qual direção prosseguir. É um método que usa a idéia de que o objetivo deve ser atingido com o menor número de passos. O suporte é dado pela idéia heurística de que o número de passos para atingir um objetivo é inversamente proporcional ao seu tamanho. 2.1.4.2 Utilização da Busca Heurística Para a utilização de busca heurística, o objetivo a ser alcançado deve estar explícito, porém dentro do contexto desse jogo, o objetivo de alcançar a torre adversária não é explícito, pois não se tem a localização exata da mesma, tendo isso em vista a busca heurística será utilizada a partir de determinada parte do jogo, e não do seu início. A busca heurística pode ser utilizada em vista de outro objetivo, o de eliminar peças com patentes altas. Após a descoberta de uma determinada patente com essas características, a busca heurística avalia e efetua uma busca para eliminá-la. 2.1.5 Inteligência Artificial Aplicada em Jogos Os jogos eletrônicos acuparam as faculdades intelectuais dos homens, e chegando algumas vezes a um gráu alarmante. (RUSSELL, NORVIG, 1995). Quando se trata de criar um oponente eletrônico, isso compete muitas incertezas, pois nunca se sabe o que um jogador venha a fazer, pois o jogador tentará até onde for possível minimizar o seu oponente eletrônico (RUSSELL, NORVIG, 1995). A IA procura simular o cérebro humano através de algoritmos e heurísticas, com o objetivo de criar programas que imitem a maneira de pensar dos seres humanos. Projetando esse objetivo ao limite, espera-se que no futuro, seja possível interagir com um programa de computador e não saber se nosso interlocutor é de fato uma máquina ou uma outra pessoa. É exatamente isso que o jogador espera dos comportamentos de jogos (SANTOS, 2002). Para atingir esse realismo, torna-se cada vez mais comum nos jogos a implementação de algoritmos clássicos das mais variadas áreas de IA (SANTOS, 2002). 11 Nos jogos, uma outra espécie de busca é feita, como damas e xadrez. Os nós em uma árvore de jogo, naturalmente, representam configurações do tabuleiro, e são ligadas por meio de ramos que transformam uma situação em outra. Naturalmente há uma nova guinada, pois as decisões são tomadas por duas pessoas, atuando como adversárias, cada uma tomando uma decisão por sua vez (WINSTON, 1988). Programas como jogos foram muito importantes para a área de IA, pelo esclarecimento trazido a respeito da importância relativa dos diversos aspectos envolvidos em uma atividade inteligente (BITTENCOURT, 1996). Consideremos jogos com dois jogadores, que chamaremos de MAX e MIN por razões que logo ficarão óbvias. MAX faz o primeiro movimento, e depois eles se revezam até o jogo terminar onde um jogo pode ser definido como uma espécie de roblema de busca (RUSSELL, NORVIG, 1995). 2.1.5.1 Mini Max Em jogos é necessário levar em conta as possíveis jogadas do oponente, os nodos (pontos ou vértices) da árvore de busca são divididos em dois tipos: os nodos “OU”, que representam situações no qual o mecanismo de busca é livre para escolher a próxima jogada, e os nodos “E”, que representam situações onde o oponente deve jogar (BITTENCOURT, 1996). A primeira técnica para busca em árvores de jogos foi o procedimento Mini Max. O procedimento funciona da seguinte forma: inicialmente é construída uma árvore completa onde a raiz corresponde à situação atual do jogo e as folhas correspondem a situações sem sucessores (vitórias, empates ou derrotas). Em seguida, atribui-se uma avaliação estática para cada situação, essa avaliação geralmente é representada por uma função simétrica onde existe o estado de vitória, derrota ou empate. O próximo passo é propagar essas avaliações em direção à raiz do grafo, respeitando a liberdade do oponente escolher sua jogada. Isto é feito da seguinte maneira: a cada nodo tipo “OU”, com sucessores já avaliados, atribui-se o valor máximo dentre as avaliações dos sucessores, pois este tipo de nodo corresponde a situação onde a próxima jogada pode ser escolhida pelo procedimento, os nodos do tipo “E” atribui-se o valor mínimo das avaliações dos sucessores, pois supõe-se, neste caso, que o oponente escolherá a jogada que lhe seja mais proveitosa, que no ponto de vista do procedimento é a que recebe a pior avaliação (BITTENCOURT, 1996). O nodo raiz é sempre um nodo do tipo “OU” pois o procedimento visa determinar qual é a melhor jogada do ponto de vista do próprio procedimento. Ao terminar a propagação, o 12 sucessor da raiz com a melhor avaliação corresponderá a melhor jogada. O resultado do procedimento pode conter mais informações do que apenas a melhor jogada, pois pode armazenar também um ponteiro para o nodo que corresponde àquela avaliação, de maneira que ao atingir a raiz disponha-se de todo o caminho que, do ponto de vista do procedimento, corresponde ao jogo ideal a partir da situação inicial dada. Quando o jogo se torna complexo, esta informação adicional pode economizar o trabalho necessário para a determinação das jogadas futuras (BITTENCOURT, 1996). 2.1.5.2 Alfa Beta “O procedimento Mini Max pode ser otimizado, na medida em que é possível construir um outro procedimento que obtém sempre os mesmos resultados e que, no entanto, dependendo da situação, examina menos nodos da árvore de busca” (BITTENCOURT, 1996). O procedimento Alfa-Beta confia no fato de que o oponente esteja seguro de que um movimento é desastroso, não tendo mais a necessidade de explorar mais esse movimento (WINSTON, 1988). A situação chamada Corte Beta é a situação mostrada na Figura 3 (BITTENCOURT, 1996). a: <=10 b: 10 d: 5 c: >= 20 e: 10 f: 20 g: ? Figura 3: Corte Beta. Neste caso, ao encontrar o valor 10 para “b”, sabe-se que o valor de “a” será inferior a 10. O valor 20 de “f” com que o valor de “c” seja necessariamente maior ou igual a 20, tornando irrelevante do ponto de vista de “a”, o valor de “g”. O procedimento que inclui esse refinamento é chamado de Alfa Beta (BITTENCOURT, 1996). 2.2 LINGUAGEM DE PROGRAMAÇÃO 13 Uma linguagem de programação é um conjunto de termos (vocábulos) e de regras (sintaxe) que permitem a formulação de instruções a um computador. 2.2.1 Linguagem C A Linguagem C foi desenvolvida na década de 1970, nos laboratórios Bell. Essa linguagem foi construída a partir da Linguagem B que foi criada no final da década de 1960 por Ken Thompson e Dennis M. Ritchie (HICKSON, 2002). Pode ser considerada uma linguagem de programação de médio nível, pois possui tanto instruções de alto nível e estruturada, como também instruções tão próximas da máquina, que só o Assembler possui. Contudo, utilizando a Linguagem C podemos construir programas organizados e concisos, ocupando pouco espaço de memória com alta velocidade de execução (HICKSON, 2002). 2.2.2 Linguagem C++ O projeto de linguagem de programação é um processo em constante evolução. Uma nova linguagem é criada a partir de lições aprendidas com linguagens anteriores ou para introduzir novos recursos e facilidades a uma linguagem existente (HICKSON, 2002). A Linguagem C++ foi desenvolvida a partir da linguagem de programação C, e com poucas exceções a Linguagem C++ mantém a Linguagem C como subconjunto (STROUSTRUP, 2000). A Linguagem C++ é orientada a objeto. Programação orientada a objeto é uma reação a problemas que foram percebidos pela primeira vez em programas muito extensos desenvolvidos na década de 1970. Todas as linguagens de orientação a objeto tentam atingir três objetivos, como uma forma de impedir que ocorram os problemas inerentes a projetos muito grandes: abstração do softwares, objeto e polimorfismo (HICKSON, 2002). 2.3 COMPUTAÇÃO GRÁFICA A Computação Gráfica é a sub-área da Ciência da Computação que representa graficamente as informações através de algoritmos, técnicas e metodologias que possibilitam a criação, o armazenamento e manipulação de modelos de objetos e suas imagens via computador (SANCHES, 2004). 14 “Segundo a ISO (International Standards Organization), a Computação Gráfica pode ser definida como o conjunto de métodos e técnicas utilizados para converter dados para um dispositivo gráfico, via computador” (SANCHES, 2004). 2.3.1 OPEN-GL O OPEN-GL (Open Graphics Library) é uma biblioteca de rotinas gráficas para trabalhar em duas ou três dimensões (SANCHES, 2004). Criada pela empresa Silicon Graphics oferece vários recursos aos programadores, proporcionando maior facilidade de programação, muito utilizada na criação de jogos. São API’s (Aplication Programming Interface) que fazem chamadas aos recursos de hardware oferecidas pelos processadores gráficos (VANZIN, 2001). O OPEN-GL foi desenvolvido para trabalhar de maneira eficiente mesmo se o computador que mostra os gráficos não é o computador que contêm o hardware gráfico. Para atingir tais qualidades, nenhum comando para realizar operações de janela ou obtenção de dados do usuário é incluído no OPEN-GL, ao invés disso deve-se trabalhar através do controlador de janelas específico para o hardware que está sendo utilizado. Devido às funcionalidades providas pelo OPEN-GL, esta API tem se tornado um padrão largamente utilizado em diversos setores, pois, possui rotinas estáveis e boa documentação. As funções seguem um padrão em relação às suas notações, de forma geral, podemos esquematizar conforme a tabela 1: Tabela 1: Forma geral 1 Nome da função Nº de variáveis Tipo de variáveis Forma vetorial argumentos Porém, nem todas as funções seguem exatamente esse formato. Por exemplo, o OPENGL possui funções que não recebem parâmetros, como o “glFlush()” , ou que só podem receber um tipo, como “glClearColor()”, não possuindo nenhum tipo de referências ao argumento. O OPEN-GL funciona como uma máquina de estados, ou seja, uma parte da memória é reservada para armazenar o estado atual das diversas variáveis envolvidas no processo de renderização. 2.4 ANÁLISE DE PROJETO ESTRUTURADO 15 Uma das técnicas para modelagem de sistemas é a Análise Estruturada que surgiu na década de 1970 e que é bastante utilizada por empresas de desenvolvimento. Foi criada por Tom De Marco e adaptada por outros autores, sendo um deles Gane&Sarson, popularizando-se como o “método de Gane”.(GANE, 1983) A Figura 4 mostra os símbolos utilizados para a modelagem, nível de análise, dos conceitos apresentados anteriormente. Salienta-se que há algumas alterações nos símbolos utilizados de autor para autor. Figura 4 – Simbologia utilizada para Análise Estruturada / Análise Essencial. 2.5 JOGOS ELETRÔNICOS Os jogos eletrônicos sempre representaram um grande mercado econômico, mas essa popularidade comercial não costuma se refletir no meio acadêmico. Entretanto, embora estejam associados ao divertimento, os jogos eletrônicos são uma importante classe de sistemas. Utilizando técnicas inovadoras de computação e ciências correlatas, os jogos são um interessante domínio de aplicação para o desenvolvimento e validação de novas técnicas computacionais, visto que possuem características críticas, como execução em tempo real e pouca capacidade de processamento (ANDRADE, 2004). O desenvolvimento de jogos eletrônicos apresenta características diferentes do desenvolvimento de software, principalmente por serem projetos relativamente grandes, e por serem constituídos de produtos artísticos até certo ponto (TATAI, 2004). As linhas gerais de jogos a ser desenvolvidos envolvem alguns casos (TATAI, 2004): Idealização das linhas a serem desenvolvidas, envolvendo em alguns casos story-boards, arte-conceito, etc; 16 Implementação do mecanismo do jogo, implementação de protótipo, implementação de ferramentas para artistas / projetistas de jogos (game-designers); Realização do projeto de fases (level-designers), juntamente com á realização do trabalho de arte e som; Depuração, teste do jogo (play-testing, realizado por jogadores) documentação; Documentação do jogo. A arquitetura de um jogo de computador envolve os seguintes componentes (TATAI, 2004): Motor (engine): O motor é responsável por implementar o módulo de renderização gráfica do jogo, freqüentemente coordena os outros componentes. Rede: O componente de rede é responsável pela comunicação externa, tanto com outro jogador ou com algum servidor. Som: Fortemente integrado ao motor, responsável para gerenciar os sons e músicas que compõem o jogo. IA: Componente responsável por implementar o controle dos oponentes ou aliados automatizados que fazem parte do jogo. 17 CAPÍTULO 3 DESENVOLVIMENTO 3.1 RECURSOS NECESSÁRIOS O software deve ser desenvolvido em plataforma de linguagem C/C++, mais especificamente DEV-C++ como compilador, pois é um compilador de entendimento fácil por causa de sua interface. È um ambiente integrado, dando suporte a compiladores baseados no GCC (GNU Compiler Collection). A licença GNU/GPL (General Public License) é utilizada para software de domínio publico, isso é, não é necessário comprá-lo para poder utilizá-lo. A linguagem C/C++ foi escolhida por trabalhar em perfeitamente com componentes de hardware, seu arquivo compilado é de execução rápida, e pode ser compilado em muitos SO (Sistema Operacional), com poucas alterações em seu código. O OPEN-GL disponibiliza bibliotecas gráficas que contribuem para o desenvolvimento da interface gráfica, proporcionando um ambiente amigável ao jogador. O SO deve ser o Microsoft Windows, por esse ser um sistema comercial, deve ser adquirida uma licença do Microsoft Windows 98 ou superior. Os custos referentes ao desenvolvimento estão em licença do SO, equipamento e a hora técnica trabalhada, que deve ser utilizada um total de 230 horas de trabalho. Tabela 2: Custos referentes ao desenvolvimento do projeto Qtd. Descrição Custo 01 Licença do Sistema Operacional Windows 98. R$ 250,00 01 Editores de texto e softwares administrativos (OPEN OFFICE). R$ 0,00 01 Biblioteca de desenvolvimento gráfico (OPEN-GL) R$ 0,00 01 Linguagem de programação e compulador (DEV C++, GCC). R$ 0,00 01 Equipamento de desenvolvimento com gravador de CD (AMD- R$ 1200,00 Duron 1.3, 128 MB RAM). 01 Mídia de Backup (CD-RW) R$ 10,00 01 Hora técnica de desenvolvimento R$ 20,00 18 Totalizando R$ 9.200,00 no que se diz respeito à mão de obra, isso inclui desenvolvimento e pesquisa, individualmente o valor é de R$ 4.600,00. O total em custos para o desenvolvimento, incluindo equipamento, licença, softwares e desenvolvimento / pesquisa é de R$ 10.680,00. 3.2 ESPECIFICAÇÃO E DESENVOLVIMENTO DO PROJETO 3.2.1 Especificações Técnicas O Jogo de Estratégia Militar foi dividido em várias partes no que diz respeito a seu desenvolvimento, são elas: 3.2.1.1 Protótipo gráfico: Implementação em linguagem C++ utilizando as API´s do OPEN-GL para sua construção. Este protótipo consolida a representação do sistema para o usuário, pois todas as operações realizadas serão visualizadas pelo protótipo gráfico. Além de representar graficamente o sistema esse protótipo possui uma matriz gráfica na qual é responsável pela distribuição das peças do jogador, atualizando as matrizes do console. 3.2.1.2 Protótipo console: Implementação em linguagem C++ utilizando recursos não Orientados a Objetos com a finalidade de ganhar desempenho. O console se responsabiliza pela distribuição das peças do computador, realização dos confrontos e verificação do vencedor. A distribuição de peças segue o objetivo de não repetir sua distribuição sempre que o jogo seja iniciado. Se um algoritmo inteligente fosse implementado para essa operação todas as vezes que o jogo fosse iniciado a formação seria a mesma, uma vez que o computador encontrou a melhor distribuição, para evitar isso a maioria das peças é colocada de forma aleatória no tabuleiro, porém segue algumas regras de estratégias básicas para isso. O protótipo gráfico possui um total de três matrizes para a realização de suas tarefas, a cada jogada todas a matrizes são atualizadas com seus respectivos valores, as matrizes são: Matriz de propriedade: Essa matriz possui a representação de todas as peças, verificando se a peça é do jogador ou do computador, também é marcado os locais livres e com lagos 19 (locais no tabuleiro que não é permitida a jogada), a verificação se a jogada é valida ou se existe algum confronto é diretamente ligada a esse matriz. Matriz de patentes: Essa matriz armazena a posição de todas as patentes, tanto do jogador quanto do computador, apesar de possuir esse matriz internamente os algoritmos de busca e o jogador não possuem acesso a ela, a finalidade dessa matriz esta ligada diretamente aos confrontos, pois a resposta do vencedor sairá dessa matriz. Matriz do computador: Essa matriz possui o posicionamento das peças do computador e as do jogador caso estas estejam abertas, sendo a única matriz que o algoritmo de busca tem acesso, as jogadas realizadas pelo computador são todas nessa matriz, atualizando as outras matrizes do console. 3.2.2 Diagrama de desenvolvimento A representação de diagramas realizadas no projeto foram feitas com base em análise estruturada. Podemos apontar como principais estruturas os seguintes itens: - JOGO - TABULEIRO - JOGADOR - PEÇA - COMPUTADOR - PESSOA Estes itens recebem o nome de processo, cada processo é uma operação do sistema, sendo através do processo temos o processamento de dados e a conseqüência transformação de dados de entrada em resultados na saída do processo. Os processos são interligados pelo Modelo ambiental, a Figura 5 representa este modelo 20 Figura 5: Modelo Ambiental. Esse diagrama apresenta o jogo como principal processo, responsável pelo inicio das operações realizadas como inicio e término. O tabuleiro apresenta processos como inicializar as matrizes, analisar movimentos, efetivar ataque e atualizar derrotas. As peças que são processos completos, na qual armazenam valores, estes valores são atribuídas individualmente a elas, uma vez que no Jogo de Estratégia Militar estes são 21 atribuídos pela sua patente, que é armazenada na sua descrição, sendo responsável pela indicação de um vencedor em um determinado confronto entre peças. O processo Jogador é responsável pela efetivação de jogadas, tanto do jogador quanto do computador, este processo recebe a linha e coluna atual e as novas linhas e colunas, sendo responsável pela sua movimentação e atualização do processo tabuleiro. O processo Computador é responsável para dar pesos as jogadas, sendo este processo que indica qual jogada será efetuada, possuindo em seu interior uma lista de decisões que deverão ser tomadas no decorrer do jogo. Pessoa é um processo que representa apenas as movimentações realizadas pelo jogador humano que interage com o jogo. 3.3 AMBIENTE DE EXECUÇÃO DO PROJETO O software pode ser jogado em equipamentos padrão ou compatíveis com o IBM-PC, com sistema operacional Windows 98 ou superior, é preciso ter uma placa de vídeo com suporte ao VGA (Video Graphics Array) para a apresentação gráfica, e é aconselhável no mínimo 4 MB de memória RAM de vídeo, pois o processamento gráfico do equipamento não necessita ser muito avançado. O equipamento deve possuir um mínimo de 64 MB de memória principal, processador de 500 MHz e 20 MB de memória em disco principal, uma unidade de entrada de dados, pode ser Internet, CD-ROM ou disquete, para que o jogo possa ser instalado. Recomenda-se uma Placa com suporte OPEN-GL, pois a mesma possui os cálculos gráficos processados por ela sem a utilização do processador para realizar tal tarefa. Tabela 3: Custos para execução do sistema Qtd. Descrição Custo 01 Licença do Sistema Operacional Windows 98 R$ 250,00 01 Equipamento para execução (AMD-K6 500, 64 MB RAM) R$ 700,00 01 Bibliotecas Gráficas OPEN-GL R$ 0,00 O total de custos para a execução do sistema é de R$ 950,00, levando em consideração que não há custos para a aquisição do software. 22 3.4 PONTOS FORTES E FRACOS Um dos pontos fortes desse projeto é a utilização de softwares de domínio público e softwares grátis, o seu desenvolvimento, por se tratar de uma linguagem existente em muitas plataformas, a compilação e execução em outro SO é facilitada, isto é, qualquer computador com um compilador C/C++ pode executá-lo com poucas alterações em seu código fonte. Com base na licença GNU, o software assim como seus fontes são de livre distribuição, assim pode ser classificado como “open source”. Como desvantagem, por possuir gráficos desenvolvido em OPEN-GL, sua execução pode não ser satisfatória em máquinas que utilizam cálculo gráfico via software (placas sem suporte OPEN-GL), podendo ter sua execução prejudicada. O programa não possui uma opção para jogar em rede, sendo seu uso restrito a apenas um computador e um jogador, impossibilitando de ser jogado em duas pessoas, uma vez que no contexto do jogo ele não pode ser jogado por duas pessoas no mesmo computador. 3.5 CRONOGRAMA DE ATIVIDADES O cronograma é um instrumento que nos auxiliará no desenvolvimento do projeto, possibilitando ter um visão dos acontecimentos ocorrido em um período de tempo, a Tabela 4 demonstra claramente o que deve ser desenvolvido e em quanto tempo se levou em cada etapa do projeto seguindo com um detalhamento de todas as fases implementadas. Tabela 4: Etapas de desenvolvimento do projeto. Período P 01/02/2004 – 14/02/2004 R 01/02/2004 – 14/02/2004 P 14/02/2004 – 04/03/2004 R 14/02/2004 – 04/03/2004 P 04/03/2004 – 10/03/2004 R 04/03/2004 – 10/03/2004 P 10/04/2004 – 20/04/2004 R 10/04/2004 – 20/04/2004 Atividade Concepção da idéia e modificações. Elaboração do pré-projeto. Redação do projeto teórico. Pesquisa de viabilidade do protótipo gráfico. continuação 23 conclusão P 20/04/2004 – 05/05/2004 Protótipo gráfico. R 20/04/2004 – 05/05/2004 P 05/05/2004 – 22/05/2004 R 05/05/2004 – 22/05/2004 P 22/05/2004 – 30/05/2004 R 22/05/2004 – 30/05/2004 P 30/05/2004 – 10/06/2004 R 30/05/2004 – 15/06/2004 P 10/06/2004 – 26/06/2004 R 15/06/2004 – 26/06/2004 P 26/06/2004 – 03/07/2004 R 26/06/2004 – 03/07/2004 P 03/07/2004 – 30/07/2004 R 03/07/2004 – 15/03/2005 P 31/08/2004 – 30/09/2004 R 15/08/2004 – 30/10/2004 P 01/10/2004 – 30/11/2004 R 01/10/2004 – 15/03/2005 P 31/11/2004 – 10/12/2004 R \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ P 10/12/2004 – 15/03/2005 R 10/12/2004 – 15/03/2005 P 15/03/2005 – 30/06/2005 Implementação e Aplicação das Funções de Inteligência R 15/03/2005 – 30/06/2005 Artificial e correções apresentadas no trabalho escrito P 30/06/2005 – 11/07/2005 R 30/06/2005 – 11/07/2005 Redação do trabalho escrito. Correções e alterações necessárias. Aprimoramento do protótipo. Redação e fundamentação do trabalho escrito. Preparação para defesa do trabalho escrito. Implementação do protótipo de Inteligência Artificial. Redação das documentações necessárias. Correções de eventuais problemas. Preparação para defesa do trabalho como um todo. Aprimoramento das jogadas do computador Preparação para a defesa final do trabalho P= Cronograma Previsto 3.5.1 Detalhamento do Cronograma R= Cronograma Realizado 24 Concepção da idéia e modificações: Nascimento da idéia de desenvolver um software de entretenimento que deve utilizar técnicas de IA. Elaboração teórica do que deve ser feito para a avaliação do projeto. Elaboração do pré-projeto: Descrição do documento assim com a escolha do professor orientador. Esclarecimento de dúvidas relacionadas ao pré-projeto adequando o mesmo para o projeto. Redação do projeto teórico: Elaboração do documento a ser entregue conforme normas estipuladas. Pesquisa de viabilidade do protótipo gráfico: Aquisição de ferramentas e estudo das melhores ferramentas para o desenvolvimento do protótipo. Protótipo gráfico: Implementação do protótipo gráfico, com a ferramenta escolhida. Redação do trabalho escrito: Escritura da documentação a ser entregue na data estipulada, juntamente com a primeira versão do pôster. Correções e alterações necessárias: Realização de correções que eventualmente venham a ser encontradas no trabalho escrito. Aprimoramento do protótipo: Implementação de novos comandos, viabilizando uma melhor resolução do jogo. Redação e fundamentação do trabalho escrito: Entrega de toda a documentação definitiva juntamente com o pôster. Preparação para a defesa do trabalho escrito: Preparação para a defesa junto a banca examinadora, do trabalho desenvolvido. Implementação do protótipo de Inteligência Artificial: Não realizada. Realização de testes para a verificação de desempenho: Não realizada. Redação das documentações necessárias: Elaboração do documento que mostrará os relatórios dos desempenhos alcançados com os testes realizados. Correções de eventuais problemas: Nessa etapa é feita uma revisão de toda a documentação gerada, dando os seus ajustes finais, preparando para a defesa. Preparação para a defesa do trabalho com um todo : Não realizado. Aprimoramento das jogadas do computador : Serão implementadas as jogadas especiais que o computador realizará em cada jogada, obedecendo as regras do jogo. Implementação e Aplicação das Funções de Inteligência Artificial e correções apresentadas no trabalho escrito: A implementação das jogadas de inteligência artificial é melhor estudada e aplicada de forma que possa ter um comportamento condizente com o 25 objetivo proposto, juntamente será feita as correções no trabalho escrito que forem propostos pelo orientador. Preparação para a defesa final do trabalho : Preparação do material de apoio que será usado na defesa. 26 CAPÍTULO 4 RESULTADOS 4.1 INTRODUÇÃO Com base nos objetivos do projeto, tem-se a necessidade de apresentar os resultados obtidos na execução do projeto provenientes de testes. 4.2 DISTRIBUIÇÃO DE PEÇAS O hardware não é peça fundamental para a realização dos teste que são executados, uma vez pode ser feita em qualquer outra máquina desde que possua as configurações mínimas exigidas para o projeto, não influenciando nos resultados dos testes. Os teste com relação a realização do objetivos tiveram sucesso, pois todas as execuções geraram posicionamento diferente na maioria das peças. Esse objetivo foi alcançado graças a grande utilização de alocação de peças de forma aleatórias, a Tabela 5 mostra um exemplo de resultado obtido após 3 execuções do algoritmo, a peça em questão possui a patente número 12 (torre), sendo a principal peça estática do jogo de estratégia militar. A patente 12 sempre estará posicionada na linha 0. Tabela 5: Teste de Posicionamento da Torre. Execução Patente Linha Coluna 1º 2º 3º 12 12 12 0 0 0 3 8 2 O Algoritmo de posicionamento posiciona a torre sempre na linha 0 tendo sempre a variação na coluna, porém ela nunca será posicionada nas extremidades do tabuleiro, ou seja, jamais estarão na coluna 0 ou 14. Outro teste realizado condizente a distribuição da torre é que as bombas sempre estarão posicionadas ao seu redor, resultado este obtido com sucesso. As peças restantes foram testadas em duas execuções, onde podemos observar que: 27 As Minas Terrestres estão presentes em todas a linhas, mas diferenciando nas colunas, propiciando assim uma melhor estratégia. O Espião estará posicionado na 3ª linha, mudando sempre de lugar nas colunas, sendo que nunca estará na 4ª fila, ficando de fronte com o inimigo imediato, evitando sua perda precoce. Os Soldados estão sempre espalhados pelo tabuleiro, tendo em vista que é a de maior quantidade no jogo. Devido também a um numero grande de peças, será sempre encontrada por todas as partes do tabuleiro, ajudando assim na descoberta das Minas e das Bombas. As patentes 5, 6, 7,e 8 como podemos observar, estarão presentes em quase todas as linhas, diversificando as colunas, fazendo uma movimentação essencial para o desarmamento das estratégias inimigas. Nos testes ocorreram que as peças de maior grau hierárquico estão sempre postadas nas 3ª e 4ª fileiras, podendo assim desfazer um possível ataque de peça de grau elevada, ocorrendo uma perda excessiva de peças do contingente. Podemos observar na tabela 6, de como foi o resultado obtidos nos teste de execução para a disponibilização das peças feita pelo computador, obtendo resultados satisfatórios. Tabela 6: Teste de Posicionamento das Peças Patente Linhas s 1ª Execução 1 2ª 1ª Execução 2ª Execução 1ª,2ª,3ª,4 0ª,6ª,12ª,14ª 0ª,2ª,7ª Execução 1ª,2ª,3ª,4 ª Colunas ª 2 3ª 3ª 8ª 10ª 3 1ª,2ª,3ª,4 1ª,2ª,4ª 5ª ~ 14ª 1ª ~ 10ª 1ª,3ª,4ª 1ª,3ª,4ª 3ª,4ª,8ª,9ª,10ª,1 9ª,10ª,11ª,12ª 2ª,4ª,5ª,7ª 2ª,6ª,8ª,9ª,10ª,1 ª 4 1ª 5 1ª,2ª,3ª,4 ª 1ª,2ª,3ª,4 ª 1ª 6 3ª,4ª 2ª,3ª,4ª 0ª,1ª,3ª,4ª,5ª 0ª,1ª,3ª,4ª,8ª,9ª 7 1ª,2ª,3ª 1ª,2ª,3ª 1ª,2ª,3ª 1ª,2ª,5ª,6ª 8 1ª,2ª 1ª,2ª 1ª,2ª,7ª 3ª,4ª,7ª 28 9 2ª,3ª,4ª 2ª,3ª 9ª 13ª,14ª 10 4ª 3ª 8ª 9ª 11 3ª 2ª 7ª 12ª O jogador também pode utilizar dessa funcionalidade para seu uso observando uma adaptação para o mesmo algoritmo segundo a mesma lógica de posicionamento e obtendo os mesmos resultados. 4.3 REALIZAÇÃO DE JOGADAS Com as técnicas de minimax, foram feitas as jogadas do computador, onde é realizado as movimentações das peças, verificando a localização do seu oponente e em que direção deve ser jogada a peça, podendo ser a um possível confronto ou recuo da peça. Para simplicicar esta afirmação, podemos demonstrar com alguns exemplos de execução. Na Tabela 7, consta o comparativo de duas peças e das linhas subseqüentes, note que o Soldado avança uma linha e o cabo armeiro continua parado, mesmo tendo um valor maior na execução, neste caso compreendamos que a jogada do soldado é melhor, pois temos vários fatores que podem não executar a jogada representada neste como Cabo Armeiro, estes fatores podem tanto ser um lago na sua frente, como uma peça do próprio jogador. Tabela 7: Jogada do Soldado. PEÇA VALOR LINHA ANTERIOR LINHA POSTERIOR Soldado 10 3 4 Cabo Armeiro 100 5 5 Em um outro exemplo de execução, tendo ambas as peças condições de execução, o Cabo Armeiro seria a escolha do algoritmo para realizar a jogada, como demonstrado no Tabela 8, note que neste exemplo o maior valor executa a jogada, tendo como principio que está é a melhor jogada. Tabela 8: Execução do maior valor. PEÇA VALOR LINHA ANTERIOR LINHA POSTERIOR Soldado 10 3 3 29 Cabo Armeiro 100 12 13 Todas as jogadas são encaradas como melhor desde que siga conceitos básicos do jogo, como não podendo realizar uma jogada sobre suas prórpias peças, ou sobre os lagos, também é correto afirmar que o algoritmo impõem valores maiores a execução de confrontos, pois está é a única forma de abrir as peças do adversário, podendo colocar valores diferentes de execuções para as peças abertas. Os lagos aqui mecionados são mais fácil visualizado no item 4.4, na qual apresenta a Interface do Jogo de Estratégia Militar. 4.4 INTERFACE GRÁFICA Um jogo é representado de vários estados no que diz respeito a interfaces gráficas, sendo uma tarefa impossível descrever todos os possíveis estados do jogo ou tabuleiro. Porém o Jogo de Estratégia Militar possui algumas interfaces que podem ser consideradas principais, como a própria imagem do tabuleiro representado na Figura 6. Figura 6: Tela com peças 30 A Figura 6 mostra o tabuleiro com as peças posicionadas em sua matriz gráfica, as peças são distinguidas pelo jogador através de sua cor, sendo as peças vermelhas do jogador e as azuis do computador. No tabuleiro existem dois quadrados azuis que representam os lagos, não é permitido realizar jogadas passando pelos lagos, sendo uma dificuldade implementada no jogo. Vale lembrar que o jogador nunca sabe as peças do computador assim como o computador não sabe a posição das peças do jogador. No lado direito da tela o jogador tem acesso ao nome das patentes e sua representação numérica, também é identificado a forma de sair do jogo, que vem a ser utilizando a tecla “ESCAPE” do teclado. O jogo possui verificações de jogadas validas, não permitindo por exemplo que o jogador ataque suas próprias peças emitindo a mensagem de erro representada na Figura 7. Figura 7: Jogada sobre Jogador. Quando uma jogada desse tipo é realizada o jogador deve realizar outra jogada, uma vez que a jogada não foi efetivada. O jogo possui alguma peças estáticas como bombas, minas terrestres e a própria torre, quando uma dessas peças tenta ser movimentada uma mensagem é exibida avisando ao jogador que ele está tentando movimentar um peça estática, a Figura 8 representa a tentativa de movimentar uma bomba. Figura 8: Movimentação de bomba. 31 Da mesma forma de uma jogada inválida, o sistema volta a interação do jogador, tendo que realizar outra jogada. 32 CAPÍTULO 5 DISCUSSÃO E CONCLUSÕES 5.1 ANÁLISE DOS RESULTADOS Os resultados obtidos até então estão satisfatórios se analisados pelo objetivo, como o algoritmo responsável por tal feito não possui uma base de conhecimentos para a distribuição de peças pelo motivo já comentado no item 3.2.1 Especificações técnicas. Analisando os resultados obtidos no capítulo anterior, pode observar que a distribuição das peças feito pelo computador encontra-se dentro do esperado, pois a torre não está posicionada sempre em um mesmo lugar, ocorrendo assim uma dificuldade ao jogador em saber a localização da torre, e sempre ao redor da mesma haverá minas e bombas que protegerão de possíveis ataques. As peças de menor patentes estarão sendo posicionadas nas linhas 1, 2 e 3 aleatoriamente, não havendo a possibilidade de serem postas em outras linhas do tabuleiro. O posicionamento das peças do jogador, possui uma demora na colocação, tendo em vista que o jogador deve colocar as peças uma de cada vez clicando com o mouse e arrastando a peça até o local desejado, mas que terá a restrição de linhas para o posicionamento que é das linhas 11 à 14 do tabuleiro ( parte inferior da tela), montando sua estratégia de jogo, para só então dar início a partida. A interface gráfica do jogo, está condizendo com o esperado, estando de fácil entendimento das peças, lagos e espaço para que se possa fazer as jogadas, estando com cores distintas para facilitar a visualização, possui uma legenda dos números e as patentes a que elas correspondem, e uma opção de tecla para que se possa interromper a partida a qualquer momento. A cada jogada realizada, é verificada se é válida ou não, interagindo com o jogador mostrando uma MensageBox, avisando as jogadas invalidas e na tentativa de movimentação de bombas, minas e torre. Com relação a movimentação das peças, está ocorrendo conforme projetado, tendo a peça soldado podendo pular quantas casas quiser na vertical ou horizontal, mas não podendo passar sobre os lagos existentes, as demais peças podem pular somente uma casa de cada vez, no confronto, as peças de menor grau ( patentes) estão saindo do tabuleiro e dando lugar a peça 33 vitoriosa, ocorrendo confronto de patentes iguais estão saindo as duas peças de dando lugar a espaços em branco, que poderão ser utilizadas por outras peças no decorrer da partida. A pertir das técnicas de MiniMax esclarecidas no item 2.1.5.1, na qual o algoritmo é responsável por impor valores para a realização de jogadas, sendo o Mini as jogadas de valores baixos, as quais o algoritmo entende como jogadas ruins e o Max sendo o inverso, escolhendo assim a jogada com valor maximo realizando as assim definidas. 5.2 CONCLUSÕES A definição de um projeto voltado à diversão eletrônica demonstra a princípio um certo grau de simplicidade, porém após um maior aprofundamento em sua análise observa-se a necessidade da utilização de ferramentas específicas que auxiliem no seu desenvolvimento. Dentre estas ferramentas, deve-se enfatizar a Análise Estruturada, que proporciona uma otimização muito grande com relação a outras técnicas de desenvolvimento, além de induzir a uma fácil e rápida divisão das partes do projeto através das funções e seus complementos. A IA vem complementar esse projeto adicionando uma carga positiva como uma grande porta aberta auxiliando para a absorção de novos conhecimentos. 5.3 TRABALHOS FUTUROS O software proposto para a utilização de IA é um jogo eletrônico, futuramente pode-se construir mecanismos para a utilização do sistema em rede, fazendo o jogo possuir um modo multi player, podendo melhorar graficamente o projeto assim como implementar fases. Podem ser feita alterações para que o mesmo seja portado a outros SO´s, assim abrindo mais suas opções de distribuição. 34 REFERÊNCIAS BIBLIOGRÁFICAS ASSOCIAÇÃO BRASILEIRA DE NORMAS TÉCNICAS. NBR 14724: Informação e documentação: trabalhos acadêmicos: apresentação. Rio de Janeiro, 2002. 6 p. ASSOCIAÇÃO BRASILEIRA DE NORMAS TÉCNICAS. NBR 10520: Informação e documentação: citações em documentos: apresentação. Rio de Janeiro, 2002. 7 p. ASSOCIAÇÃO BRASILEIRA DE NORMAS TÉCNICAS. NBR 6023: Informação e documentação: referências: elaboração. Rio de Janeiro, 2002. 24 p. ANDRADE G. D., Graduação em Ciência da Computação, proposta de D. Sc., UNIVERSIDADE FEDERAL DE PERNAMBUCO. Disponível em <http://www.cin.ufpe.br/~tg/2003-2/gda-proposta.doc.> Acesso em 10 mai. 2004, 13:20:00. BARR, A., FEIGNENBAUM, E. A., The Handbook of Artificial Intelligence, Pitman 1981. BODEN, M. A., Artificial Intelligence and Natural Man, Havester Press, 1977. BITTENCOURT, M. L., Métodos Iterativos e Multigrid Adaptáveis em Malhas Nãoestruturadas, tese de D. Sc., UNICAMP, Julho, 1996. BITTENCOURT, G., Inteligência Artificial. Ferramentas e Teorias, 2.ed, Florianópolis, 2001. BOOCH, G., RUMBAUGH, J., JACOBSON, I., UML Guia do Usuário, Ed. Campus, Rio de Janeiro, 5ª Tiragem, 2000. FERNANDES, A. M. R., Inteligência Artificial. Noções Gerais. Ed. Visual Books, 2003. GANASCIA, J. G., Inteligência Artificial. Ed. Ática, 1993. 35 GANE, C. Análise estruturada de sistema. Rio de Janeiro: Livros Técnicos Científicos, 1983. GIRARDI, R. Reuso de Software, 2003 . Disponível em: <maae.deinf.ufma.br/Ensino/ES/CGCC/ Reuso%20de%20software.pdf > Acesso em 11 mai. 2004, 11:45:00 HALABAN, S. Combate. Disponível em: <www.ludomania.com.br/Modernos/combate.html>. Acesso em 15 abr. 2004, 11:41:00. HICKSON R., Aprenda a Programar em C, C++ e C#, Editora Campus, Rio de Janeiro, 2002. LEMOS, A. Anjos interativos e retribalização do mundo. Sobre interatividade e interfaces digitais. Disponível em: < http://www.facom.ufba.br/ciberpesquisa/lemos/interac.html >. Acesso em: 10 abr. 2004, 22:04:00. MARTINS, M., Paradigmas de programação III. Grafos. Disponível em <http:// sim.di.uminho.pt/disciplinas/ppiii-lesi/0304/APT_GRAFOS_0304.pdf >. Acesso em: 01 jun. 2004, 12:28:00. MULLER, N. D., Grafos. Disponível em <http://www.ulbra.tche.br/~danielnm/ed/B/ polB.html>. Acesso em 07 jun. 2004, 16:15:00. NASCIMENTO, C., YONEYAMA, T., Inteligência Artificial em controle e automação, Editora Edgard Blücher LTDA, São Paulo, 2000. RICH, E., Inteligência Artificial. Editora Kapelusz, São Paulo, 1988. RUSSELL, S. NORVIG P., Artificial Intelligence A Modern Approach, Prantice Hall, New Jersey, 1995 36 SANCHES, I., Computação Gráfica. Disponível em: <www.ionildo.pop.com.br> Acesso em 24 Jun. 2004. SANTOS, G. L., Inteligência Artificial em jogos 3D. Disponível em: <www. paralelo.com.br/documentos/Real-Time%20BSP-Based%20Path%20Planning%20with%20AStar%20(Full-Portuguese).pdf> Acesso em: 7 mai. 2004. SCHWABE, D., CARVALHO, R. L. de Engenharia do Conhecimento e Sistemas Especialistas. Editora Kapelusz: Buenos Aires, 1987. SIMONS, G.T., Introdução a Inteligência Artificial. Ed. Classe,1998. STROUSTRUP, B., A Linguagem de Programação C++. Ed. Bookman, Porto Alegre, 2000. TATAI, V. K., Técnicas de Sistemas Inteligentes Aplicadas ao Desenvolvimento de Jogos de Computador. tese de D. Sc., UNIVERSIDADE ESTATUAL DE CAMPINAS. Disponível em <www.dca.fee.unicamp.br/~gudwin/ ftp/publications/TeseTatai.pdf > Acesso em: 11 de mai. 2004. VANZIN, A. M., Placas de Video Placas 3D. Disponível em <www.leoviotti.com/hardcia/tutoriais/pl_3d.html> . Acesso em: 7 mai. 2004. WINSTON, P. H., Inteligência Artificial. Livros Técnicos e Científicos Editora LTDA: Rio de Janeiro, 1988 37 GLOSSÁRIO Árvore de Decisão: Conceitos são organizados em forma de árvores, decisões são ramificações da árvore. Grafos: Forma de representar elementos de um conjunto e relações entre esses elementos de forma sucinta. Heurística: Palavra que vem do grego “heuriskein”, que significa descobrir. Interface: Meio de comunicação entre o software e o usuário. Lógica: Um modo de declaração que representa o conhecimento. Nodo: Estado entre uma relação e outra. 38 APENDICE A: MANUAL JOGO DE ESTRATEGIA MILITAR CURITIBA 2005 39 MANUAL SUMARIO 1.REQUISITOS DO JOGO............................................................................................. 42 2.INSTALAÇÃO..............................................................................................................42 3.TABULEIRO.................................................................................................................45 5.JOGADAS.....................................................................................................................49 6.ATAQUE......................................................................................................................50 7.QUEM GANHA O JOGO............................................................................................52 8.SAIR.............................................................................................................................52 9.DICAS IMPORTANTES.............................................................................................52 40 LISTA DE FIGURAS Figura 1: Ícone de Instalação........................................................................................... 42 Figura 2: Tela de Bem-vindo........................................................................................... 42 Figura 3: Local de Instalação........................................................................................... 43 Figura 4: Pasta do Menu Iniciar. ..................................................................................... 43 Figura 5: Atalho da Áreas de Trabalho. .......................................................................... 44 Figura 6: Confirmação de Instalação............................................................................... 44 Figura 7: Progresso de Instalação.................................................................................... 45 Figura 8: Conclusão da Instalação................................................................................... 45 Figura 9: Tabuleiro. ......................................................................................................... 47 Figura 10: Inicio do jogo. ................................................................................................ 48 Figura 11: Peças sendo posicionadas .............................................................................. 48 Figura 12: Peças distribuídas no Tabuleiro. .................................................................... 48 Figura 13 Exemplo de movimentação. ............................................................................ 49 Figura 14: Movimentação do Computador...................................................................... 50 Figura 15: Jogadas Realizadas......................................................................................... 50 Figura 16: Confronto entre patentes. ............................................................................... 52 Figura 17: Ícone Uninstall. .............................................................................................. 53 Figura 18: Confirmação de desinstalação........................................................................ 53 Figura 19: Sucesso na remoção do jogo. ......................................................................... 54 41 LISTA DE TABELAS Tabela 1: Total de peças. ............................................................................................. 46 42 MANUAL 1.REQUISITOS DO JOGO O Sistema Operacional deve ser o Microsoft Windows 98 ou superior. CPU 500 MHz ou superior. Memória 64 MB (recomendado 128 MB). Espaço em disco de 2 MB ou mais. 2.INSTALAÇÃO Insirir o CD do jogo na unidade de leitura de CD-ROW, com o mouse dê dois cliques como botão esquerdo sobre o ícone de instalação. Figura 1: Ícone de Instalação. Aparecerá a tela de Bem-vindo ao Assistente de Instalação, conforme apresentado na figura 2. Figura 2: Tela de Bem-vindo. 43 Ao clicar em avançar, é pedido o local de instalação, como padrão o jogo é instalado no diretório c:\arquivos de programas, como mostrado na figura 3. Figura 3: Local de Instalação. Na próxima tela deve ser informado a pasta que aparecerá no menu iniciar, como ilustrado na figura 4. Figura 4: Pasta do Menu Iniciar. 44 Na tela que segue, será apresentado se deseja incluir atalho na área de trabalho, como na figura 5. Figura 5: Atalho da Áreas de Trabalho. Aparecerá a confirmação de instalação, no qual é apresentado a pasta de instalação e o local da pasta no menu iniciar, representado na figura 6: Figura 6: Confirmação de Instalação. 45 Será iniciado então a instalação, representando o progresso em uma barra gráfica de instalação, conforme figura 7: Figura 7: Progresso de Instalação. Finalmente a instalação é concluída, e então é apresentado a opção de executar ou não a instalação, como ilustrado a figura 8. Figura 8: Conclusão da Instalação. 3.TABULEIRO 46 O jogo de Estratégia Militar consiste num tabuleiro 15 X 15, contendo 60 peças para cada jogador que é posicionada na parte inferior para o jogador em vermelho e superior para o computador em azul, conforme a figura 9 do manual, que mostra o tabuleiro contendo 2 lagos em azuis, uma legenda com a descrição e a representação das peças e um modo para se interromper a partida. A linha amarela do tabuleiro representa a posição inicial das peças do jogador, de onde elas serão posicionadas para a construção das estratégias de jogadas que é realizada pelo participante. O Tabuleiro é composto por 120 (cento e vinte) peças, pertencendo metade ao jogador, e metade ao computador, essas sendo dividida por patentes como mostra a Tabela 1. Tabela 1: Total de peças. Nome Total Soldado 14 Sargento 6 Cabo Armeiro 7 Tenente 6 Capitão 6 Major 4 Coronel 3 General 1 Marechal 1 Torre 1 Mina 6 Bomba 4 Espião 1 47 Figura 9: Tabuleiro. A figura 9 representa a primeira tela apresentada ao jogador, com as opções de disponibilizar as peças automaticamente, pressionando a tecla “a” ou manualmente pressionando a tecla “s”. 3.1.Disponibilização de peças manualmente. Caso o jogador opte por distribuir suas peças manualmente, o jogador disponibilizar suas peças, clicando com o botão esquerdo do mouse na peça desejada e arrastando até o local de destino, que poderá ser feita apenas nas 4 primeiras linhas de baixo para cima. Como mostra as figuras 10 e 11. 48 Figura 10: Inicio do jogo. Figura 11: Peças sendo posicionadas Após a distribuição das peças, poderá ser dado o início do jogo, a figura 12 representa a tela com as peças distribuídas no tabuleiro. Figura 12: Peças distribuídas no Tabuleiro. 49 5.JOGADAS As jogadas devem ser realizadas utilizando o mouse, clicando em cima peça e a arrastando para seu destino, da mesma forma do posicionamento inicial, mas agora em direção das peças do computador, uma casa por vez, não podendo pular uma peça sobre a outra e nem passar pelos lagos. Todas as peças podem se movimentar uma casa na vertical ou na horizontal, com exceção das bombas, minas e da torre que são estáticas. A primeira jogada deve ser executada pelo jogador, a figura 12 dá um exemplo de primeira movimentação, jogando um soldado para o espaço livre à sua frente. Figura 13 Exemplo de movimentação. A figura 14 representa a continuação do jogo com uma peça do computador sendo movimentada da mesma forma. 50 Figura 14: Movimentação do Computador. O jogo deve seguir tendo uma movimentação de cada participante do jogo (jogador / computador), conforme representado na figura 15. Figura 15: Jogadas Realizadas. 6.ATAQUE 51 Quando a peça estiver na frente, ao lado ou atrás de uma peça adversária, você pode atacar, se quiser. Lembre-se que as peças de maior grau na hierarquia derrotam as peças de menor grau. Para atacar, coloque as peças na casa do adversário, a cada ataque será mostrada a as peças que estão sendo confrontadas, a peça derrotada sai do jogo, dando lugar a peça vencedora. Quando o grau de sua peça for o mesmo da peça do computador,as duas saem do jogo. O grau do Espião e o menor: só 2, mas se atacar o Marechal do adversário, ganha o ataque. Porém se o marechal o atacar primeiro, o Espião sai do jogo. Cuidado com as Bombas e as Minas, existem duas peças semelhantes porém com objetivos diferentes, são elas as bombas e as minas, a grande diferença entre elas vem a ser que as bombas só saem do jogo quando um cabo armeiro a ataca, permanecendo quando outra peça assim a fizer, a mina também só pode ser desarmada pelo cabo armeiro porém possui uma diferença vital quando outras peças a atacam, a peça que ataca e a mina são retiradas do jogo, independente de quem atacou. Quando ocorrer um confronto é apresentado uma mensagem na tela de jogador vencedor, logo em seguida é informada a patente vitoriosa, conforme a figura 16 apresenta. Nesta figura representa a jogada de um soldado do jogador (patente 3) confrontando um Cabo Armeiro do Computador (patente 4), na representação é mostrada as duas mensagens, porém elas são apresentadas uma a uma, primeiro a mensagem de quem foi vitorioso, depois a da patente vitoriosa. 52 Figura 16: Confronto entre patentes. 7.QUEM GANHA O JOGO O primeiro exército que capturar a Torre adversária vence o jogo. E tem mais! Se o jogador ficar só com as Bombas, as Minas e a Torre no final do jogo, dará a vitória ao exército inimigo. 8.SAIR Ao término da partida deverá ser pressionada a tecla ‘ESC’ do teclado para encerrar o programa do jogo, podendo ser usada a qualquer momento durante a partida também. 9.DICAS IMPORTANTES Quando o jogador distribuir as peças no tabuleiro, deixar a Torre num dos cantos do seu território , e use 2 ou 3 Bombas para defendê-la. 53 Espalhar as Bombas restantes e as Minas para despistar o adversário. É bom colocar os Soldados na 1ª fila, para iniciarem os ataques.Assim, você fica sabendo logo o grau das peças do adversário. Você também pode colocar as peças de maior grau na 1ª fileira, mas aí corre o risco de perdê-las e ficar sem elementos de ataque. É melhor que os Cabos Armeiros fiquem na retaguarda, pois são os únicos que desarmam as Bombas. Prestar bastante atenção nos movimentos do Computador para descobrir a estratégia, a posição das Bombas e onde está a Torre. 10. DESINSTALAÇÃO DO PROGRAMA. O Jogo de Estratégia Militar conta com um dispositivo de “Uninstall”, que reverte o processo de instalação, o ícone para desinstalar o programa está representado na figura 17. Figura 17: Ícone Uninstall. Uma vez acionado este dispositivo, será interrogado se o usuário realmente deseja retirar o programa e seus dispositivos, conforme apresentado na figura 18. . Figura 18: Confirmação de desinstalação. Após aceito a opção o dispositivo iniciará a remoção do jogo, e então será apresentada a tela de sucesso na remoção, conforme apresentado na figura 19. 54 Figura 19: Sucesso na remoção do jogo. 55 APENDICE B: FONTES DO JOGO DE ESTRATÉGIA MILITAR JOGO DE ESTRATÉGIA MILITAR CURITIBA 2005 56 /* Projeto Desenvolvido por: Cristiano Palmer Mario Cesar Melnik */ /* Includes requeridos */ #ifdef _WIN32 #include <windows.h> #endif #include <GL/gl.h> #include <GL/glut.h> #include <stdio.h> #include <string> int ncol; int linha,graf_lin; int coluna; int nlinha; int ncoluna; int cont; int donodajogada ; int njogada = 0; int atuallinha=0; int atualcoluna=0; int linhaquente=0; int colunaquente=0; #include "escrit.h" #include "posicaoinic.h" #include "objpecjog.h" #include "objpecComp.h" #include "Tabuleiro.h" void confronto(int ataque, int atacado); int inversor(int T); int atualiza_matriz_computador(); int marca_jogadores_computador(); void valor(); void realiza_jogada(int jogada,int flag); void movimenta(int movimento,int peca,int linhaquente,int colunaquente); #include "disponibiliza.h" #include "mov_inic.h" #include "movimento.h" 57 #include "mouseped.h" #include "IA.h" #include "real_jog.h" /* Executada sempre que é necessario re-exibir a imagem */ void display(void) { glMatrixMode(GL_MODELVIEW); glClear(GL_COLOR_BUFFER_BIT); mat(); Inic_Pecas(); telaescrita(); Peca_Jog1(); Peca_Jog2(); Peca_Jog3(); Peca_Jog4(); Peca_Jog5(); Peca_Jog6(); Peca_Jog7(); Peca_Jog8(); Peca_Jog9(); Peca_Jog10(); Peca_Jog11();Peca_Jog12();Peca_Jog13(); Peca_Jog14(); Peca_Jog_Cab1(); Peca_Jog_Cab2(); Peca_Jog_Cab3(); Peca_Jog_Cab4(); Peca_Jog_Cab5(); Peca_Jog_Cab6(); Peca_Jog_Cab7(); Peca_Jog_Sar1();Peca_Jog_Sar2();Peca_Jog_Sar3(); Peca_Jog_Sar4();Peca_Jog_Sar5();Peca_Jog_Sar6(); Peca_Jog_Ten1();Peca_Jog_Ten2();Peca_Jog_Ten3(); Peca_Jog_Ten4();Peca_Jog_Ten5();Peca_Jog_Ten6(); Peca_Jog_Cap1();Peca_Jog_Cap2();Peca_Jog_Cap3(); Peca_Jog_Cap4();Peca_Jog_Cap5();Peca_Jog_Cap6(); Peca_Jog_Maj1();Peca_Jog_Maj2(); Peca_Jog_Maj3();Peca_Jog_Maj4(); Peca_Jog_Cor1();Peca_Jog_Cor2();Peca_Jog_Cor3(); Peca_Jog_Gen();Peca_Jog_Mar();Peca_Jog_Esp(); Peca_Jog_Bom1();Peca_Jog_Bom2();Peca_Jog_Bom3(); Peca_Jog_Bom4();Peca_Jog_Bom5();Peca_Jog_Bom6(); Peca_Jog_Min1();Peca_Jog_Min2(); Peca_Jog_Min3();Peca_Jog_Min4(); Peca_Jog_Tor(); 58 Peca_Com1(); Peca_Com2(); Peca_Com3(); Peca_Com4(); Peca_Com5(); Peca_Com6(); Peca_Com7(); Peca_Com8(); Peca_Com9(); Peca_Com10(); Peca_Com11();Peca_Com12();Peca_Com13(); Peca_Com14(); Peca_Com_Cab1(); Peca_Com_Cab2(); Peca_Com_Cab3(); Peca_Com_Cab4(); Peca_Com_Cab5(); Peca_Com_Cab6(); Peca_Com_Cab7(); Peca_Com_Sar1();Peca_Com_Sar2();Peca_Com_Sar3(); Peca_Com_Sar4();Peca_Com_Sar5();Peca_Com_Sar6(); Peca_Com_Ten1();Peca_Com_Ten2();Peca_Com_Ten3(); Peca_Com_Ten4();Peca_Com_Ten5();Peca_Com_Ten6(); Peca_Com_Cap1();Peca_Com_Cap2();Peca_Com_Cap3(); Peca_Com_Cap4();Peca_Com_Cap5();Peca_Com_Cap6(); Peca_Com_Maj1();Peca_Com_Maj2(); Peca_Com_Maj3();Peca_Com_Maj4(); Peca_Com_Cor1();Peca_Com_Cor2();Peca_Com_Cor3(); Peca_Com_Gen();Peca_Com_Mar();Peca_Com_Esp(); Peca_Com_Bom1();Peca_Com_Bom2();Peca_Com_Bom3(); Peca_Com_Bom4();Peca_Com_Bom5();Peca_Com_Bom6(); Peca_Com_Min1();Peca_Com_Min2(); Peca_Com_Min3();Peca_Com_Min4(); Peca_Com_Tor(); //jogada_jogador(); glutSwapBuffers(); } /* Função ativada qdo a janela é aberta pela primeira vez e toda vez 59 que a janela é reconfigurada (movida ou modificado o tamanho) */ void myReshape(int w, int h) { glViewport (0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-10.0, 10.0, -10.0, 10.0, -10.0, 10.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } /* Função ativada qdo alguma tecla é pressionada */ void Key(unsigned char key, int x, int y) { switch (key) { case 'a':op=1; /* MessageBox(0,"ESTE PROJETO FOI DESENVOLVIDO POR: " Cristiano Palmer " " E Mario Cesar Melnik INART",MB_OK); */ it0=5,jt0=2; it01=2,jt01=4; tabpec[13][4]=3; tabpec[11][1]=3; it02=3,jt02=4; tabpec[11][2]=3; it03=4,jt03=4; tabpec[11][3]=3; it04=5,jt04=4; tabpec[11][4]=3; it05=6,jt05=4; tabpec[11][5]=3; it06=7,jt06=4; tabpec[11][6]=3; it07=8,jt07=4; tabpec[11][7]=3; it08=9,jt08=4; tabpec[11][8]=3; it09=10,jt09=4; tabpec[11][9]=3; it010=11,jt010=4; tabpec[11][10]=3; it011=12,jt011=4; tabpec[11][11]=3; it012=13,jt012=4; tabpec[11][12]=3; it013=14,jt013=4; tabpec[11][13]=3; \n " \n " \n " ","Mensagem 60 it101=1,jt101=3; tabpec[12][0]=4; it102=2,jt102=3; tabpec[12][1]=4; it103=3,jt103=3; tabpec[12][2]=4; it104=4,jt104=3; tabpec[12][3]=4; it105=5,jt105=3; tabpec[12][4]=4; it106=6,jt106=3; tabpec[12][5]=4; it107=7,jt107=3; tabpec[12][6]=4; it201=8,jt201=3; tabpec[12][7]=5; it202=9,jt202=3; tabpec[12][8]=5; it203=10,jt203=3; tabpec[12][9]=5; it204=11,jt204=3; tabpec[12][10]=5; it205=12,jt205=3; tabpec[12][11]=5; it206=13,jt206=3; tabpec[12][12]=5; it301=14,jt301=3; tabpec[12][13]=6; it302=15,jt302=3; tabpec[12][14]=6; it303=1,jt303=2; tabpec[13][0]=6; it304=2,jt304=2; tabpec[13][1]=6; it305=3,jt305=2; tabpec[13][2]=6; it306=4,jt306=2; tabpec[13][3]=6; it401=1,jt401=4; tabpec[11][0]=7; it402=6,jt402=2; tabpec[13][5]=7; it403=7,jt403=2; tabpec[13][6]=7; it404=8,jt404=2; tabpec[13][7]=7; it405=9,jt405=2; tabpec[13][8]=7; it406=10,jt406=2; tabpec[13][9]=7; it501=11,jt501=2; tabpec[13][10]=8; it502=12,jt502=2; tabpec[13][11]=8; it503=13,jt503=2; tabpec[13][12]=8; it504=14,jt504=2; tabpec[13][13]=8; it601=15,jt601=2; tabpec[13][14]=9; it602=1,jt602=1; tabpec[14][0]=9; it603=2,jt603=1; tabpec[14][1]=9; it7=3,jt7=1; tabpec[14][2]=10; it8=4,jt8=1; tabpec[14][3]=11; 61 it9=5,jt9=1; tabpec[14][4]=2; it1001=6,jt1001=1;tabpec[14][5]=0; it1002=7,jt1002=1;tabpec[14][6]=0; it1003=8,jt1003=1;tabpec[14][7]=0; it1004=9,jt1004=1;tabpec[14][8]=0; it1005=10,jt1005=1;tabpec[14][9]=0; it1006=11,jt1006=1;tabpec[14][10]=0; it1101=12,jt1101=1; tabpec[14][11]=1; it1102=13,jt1102=1; tabpec[14][12]=1; it1103=14,jt1103=1; tabpec[14][13]=1; it1104=15,jt1104=1; tabpec[14][14]=1; it12=15,jt12=4;tabpec[11][14]=12; for(i=0;i<=60;i++){Vetor[i]=-1;} dispCOM(); break; case 's':op=2; it0=1,jt0=0; it01=1,jt01=0; it02=1,jt02=0; it03=1,jt03=0; it04=1,jt04=0; it05=1,jt05=0; it06=1,jt06=0; it07=1,jt07=0;it08=1,jt08=0; it09=1,jt09=0; it010=1,jt010=0; it011=1,jt011=0; it012=1,jt012=0; it013=1,jt013=0; it101=2,jt101=0; it102=2,jt102=0; it103=2,jt103=0; it104=2,jt104=0; it105=2,jt105=0; it106=2,jt106=0; it107=2,jt107=0; it201=3,jt201=0; it202=3,jt202=0; it203=3,jt203=0; it204=3,jt204=0; it205=3,jt205=0; it206=3,jt206=0; it301=4,jt301=0; it302=4,jt302=0; it303=4,jt303=0; it304=4,jt304=0; it305=4,jt305=0; it306=4,jt306=0; it401=5,jt401=0; it402=5,jt402=0; it403=5,jt403=0; it404=5,jt404=0; it405=5,jt405=0; it406=5,jt406=0; it501=6,jt501=0; it502=6,jt502=0; it503=6,jt503=0; it504=6,jt504=0; 62 it601=7,jt601=0; it602=7,jt602=0; it603=7,jt603=0; it7=8,jt7=0; it8=9,jt8=0; it9=10,jt9=0; it1001=11,jt1001=0; it1002=11,jt1002=0; it1003=11,jt1003=0; it1004=11,jt1004=0; it1005=11,jt1005=0; it1006=11,jt1006=0; it1101=12,jt1101=0; it1102=12,jt1102=0; it1103=12,jt1103=0; it1104=12,jt1104=0; it12=13,jt12=0; dispCOM(); break; case 27: exit(1); break; default: break; } printf("\n Valor de op na Key : %d", op); //jogada_jogador(); mostra01(); printf("\n"); mostra02(); glutPostRedisplay(); } /* Jogada do Jogdor*/ /* Inicializações do programa */ void myInit(void) { glClearColor(1.0, 1.0, 1.0, -10.0); } /* Parte principal - ponto de início de execução */ int main(int argc, char** argv) 63 { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize(800, 600); glutInitWindowPosition(0,0); glutCreateWindow("Jogo de Estrategia Militar"); myInit(); glutMouseFunc(MOUSE); glutDisplayFunc(display); glutReshapeFunc(myReshape); glutKeyboardFunc(Key); glutMainLoop(); return(0); } // DEMO DE JOGADAS tabuleiro visto pelo computador /* int flag; //variavel de posicjogada 1-Jogada ofensiva na horizontal da peça // 2-Jogada defensiva na horizontal da peça // 3-Jogada ofensiva na vertical da peça // 4 -Jogada defensiva na vertical da peça int jogada; //variavel que guarda valor da jogada C\L 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 0 221-221-221-221-221-221-221-221-221-221-221-221-221-221-221 1 221-221-221-221-221-221-221-221-221-221-221-221-221-221-221 2 221-221-221-221-221-221-221-221-221-221-221-221-221-221-221 3 221-221-221-221-221-221-221-221-221-221-221-221-221-221-221 4 000-000-000-000-000-000-000-000-000-000-000-000-000-000-000 5 000-000-000-000-000-000-000-000-000-##-##-##-##-000-000 6 000-000-##-##-##-##-000-000-000-##-##-##-##-000-000 7 000-000-##-##-##-##-000-000-000-##-##-##-##-000-000 8 000-000-##-##-##-##-000-000-000-##-##-##-##-000-000 9 000-000-##-##-##-##-000-000-000-000-000-000-000-000-000 10 00-00-00-00-00-00-00-00-00-00-00-00-00-00-000 11 332-332-332-332-332-332-332-332-332-332-332-332-332-332-332 12 332-332-332-332-332-332-332-332-332-332-332-332-332-332-332 13 332-332-332-332-332-332-332-332-332-332-332-332-332-332-332 64 14 332-332-332-332-332-332-332-332-332-332-332-332-332-332-332 */ //Ideia, substituir todos os "22" pelas peças do computador //Substituir todos os 33 pelas peças abertas do jogador //Sendo a matriz de visualização do computado // quando a peça tiver o numero 1 no final é do computador // quando a peça tiver o numero 2 no final é do jogador // quando a peça tiver o numero 0 no final é em branco int tabcomp[15][15]={ 221,221,221,221,221,221,221,221,221,221,221,221,221,221,221, 221,221,221,221,221,221,221,221,221,221,221,221,221,221,221, 221,221,221,221,221,221,221,221,221,221,221,221,221,221,221, 221,221,221,221,221,221,221,221,221,221,221,221,221,221,221, 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000, 000,000,000,000,000,000,000,000,000,999,999,999,999,000,000, 000,000,999,999,999,999,000,000,000,999,999,999,999,000,000, 000,000,999,999,999,999,000,000,000,999,999,999,999,000,000, 000,000,999,999,999,999,000,000,000,999,999,999,999,000,000, 000,000,999,999,999,999,000,000,000,000,000,000,000,000,000, 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000, 332,332,332,332,332,332,332,332,332,332,332,332,332,332,332, 332,332,332,332,332,332,332,332,332,332,332,332,332,332,332, 332,332,332,332,332,332,332,332,332,332,332,332,332,332,332, 332,332,332,332,332,332,332,332,332,332,332,332,332,332,332 }; int atualiza_matriz_computador(){ int coluna=0; int linha=0; for(linha=0;linha<4;linha++){ for(coluna=0;coluna<15;coluna++){ tabcomp[linha][coluna]=tabpec[linha][coluna]; } } printf("\n atualiza matriz"); for(x=0;x<=14;x++){ printf("\n"); for(y=0;y<=14;y++){ printf("|"); 65 printf("%d",tabcomp[x][y]); } } } int marca_jogadores_computador(){ for(linha=0;linha<4;linha++){ for(coluna=0;coluna<15;coluna++){ tabcomp[linha][coluna]=tabcomp[linha][coluna]*10+1; } }printf("\n marca jogadores"); for(x=0;x<=14;x++){ printf("\n"); for(y=0;y<=14;y++){ printf("|"); printf("%d",tabcomp[x][y]); } } } int zara_linha_tabcomp(){ tabcomp[linha][coluna]=000; } void armazena_peca(){ atuallinha=linha; atualcoluna=coluna; } void valor(){ printf("\n ENTROU NA IA "); for(coluna=0;coluna<15;coluna++){ if((tabini[linha][coluna]=='C')&&(linha<15)&&(linha>0)&&(coluna<15)&&( coluna>0)){ if (tabcomp[13][coluna]==332){ armazena_peca(); jogada=10000; flag=1; realiza_jogada(jogada,flag); } } 66 } for(coluna=12;coluna<=12;coluna++){ if((tabini[linha][coluna]=='C')&&(linha<15)&&(linha>0)&&(coluna<15)&&( coluna>0)){ if (tabcomp[12][coluna]==41){ armazena_peca(); jogada=1000; flag=1; realiza_jogada(jogada,flag); } } } for(coluna=0;coluna<=14;coluna++){ for(linha=0;linha<=14;linha++){ if((tabini[linha][coluna]=='J')&&(linha<15)&&(linha>0)&&(coluna<15)&&( coluna>0)){ if (tabcomp[linha][coluna]==112){ if(tabcomp[linha-1][coluna]==21){ armazena_peca(); jogada=1001; flag=1; realiza_jogada(jogada,flag); } } } } } for(coluna=0;coluna<=14;coluna++){ for(linha=0;linha<=14;linha++){ if(tabini[linha][coluna]=='J'){ if ((tabcomp[linha][coluna]==112)&&(linha<15)&&(linha>0)&&(coluna<15)&&(coluna> 0)){ if(tabcomp[linha+1][coluna]==21){ armazena_peca(); jogada=1001; 67 flag=2; realiza_jogada(jogada,flag); } } } } } for(coluna=0;coluna<=14;coluna++){ for(linha=0;linha<=14;linha++){ if(tabini[linha][coluna]=='J'){ if ((tabcomp[linha][coluna]==112)&&(linha<15)&&(linha>0)&&(coluna<15)&&(coluna> 0)){ if(tabcomp[linha][coluna-1]==21){ armazena_peca(); jogada=1001; flag=3; realiza_jogada(jogada,flag); } } } } } for(coluna=0;coluna<=14;coluna++){ for(linha=0;linha<=14;linha++){ if(tabini[linha][coluna]=='J'){ if ((tabcomp[linha][coluna]==112)&&(linha<15)&&(linha>0)&&(coluna<15)&&(coluna> 0)){ if(tabcomp[linha][coluna+1]==21){ armazena_peca(); jogada=1001; flag=4; realiza_jogada(jogada,flag); } } } } } 68 for(coluna=0;coluna<=14;coluna++){ for(linha=0;linha<=14;linha++){ if(tabini[linha][coluna]=='C'){ if((tabcomp[linha][coluna]==71)&&(linha<15)&&(linha>0)&&(coluna<15)&&( coluna>0)){ if(tabcomp[linha-1][coluna]==332){ armazena_peca(); jogada=10; flag=1; realiza_jogada(jogada,flag); } if(tabcomp[linha+1][coluna]==332){ armazena_peca(); jogada=10; flag=2; realiza_jogada(jogada,flag); } if(tabcomp[linha][coluna+1]==332){ armazena_peca(); jogada=15; flag=3; realiza_jogada(jogada,flag); } if(tabcomp[linha][coluna-1]==332){ armazena_peca(); jogada=10; flag=4; realiza_jogada(jogada,flag); } } } } } for(coluna=0;coluna<=14;coluna++){ for(linha=0;linha<=14;linha++){ if(tabini[linha][coluna]=='C'){ if(tabcomp[linha][coluna]==71){ 69 if(((tabcomp[linha1][coluna]<=52)&&(tabcomp[linha-1][coluna]!=2)&&(tabini[linha1][coluna]!='C'))&&(linha<15)&&(linha>0)&&(coluna<15)&&(coluna>0)){ armazena_peca(); jogada=10; flag=1; realiza_jogada(jogada,flag); } if(((tabcomp[linha+1][coluna]<=52)&&(tabcomp[linha+1][coluna]!=2)&&(ta bini[linha+1][coluna]!='C'))&&(linha<15)&&(linha>0)&&(coluna<15)&&(coluna>0) ){ armazena_peca(); jogada=10; flag=2; realiza_jogada(jogada,flag); } if(((tabcomp[linha][coluna+1]<=52)&&(tabcomp[linha][coluna+1]!=2)&&(ta bini[linha][coluna+1]!='C')&&(linha<15)&&(linha>0)&&(coluna<15)&&(coluna>0)) ){ armazena_peca(); jogada=100; flag=3; realiza_jogada(jogada,flag); } if(((tabcomp[linha][coluna1]<=52)&&(tabcomp[linha][coluna-1]!=2)&&(tabini[linha][coluna1]!='C'))&&(linha<15)&&(linha>0)&&(coluna<15)&&(coluna>0)){ armazena_peca(); jogada=10; flag=4; realiza_jogada(jogada,flag); } } } } } 70 for(coluna=0;coluna<=14;coluna++){ for(linha=0;linha<=14;linha++){ if(tabini[linha][coluna]=='C'){ if((tabcomp[linha][coluna]>71)&&(linha<15)&&(linha>0)&&(coluna<15)&&(c oluna>0)){ if(tabcomp[linha-1][coluna]==332){ armazena_peca(); jogada=15; flag=1; realiza_jogada(jogada,flag); } if(tabcomp[linha+1][coluna]==332){ armazena_peca(); jogada=10; flag=2; realiza_jogada(jogada,flag); } if(tabcomp[linha][coluna+1]==332){ armazena_peca(); jogada=10; flag=3; realiza_jogada(jogada,flag); } if(tabcomp[linha][coluna-1]==332){ armazena_peca(); jogada=10; flag=4; realiza_jogada(jogada,flag); } } } } } for(coluna=0;coluna<=14;coluna++){ for(linha=0;linha<=14;linha++){ if(tabini[linha][coluna]=='C'){ 71 if((tabcomp[linha][coluna]>71)&&(linha<15)&&(linha>0)&&(coluna<15)&&(c oluna>0)){ if((tabcomp[linha1][coluna]<=52)&&(tabcomp[linha-1][coluna]!=2)&&(tabini[linha1][coluna]!='C')){ armazena_peca(); jogada=10; flag=1; realiza_jogada(jogada,flag); } if((tabcomp[linha+1][coluna]<=52)&&(tabcomp[linha+1][coluna]!=2)&&(tab ini[linha+1][coluna]!='C')){ armazena_peca(); jogada=10; flag=2; realiza_jogada(jogada,flag); } if((tabcomp[linha][coluna+1]<=52)&&(tabcomp[linha][coluna+1]!=2)&&(tab ini[linha][coluna+1]!='C')){ armazena_peca(); jogada=100; flag=3; realiza_jogada(jogada,flag); } if((tabcomp[linha][coluna1]<=52)&&(tabcomp[linha][coluna-1]!=2)&&(tabini[linha][coluna-1]!='C')){ armazena_peca(); jogada=10; flag=4; realiza_jogada(jogada,flag); } } } } } 72 for(coluna=0;coluna<=14;coluna++){ for(linha=0;linha<=14;linha++){ if(tabini[linha][coluna]=='C'){ if((tabcomp[linha][coluna]==111)&&(linha<15)&&(linha>0)&&(coluna<15)&& (coluna>0)){ if(tabcomp[linha-1][coluna]==332){ armazena_peca(); jogada=10; flag=1; realiza_jogada(jogada,flag); } if(tabcomp[linha+1][coluna]==332){ armazena_peca(); jogada=10; flag=2; realiza_jogada(jogada,flag); } if(tabcomp[linha][coluna+1]==332){ armazena_peca(); jogada=80; flag=3; realiza_jogada(jogada,flag); } if(tabcomp[linha][coluna-1]==332){ armazena_peca(); jogada=10; flag=4; realiza_jogada(jogada,flag); } } } } } for(coluna=0;coluna<=14;coluna++){ for(linha=0;linha<=14;linha++){ if(tabini[linha][coluna]=='C'){ 73 if((tabcomp[linha][coluna]==111)&&(linha<15)&&(linha>0)&&(coluna<15)&& (coluna>0)){ if((tabcomp[linha1][coluna]<=102)&&(tabcomp[linha-1][coluna]!=2)&&(tabini[linha1][coluna]!='C')){ armazena_peca(); jogada=80; flag=1; realiza_jogada(jogada,flag); } if((tabcomp[linha+1][coluna]<=102)&&(tabcomp[linha+1][coluna]!=2)&&(ta bini[linha+1][coluna]!='C')){ armazena_peca(); jogada=10; flag=2; realiza_jogada(jogada,flag); } if((tabcomp[linha][coluna+1]<=102)&&(tabcomp[linha][coluna+1]!=2)&&(ta bini[linha][coluna+1]!='C')){ armazena_peca(); jogada=10; flag=3; realiza_jogada(jogada,flag); } if((tabcomp[linha][coluna1]<=102)&&(tabcomp[linha][coluna-1]!=2)&&(tabini[linha][coluna-1]!='C')){ armazena_peca(); jogada=10; flag=4; realiza_jogada(jogada,flag); } } } } } 74 for(coluna=0;coluna<=14;coluna++){ for(linha=0;linha<=14;linha++){ if(tabini[linha][coluna]=='C'){ if((tabcomp[linha][coluna]==51)&&(linha<15)&&(linha>0)&&(coluna<15)&&( coluna>0)){ if(tabcomp[linha-1][coluna]==332){ armazena_peca(); jogada=10; flag=1; realiza_jogada(jogada,flag); } if(tabcomp[linha+1][coluna]==332){ armazena_peca(); jogada=10; flag=2; realiza_jogada(jogada,flag); } if(tabcomp[linha][coluna+1]==332){ armazena_peca(); jogada=80; flag=3; realiza_jogada(jogada,flag); } if(tabcomp[linha][coluna-1]==332){ armazena_peca(); jogada=10; flag=4; realiza_jogada(jogada,flag); } } } } } for(coluna=0;coluna<=14;coluna++){ for(linha=0;linha<=14;linha++){ if(tabini[linha][coluna]=='C'){ if(tabcomp[linha][coluna]==51){ 75 if(((tabcomp[linha1][coluna]<=42)&&(tabcomp[linha-1][coluna]!=2)&&(tabini[linha1][coluna]!='C'))&&(linha<15)&&(linha>0)&&(coluna<15)&&(coluna>0)){ armazena_peca(); jogada=80; flag=1; realiza_jogada(jogada,flag); } if(((tabcomp[linha+1][coluna]<=42)&&(tabcomp[linha+1][coluna]!=2)&&(ta bini[linha+1][coluna]!='C'))&&(linha<15)&&(linha>0)&&(coluna<15)&&(coluna>0) ){ armazena_peca(); jogada=10; flag=2; realiza_jogada(jogada,flag); } if(((tabcomp[linha][coluna+1]<=42)&&(tabcomp[linha][coluna+1]!=2)&&(ta bini[linha][coluna+1]!='C'))&&(linha<15)&&(linha>0)&&(coluna<15)&&(coluna>0) ){ armazena_peca(); jogada=10; flag=3; realiza_jogada(jogada,flag); } if(((tabcomp[linha][coluna1]<=42)&&(tabcomp[linha][coluna-1]!=2)&&(tabini[linha][coluna1]!='C'))&&(linha<15)&&(linha>0)&&(coluna<15)&&(coluna>0)){ armazena_peca(); jogada=10; flag=4; realiza_jogada(jogada,flag); } } } } } 76 for(coluna=0;coluna<=14;coluna++){ for(linha=0;linha<=14;linha++){ if(tabini[linha][coluna]=='C'){ if((tabcomp[linha][coluna]==41)&&(linha<15)&&(linha>0)&&(coluna<15)&&( coluna>0)){ if(tabcomp[linha-1][coluna]==332){ armazena_peca(); jogada=10; flag=1; realiza_jogada(jogada,flag); } if(tabcomp[linha+1][coluna]==332){ armazena_peca(); jogada=10; flag=2; realiza_jogada(jogada,flag); } if(tabcomp[linha][coluna+1]==332){ armazena_peca(); jogada=80; flag=3; realiza_jogada(jogada,flag); } if(tabcomp[linha][coluna-1]==332){ armazena_peca(); jogada=10; flag=4; realiza_jogada(jogada,flag); } } } } } for(coluna=0;coluna<=14;coluna++){ for(linha=0;linha<=14;linha++){ if(tabini[linha][coluna]=='C'){ 77 if((tabcomp[linha][coluna]==41)&&(linha<15)&&(linha>0)&&(coluna<15)&&( coluna>0)){ if((tabcomp[linha1][coluna]<=32)||(tabcomp[linha-1][coluna]==2)&&(tabini[linha1][coluna]!='C')){ armazena_peca(); jogada=80; flag=1; realiza_jogada(jogada,flag); } if((tabcomp[linha+1][coluna]<=32)||(tabcomp[linha+1][coluna]==2)&&(tab ini[linha+1][coluna]!='C')){ armazena_peca(); jogada=70; flag=2; realiza_jogada(jogada,flag); } if((tabcomp[linha][coluna+1]<=32)||(tabcomp[linha][coluna+1]==2)&&(tab ini[linha][coluna+1]!='C')){ armazena_peca(); jogada=70; flag=3; realiza_jogada(jogada,flag); } if((tabcomp[linha][coluna1]<=32)||(tabcomp[linha][coluna-1]==2)&&(tabini[linha][coluna-1]!='C')){ armazena_peca(); jogada=70; flag=4; realiza_jogada(jogada,flag); } } } } } 78 for(coluna=0;coluna<=14;coluna++){ for(linha=0;linha<=14;linha++){ if(tabini[linha][coluna]=='C'){ if((tabcomp[linha][coluna]==41)&&(linha<15)&&(linha>0)&&(coluna<15)&&( coluna>0)){ if((tabcomp[linha1][coluna]<=32)||(tabcomp[linha-1][coluna]!=12)&&(tabini[linha1][coluna]!='C')){ armazena_peca(); jogada=80; flag=1; realiza_jogada(jogada,flag); } if((tabcomp[linha+1][coluna]<=32)||(tabcomp[linha+1][coluna]!=12)&&(ta bini[linha+1][coluna]!='C')){ armazena_peca(); jogada=70; flag=2; realiza_jogada(jogada,flag); } if((tabcomp[linha][coluna+1]<=32)||(tabcomp[linha][coluna+1]!=12)&&(ta bini[linha][coluna+1]!='C')){ armazena_peca(); jogada=70; flag=3; realiza_jogada(jogada,flag); } if((tabcomp[linha][coluna1]<=32)||(tabcomp[linha][coluna-1]!=12)&&(tabini[linha][coluna-1]!='C')){ armazena_peca(); jogada=70; flag=4; realiza_jogada(jogada,flag); } 79 } } } } for(coluna=0;coluna<=14;coluna++){ for(linha=0;linha<=14;linha++){ if(tabini[linha][coluna]=='C'){ if((tabcomp[linha][coluna]==021)&&(linha<15)&&(linha>0)&&(coluna<15)&& (coluna>0)){ if(tabcomp[linha-1][coluna]==332){ armazena_peca(); jogada=0; flag=1; realiza_jogada(jogada,flag); } if(tabcomp[linha+1][coluna]==332){ armazena_peca(); jogada=100; flag=2; realiza_jogada(jogada,flag); } if(tabcomp[linha][coluna+1]==332){ armazena_peca(); jogada=0; flag=3; realiza_jogada(jogada,flag); } if(tabcomp[linha][coluna-1]==332){ armazena_peca(); jogada=0; flag=4; realiza_jogada(jogada,flag); } 80 } } } } for(coluna=0;coluna<=14;coluna++){ for(linha=0;linha<=14;linha++){ if(tabini[linha][coluna]=='C'){ if((tabcomp[linha][coluna]==21)&&(linha<15)&&(linha>0)&&(coluna<15)&&( coluna>0)){ if(tabcomp[linha-1][coluna]==112){ armazena_peca(); jogada=100000; flag=1; realiza_jogada(jogada,flag); } if(tabcomp[linha+1][coluna]==112){ armazena_peca(); jogada=0; flag=2; realiza_jogada(jogada,flag); } if(tabcomp[linha][coluna+1]==112){ armazena_peca(); jogada=100000; flag=3; realiza_jogada(jogada,flag); } if(tabcomp[linha][coluna-1]==112){ armazena_peca(); jogada=0; flag=4; realiza_jogada(jogada,flag); } } } } } 81 // } for(coluna=0;coluna <=14;coluna++){ for(linha=0;linha <=14;linha++){ if(tabini[linha][coluna]=='C'){ if((tabcomp[linha][coluna]==41)&&(linha<15)&&(linha>0)&&(coluna<15)&&( coluna>0)){ if(tabcomp[linha-1][coluna]==332){ armazena_peca(); jogada=20; flag=1; realiza_jogada(jogada,flag); } if(tabcomp[linha+1][coluna]==332){ armazena_peca(); jogada=0; flag=2; realiza_jogada(jogada,flag); } if(tabcomp[linha][coluna+1]==332){ armazena_peca(); jogada=0; flag=3; realiza_jogada(jogada,flag); } if(tabcomp[linha][coluna-1]==332){ armazena_peca(); jogada=0; flag=4; realiza_jogada(jogada,flag); } } } } } for(coluna=0;coluna<=14;coluna++){ for(linha=0;linha<=14;linha++){ 82 if(tabini[linha][coluna]=='C'){ if((tabcomp[linha][coluna]==41)&&(linha<15)&&(linha>0)&&(coluna<15)&&( coluna>0)){ if((tabcomp[linha1][coluna]<=32)&&(tabcomp[linha-1][coluna]!=2)&&(tabini[linha1][coluna]!='C')){ armazena_peca(); jogada=0; flag=1; realiza_jogada(jogada,flag); } if((tabcomp[linha+1][coluna]<=32)&&(tabcomp[linha+1][coluna]!=2)&&(tab ini[linha+1][coluna]!='C')){ armazena_peca(); jogada=0; flag=2; realiza_jogada(jogada,flag); } if((tabcomp[linha][coluna+1]<=32)&&(tabcomp[linha][coluna+1]!=2)&&(tab ini[linha][coluna+1]!='C')){ armazena_peca(); jogada=20; flag=3; realiza_jogada(jogada,flag); } if((tabcomp[linha][coluna1]<=32)&&(tabcomp[linha][coluna-1]!=2)&&(tabini[linha][coluna-1]!='C')){ armazena_peca(); jogada=0; flag=4; realiza_jogada(jogada,flag); } } } } 83 } for(coluna=0;coluna<=14;coluna++){ for(linha=0;linha<=14;linha++){ if(tabini[linha][coluna]=='C'){ if((tabcomp[linha][coluna]==61)&&(linha<15)&&(linha>0)&&(coluna<15)&&( coluna>0)){ if(tabcomp[linha-1][coluna]==332){ armazena_peca(); jogada=20; flag=1; realiza_jogada(jogada,flag); } if(tabcomp[linha+1][coluna]==332){ armazena_peca(); jogada=0; flag=2; realiza_jogada(jogada,flag); } if(tabcomp[linha][coluna+1]==332){ armazena_peca(); jogada=0; flag=3; realiza_jogada(jogada,flag); } if(tabcomp[linha][coluna-1]==332){ armazena_peca(); jogada=0; flag=4; realiza_jogada(jogada,flag); } } } } } for(coluna=0;coluna<=14;coluna++){ for(linha=0;linha<=14;linha++){ if(tabini[linha][coluna]=='C'){ 84 if((tabcomp[linha][coluna]==61)&&(linha<15)&&(linha>0)&&(coluna<15)&&( coluna>0)){ if((tabcomp[linha1][coluna]<=52)&&(tabcomp[linha-1][coluna]!=2)&&(tabini[linha1][coluna]!='C')){ armazena_peca(); jogada=0; flag=1; realiza_jogada(jogada,flag); } if((tabcomp[linha+1][coluna]<=52)&&(tabcomp[linha+1][coluna]!=2)&&(tab ini[linha+1][coluna]!='C')){ armazena_peca(); jogada=0; flag=2; realiza_jogada(jogada,flag); } if((tabcomp[linha][coluna+1]<=52)&&(tabcomp[linha][coluna+1]!=2)&&(tab ini[linha][coluna+1]!='C')){ armazena_peca(); jogada=20; flag=3; realiza_jogada(jogada,flag); } if((tabcomp[linha][coluna1]<=52)&&(tabcomp[linha][coluna-1]!=2)&&(tabini[linha][coluna-1]!='C')){ armazena_peca(); jogada=0; flag=4; realiza_jogada(jogada,flag); } } } } } 85 for(coluna=0;coluna<=14;coluna++){ for(linha=0;linha<=14;linha++){ if(tabini[linha][coluna]=='C'){ if((tabcomp[linha][coluna]==81)&&(linha<15)&&(linha>0)&&(coluna<15)&&( coluna>0)){ if(tabcomp[linha-1][coluna]==332){ armazena_peca(); jogada=20; flag=1; realiza_jogada(jogada,flag); } if(tabcomp[linha+1][coluna]==332){ armazena_peca(); jogada=0; flag=2; realiza_jogada(jogada,flag); } if(tabcomp[linha][coluna+1]==332){ armazena_peca(); jogada=0; flag=3; realiza_jogada(jogada,flag); } if(tabcomp[linha][coluna-1]==332){ armazena_peca(); jogada=0; flag=4; realiza_jogada(jogada,flag); } } } } } for(coluna=0;coluna<=14;coluna++){ for(linha=0;linha<=14;linha++){ 86 if(tabini[linha][coluna]=='C'){ if((tabcomp[linha][coluna]==81)&&(linha<15)&&(linha>0)&&(coluna<15)&&( coluna>0)){ if((tabcomp[linha1][coluna]<=072)&&(tabcomp[linha-1][coluna]!=2)&&(tabini[linha1][coluna]!='C')){ armazena_peca(); jogada=0; flag=1; realiza_jogada(jogada,flag); } if((tabcomp[linha+1][coluna]<=072)&&(tabcomp[linha+1][coluna]!=2)&&(ta bini[linha+1][coluna]!='C')){ armazena_peca(); jogada=0; flag=2; realiza_jogada(jogada,flag); } if((tabcomp[linha][coluna+1]<=072)&&(tabcomp[linha][coluna+1]!=2)&&(ta bini[linha][coluna+1]!='C')){ armazena_peca(); jogada=20; flag=3; realiza_jogada(jogada,flag); } if((tabcomp[linha][coluna1]<=072)&&(tabcomp[linha][coluna-1]!=2)&&(tabini[linha][coluna-1]!='C')){ armazena_peca(); jogada=0; flag=4; realiza_jogada(jogada,flag); } } } } 87 } for(coluna=0;coluna<=14;coluna++){ for(linha=0;linha<=14;linha++){ if(tabini[linha][coluna]=='C'){ if((tabcomp[linha][coluna]==91)&&(linha<15)&&(linha>0)&&(coluna<15)&&( coluna>0)){ if(tabcomp[linha-1][coluna]==332){ armazena_peca(); jogada=20; flag=1; realiza_jogada(jogada,flag); } if(tabcomp[linha+1][coluna]==332){ armazena_peca(); jogada=0; flag=2; realiza_jogada(jogada,flag); } if(tabcomp[linha][coluna+1]==332){ armazena_peca(); jogada=0; flag=3; realiza_jogada(jogada,flag); } if(tabcomp[linha][coluna-1]==332){ armazena_peca(); jogada=0; flag=4; realiza_jogada(jogada,flag); } } } } } for(coluna=0;coluna<=14;coluna++){ for(linha=0;linha<=14;linha++){ if(tabini[linha][coluna]=='C'){ 88 if((tabcomp[linha][coluna]==91)&&(linha<15)&&(linha>0)&&(coluna<15)&&( coluna>0)){ if((tabcomp[linha1][coluna]<=82)&&(tabcomp[linha-1][coluna]!=2)&&(tabini[linha1][coluna]!='C')){ armazena_peca(); jogada=0; flag=1; realiza_jogada(jogada,flag); } if((tabcomp[linha+1][coluna]<=82)&&(tabcomp[linha+1][coluna]!=2)&&(tab ini[linha+1][coluna]!='C')){ armazena_peca(); jogada=0; flag=2; realiza_jogada(jogada,flag); } if((tabcomp[linha][coluna+1]<=82)&&(tabcomp[linha][coluna+1]!=2)&&(tab ini[linha][coluna+1]!='C')){ armazena_peca(); jogada=20; flag=3; realiza_jogada(jogada,flag); } if((tabcomp[linha][coluna1]<=82)&&(tabcomp[linha][coluna-1]!=2)&&(tabini[linha][coluna-1]!='C')){ armazena_peca(); jogada=0; flag=4; realiza_jogada(jogada,flag); } } } } } 89 for(coluna=0;coluna<=14;coluna++){ for(linha=0;linha<=14;linha++){ if(tabini[linha][coluna]=='C'){ if((tabcomp[linha][coluna]==101)&&(linha<15)&&(linha>0)&&(coluna<15)&& (coluna>0)){ if(tabcomp[linha-1][coluna]==332){ armazena_peca(); jogada=20; flag=1; realiza_jogada(jogada,flag); } if(tabcomp[linha+1][coluna]==332){ armazena_peca(); jogada=0; flag=2; realiza_jogada(jogada,flag); } if(tabcomp[linha][coluna+1]==332){ armazena_peca(); jogada=0; flag=3; realiza_jogada(jogada,flag); } if(tabcomp[linha][coluna-1]==332){ armazena_peca(); jogada=0; flag=4; realiza_jogada(jogada,flag); } } } } } for(coluna=0;coluna<=14;coluna++){ for(linha=0;linha<=14;linha++){ if(tabini[linha][coluna]=='C'){ 90 if((tabcomp[linha][coluna]==101)&&(linha<15)&&(linha>0)&&(coluna<15)&& (coluna>0)){ if((tabcomp[linha1][coluna]<=92)&&(tabcomp[linha-1][coluna]!=2)&&(tabini[linha1][coluna]!='C')){ armazena_peca(); jogada=0; flag=1; realiza_jogada(jogada,flag); } if((tabcomp[linha+1][coluna]<=92)&&(tabcomp[linha+1][coluna]!=2)&&(tab ini[linha+1][coluna]!='C')){ armazena_peca(); jogada=0; flag=2; realiza_jogada(jogada,flag); } if((tabcomp[linha][coluna+1]<=92)&&(tabcomp[linha][coluna+1]!=2)&&(tab ini[linha][coluna+1]!='C')){ armazena_peca(); jogada=20; flag=3; realiza_jogada(jogada,flag); } if((tabcomp[linha][coluna1]<=92)&&(tabcomp[linha][coluna-1]!=2)&&(tabini[linha][coluna-1]!='C')){ armazena_peca(); jogada=0; flag=4; realiza_jogada(jogada,flag); } } } } } 91 for(coluna=0;coluna<=14;coluna++){ for(linha=0;linha<=14;linha++){ if(tabini[linha][coluna]=='C'){ if((tabcomp[linha][coluna]==111)&&(linha<15)&&(linha>0)&&(coluna<15)&& (coluna>0)){ if(tabcomp[linha-1][coluna]==332){ armazena_peca(); jogada=20; flag=1; realiza_jogada(jogada,flag); } if(tabcomp[linha+1][coluna]==332){ armazena_peca(); jogada=0; flag=2; realiza_jogada(jogada,flag); } if(tabcomp[linha][coluna+1]==332){ armazena_peca(); jogada=0; flag=3; realiza_jogada(jogada,flag); } if(tabcomp[linha][coluna-1]==332){ armazena_peca(); jogada=0; flag=4; realiza_jogada(jogada,flag); } } } } } for(coluna=0;coluna<=14;coluna++){ for(linha=0;linha<=14;linha++){ 92 if(tabini[linha][coluna]=='C'){ if((tabcomp[linha][coluna]==111)&&(linha<15)&&(linha>0)&&(coluna<15)&& (coluna>0)){ if((tabcomp[linha1][coluna]<=102)&&(tabcomp[linha-1][coluna]!=2)&&(tabini[linha1][coluna]!='C')){ armazena_peca(); jogada=0; flag=1; realiza_jogada(jogada,flag); } if((tabcomp[linha+1][coluna]<=102)&&(tabcomp[linha+1][coluna]!=2)&&(ta bini[linha+1][coluna]!='C')){ armazena_peca(); jogada=0; flag=2; realiza_jogada(jogada,flag); } if((tabcomp[linha][coluna+1]<=102)&&(tabcomp[linha][coluna+1]!=2)&&(ta bini[linha][coluna+1]!='C')){ armazena_peca(); jogada=20; flag=3; realiza_jogada(jogada,flag); } if((tabcomp[linha][coluna1]<=102)&&(tabcomp[linha][coluna-1]!=102)&&(tabini[linha][coluna-1]!='C')){ armazena_peca(); jogada=0; flag=4; realiza_jogada(jogada,flag); } } } } 93 } for(coluna=0;coluna<=14;coluna++){ for(linha=0;linha<=14;linha++){ if(tabini[linha][coluna]=='C'){ if((tabcomp[linha][coluna]==031)&&(linha<15)&&(linha>0)&&(coluna<15)&& (coluna>0)){ if(tabcomp[linha-1][coluna]==332){ armazena_peca(); jogada=1; flag=1; realiza_jogada(jogada,flag); } if(tabcomp[linha+1][coluna]==332){ armazena_peca(); jogada=2; flag=2; realiza_jogada(jogada,flag); } if(tabcomp[linha][coluna+1]==332){ armazena_peca(); jogada=1; flag=3; realiza_jogada(jogada,flag); } if(tabcomp[linha][coluna-1]==332){ armazena_peca(); jogada=2; flag=4; realiza_jogada(jogada,flag); } } } } } for(coluna<=14;coluna=0;coluna--){ for(linha=0;linha<=14;linha++){ 94 if(tabini[linha][coluna]=='C'){ if((tabcomp[linha][coluna]==31)&&(linha<15)&&(linha>0)&&(coluna<15)&&( coluna>0)){ if(tabcomp[linha-1][coluna]==332){ armazena_peca(); jogada=1; flag=1; realiza_jogada(jogada,flag); } if(tabcomp[linha+1][coluna]==332){ armazena_peca(); jogada=2; flag=2; realiza_jogada(jogada,flag); } if(tabcomp[linha][coluna+1]==332){ armazena_peca(); jogada=1; flag=3; realiza_jogada(jogada,flag); } if(tabcomp[linha][coluna-1]==332){ armazena_peca(); jogada=2; flag=4; realiza_jogada(jogada,flag); } } } } } for(coluna=0;coluna<=14;coluna++){ for(linha<=14;linha<=0;linha--){ if(tabini[linha][coluna]=='C'){ if((tabcomp[linha][coluna]==031)&&(linha<15)&&(linha>0)&&(coluna<15)&& (coluna>0)){ 95 if(tabcomp[linha-1][coluna]==332){ armazena_peca(); jogada=1; flag=1; realiza_jogada(jogada,flag); } if(tabcomp[linha+1][coluna]==332){ armazena_peca(); jogada=2; flag=2; realiza_jogada(jogada,flag); } if(tabcomp[linha][coluna+1]==332){ armazena_peca(); jogada=1; flag=3; realiza_jogada(jogada,flag); } if(tabcomp[linha][coluna-1]==332){ armazena_peca(); jogada=2; flag=4; realiza_jogada(jogada,flag); } } } } } for(coluna<=14;coluna=0;coluna--){ for(linha<=14;linha<=0;linha--){ if(tabini[linha][coluna]=='C'){ if((tabcomp[linha][coluna]==031)&&(linha<15)&&(linha>0)&&(coluna<15)&& (coluna>0)){ if(tabcomp[linha-1][coluna]==332){ armazena_peca(); jogada=1; flag=1; 96 realiza_jogada(jogada,flag); } if(tabcomp[linha+1][coluna]==332){ armazena_peca(); jogada=2; flag=2; realiza_jogada(jogada,flag); } if(tabcomp[linha][coluna+1]==332){ armazena_peca(); jogada=1; flag=3; realiza_jogada(jogada,flag); } if(tabcomp[linha][coluna-1]==332){ armazena_peca(); jogada=2; flag=4; realiza_jogada(jogada,flag); } } } } } for(coluna=0;coluna<=14;coluna++){ for(linha=0;linha<=14;linha++){ if(tabini[linha][coluna]=='C'){ if((tabcomp[linha][coluna]==31)&&(linha<15)&&(linha>0)&&(coluna<15)&&( coluna>0)){ if(tabcomp[linha-1][coluna]==32){ armazena_peca(); jogada=1; flag=1; realiza_jogada(jogada,flag); } if(tabcomp[linha+1][coluna]==32){ armazena_peca(); 97 jogada=1; flag=2; realiza_jogada(jogada,flag); } if(tabcomp[linha][coluna+1]==32){ armazena_peca(); jogada=1; flag=3; realiza_jogada(jogada,flag); } if(tabcomp[linha][coluna-1]==32){ armazena_peca(); jogada=1; flag=4; realiza_jogada(jogada,flag); } } } } } for(x=0;x<=14;x++){ printf("\n"); for(y=0;y<=14;y++){ printf("|"); printf("%d",tabcomp[x][y]); } } printf("\n peca jogada :%d",peca); printf("\n Valor da jogada em IA :%d",jogada); printf("\n Valor do FLAG em IA :%d",flag); printf("\n Valor de linhaquente :%d",linhaquente); printf("\n Valor de colunaquente :%d",colunaquente); //realiza_jogada(jogada,flag); //movimenta(flag,peca,linhaquente,colunaquente); } 98 printf("\n FLAG saindo de movimenta :%d",flag); printf("\n peca em movimenta :%d",peca); } void realiza_jogada(int jogada,int flag){ printf("\n LINHA ATUAL %d", atuallinha); printf("\n COLUNA ATUAL %d", atualcoluna); printf("\n JOGADA ATUAL %d", jogada); printf("\n FLAG ATUAL %d", flag); if(jog_real < jogada){ jog_real=jogada; linhaquente=atuallinha; colunaquente=atualcoluna; } printf("\n JOGADA VALIDA %d",jog_real); printf("\n LINHA QUENTE %d",linhaquente); printf("\n COLUNA QUENTE %d",colunaquente); } /*void realiza_jogada(int jogada,int flag){ int sera; sera = jogada; if(jog_real != sera){ // printf("\n Entrou no primeiro IF \n"); // printf("\n valor de jog_real :%d",jog_real); // printf("\n valor de sera :%d", sera); if(jog_real < sera){ printf("\n ATUALIZA VALORES \n"); linhaquente=atuallinha; colunaquente=atualcoluna; printf("\n FUNCAO EXECUTADA \n"); printf("\n peca jogada :%d",peca); printf("\n Valor da jogada em IA :%d",jog_real); printf("\n Valor do FLAG em IA :%d",flag); printf("\n Valor de linhaquente :%d",linhaquente); printf("\n Valor de colunaquente :%d",colunaquente); movimenta(flag,peca,linhaquente,colunaquente); jog_real = jogada; } } 99 } void movimenta(int movimento,int peca,int linhaquente,int colunaquente){ flag=movimento; printf("\n FLAG dentro de movimenta :%d",flag); if(flag == 1 && peca ==3){ linha = linha + 1; tabpec[linha][coluna]=3; linha = linha - 1; tabpec[linha][coluna]=-1; if(ident_c==0){ic0=coluna,jc0=linha;} if(ident_c==100){ic01=coluna,jc01=linha;} if(ident_c==200){ic02=coluna,jc02=linha;} if(ident_c==300){ic03=coluna,jc03=linha;} if(ident_c==400){ic04=coluna,jc04=linha;} if(ident_c==500){ic05=coluna,jc05=linha;} if(ident_c==600){ic06=coluna,jc06=linha;} if(ident_c==700){ic07=coluna,jc07=linha;} if(ident_c==800){ic08=coluna,jc08=linha;} if(ident_c==900){ic09=coluna,jc09=linha;} if(ident_c==1000){ic010=coluna,jc010=linha;} if(ident_c==1100){ic011=coluna,jc011=linha;} if(ident_c==1200){ic012=coluna,jc012=linha;} if(ident_c==1300){ic013=coluna,jc013=linha;} } if(flag == 2 && tabpec[linha][coluna]==3){ linha = linha - 1; tabpec[linha][coluna]=3; linha = linha + 1; tabpec[linha][coluna]=-1; if(ident_c==0){ic0=coluna,jc0=linha;} if(ident_c==100){ic01=coluna,jc01=linha;} if(ident_c==200){ic02=coluna,jc02=linha;} if(ident_c==300){ic03=coluna,jc03=linha;} if(ident_c==400){ic04=coluna,jc04=linha;} if(ident_c==500){ic05=coluna,jc05=linha;} if(ident_c==600){ic06=coluna,jc06=linha;} if(ident_c==700){ic07=coluna,jc07=linha;} if(ident_c==800){ic08=coluna,jc08=linha;} 100 if(ident_c==900){ic09=coluna,jc09=linha;} if(ident_c==1000){ic010=coluna,jc010=linha;} if(ident_c==1100){ic011=coluna,jc011=linha;} if(ident_c==1200){ic012=coluna,jc012=linha;} if(ident_c==1300){ic013=coluna,jc013=linha;} } if(flag == 3 && tabpec[linha][coluna]==3){ coluna = coluna + 1; tabpec[linha][coluna]=3; coluna = coluna - 1; tabpec[linha][coluna]=-1; if(ident_c==0){ic0=coluna,jc0=linha;} if(ident_c==100){ic01=coluna,jc01=linha;} if(ident_c==200){ic02=coluna,jc02=linha;} if(ident_c==300){ic03=coluna,jc03=linha;} if(ident_c==400){ic04=coluna,jc04=linha;} if(ident_c==500){ic05=coluna,jc05=linha;} if(ident_c==600){ic06=coluna,jc06=linha;} if(ident_c==700){ic07=coluna,jc07=linha;} if(ident_c==800){ic08=coluna,jc08=linha;} if(ident_c==900){ic09=coluna,jc09=linha;} if(ident_c==1000){ic010=coluna,jc010=linha;} if(ident_c==1100){ic011=coluna,jc011=linha;} if(ident_c==1200){ic012=coluna,jc012=linha;} if(ident_c==1300){ic013=coluna,jc013=linha;} } if(flag == 4 && tabpec[linha][coluna]==3){ coluna = coluna - 1; tabpec[linha][coluna]=3; coluna = coluna + 1; tabpec[linha][coluna]=-1; if(ident_c==0){ic0=coluna,jc0=linha;} if(ident_c==100){ic01=coluna,jc01=linha;} if(ident_c==200){ic02=coluna,jc02=linha;} if(ident_c==300){ic03=coluna,jc03=linha;} if(ident_c==400){ic04=coluna,jc04=linha;} if(ident_c==500){ic05=coluna,jc05=linha;} if(ident_c==600){ic06=coluna,jc06=linha;} if(ident_c==700){ic07=coluna,jc07=linha;} 101 if(ident_c==800){ic08=coluna,jc08=linha;} if(ident_c==900){ic09=coluna,jc09=linha;} if(ident_c==1000){ic010=coluna,jc010=linha;} if(ident_c==1100){ic011=coluna,jc011=linha;} if(ident_c==1200){ic012=coluna,jc012=linha;} if(ident_c==1300){ic013=coluna,jc013=linha;} } void mov(int linha,int coluna, int linhaant, int colunaant){ if((linhaant == linha +1 && colunaant != coluna)|| (linhaant == linha -1 && colunaant != coluna)|| (linhaant == linha +1 && colunaant != coluna)|| (linhaant == linha -1 && colunaant != coluna) || (coluna+1!=colunaant)&&(coluna-1!=colunaant)&& (linha+1!=linhaant)&&(linha-1!=linhaant)){ pecapeg = tabpec[lin][col-1]; printf("\n Peca Atribuida para pecapeg :%d",pecapeg); bem = tabini[lin][col-1]; printf("\n Localizacao em TABINI :%c ",bem); printf("\nA PECA buscada e da patente: "); printf("%d",tabpec[lin][col-1]); printf("\nPertencente ao :"); if(tabini[lin][col-1]=='B'){ printf("BRANCO"); MessageBox(0,"LUGAR EM BRANCO","MSG INART",MB_OK); } if(tabini[lin][col-1]=='C'){ printf("COMPUTADOR"); printf("\nNao e permitido pegar pecas do computador"); printf("\n PECA PEGA : %d",ident_c); MessageBox(0,"PECA DO COMPUTADOR","MSG INART",MB_OK); } if(tabini[lin][col-1]=='J'){ printf("JOGADOR"); if(pecapeg == 3){ goto SOLDADO; } if((lin == nlin +1 && col != ncol) || 102 (lin == nlin -1 && col != ncol)|| (lin == nlin +1 && col != ncol) || (lin == nlin -1 && col != ncol) || (ncol+1!=col)&&(ncol-1!=col)&& (nlin+1!=lin)&&(nlin-1!=lin)){ MessageBox(0,"JOGADA INVALIDA('jogada jogador')","MSG INART",MB_OK); } else{ SOLDADO: if((lin == nlin +1 && col != ncol) || (lin == nlin -1 && col != ncol)){ /* for(lin=5; lin < 10; lin++){ lin == '#'; } */ MessageBox(0,"JOGADA INVALIDA \n if soldado","MSG INART",MB_OK); } } if((ataque > atacado)){ int nLIN,COL; if((ident == 101)||(ident == 102)|| (ident == 103)||(ident == 104)|| (ident == 105)||(ident == 106)||(ident == 107)){ MessageBox(0,"VITÓRIA DO JOGADOR","MSG INART",MB_OK); printf("\n peca do COMP : %d",ident_c); printf("\n peca do jogador : %d",ident); tabpec[lin][col-1] = -1; tabini[lin][col-1] = 'B'; tabini[nlin][ncol-1] = 'J'; tabpec[nlin][ncol-1] = pecapeg; INVERSO_NLin(nlin); nLIN=nlin; COL=ncol; printf("\n linha dentro de vitoria 'nLIN' //it401=ncol,jt401=nLIN; if(ident == 101){it101=ncol,jt101=nLIN;} if(ident == 102){it102=ncol,jt102=nLIN;} if(ident == 103){it103=ncol,jt103=nLIN;} if(ident == 104){it104=ncol,jt104=nLIN;} :%d", nLIN); 103 if(ident == 105){it105=ncol,jt105=nLIN;} if(ident == 106){it106=ncol,jt106=nLIN;} if(ident == 107){it107=ncol,jt107=nLIN;} switch(ident_c){ case 0:ic0=1,jc0=0;break; case 100:ic01=1,jc01=0;break; case 200:ic02=1,jc02=0;break; case 300:ic03=1,jc03=0;break; case 400:ic04=1,jc04=0;break; case 500:ic05=1,jc05=0;break; case 600:ic06=1,jc06=0;break; case 700:ic07=1,jc07=0;break; case 800:ic08=1,jc08=0;break; case 900:ic09=1,jc09=0;break; case 1000:ic010=1,jc010=0;break; case 1100:ic011=1,jc011=0;break; case 1200:ic012=1,jc012=0;break; case 1300:ic013=1,jc013=0;break; case 9:ic9=0,jc9=0;MessageBox(0,"Voce acaba de derrotar o ESPIAO ","MSG INART",MB_OK); break; case 1001:ic1001=10,jc1001=0;MessageBox(0,"Voce acaba de acaba de acaba de acaba de acaba de acaba de acaba de acaba de acaba de acaba de DESARMAR UMA BOMBA ","MSG INART",MB_OK); break; case 1002:ic1002=10,jc1002=0;MessageBox(0,"Voce DESARMAR UMA BOMBA ","MSG INART",MB_OK); break; case 1003:ic1003=10,jc1003=0;MessageBox(0,"Voce DESARMAR UMA BOMBA ","MSG INART",MB_OK); break; case 1004:ic1004=10,jc1004=0;MessageBox(0,"Voce DESARMAR UMA BOMBA ","MSG INART",MB_OK); break; case 1005:ic1005=10,jc1005=0;MessageBox(0,"Voce DESARMAR UMA BOMBA ","MSG INART",MB_OK); break; case 1006:ic1006=10,jc1006=0;MessageBox(0,"Voce DESARMAR UMA BOMBA ","MSG INART",MB_OK); break; case 1101:ic1101=11,jc1101=0;MessageBox(0,"Voce DESARMAR UMA MINA","MSG INART",MB_OK);break; case 1102:ic1102=11,jc1102=0;MessageBox(0,"Voce DESARMAR UMA MINA","MSG INART",MB_OK);break; case 1103:ic1103=11,jc1103=0;MessageBox(0,"Voce DESARMAR UMA MINA","MSG INART",MB_OK);break; case 1104:ic1104=11,jc1104=0;MessageBox(0,"Voce DESARMAR UMA MINA","MSG INART",MB_OK);break; } 104 mostra01();mostra02(); } if((atacado!=0)&&(atacado!=1)){ if((ident == 0)||(ident == 100)||(ident == 200)||(ident == 500)||(ident == 600)||(ident == 1000)||(ident == 300)|| (ident == 400)||(ident == (ident == 800)||(ident == 700)|| 900)||(ident == 1100)|| (ident == 1200)||(ident == 1300)){ MessageBox(0,"VITÓRIA DO JOGADOR","MSG INART",MB_OK); printf("\n peca do COMP : %d",ident_c); printf("\n peca do jogador : %d",ident); tabpec[lin][col-1] = -1; tabini[lin][col-1] = 'B'; tabini[nlin][ncol-1] = 'J'; tabpec[nlin][ncol-1] = pecapeg; INVERSO_NLin(nlin); nLIN=nlin; COL=ncol; printf("\n linha dentro de vitoria 'nLIN' :%d", nLIN); //it401=ncol,jt401=nLIN; if(ident == 0){it0=0,jt0=0;} if(ident == 100){it01=ncol,jt01=nLIN;} if(ident == 200){it02=ncol,jt02=nLIN;} if(ident == 300){it03=ncol,jt03=nLIN;} if(ident == 400){it04=ncol,jt04=nLIN;} if(ident == 500){it05=ncol,jt05=nLIN;} if(ident == 600){it06=ncol,jt06=nLIN;} if(ident == 700){it07=ncol,jt07=nLIN;} if(ident == 800){it08=ncol,jt08=nLIN;} if(ident == 900){it09=ncol,jt09=nLIN;} if(ident == 1000){it010=ncol,jt010=nLIN;} if(ident == 1100){it011=ncol,jt011=nLIN;} if(ident == 1200){it012=ncol,jt012=nLIN;} if(ident == 1300){it013=ncol,jt013=nLIN;} switch(ident_c){ case 9:ic9=0,jc9=0; MessageBox(0,"Voce INART",MB_OK); break; acaba de derrotar o ESPIAO ","MSG 105 } mostra01();mostra02(); } if((ident == 201)||(ident == 202)||(ident == 203)|| (ident == 204)||(ident == 205)||(ident == 206)){ MessageBox(0,"VITÓRIA DO JOGADOR","MSG INART",MB_OK); printf("\n peca do COMP : %d",ident_c); printf("\n peca do jogador : %d",ident); tabpec[lin][col-1] = -1; tabini[lin][col-1] = 'B'; tabini[nlin][ncol-1] = 'J'; tabpec[nlin][ncol-1] = pecapeg; INVERSO_NLin(nlin); nLIN=nlin; COL=ncol; printf("\n linha dentro de vitoria 'nLIN' :%d", nLIN); //it401=ncol,jt401=nLIN; if(ident == 201){it201=ncol,jt201=nLIN;} if(ident == 202){it202=ncol,jt202=nLIN;} if(ident == 203){it203=ncol,jt203=nLIN;} if(ident == 204){it204=ncol,jt204=nLIN;} if(ident == 205){it205=ncol,jt205=nLIN;} if(ident == 206){it206=ncol,jt206=nLIN;} switch(ident_c){ case 0:ic0=1,jc0=0;MessageBox(0,"Voce acaba de derrotar um SOLDADO ","MSG INART",MB_OK); break; case 100:ic01=1,jc01=0;MessageBox(0,"Voce acaba de derrotar um SOLDADO ","MSG INART",MB_OK); break; case 200:ic02=1,jc02=0;MessageBox(0,"Voce acaba de derrotar um SOLDADO ","MSG INART",MB_OK); break; case 300:ic03=1,jc03=0;MessageBox(0,"Voce acaba de derrotar um SOLDADO ","MSG INART",MB_OK); break; case 400:ic04=1,jc04=0;MessageBox(0,"Voce acaba de derrotar um SOLDADO ","MSG INART",MB_OK); break; case 500:ic05=1,jc05=0;MessageBox(0,"Voce acaba de derrotar um SOLDADO ","MSG INART",MB_OK); break; case 600:ic06=1,jc06=0;MessageBox(0,"Voce acaba de derrotar um SOLDADO ","MSG INART",MB_OK); break; case 700:ic07=1,jc07=0;MessageBox(0,"Voce acaba de derrotar um SOLDADO ","MSG INART",MB_OK); break; 106 case 800:ic08=1,jc08=0;MessageBox(0,"Voce acaba de derrotar um SOLDADO ","MSG INART",MB_OK); break; case 900:ic09=1,jc09=0;MessageBox(0,"Voce acaba de derrotar um SOLDADO ","MSG INART",MB_OK); break; case 1000:ic010=1,jc010=0;MessageBox(0,"Voce acaba de derrotar um SOLDADO ","MSG INART",MB_OK); break; case 1100:ic011=1,jc011=0;MessageBox(0,"Voce acaba de derrotar um SOLDADO ","MSG INART",MB_OK); break; case 1200:ic012=1,jc012=0;MessageBox(0,"Voce acaba de derrotar um SOLDADO ","MSG INART",MB_OK); break; case 1300:ic013=1,jc013=0;MessageBox(0,"Voce acaba de derrotar um SOLDADO ","MSG INART",MB_OK); break; case 9:ic9=9,jc9=0;MessageBox(0,"Voce acaba de derrotar o ESPIAO ","MSG INART",MB_OK); break; case 101:ic101=2,jc101=0;MessageBox(0,"Voce acaba de derrotar um CABO ARMEIRO ","MSG INART",MB_OK); break; case 102:ic102=2,jc102=0;MessageBox(0,"Voce acaba de derrotar um CABO ARMEIRO ","MSG INART",MB_OK); break; case 103:ic103=2,jc103=0;MessageBox(0,"Voce acaba de derrotar um CABO ARMEIRO ","MSG INART",MB_OK); break; case 104:ic104=2,jc104=0;MessageBox(0,"Voce acaba de derrotar um CABO ARMEIRO ","MSG INART",MB_OK); break; case 105:ic105=2,jc105=0;MessageBox(0,"Voce acaba de derrotar um CABO ARMEIRO ","MSG INART",MB_OK); break; case 106:ic106=2,jc106=0;MessageBox(0,"Voce acaba de derrotar um CABO ARMEIRO ","MSG INART",MB_OK); break; case 107:ic107=2,jc107=0;MessageBox(0,"Voce acaba de derrotar um CABO ARMEIRO ","MSG INART",MB_OK); break; } mostra01();mostra02(); } if((ident == 301)||(ident == 302)||(ident == 303)|| (ident == 304)||(ident == 305)||(ident == 306)){ MessageBox(0,"VITÓRIA DO JOGADOR","MSG INART",MB_OK); printf("\n peca do COMP : %d",ident_c); printf("\n peca do jogador : %d",ident); tabpec[lin][col-1] = -1; tabini[lin][col-1] = 'B'; tabini[nlin][ncol-1] = 'J'; tabpec[nlin][ncol-1] = pecapeg; INVERSO_NLin(nlin); 107 nLIN=nlin; COL=ncol; printf("\n linha dentro de vitoria 'nLIN' :%d", nLIN); //it401=ncol,jt401=nLIN; if(ident == 301){it301=ncol,jt301=nLIN;} if(ident == 302){it302=ncol,jt302=nLIN;} if(ident == 303){it303=ncol,jt303=nLIN;} if(ident == 304){it304=ncol,jt304=nLIN;} if(ident == 305){it305=ncol,jt305=nLIN;} if(ident == 306){it306=ncol,jt306=nLIN;} switch(ident_c){ case 0:ic0=1,jc0=0;MessageBox(0,"Voce acaba de derrotar um SOLDADO ","MSG INART",MB_OK); break; case 100:ic01=1,jc01=0;MessageBox(0,"Voce acaba de derrotar um SOLDADO ","MSG INART",MB_OK); break; case 200:ic02=1,jc02=0;MessageBox(0,"Voce acaba de derrotar um SOLDADO ","MSG INART",MB_OK); break; case 300:ic03=1,jc03=0;MessageBox(0,"Voce acaba de derrotar um SOLDADO ","MSG INART",MB_OK); break; case 400:ic04=1,jc04=0;MessageBox(0,"Voce acaba de derrotar um SOLDADO ","MSG INART",MB_OK); break; case 500:ic05=1,jc05=0;MessageBox(0,"Voce acaba de derrotar um SOLDADO ","MSG INART",MB_OK); break; case 600:ic06=1,jc06=0;MessageBox(0,"Voce acaba de derrotar um SOLDADO ","MSG INART",MB_OK); break; case 700:ic07=1,jc07=0;MessageBox(0,"Voce acaba de derrotar um SOLDADO ","MSG INART",MB_OK); break; case 800:ic08=1,jc08=0;MessageBox(0,"Voce acaba de derrotar um SOLDADO ","MSG INART",MB_OK); break; case 900:ic09=1,jc09=0;MessageBox(0,"Voce acaba de derrotar um SOLDADO ","MSG INART",MB_OK); break; case 1000:ic010=1,jc010=0;MessageBox(0,"Voce acaba de derrotar um SOLDADO ","MSG INART",MB_OK); break; case 1100:ic011=1,jc011=0;MessageBox(0,"Voce acaba de derrotar um SOLDADO ","MSG INART",MB_OK); break; case 1200:ic012=1,jc012=0;MessageBox(0,"Voce acaba de derrotar um SOLDADO ","MSG INART",MB_OK); break; case 1300:ic013=1,jc013=0;MessageBox(0,"Voce acaba de derrotar um SOLDADO ","MSG INART",MB_OK); break; 108 case 9:ic9=9,jc9=0;MessageBox(0,"Voce acaba de derrotar o ESPIAO ","MSG INART",MB_OK); break; case 101:ic101=2,jc101=0;MessageBox(0,"Voce acaba de derrotar um CABO ARMEIRO ","MSG INART",MB_OK); break; case 102:ic102=2,jc102=0;MessageBox(0,"Voce acaba de derrotar um CABO ARMEIRO ","MSG INART",MB_OK); break; case 103:ic103=2,jc103=0;MessageBox(0,"Voce acaba de derrotar um CABO ARMEIRO ","MSG INART",MB_OK); break; case 104:ic104=2,jc104=0;MessageBox(0,"Voce acaba de derrotar um CABO ARMEIRO ","MSG INART",MB_OK); break; case 105:ic105=2,jc105=0;MessageBox(0,"Voce acaba de derrotar um CABO ARMEIRO ","MSG INART",MB_OK); break; case 106:ic106=2,jc106=0;MessageBox(0,"Voce acaba de derrotar um CABO ARMEIRO ","MSG INART",MB_OK); break; case 107:ic107=2,jc107=0;MessageBox(0,"Voce acaba de derrotar um CABO ARMEIRO ","MSG INART",MB_OK); break; case 201:ic201=3,jc201=0;MessageBox(0,"Voce acaba de derrotar um SARGENTO ","MSG INART",MB_OK); break; case 202:ic202=3,jc202=0;MessageBox(0,"Voce acaba de derrotar um SARGENTO ","MSG INART",MB_OK); break; case 203:ic203=3,jc203=0;MessageBox(0,"Voce acaba de derrotar um SARGENTO ","MSG INART",MB_OK); break; case 204:ic204=3,jc204=0;MessageBox(0,"Voce acaba de derrotar um SARGENTO ","MSG INART",MB_OK); break; case 205:ic205=3,jc205=0;MessageBox(0,"Voce acaba de derrotar um SARGENTO ","MSG INART",MB_OK); break; case 206:ic206=3,jc206=0;MessageBox(0,"Voce acaba de derrotar um SARGENTO ","MSG INART",MB_OK); break; } mostra01(); mostra02(); } } void MOUSE(int tecla, int estado, int x, int y){ int K =0; switch(tecla){ case GLUT_LEFT_BUTTON: if(estado == GLUT_DOWN){ if(x>=60 && x<=99 && y>=72 && y<=103){ iant=1; jant=15; 109 verif(); } if(x>=100 && x<=139 && y>=72 && y<=103){ iant=2; jant=15; verif(); } if(x>=140 && x<=179 && y>=72 && y<=103){ iant=3; jant=15; verif(); } if(x>=180 && x<=219 && y>=72 && y<=103){ iant=4; jant=15; verif(); } if(x>=220 && x<=259 && y>=72 && y<=103){ iant=5; jant=15; verif(); } if(x>=260 && x<=299 && y>=72 && y<=103){ iant=6; jant=15; verif(); } if(x>=300 && x<=339 && y>=72 && y<=103){ iant=7; jant=15; verif(); } if(x>=340 && x<=379 && y>=72 && y<=103){ iant=8; jant=15; verif(); } if(x>=380 && x<=419 && y>=72 && y<=103){ iant=9; jant=15; verif(); 110 } if(x>=420 && x<=459 && y>=72 && y<=103){ iant=10; jant=15; verif(); } if(x>=460 && x<=499 && y>=72 && y<=103){ iant=11; jant=15; verif(); } if(x>=500 && x<=539 && y>=72 && y<=103){ iant=12; jant=15; verif(); } if(x>=540 && x<=579 && y>=72 && y<=103){ iant=13; jant=15; verif(); } if(x>=580 && x<=619 && y>=72 && y<=103){ iant=14; jant=15; verif(); } if(x>=620 && x<=659 && y>=72 && y<=103){ iant=15; jant=15; verif(); } //********************************************************* if(x>=60 && x<=99 && y>=101 && y<=133){ iant=1; jant=14; verif(); } if(x>=100 && x<=139 && y>=101 && y<=133){ iant=2; jant=14; verif(); 111 } if(x>=140 && x<=179 && y>=101 && y<=133){ iant=3; jant=14; verif(); } if(x>=180 && x<=219 && y>=101 && y<=133){ iant=4; jant=14; verif(); } if(x>=220 && x<=259 && y>=101 && y<=133){ iant=5; jant=14; verif(); } if(x>=260 && x<=299 && y>=101 && y<=133){ iant=6; jant=14; verif(); } if(x>=300 && x<=339 && y>=101 && y<=133){ iant=7; jant=14; verif(); } if(x>=340 && x<=379 && y>=101 && y<=133){ iant=8; jant=14; verif(); } if(x>=380 && x<=419 && y>=101 && y<=133){ iant=9; jant=14; verif(); } if(x>=420 && x<=459 && y>=101 && y<=133){ iant=10; jant=14; verif(); } 112 if(x>=460 && x<=499 && y>=101 && y<=133){ iant=11; jant=14; verif(); } if(x>=500 && x<=539 && y>=101 && y<=133){ iant=12; jant=14; verif(); } if(x>=540 && x<=579 && y>=101 && y<=133){ iant=13; jant=14; verif(); } if(x>=580 && x<=619 && y>=101 && y<=133){ iant=14; jant=14; verif(); } if(x>=620 && x<=659 && y>=101 && y<=133){ iant=15; jant=14; verif(); } //********************************************************* if(x>=60 && x<=99 && y>=131 && y<=163){ iant=1; jant=13; verif(); } if(x>=100 && x<=139 && y>=131 && y<=163){ iant=2; jant=13; verif(); } if(x>=140 && x<=179 && y>=131 && y<=163){ iant=3; jant=13; verif(); } 113 if(x>=180 && x<=219 && y>=131 && y<=163){ iant=4; jant=13; verif(); } if(x>=220 && x<=259 && y>=131 && y<=163){ iant=5; jant=13; verif(); } if(x>=260 && x<=299 && y>=131 && y<=163){ iant=6; jant=13; verif(); } if(x>=300 && x<=339 && y>=131 && y<=163){ iant=7; jant=13; verif(); } if(x>=340 && x<=379 && y>=131 && y<=163){ iant=8; jant=13; verif(); } if(x>=380 && x<=419 && y>=131 && y<=163){ iant=9; jant=13; verif(); } if(x>=420 && x<=459 && y>=131 && y<=163){ iant=10; jant=13; verif(); } if(x>=460 && x<=499 && y>=131 && y<=163){ iant=11; jant=13; verif(); } if(x>=500 && x<=539 && y>=131 && y<=163){ 114 iant=12; jant=13; verif(); } if(x>=540 && x<=579 && y>=131 && y<=163){ iant=13; jant=13; verif(); } if(x>=580 && x<=619 && y>=131 && y<=163){ iant=14; jant=13; verif(); } if(x>=620 && x<=659 && y>=131 && y<=163){ iant=15; jant=13; verif(); } //********************************************************* if(x>=60 && x<=99 && y>=158 && y<=193){ iant=1; jant=12; verif(); } if(x>=100 && x<=139 && y>=158 && y<=193){ iant=2; jant=12; verif(); } if(x>=140 && x<=179 && y>=158 && y<=193){ iant=3; jant=12; verif(); } if(x>=180 && x<=219 && y>=158 && y<=193){ iant=4; jant=12; verif(); } if(x>=220 && x<=259 && y>=158 && y<=193){ 115 iant=5; jant=12; verif(); } if(x>=260 && x<=299 && y>=158 && y<=193){ iant=6; jant=12; verif(); } if(x>=300 && x<=339 && y>=158 && y<=193){ iant=7; jant=12; verif(); } if(x>=340 && x<=379 && y>=158 && y<=193){ iant=8; jant=12; verif(); } if(x>=380 && x<=419 && y>=158 && y<=193){ iant=9; jant=12; verif(); } if(x>=420 && x<=459 && y>=158 && y<=193){ iant=10; jant=12; verif(); } if(x>=460 && x<=499 && y>=158 && y<=193){ iant=11; jant=12; verif(); } if(x>=500 && x<=539 && y>=158 && y<=193){ iant=12; jant=12; verif(); } if(x>=540 && x<=579 && y>=158 && y<=193){ iant=13; 116 jant=12; verif(); } if(x>=580 && x<=619 && y>=158 && y<=193){ iant=14; jant=12; verif(); } if(x>=620 && x<=659 && y>=158 && y<=193){ iant=15; jant=12; verif(); } } int inversor(int T){ int B; B = T; switch(B){ case 0:jj=15;break; case 1:jj=14;break; case 2:jj=13;break; case 3:jj=12;break; case 4:jj=11;break; case 5:jj=10;break; case 6:jj=9;break; case 7:jj=8;break; case 8:jj=7;break; case 9:jj=6;break; case 10:jj=5;break; case 11:jj=4;break; case 12:jj=3;break; case 13:jj=2;break; case 14:jj=1;break; case 15:jj=0;break; return(jj); } }