14 Centro Universitário Positivo - UnicenP Núcleo de Ciências Exatas e Tecnológicas NCET Engenharia da Computação Paula Fernanda Fonseca Jogo de Damas Embarcado Curitiba 2005 2 Centro Universitário Positivo - UnicenP Núcleo de Ciências Exatas e Tecnológicas NCET Engenharia da Computação Paula Fernanda Fonseca Jogo de Damas Embarcado Monografia apresentada à disciplina de Projeto Final, como requisito parcial à conclusão do Curso de Engenharia da Computação. Thomé Curitiba 2005 Orientador: Profª. Adriana 3 4 TERMO DE APROVAÇÃO Paula Fernanda Fonseca Jogo de Damas Embarcado Monografia aprovada como requisito parcial à conclusão do curso de Engenharia da Computação do Centro Universitário Positivo, pela seguinte banca examinatória: Professora Adriana Thomé - Orientadora Professor Roberto Selow - Membro Professor Edson Ferlin - Membro Curitiba, 12 de Dezembro de 2005. iv 5 v 6 AGRADECIMENTOS A meus pais, Norberto José Fonseca e Simone Maciel Fonseca, pela oportunidade que me ofereceram de cursar uma faculdade, pela confiança em mim depositada. Muito obrigada pelo carinho, paciência, compreensão, afinal fiquei estressada algumas vezes. Amo muito vocês. A meu amor, Charles Stein, não apenas pelo incentivo, paciência, dedicação, compreensão, durante esse ano, mas durante toda nossa formação acadêmica. Não foi fácil chegarmos aqui, mas felizmente conseguimos. A minhas irmãs por agüentarem minha bagunça constante em casa para que pudesse produzir meu tabuleiro. Por toda ajuda e incentivo durante esse ano. Agradeço a todos que direta ou indiretamente ajudaram-me a chegar aqui hoje. Muito obrigada por tudo. vi 7 vii 8 SUMÁRIO LISTA DE FIGURAS .................................................................................................................................................. IX LISTA DE TABELAS ................................................................................................................................................... X LISTA DE SIGLAS ..................................................................................................................................................... XI RESUMO .....................................................................................................................................................................XII ABSTRACT .................................................................................................................................................................XII 1.INTRODUÇÃO..........................................................................................................................................................14 1.1. 1.2. 1.3. 1.4. INTRODUÇÃO AO TEMA DO PROJETO............................................................................................................14 MOTIVAÇÃO .................................................................................................................................................14 SITUAÇÃO DO PROJETO NO CONTEXTO GERAL EM QUE ESTÁ INSERIDO .......................................................14 METAS A SEREM ALCANÇADAS ....................................................................................................................15 2.DESCRIÇÃO..............................................................................................................................................................15 3.ESTUDO TEÓRICO .................................................................................................................................................16 3.1. INTELIGÊNCIAS MÚLTIPLAS .........................................................................................................................16 3.1.1. Tipos de inteligências múltiplas.............................................................................................................18 3.2. JOGO DE DAMAS ...........................................................................................................................................20 3.2.1. História do Jogo .....................................................................................................................................20 3.2.2. Opiniões sobre o jogo.............................................................................................................................22 3.2.3. Regras do Jogo de Damas......................................................................................................................23 3.3. ALGORITMO MINIMAX ..............................................................................................................................26 3.3.1. Acrescentando cortes alfa-beta..............................................................................................................32 3.4. MICROCONTROLADOR 8051.........................................................................................................................38 3.5. REED SWITCH ................................................................................................................................................38 3.6. LED ...............................................................................................................................................................39 3.7. DISPLAY LCD ...............................................................................................................................................39 4.ESPECIFICAÇÃO DO HARDWARE....................................................................................................................41 4.1. 4.2. FUNÇÕES DO HARDWARE.............................................................................................................................41 COMPONENTES UTILIZADOS ........................................................................................................................42 5.ESPECIFICAÇÃO DO SOFTWARE .....................................................................................................................44 5.1. 5.2. 5.3. 5.4. 5.5. 5.6. AMBIENTE E LINGUAGEM DE DESENVOLVIMENTO ......................................................................................44 INTERFACE COM O USUÁRIO .........................................................................................................................44 DIAGRAMA DE CONTEXTO ...........................................................................................................................44 DIAGRAMA DE FLUXO DE DADOS (DFD) ....................................................................................................44 DIAGRAMA DE ESTADOS ..............................................................................................................................44 FLUXOGRAMA ..............................................................................................................................................47 6.ESPECIFICAÇÃO DA VALIDAÇÃO DO PROJETO ........................................................................................49 7.RESULTADOS ..........................................................................................................................................................49 7.1. 7.2. SOFTWARE .....................................................................................................................................................49 HARDWARE ....................................................................................................................................................54 8.CONCLUSÃO ............................................................................................................................................................56 9.REFERÊNCIAS BIBLIOGRÁFICAS ....................................................................................................................57 ANEXO 1 .......................................................................................................................................................................59 ANEXO 2 .......................................................................................................................................................................60 ANEXO 3 .......................................................................................................................................................................61 ANEXO 4 .......................................................................................................................................................................62 ANEXO 5 .......................................................................................................................................................................63 ANEXO 6 .......................................................................................................................................................................64 viii 9 LISTA DE FIGURAS FIGURA 2.1 MÓDULOS DO HARDWARE ..........................................................................................................16 FIGURA 3.1 POSIÇÃO INICIAL DAS PEÇAS....................................................................................................23 FIGURA 3.2 - TOMADA .............................................................................................................................................25 FIGURA 3.3 (A) - TOMADA FIGURA 3.4 FIGURA 3.3 (B) - TOMADA .......................................25 NOTAÇÃO DAS CASAS DO TABULEIRO ..................................................................................26 FIGURA 3.5 ...................................................................................................................................................................27 FONTE: RICH (1994) ..................................................................................................................................................27 FIGURA 3.6 BUSCA DE DUAS JOGADAS ..........................................................................................................28 FONTE: RICH (1994) ..................................................................................................................................................28 FIGURA 3.7 RETORNANDO OS VALORES DE UMA BUSCA EM DUAS JOGADAS ...............................28 FONTE: RICH (1994) ..................................................................................................................................................28 FIGURA 3.8 UM CORTE ALFA.............................................................................................................................33 FONTE: RICH (1994) ..................................................................................................................................................33 FIGURA 3.9 CORTES ALFA E BETA ..................................................................................................................34 FONTE: RICH (1994) ..................................................................................................................................................34 FIGURA 3.10 REED SWITCH .................................................................................................................................39 FIGURA 3.11 LED.....................................................................................................................................................39 FIGURA 3.12 DISPLAY LCD...................................................................................................................................40 FIGURA 4.1 CASA E PEÇA DO TABULEIRO ...................................................................................................42 FIGURA 5.1 TABULEIRO ......................................................................................................................................45 FIGURA 5.2 DIAGRAMA DE CONTEXTO.........................................................................................................45 FIGURA 5.3 DIAGRAMA DE FLUXO DE DADOS............................................................................................46 FIGURA 5.4 DIAGRAMA DE ESTADOS .............................................................................................................47 FIGURA 5.5 - FLUXOGRAMA..................................................................................................................................48 FIGURA 7.1 CRIANÇA REALIZANDO UMA JOGADA ..................................................................................53 FIGURA 7.2 JOGADA DO COMPUTADOR.........................................................................................................53 FIGURA 7.3 PLACA DE CIRCUITO DO TABULEIRO....................................................................................54 FIGURA 7.4 PLACA DE CIRCUITO DE PROCESSAMENTO........................................................................55 FIGURA 7.5 TABULEIRO ......................................................................................................................................55 FIGURA 7.6 TABULEIRO ......................................................................................................................................56 ix 10 LISTA DE TABELAS TABELA 1 MÓDULOS LCD DISPONÍVEIS .......................................................................................................40 TABELA 2 PINAGEM DOS MÓDULOS LCD.....................................................................................................41 TABELA 3 COMPONENTES UTILIZADOS.......................................................................................................42 TABELA 4 CUSTO DO PROJETO........................................................................................................................43 x 11 LISTA DE SIGLAS uc Microcontrolador QI Coeficiente de Inteligência xi 12 RESUMO Este trabalho tem como objetivo o desenvolvimento de um tabuleiro de jogo de damas. O software é baseado no algoritmo Minimax e utiliza uma função de heurística posicional. O tabuleiro é composto por 64 casas, 24 peças, 12 brancas e 12 pretas, e um display LCD. Todo o processamento do sistema é realizado no próprio tabuleiro, através do microcontrolador da Philips. xii 13 ABSTRACT This work has as objective the development of a checkers. The software is based on the Minimax algorithm, using the position heuristic function. The board is composed by 64 squares, 24 pieces, 12 whites and 12 black, and a display LCD. All the system processing is carried out in the tray, through the Philips microcontroller. xiii 14 1. INTRODUÇÃO 1.1. Introdução ao tema do Projeto O êxito de um bom desempenho escolar é resultado do aprimoramento de algumas funções cerebrais importantes como: atenção, memória, percepção, raciocínio, concentração. Isso pode ser conseguido por intermédio de metodologias adequadas como, por exemplo: os jogos lúdicos, projetos de trabalho e a *caixa de trabalho. Essas técnicas têm como objetivo estimular a criança a desenvolver, diante de situações problemas, sua capacidades e habilidades intelectuais, sua criatividade e iniciativa em busca de soluções. No entanto, sabemos que esse processo torna-se viável quando apresentado de forma prazerosa, principalmente lúdica para essa criança. 1.2. Motivação A realização deste projeto originou-se da análise dessa realidade escolar. E, dentro desse contexto pensou-se o desenvolvimento de um sistema computacional, a criação de um jogo de damas, para auxiliar no aperfeiçoamento dessas estruturas cerebrais, mais especificamente: concentração, percepção e raciocínio. 1.3. Situação do projeto no contexto geral em que está inserido A inserção do jogo de damas, no âmbito educacional possibilita o desenvolvimento de dois tipos de inteligência: a espacial e lógico matemática, destacando habilidades latentes e inerentes da criança. Sendo assim, é apropriado o seu uso nessa área de atuação, pois ressalta de forma lúdica seu interesse. Caixa de Trabalho - Visca idealizou a caixa de trabalho para se trabalhar com as dificuldades de aprendizagem e, para isso, inspirou-se na caixa individual utilizada pelos terapeutas analista na Psicanálise de crianças. Ela seria composta de brinquedos e materiais escolhidos para representarem o mundo interno das crianças, suas fantasias inconscientes frente ao mundo (BARBOSA, 2000, p. 35). 15 1.4. Metas a serem alcançadas Desenvolvimento de um tabuleiro de jogo de damas com 64 casas e 24 peças, 12 brancas e 12 pretas. Cada casa preta deve conter um reed switch e um led. Cada peça, tanto as brancas como as pretas, devem ter embutidas em sua base um imã, este será o responsável pela ativação dos reed switch. Em um display aparecem as jogadas que o computador deseja que a criança realize para ele e é mostra também quando uma jogada foi realizada de forma errada. 2. DESCRIÇÃO O sistema computacional em questão é composto por um tabuleiro com 64 casas e 24 peças, sendo 12 peças brancas e 12 peças pretas. O processamento é realizado no tabuleiro através de um microcontrolador. O hardware é composto por 3 módulos, como ilustra a figura 2.1: Módulo de Entrada (Jogador 1) - onde o usuário movimenta as peças. A movimentação de uma peça faz com que os reed switches mudem de estado, permitindo saber qual delas foi movida; Módulo de Processamento Recebendo a saída proveniente do módulo de entrada, o microcontrolador (uC P89C51) processa os dados e executa o algoritmo MINIMAX gerando a saída para o próximo módulo; Módulo de Saída (Jogador 2) representa a jogada do computador. A casa da qual o computador deseja mover a peça fica piscando e a casa para onde a peça será movida também piscará até que o jogador realize esta jogada para ele. 16 Figura 2.1 Módulos do Hardware 3. ESTUDO TEÓRICO 3.1. Inteligências Múltiplas A Teoria das Inteligências Múltiplas, de Howard Gardner (1985) é uma alternativa para o conceito de inteligência como uma capacidade inata, geral e única, que permite aos indivíduos um desempenho, maior ou menor, em qualquer área de atuação. Sua insatisfação com a idéia de QI e com visões unitárias de inteligência, que focalizam, sobretudo, as habilidades importantes para o sucesso escolar, levou Gardner a redefinir inteligência à luz das origens biológicas da habilidade para resolver problemas. Através da avaliação das atuações de diferentes profissionais em diversas culturas, e do repertório de habilidades dos seres humanos na busca de soluções, culturalmente apropriadas, para os seus problemas, Gardner trabalhou no sentido inverso ao desenvolvimento, retroagindo para eventualmente chegar às inteligências que deram origem a tais realizações. Na sua pesquisa, Gardner estudou também: (a) o desenvolvimento de diferentes habilidades em crianças normais e crianças superdotadas; (b) adultos com lesões cerebrais e como estes não perdem a intensidade de sua produção intelectual, mas sim uma ou algumas habilidades, sem que outras habilidades sejam sequer atingidas; "Idiot savants" são idiotas incapazes de pensar racionalmente que, entretanto, têm memórias prodigiosas que guardam tudo, completamente divorciadas da sua inteligência. 17 (c) populações ditas excepcionais, tais como *idiot-savants e autistas, e como os primeiros podem dispor de apenas uma competência, sendo bastante incapazes nas demais funções cerebrais, enquanto as crianças autistas apresentam ausências nas suas habilidades intelectuais; (d) como realizou o desenvolvimento cognitivo através dos milênios. Psicólogo construtivista muito influenciado por Jean Piaget, Gardner distingue-se dele na medida em que Piaget acreditava que todos os aspectos da simbolização partem de uma mesma função semiótica, enquanto que ele acredita que processos psicológicos independentes são empregados quando o indivíduo lida com símbolos lingüísticos, numéricos gestuais ou outros. Segundo Gardner uma criança pode ter um desempenho precoce em uma área (o que Piaget chamaria de pensamento formal) e estar na média ou mesmo abaixo da média em outra (o equivalente, por exemplo, ao estágio sensório-motor). Gardner descreve o desenvolvimento cognitivo como uma capacidade cada vez maior de entender e expressar significado em vários sistemas simbólicos utilizados num contexto cultural, e sugere que não há uma ligação necessária entre a capacidade ou estágio de desenvolvimento em uma área de desempenho e capacidades ou estágios em outras áreas ou domínios. Num plano de análise psicológico, afirma Gardner (1982), cada área ou domínio tem seu sistema simbólico próprio; num plano sociológico de estudo, cada domínio se caracteriza pelo desenvolvimento de competências valorizadas em culturas específicas. Gardner sugere, ainda, que as habilidades humanas não são organizadas de forma horizontal; ele propõe que se pense nessas habilidades como organizadas verticalmente, e que, ao invés de haver uma faculdade mental geral, como a memória, talvez existam formas independentes de percepção, memória e aprendizado, em cada área ou domínio, com possíveis semelhanças entre necessariamente com uma relação direta. (GAMA, 1998) as áreas, mas não 18 3.1.1. Tipos de inteligências múltiplas Gardner identificou as inteligências lingüística, lógico-matemática, espacial, musical, cinestésica, interpessoal e intrapessoal. Postula que essas competências intelectuais são relativamente independentes, têm sua origem e limites genéticos próprios e substratos neuroanatômicos específicos e dispõem de processos cognitivos próprios. Segundo ele, os seres humanos dispõem de graus variados de cada uma das inteligências e maneiras diferentes com que elas se combinam e organizam e se utilizam dessas capacidades intelectuais para resolver problemas e criar produtos. Gardner ressalta que, embora estas inteligências sejam, até certo ponto, independentes uma das outras, elas raramente funcionam isoladamente. Embora algumas ocupações exemplifiquem uma inteligência, na maioria dos casos as ocupações ilustram bem a necessidade de uma combinação de inteligências. Por exemplo, um cirurgião necessita da acuidade da inteligência espacial combinada com a destreza da cinestésica. A seguir, os tipos de inteligências são detalhados (GAMA, 1998): Inteligência lingüística - Os componentes centrais da inteligência lingüística são uma sensibilidade para os sons, ritmos e significados das palavras, além de uma especial percepção das diferentes funções da linguagem. É a habilidade para usar a linguagem para convencer, agradar, estimular ou transmitir idéias. Gardner indica que é a habilidade exibida na sua maior intensidade pelos poetas. Em crianças, esta habilidade se manifesta através da capacidade para contar histórias originais ou para relatar, com precisão, experiências vividas. Inteligência musical - Esta inteligência se manifesta através de uma habilidade para apreciar, compor ou reproduzir uma peça musical. Inclui discriminação de sons, habilidade para perceber temas musicais, sensibilidade para ritmos, texturas e timbre, e habilidade para produzir e/ou reproduzir música. A criança pequena com habilidade musical especial percebe desde cedo diferentes sons no seu ambiente e, freqüentemente, canta para si mesma. Inteligência lógico-matemática - Os componentes centrais desta inteligência são descritos por Gardner como uma sensibilidade para padrões, ordem e sistematização. É a habilidade para explorar relações, categorias e padrões, através da 19 manipulação de objetos ou símbolos, e para experimentar de forma controlada; é a habilidade para lidar com séries de raciocínios, para reconhecer problemas e resolvêlos. É a inteligência característica de matemáticos e cientistas Gardner, porém, explica que, embora o talento cientifico e o talento matemático possam estar presentes num mesmo indivíduo, os motivos que movem as ações dos cientistas e dos matemáticos não são os mesmos. Enquanto os matemáticos desejam criar um mundo abstrato consistente, os cientistas pretendem explicar a natureza. A criança com especial aptidão nesta inteligência demonstra facilidade para contar e fazer cálculos matemáticos e para criar notações práticas de seu raciocínio. Inteligência espacial - Gardner descreve a inteligência espacial como a capacidade para perceber o mundo visual e espacial de forma precisa. É a habilidade para manipular formas ou objetos mentalmente e, a partir das percepções iniciais, criar tensão, equilíbrio e composição, numa representação visual ou espacial. É a inteligência dos artistas plásticos, dos engenheiros e dos arquitetos. Em crianças pequenas, o potencial especial nessa inteligência é percebido através da habilidade para quebra-cabeças e outros jogos espaciais e a atenção a detalhes visuais. Inteligência cinestésica - Esta inteligência se refere à habilidade para resolver problemas ou criar produtos através do uso de parte ou de todo o corpo. É a habilidade para usar a coordenação grossa ou fina em esportes, artes cênicas ou plásticas no controle dos movimentos do corpo e na manipulação de objetos com destreza. A criança especialmente dotada na inteligência cinestésica se move com graça e expressão a partir de estímulos musicais ou verbais demonstra uma grande habilidade atlética ou uma coordenação fina apurada. Inteligência interpessoal - Esta inteligência pode ser descrita como uma habilidade pare entender e responder adequadamente a humores, temperamentos motivações e desejos de outras pessoas. Ela é melhor apreciada na observação de psicoterapeutas, professores, políticos e vendedores bem sucedidos. Na sua forma mais primitiva, a inteligência interpessoal se manifesta em crianças pequenas como a habilidade para distinguir pessoas, e na sua forma mais avançada, como a habilidade para perceber intenções e desejos de outras pessoas e para reagir apropriadamente a partir dessa percepção. Crianças especialmente dotadas demonstram muito cedo uma 20 habilidade para liderar outras crianças, uma vez que são extremamente sensíveis às necessidades e sentimentos de outros. Inteligência intrapessoal - Esta inteligência é o correlativo interno da inteligência interpessoal, isto é, a habilidade para ter acesso aos próprios sentimentos, sonhos e idéias, para discriminá-los e lançar mão deles na solução de problemas pessoais. É o reconhecimento de habilidades, necessidades, desejos e inteligências próprias, a capacidade para formular uma imagem precisa de si próprio e a habilidade para usar essa imagem para funcionar de forma efetiva. Como esta inteligência é a mais pessoal de todas, ela só é observável através dos sistemas simbólicos das outras inteligências, ou seja, através de manifestações lingüísticas, musicais ou cinestésicas. 3.2. Jogo de Damas 3.2.1. História do Jogo A origem do Jogo de Damas perde-se na bruma dos tempos. Sabe-se que é conhecido, desde os tempos imemoriais, no Extremo Oriente. Nas escavações feitas no Vale do Rio Nilo, foram encontradas incrustações com desenhos do tabuleiro e algumas pedras soltas, pelo que se pode afirmar que ele era jogado no antigo Egito. Assegura-se que o Jogo de Damas era conhecido no Egito desde a época de Osortasen I, pois que nas paredes do palácio de Ramsés Meiamoun, Medineth-Habou, existe um desenho que representa este Faraó jogando as Damas com uma de suas mulheres. Também, nos mausoléus de Saggarah, no Egito, se vêem tabuleiros de Damas. Dois destes, que são da época dos Faraós, existem no Museu do Louvre, em Paris. No British Museum, de Londres, conserva-se uma antiga caricatura, que representa um leão e uma cabra, jogando as Damas. 21 Os gregos referindo-se aos tempos fabulosos, e apoiados em alguns dados de Platão, ou talvez em sua exagerada fantasia, afirmavam que Mercúrio foi o inventor do Jogo de Damas. Homero, na Odisséia, apresenta dois pretendentes de Penélope jogando à porta do palácio de Ulisses, o Pessoi (vocábulo grego que significa: jogo de cálculo), que é parecido com o Jogo de Damas. Posteriormente, jogou-se na Grécia o DIAGRISMA. Mais tarde aparece em Roma o LUDUS LATRUNCULORUM, modificação do DIAGRISMA dos gregos, pois no jogo romano já se moviam as pedras, e, quando uma delas chegava a 1ª fila do adversário, convertia-se em rainha ou pedra coroada (como no jogo moderno), podendo se mover em todas as direções. Supõe-se, portanto, que o Jogo de Damas clássicas é o mais antigo de todos que atualmente se praticam no mundo, descendendo do LUDUS LATRUNCULORUM, dos romanos. Durante a Idade Média, o Jogo de Damas gozou de uma popularidade imensa em quase toda a Europa. Quanto ao nome pelo qual é conhecido atualmente, supõe-se que foi por muitos séculos o passatempo predileto das Damas da nobreza, que o tinham por seu jogo favorito, chegando este a familiarizar-se tanto com o belo sexo, que adquiriu o título de Jogo de Damas. A história bibliográfica do Jogo de Damas principia na Espanha, com o livro de Antom Torquemana, intitulado: EL INGÉNIO Ó JUEGO DE MARRO DE PUNTA Ó DAMAS Valência, 1547. Por esta razão os historiógrafos consideram este jogo como auxiliar indispensável para a reconstrução e interpretação do jogo romano LUDUS LATRUNCULORUM. (LANDIM) 22 3.2.2. Opiniões sobre o jogo Existem inúmeras opiniões de escritores, professores, psicólogos, etc., a respeito do Jogo de Damas. A seguir são apresentadas algumas delas: A Baliza (Artigo publicado na BALIZA, Jornal Desportivo, Lisboa, 1946): "É considerado, geralmente, o Jogo de Damas um desporto para distrair o espírito dos aborrecimentos da vida. Alguns também o cultivam por gosto e para desenvolvimento da mentalidade no exercício do cálculo. É uma maneira de ocupar o tempo e o espírito, desviando-o doutras distrações, às vezes nocivas e sempre, mais ou menos dispendiosas, sobretudo nos inertes e calamitosos tempos que vivemos". Professor Doutor Carlos Sirtori (Médico e Director do Instituto Gaslini, Génova, e Presidente da Fundação Carlos Erba, de Milão - ITÁLIA): "As crianças devem jogar às Damas. Está demonstrado cientificamente que aos 5 ou 6 anos qualquer criança, normalmente desenvolvida, está apta a conhecer as Regas do Jogo de Damas. Este Jogo permite-lhe desenvolver plenamente a sua personalidade e dá, além disso, aos seus Pais a possibilidade de julgar a inteligência e o caráter dos seus filhos. É um jogo que ela aceita e depois deseja, porque lhe dá, também, o sentido das primeiras competições mentais, das primeiras vitórias, dos primeiros contactos com o velho tema de ganhar qualquer coisa aos outros, e de vencer, de se tornar forte, autoritário. Em suma, um JOGO cheio de gratificações, porque antigo, mais antigo que o xadrez, jogado até pelos faraós e conhecido de Homero e Platão. Por conseguinte, temos um meio simples e seguro para analisar as nossas crianças, uma espécie de teste global que as mães poderão aplicar largamente durante as férias". Professor Doutor Marlon Tinsley (Professor catedrático de Matemática na Universidade da Florida - Estados Unidos - e Campeão Americano do Jogo de Damas): "As Regras do Jogo de Damas são tão simples que uma mente inculta julga, naturalmente, que o Jogo de Damas é também muito simples. Mas é como na Matemática: sistemas numéricos com as regras muito simples tornam-se nos mais complexos cálculos. É por isso que quem não conheça o Jogo de Damas o considere como um jogo de crianças e de velhos; mas a esses o professor de matemática sorri e diz-lhes que muitas vezes uma grande parte da complexidade está escondida nas coisas que à primeira vista parecem ser tranqüilas, modestas e simples". 23 Professor Richard Schmidt (Professor de Matemática e Director da Dublin School - Escócia): "Para estimular e aguçar a inteligência nada há melhor que um bom problema de Damas; é, por esse motivo, que obrigo os alunos do curso Secundário a resolver diariamente problemas do Jogo de Damas". 3.2.3. Regras do Jogo de Damas 3.2.3.1. Definições e objetivo a) O Jogo de Damas se pratica entre dois parceiros, em tabuleiro quadrado, de 64 casas alternadamente claras e escuras, dispondo de 12 pedras brancas e 12 pretas. b) O objetivo é capturar ou imobilizar as peças do adversário. O parceiro que o conseguir ganha a partida. 3.2.3.2. Do tabuleiro de damas O tabuleiro deve ser colocado de modo que a casa angular à esquerda de cada parceiro seja escura. 3.2.3.3. Da posição das pedras No início da partida, as pedras devem ser colocadas no tabuleiro sobre as casas escuras, da seguinte forma: nas três primeiras filas horizontais, as pedras brancas; e, nas três últimas, as pedras pretas, como mostra a figura 3.1. Figura 3.1 Posição Inicial das Peças 24 3.2.3.4. Da marcha da pedra a) A pedra movimenta-se em diagonal, sobre as casas escuras, para frente, e uma casa de cada vez. b) A pedra que atingir a oitava casa adversária, parando ali, será promovida a "dama", peça de movimento mais amplos que a simples pedra. Assinala-se a dama sobrepondo-se, à pedra promovida, outra da mesma cor. 3.2.3.5. Da marcha da dama A dama pode mover-se de determinada casa para qualquer outra, não obstruída, situada na mesma diagonal. A diagonal está obstruída, para a dama, quando nela houver uma ou mais peças da mesma cor, ou duas ou mais peças adversárias em casas contíguas. 3.2.3.6. Da tomada a) Quando na casa contígua a uma pedra houver uma peça adversária, com uma casa imediata vaga, na mesma diagonal, a pedra toma-la-á passando para a citada casa vaga. Assim, a pedra toma para frente e para trás, sendo este o único movimento retrógrado da pedra. Se, após a tomada de uma pedra, a circunstância se repetir, a pedra continuará a tomada no mesmo lance, chamando-se a este movimento "tomada em cadeia". Como ilustrado na figura 3.2. b) Se, as diagonais da casa de partida da dama, houver uma peça adversária cuja casa imediata esteja vaga, a dama toma-la-á passando para qualquer casa vaga após a peça tomada. A dama também toma em cadeia. c) A tomada é obrigatória. A pedra e a dama têm o mesmo valor para tomar ou ser tomada. Se, no mesmo lance houver mais de um modo para tomar, é obrigatório executar o lance que tome o maior número de peças (Lei da maioria), como mostram as figuras 3.3(a) e 3.3(b). 25 Figura 3.2 - Tomada Figura 3.3 (a) - Tomada 3.2.3.7. Figura 3.3 (b) - Tomada Da saída As brancas têm sempre a saída, isto é, o primeiro lance da partida. Determina-se por sorteio ou convenção, para a primeira partida; nas seguintes, as brancas cabem alternadamente aos dois parceiros. 3.2.3.8. Da execução dos lances a) O lance é executado quando se leva diretamente à nova casa a peça tocada; a peça deve ser imediatamente solta. b) O lance está completo quando a mão do jogador tiver largado a peça, ao movê-la de uma casa para outra. 26 3.2.3.9. Da notação a) As oito colunas verticais, da esquerda para a direita, para as brancas, são designadas pelas letras: a, b, c, d, e, f, g, h. Ver figura 3.4. Figura 3.4 Notação das Casas do tabuleiro b) As oito travessas horizontais são numeradas de 1 a 8, a contar da base das brancas. c) O lance será indicado pela casa de saída da peça e a casa de chegada. 3.3. Algoritmo MINIMAX O procedimento de busca minimax é um procedimento de busca de profundidade, de profundidade limitada. A idéia é iniciar na posição corrente e usar o gerador de movimentos plausíveis para gerar o conjunto de possíveis posições sucessoras. Agora pode-se aplicar a função de avaliação estática a essas posições e simplesmente escolher a melhor. Depois disso, pode-se retornar esse valor à posição inicial para representar a avaliação que foi feita dela. A posição inicial é tão boa para o jogador 1 quanto a posição gerada pelo melhor movimento que se pode executar a seguir. Aqui assumi-se que a função de avaliação estática retorna valores altos para indicar situações boas para o jogador 1, portanto a meta é maximizar o valor da função de avaliação estática na próxima posição do tabuleiro. Um exemplo dessa operação é mostrado na figura 3.5 . Ela assume uma função de avaliação estática que retorna valores que variam de 10 a 10, sendo que 10 indica vitória para jogador 1, -10, uma vitória do oponente, e 0, um empate. Como o objetivo é 27 maximizar o valor da função heurística, escolhe-se mover para B. Retornando o valor de B para A, concluí-se que o valor de A é 8, sabe-se que pode-se mover para uma posição cujo valor seja 8. A B C D (8) (3) (-2) Figura 3.5 Fonte: RICH (1994) Mas, como também sabe-se que a função de avaliação estática não é totalmente precisa, gostaria-se de levar a busca para além de uma jogada. Isso pode ser muito importante, por exemplo, em um jogo de xadrez, durante uma troca de peças. Depois do movimento do jogador 1, a situação pode parecer muito boa, mas, analisando um movimento à frente, vê-se que uma das peças também será capturada e, portanto, a situação não é tão favorável quanto parecia. Então é útil olhar-se à frente para ver o que acontecerá com cada uma das novas posições no próximo movimento a ser feito pelo oponente. Em vez de aplicar a função de avaliação estática a cada uma das posições que acabou-se de gerar, aplica-se o gerador de movimentos plausíveis, gerando um conjunto de posições sucessoras para cada posição do tabuleiro. Se parasse aqui, depois de ter analisado duas jogadas à frente, poderia-se aplicar a função de avaliação estática a cada uma dessas posições, conforme mostra a figura 3.6. Agora é necessário levar em conta que o oponente escolherá quais movimentos sucessores serão feitos e, assim, qual valor terminal deverá ser retornado ao nível seguinte. Suponha que tenha-se feito o movimento B. Então o oponente terá de escolher entre os movimentos E, F e G. O objetivo do oponente é minimizar o valor da função de avaliação, então podemos esperar que ele escolha o movimento F. Isto significa que, se for feito o movimento B, a posição real em que o jogador 1 estará um movimento mais tarde será ruim. Isto se aplica apesar da possível configuração representada pelo nó E, que é boa para o jogador 1. Mas, como esse nível não é sua 28 vez de jogar, ele não poderá escolher aquele movimento. A figura 3.7 mostra o resultado da propagação dos novos valores da árvore acima. No nível que representa a escolha do oponente, o valor mínimo foi escolhido e retornado. No nível que representa a escolha do jogador 1, o valor máximo foi escolhido. A B C D E F G H I J K (9) (-6) (0) (0) (-2) (-4) (-3) Figura 3.6 Busca de duas jogadas Fonte: RICH (1994) A B Jogada de maximização C Jogada de minimização D E F G H I J K (9) (-6) (0) (0) (-2) (-4) (-3) Figura 3.7 Retornando os valores de uma busca em duas jogadas Fonte: RICH (1994) Uma vez retornados os valores da segunda jogada, fica claro que o movimento correto para o jogador 1 nesse primeiro nível, dadas as informações que tem-se disponíveis, é C, já que não há nada que o oponente possa fazer para produzir um valor pior que 2. Esse processo pode ser repetido para quantas jogadas o tempo permitir, e as avaliações mais precisas podem ser usadas para escolher o movimento correto no primeiro nível. O revezamento entre maximização e minimização em jogadas 29 alternadas quando as avaliações estão sendo devolvidas corresponde às estratégias opostas de dois jogadores, e dá a esse método o nome de minimax. Depois de descrever informalmente a operação do procedimento minimax, ele será agora descrito com precisão. Ele é um procedimento recursivo direto, que toma por base dois procedimentos auxiliares, específicos do jogo que está sendo jogado: 1. GERMOV (Posição, Jogador) O gerador de movimentos plausíveis, o qual retorna uma lista de nós que representam os movimentos que podem ser feitos por Jogador em Posição. Chamamos os dois jogadores de JOGADOR-UM e JOGADOR-DOIS; em um programa de xadrez, podemos usar nomes BRANCAS e PRETAS. 2. ESTÁTICA (Posição, Jogador) A função de avaliação estática, que retorna um número que representa a qualidade de Posição do ponto de vista de jogador. Como em qualquer programa recursivo, um problema crítico com relação ao projeto de procedimento MINIMAX é quando parar a recursão e simplesmente chamar a função de avaliação estática. Há vários fatores que podem influenciar essa decisão. Eles incluem: Um lado ganhou? Quantas jogadas já explorarmos? Quão promissor é esse caminho? Quanto tempo ainda temos? Qual o grau de estabilidade dessa configuração? No procedimento MINIMAX genérico discutido aqui, apela-se a uma função, PROFUNDO-O-SUFICIENTE, que assume avaliar todos esses fatores e retornar VERDADEIRO se a busca tiver de ser interrompida no nível corrente, ou FALSO, nos casos contrários. A simples implementação que será dada à função PROFUNDO-OSUFICIENTE assumirá dois parâmetros: Posição e Profundidade. Ela ignorará o parâmetro Posição e simplesmente retornará VERDADEIRO caso o parâmetro Profundidade exceder o valor da constante de interrupção. 30 Um problema que surge na definição de MINIMAX como procedimento recursivo é que ele precisa retornar não um, mais dois resultados: O valor do caminho escolhido. O caminho em si. Retorna-se o caminho inteiro, embora provavelmente apenas o primeiro elemento, que representa o melhor movimento a partir da posição atual, seja realmente necessário. Assume-se que MINIMAX retorna uma estrutura que contém ambos os resultados e que temos duas funções, VALOR e CAMINHO, que extraem os componentes separados. Já que definiu-se o procedimento MINIMAX como função recursiva, precisa-se também especificar como ele deverá ser chamado inicialmente. O movimento precisa de três parâmetros, uma posição de tabuleiro, a atual profundidade da busca e o jogador. Portanto, a chamada inicial para computar o melhor movimento a partir da posição CORRENTE deverá ser MINIMAX (CORRENTE, 0, JOGADOR-UM) caso seja a vez do JOGADOR-UM, ou MINIMAX (CORRENTE, 0, JOGADOR-DOIS) caso seja a vez do JOGADOR-DOIS. Algoritmo: MINIMAX (Posição, Profundidade, Jogador) 1. Se PROFUNDO-O-SUFICIENTE (Posição, Profundidade), então retorne a estrutura VALOR = ESTÁTICA (Posição, Jogador) CAMINHO = nil Isto indica que não há nenhum caminho saindo desse nó e que seu valor é aquele determinado pela função de avaliação estática. 2. Caso contrário, gere mais uma camada da árvore chamando a função GERMOV (Posição, Jogador) e atribuindo a SUCESSORES a lista que ela retorna. 31 3. Se SUCESSORES estiver vazio, então não há nenhum movimento a fazer. Retorne a mesma estrutura que terá sido retornada se PROFUNDO-O-SUFICIENTE retornasse VERDADEIRO. 4. Se SUCESSORES não estiver vazio, então examine cada elemento e mantenha registro do melhor. Isto é feito assim: Inicialize MELHOR-CONTAGEM com o valor mínimo que ESTÁTICA consiga retornar. Ele será utilizado para refletir o melhor placar que pode ser atingido por qualquer elemento de SUCESSORES. Para cada elemento SUC de SUCESSORES, faça o seguinte: (a) Atribua a RESULTADO-SUC MINIMAX (SUC, Profundidade + 1, OPOSTO (Jogador))3 Esta chamada recursiva na verdade executará a exploração de SUC. (b) Atribua a NOVO-VALOR VALOR (RESULTADO-SUC). Isto reflitirá os méritos da posição do ponto de vista oposto ao do próximo nível mais baixo. (c) Se NOVO-VALOR > MELHOR-CONTAGEM, então encontramos um sucessor melhor que qualquer outro já tenha sido examinado até o momento. Registre este fato: I. Atribua a MELHOR-PLACAR NOVO-VALOR. II. O melhor caminho conhecido agora é de CORRENTE para SUC e depois para o caminho apropriado abaixo de SUC, conforme determinado pela MINIMAX. Portanto, atribua chamada recursiva MELHOR-CAMINHO de o resultado da inclusão de SUC à frente de CAMINHO (RESULTADO-SUC). 32 5. Agora que todos os sucessores foram examinados, sabemos o valor de Posição e também do caminho que deve ser seguido para chegar a esse parâmetro. Então retorne a estrutura VALOR = MELHOR-CONTAGEM CAMINHO = MELHOR-CAMINHO Quando a primeira chamada de MINIMAX retorna, o melhor movimento de CORRENTE é o primeiro elemento de CAMINHO. Para ver como esse procedimento funciona, você deve acompanhar uma execução na árvore de jogo mostrada na figura 3.6. O procedimento MINIMAX que foi descrito é muito simples. Porém seu desempenho pode ser significativamente melhorado com certos refinamentos, como ilustrado no item a seguir. 3.3.1. Acrescentando cortes alfa-beta O procedimento minimax é um processo em profundidade. Um caminho é explorado durante o tempo permitido, a função de avaliação estática é aplicada às posições do jogo na última etapa do caminho, e o valor pode então ser passado caminho acima, um nível de cada vez. Uma das boas coisas dos procedimentos em profundidade é que é sempre possível melhorar sua eficiência usando técnicas ramificar-e-podar, em que soluções parciais claramente piores do que soluções conhecidas podem ser logo abandonadas. Essa estratégia é chamada de poda alfabeta. Ela requer a manutenção de dois valores-limite, um representando um limite inferior para o valor que pode, em última análise, ser atribuído a um nó de maximização (este valor é chamado alfa) e outro representando um limite superior para outro valor que pode ser atribuído a um nó de minimização (este valor é chamado de beta). Para ver como funciona o procedimento alfa-beta, considere o exemplo mostrado na figura 3.8. Depois de examinar o nó F, sabe-se que o oponente tem garantida uma contagem de 5 ou menos em C (já que o oponente é o jogador de minimização). Mas sabe-se também que tem-se garantida uma contagem de 3 ou mais no nó A, que pode-se atingir movendo-se para B. Qualquer outro movimento que 33 produza uma contagem menor que 3 é pior do que o movimento para B, e pode-se ignora-lo. Depois de examinar apenas F, tem-se certeza de que um movimento para C é pior (ele será menor ou igual a 5) independentemente da contagem do nó G. Assim, não precisa preocupar-se em explorar G. É claro que a eliminação de um nó pode parecer não justificar o acompanhamento dos limites e sua verificação, mas, explorando-se essa árvore até seis jogadas, então poderia-se eliminar não um único nó, mas toda uma árvore com três jogadas de profundidade. A Jogada de maximização B (3) C ( < -5) Jogada de minimização D E F (3) (5) (-5) G Figura 3.8 Um corte alfa Fonte: RICH (1994) Para ver como os dois limites, alfa e beta, podem ser usados, considere o exemplo mostrado na figura 3.9. Durante a busca dessa árvore, toda subárvore encabeçada por B é procurada e descobre-se que em A pode-se esperar uma contagem de pelo menos 3. Quando esse valor de alfa é passado para F, ele permite ignorar a exploração de L, por quê? Depois que K é examinado, vê-se que I tem garantido uma contagem máxima de 0, o que significa que F tem garantido um mínimo de 0. Mas esse valor é menor que o valor de alfa, e, portanto, mais nenhuma ramificação de I precisa ser considerada. O jogador de maximização já sabe que não deve escolher mover para C e depois par I porque, com esses movimentos, a contagem resultante não será melhor que 0, e com um movimento para B ele pode alcançar uma contagem de 3. Agora será visto como o valor de beta pode ser usado. Depois de impedir a continuidade da exploração de I, J é examinado, produzindo um valor de 5, que é designado como valor de F (já que ele é o máximo entre 5 e 0). Esse valor torna-se o valor de beta no nó C. Ele indica que C tem garantida uma contagem de 5 ou menos. Agora precisa-se expandir G. Primeiro M é examinado. Seu valor, 7, é 34 passado de volta para G como valor experimental. Mas agora 7 é comparado a beta (5). Ele é maior e o jogador com vez de jogar no nó C está tentando minimizar. Então esse jogador não vai escolher G, porque a contagem obtida seria pelo menos 7, e há um movimento alternativo para F, que levará a uma contagem de 5. Desse modo não é necessário explorar nenhuma outra ramificação de G. A Jogada de maximização Jogada de minimização C B D E (3) (5) H G F (4) Jogada de maximização I J M N (5) (7) (8) Jogada de minimização K L (0) (7) Figura 3.9 Cortes alfa e beta Fonte: RICH (1994) Com este exemplo, vê-se que, nos níveis de maximização, pode-se descartar em movimento logo cedo se ficar claro que seu valor será menor do que o limite atual, enquanto, nos níveis de minimização, a busca terminará se forem descobertos valores maiores que o limite atual. Mas descartar um movimento possível através de um jogador de maximização na verdade significa interromper a busca em um nível de minimização. Olhe novamente o exemplo da figura 3.8. Uma vez determinado que C é um mau movimento a partir de A, não pode-se pensar em explorar G, nem nenhum outro caminho, no nível de minimização abaixo de C. Então alfa e beta são realmente usados para encerrar uma busca num nível de minimização quando um valor menor que alfa for encontrado, e no nível de maximização quando um valor maior que beta for 35 encontrado. Interromper a busca em um nível de maximização quando um valor alto é encontrado pode parecer, a princípio, um contra-senso, mas, se você tiver em mente que só quer-se chegar em um determinado nó de um nível de maximização se o jogador de minimização no nível acima escolher aquele nó, então todo o processo passa a fazer sentido. Depois de ilustrar a operação da poda alfa-beta, pode-se agora explorar como o procedimento MINIMAX pode ser modificado para explorar essa técnica. Observe que, nos níveis de maximização, apenas beta é usado para determinar onde a busca deve ser interrompida, e, nos níveis de minimização, apenas alfa é usado. Mas, nos níveis de maximização, também precisamos saber o valor de alfa porque, quando MINIMAX é chamado recursivamente, um nível de minimização é criado e ele precisa ter acesso a alfa. Conseqüentemente, nos níveis de maximização, alfa precisa ser conhecido não apenas para poder ser usado, mas também para poder ser passado árvore abaixo. O mesmo se aplica aos níveis de minimização com relação a beta. Cada nível precisa receber ambos valores, um para ser usado e outro para ser passado para o próximo nível usar. O procedimento MINIMAX, como está, não precisa tratar os níveis de maximização e minimização diferentemente, porque ele simplesmente inverte o sinal das avaliações toda vez que os níveis mudam. Seria bom se uma técnica semelhante pudesse ser encontrada para não ter que escrever procedimentos separados para os dois jogadores. Isto é fácil. Em vez de fazer referência a alfa e beta, o MINIMAX usa dois valores, USAR-LIMITE e PASSAR-LIMITE. USAR-LIMITE é usado para calcular cortes. PASSAR-LIMITE é meramente passado para o próximo nível como USARLIMITE. É claro que USAR-LIMITE também precisa ser passado para o próximo nível, mas ele será passado como PASSAR-LIMITE, e então pode ser passado para o terceiro nível abaixo, novamente como USAR-LIMITE, e assim por diante. Assim como os valores precisam ter seus sinais invertidos toda vez que eram passados de um nível para outro, também os limites precisam ter seus sinais invertidos. Isto é necessário para que, independentemente do nível da busca, um teste maior que determine se um limite foi ou não cruzado. Agora ainda é preciso que não haja diferença entre código exigido nos níveis de maximização e aquele exigido nos níveis de minimização. 36 Acabou-se de descrever como os valores alfa e beta são passados árvores abaixo. Além disso, precisa-se decidir como eles devem ser atribuídos. Para ver como, vamos voltar primeiro ao exemplo simples da figura 3.8. Em um nível de maximização, como o do nó A, alfa é definido como sendo o valor do melhor sucessor já encontrado. (Observe que, embora nos níveis de maximização beta seja usado para determinar cortes, é alfa que tem seu valor calculado. Desse modo, em qualquer nível USARLIMITE será verificado para cortes e PASSAR-LIMITE será utilizado para poder ser usado mais tarde). Mas, se o nó de maximização não estiver no topo da árvore, precisa-se considerar também o valor de alfa vindo de um nó mais alto. Para ver como isto funciona, olhe novamente a figura 3.9 e considere o que acontece no nó F. Atribuise o valor 0 ao nó I com base no exame do nó K. Este é, até o momento, o melhor sucessor de F. mas, numa exploração anterior da subárvore encabeçada por B, alfa recebeu o valor 3, e foi passado árvore abaixo de A até F. Alfa não deve receber 0, com base no nó I. Ele deve ser mantido com o valor 3, para refletir o melhor movimento encontrado até então em toda a árvore. Assim, vê-se que, em um nível de maximização, alfa deve receber o valor que tinha no próximo nível mais alto de maximização ou o melhor valor encontrado nesse nível, o que quer que seja maior. Declaração correspondente pode ser feita sobre beta em níveis de minimização. De fato, o que queremos dizer é que, em qualquer nível, PASSAR-LIMITE deve sempre ser o máximo entre o valor herdado de cima e o melhor movimento encontrado em seu nível Se PASSAR-LIMITE for atualizado, o novo valor deve ser propagado tanto para os níveis inferiores quanto para os níveis superiores, de forma a sempre refletir o melhor movimento encontrado na árvore. Neste ponto, nota-se que é feito, para calcular PASSAR-LIMITE, a mesma coisa que foi feito em MINIMAX para calcular MELHOR-CONTAGEM. Poderíamos também eliminar MELHOR-CONTAGEM e deixar PASSAR-LIMITE atuando em seu lugar. Com essas observações, pode-se descrever a operação da função MINIMAX-AB, que requer quatro argumentos. Posição, Profundidade, Usar-Limite e Passar-Limite. A chamada inicial, para escolher um movimento para JOGADOR-UM na posição ATUAL, deve ser MINIMAX-A-B (CORRENTE, 0, JOGADOR-UM, valor máximo que ESTÁTICA pode calcular, valor mínimo que ESTÁTICA pode calcular). 37 Estes valores iniciais de Usar-limite e Passar-Limite representam os piores valores que cada lado pode atingir. Algoritmo: MINIMAX-A-B (Profundidade, Jogador, Usar-Limite, PassarLimite) 1. Se PROFUNDO-O-SUFICIENTE (Posição, Profundidade), então retorne a estrutura VALOR = ESTÁTICA (Posição, Jogador); CAMINHO = nil 2. Caso contrário, gere mais uma jogada da árvore chamando a função GERMOV (posição, Jogador) e atribuindo a SUCESSORES a lista retornada. 3. Se SUCESSORES estiver vazio, não há movimentos a serem feitos; retorne a mesma estrutura que seria retornada caso PROFUNDO-OSUFICIENTE tivesse retornado VERDADE. 4. se SUCESSORES não estiver vazio, então examine cada elemento e acompanhe o melhor deles. Isto é feito da seguinte maneira: Para cada elemento SUC de SUCESSORES: (a) Atribua RESULTADO-SUC MINIMAX-A-B (SUC, Profundidade + 1, OPOSTO(Jogador), - PassarLimite, - Usar-Limite). (b) Atribua NOVO-VALOR VALUE (RESULT-SUC). (c) Se NOVO-VALOR > Passar-Limite, então encontramos um sucessor melhor que qualquer outro examinado até o momento. Registre o fato fazendo o seguinte: I. Atribua Passar-Limite NOVO-VALOR. 38 II. O melhor caminho conhecido é agora de CORRENTE para SUC e depois para o caminho apropriado, conforme determinado pela chamada recursiva de MINIMAX-A-B. Ajuste MELHOR- PERCURSO para o resultado da inclusão de SUC á frente de CAMINHO (RESULTADO-SUC). (d) Se Passar-Limite (refletindo o melhor valor atual) não for melhor que Usar-Limite, então deve-se parar de examinar essa ramificação. Mas tanto os limites quanto os valores foram invertidos. Portanto, se PassarLimite = Usar-Limite, então retorne imediatamente com o valor VALOR = Passar-Limite CAMINHO = MELHOR-CAMINHO 5. Retorne a estrutura VALOR = Passar-Limite CAMINHO = MELHOR-PERCURSSO 3.4. Microcontrolador 8051 O 8051 é um microcontrolador rápido com clock de 12MHz, sendo que existem versões de até 30MHz, fornecidas por outros fabricantes, e suas características de hardware e software permitem usá-lo como um poderoso controlador, sobretudo em sistemas de lógica seqüencial e combinatória. Nesse projeto será utilizado o microcontrolador da philips, o P89C51RD2, por possuir uma capacidade de 64Kbytes de memória flash. 3.5. Reed Switch É uma pequena ampola de vidro que contém em seu interior duas lâminas de ferromagnético bem próximas uma da outra. Aproximando-se um imã do reed switch as lâminas se encostam fechando contato. Como mostrado na figura 3.10. 39 Figura 3.10 Reed Switch 3.6. Led Led é a sigla de Light-Emitting Diode (diodo emissor de luz). É um semicondutor, com junção P-N. Quando recebe corrente elétrica o diodo acende. Funciona com baixa tensão, cerca de 2.5 volts, e corrente, cerca de 10mA. Como mostrado na figura 3.11. Figura 3.11 Led 3.7. Display LCD Os módulos LCD são interfaces de saída muito útil em sistemas microprocessados. Estes módulos podem ser gráficos e a caracter. A figura 3.12 mostra um display de caracter. Os módulos LCD gráficos são encontrados com resoluções de 122x32, 128x64, 240x64 e 240x128 dots pixel, e geralmente estão disponíveis com 20 pinos para conexão. Os LCD comuns (tipo caracter) são especificados em número de linhas por colunas e são encontrados nas configurações previstas na Tabela 1. 40 Figura 3.12 Tabela 1 Display LCD Módulos LCD disponíveis Os módulos podem ser encontrados com LED backlight (com uma iluminação de fundo) para facilitar as leituras durante a noite. Neste caso, a alimentação deste led fazse normalmente pelos pinos 15 e 16 para os módulos comuns e 19 e 20 para os módulos gráficos, sendo os pinos 15 e 19 para ligação ao anodo e os pinos 16 e 20 para o catodo. A corrente de alimentação deste led varia de 100 a 200mA, dependendo do modelo. Estes módulos utilizam um controlador próprio, permitindo sua interligação com outras placas através de seus pinos, onde deve ser alimentado o módulo e interligado o barramento de dados e controle do módulo com a placa do usuário. Naturalmente que além de alimentar e conectar os pinos do módulo com a placa do usuário deverá haver 41 um protocolo de comunicação entre as partes, que envolve o envio de bytes de instruções e bytes de dados pelo sistema do usuário. Assim como em um rádio relógio todo módulo LCD permite um ajuste na intensidade da luz emitida ou ajuste de contraste, isto é possível variando-se a tensão no pino 3. A Figura 1 mostra um circuito típico e recomendado pela maioria dos fabricantes para efetuar este ajuste. Alguns fabricantes recomenda o uso de um resistor de 4K7 em série com o potenciômetro de 10K . A Tabela 2 descreve cada pino do módulo ou do display para conexão deste a outras placas: Tabela 2 Pinagem dos módulos LCD 4. ESPECIFICAÇÃO DO HARDWARE 4.1. Funções do Hardware O tabuleiro contém em cada uma de suas casas pretas um reed switch e um led. Cada peça do jogo, tanto as pretas como as brancas, tem embutida em sua base um imã. Isso pode ser visualizado na figura 4.1. 42 Figura 4.1 Casa e Peça do tabuleiro O tabuleiro contém também um display que mostra tanto as jogadas realizadas pela criança com as do computador. 4.2. Componentes Utilizados A tabela 1.3 mostra os componentes utilizados para o desenvolvimento do projeto. Tabela 3 Componentes utilizados Componente Quantidade Microprocessador da família 8051 (P89C51RD2) 1 Reed Switch 64 Leds 32 Imãs 24 Latch 74HC573 6 Display LCD 1 Decodificador 74LS138 1 Max232 1 Porta lógica 74LS04 1 DM7406 2 74LS14 2 Bateria 6 volts 1 Placa Perfurada 1 Placa Fenolite 1 Diodo 1N4007 32 Demais componentes (resistores, capacitores, chaves, etc) vários 43 4.3. Tabela de Custos A tabela 4 mostra o custo do projeto com componentes e mão-de-obra utilizada. Tabela 4 Custo do Projeto Descrição Qtde Custo Unitário Total Microprocessador da família 8051 1 R$ 60,00 R$ 60,00 Reed Switch 64 R$ 1,40 R$ 89,60 Leds 32 R$ 0,15 R$ 4,80 Imãs 24 R$ 1,90 R$ 45,60 Latch 74HC573 6 R$ 0,86 R$ 5,76 Display LCD 1 R$ 19,80 R$ 19,80 Decodificador 74LS138 1 R$ 0,78 R$ 0,78 Max232 1 R$ 2,91 R$ 2,91 Porta lógica 74LS04 1 R$ 0,84 R$ 0,84 DM7406 2 R$ 1,32 R$ 2,64 74LS14 2 R$ 0,56 R$ 1,12 Placa Perfurada 1 R$ 18,00 R$ 18,00 Placa Fenolite 1 R$ 45,12 R$ 45,12 Bateria 6 volts 1 R$ 17,25 R$ 17,25 Diodo 1N4007 32 R$ 0,05 R$ 1,60 (P89C51RD2) Demais Componentes Mão-de-Obra (aproximadamente 720 horas R$ 50,00 R$ 5,00 R$ 3600 TOTAL 3920,22 6 horas por dia, durante 6 meses) 44 5. ESPECIFICAÇÃO DO SOFTWARE 5.1. Ambiente e Linguagem de desenvolvimento A linguagem utilizada para o desenvolvimento do software foi o C e o ambiente de desenvolvimento utilizado foi o Keil uVision. 5.2. Interface com o usuário A interface com o usuário é feita através do tabuleiro, como mostra a figura 5.1. O usuário realiza sua jogada e fica aguardando o tabuleiro mostrar-lhe, através do display e dos led s contidos em cada casa, qual é a sua jogada. O usuário deve então retirar a peça da casa onde o led esta piscando e colocá-la na casa em que o led acendeu. O jogo só continuará quando o usuário confirmar a jogada que lhe foi solicitada. 5.3. Diagrama de Contexto A figura 5.2 mostra o diagrama de contexto do sistema. Esse diagrama mostra o relacionamento entre as entidades externas e o software. 5.4. Diagrama de Fluxo de Dados (DFD) A figura 5.3 mostra o diagrama de fluxo de dados do sistema. O DFD é uma forma gráfica de mostrar as funções que compõem o sistema. 5.5. Diagrama de Estados A figura 5.4 mostra o diagrama de estados do sistema. Mostra os diferentes estados de um Objeto durante sua vida, e o estímulo que faz com que o Objeto mude seu estado. 45 Figura 5.1 Figura 5.2 Tabuleiro Diagrama de Contexto 46 Figura 5.3 Diagrama de Fluxo de Dados 47 Figura 5.4 Diagrama de Estados 5.6. Fluxograma A figura 5.5 mostra o fluxograma do sistema. No inicio a criança realiza uma jogada, então é feita uma leitura do estado do tabuleiro para saber se houve alguma mudança. Enquanto uma mudança não for detectada o programa ficará preso realizando sucessivas leituras do tabuleiro. Detectada a mudança verifica se a jogada é valida, se não for pede para criança jogar novamente, caso contrário verifica se as peças do computador acabaram. Se acabaram a criança ganha o jogo se não monta-se a árvore do Minimax para escolher qual é a melhor jogada a ser realizada para o computador, enviando para o display qual é a linha e coluna da casa origem e a linha e coluna da casa destino que a criança deve mover. Verifica-se se a criança realizou a jogada corretamente para o computador se sim verifica se as peças da criança acabaram para verificar se ele ganhou o jogo, caso contrário manda a criança jogar. 48 Figura 5.5 - Fluxograma 49 6. ESPECIFICAÇÃO DA VALIDAÇÃO DO PROJETO A validação ocorrerá com crianças das séries iniciais do ensino fundamental. A fim de, observar as suas reações frente situações-problemas geradas nessa interação. Diante dessas reações irão demonstrar suas capacidades de raciocínio, habilidades e destreza procurando alternativas adequadas para solucioná-las. 7. RESULTADOS 7.1. Software Para o desenvolvimento do software inicialmente pensou-se em fazer uma implementação dinâmica, pois o MINIMAX é um algoritmo de busca em profundidade sendo necessário montar uma árvore a cada jogada com uma profundidade préestabelecida, porém por limitação do compilador, que permite apenas 2K de código hex, isso não foi possível. Testes realizados, utilizando o debuger do próprio compilador e também fisicamente no tabuleiro, mostraram que o compilador poderia estar se perdendo na hora de montar o código hex, no debuger do compilador ele realizava o que era esperado, porém quando gravado no microcontrolador não ocorria o mesmo resultado. Isso pode ter sido causado devido as inúmeras alocações de memória que ocorrem durante a montagem da árvore. A seguir é mostrado o código implementado para a estrutura árvore. // Inicializa a árvore void initArvore(Arvore *arvore) { arvore->tamanho = 0; arvore->raiz = NULL; } // Destrói a árvore removendo todos os nós void delArvore(Arvore *arvore) { removeNoArvore(arvore, NULL); } // remove todos os nós da árvore // Insere um nó como filho do nós especificado. Se i nó especificado == NULL, insere a raiz 50 // (somente se a árvore estivar vazia). Retorna 0, se tudo OK, - 1 se erro. unsigned int insereNo(Arvore *arvore, No *no, unsigned int *conteudo, int peso) { No *temp, **posicao; if (no == NULL) { if (arvore->tamanho > 0) return -1; posicao = &arvore->raiz; } else { posicao = &no->filho; // se tem mais irmãos, posiciona posicao no último while (*posicao != NULL) posicao = &(*posicao)->prox; // pega o proximo } if ( (temp = (No*) malloc(sizeof(No)) ) == NULL) return -1; temp->cont = (void *)conteudo; temp->pai = no; temp->filho = NULL; temp->prox = NULL; temp->peso = peso; *posicao = temp; arvore->tamanho++; return 0; } // Remove a subárvore enraizada como filha do nó especificado // Se no == NULL, remove todos os nós da árvore void removeNoArvore(Arvore *arvore, No *no) reentrant { No **posicao; if (arvore->tamanho == 0) return; // Término da recursão if (no == NULL) posicao = &arvore->raiz; else posicao = &no->filho; if (*posicao != NULL) { removeNoArvore(arvore, *posicao); removeProxNoArvore(arvore, *posicao); 51 free( (*posicao)->cont ); free(*posicao); *posicao = NULL; arvore->tamanho--; // remove o filho // mais velho } return; } void removeProxNoArvore(Arvore *arvore, No *no) reentrant { No **p; p = &no->prox; if (*p != NULL) { removeProxNoArvore(arvore, *p); free( (*p)->cont ); free(*p); arvore->tamanho--; } } Pensou-se então em uma outra alternativa para a implementação do algoritmo, a implementação estática. Esta mostrou-se eficaz não apresentando nenhum problema para compilar no debug e gravar no microcontrolador para rodar o programa. Conseguindo-se então realizar jogadas satisfatórias. A seguir um trecho da implementação estática. // A partir do tabuleiro raiz verifica quais serão as possiveis jogadas que poderão ser realizadas pelo computador void criaJogadas(void) { unsigned char data i, data j, data cont; int data peso; melhorPeso = -9999; for (i = 1; i <= 7; i++) { if (i % 2 == 0) j = 1; else j = 2; for (; j <= 8; j+=2) { if (getTabuleiro(i, j, tabuleiro) == PeaoPreto) { if (j != 1) 52 { if ((getTabuleiro(i+1,j-1,tabuleiro)==PeaoBranco) && (getTabuleiro(i+2, j-2, tabuleiro) == Vazia) ) { copiaDadosTabuleiro(tabuleiro, raiz); cont = getTabuleiro(i, j, raiz); setTabuleiro(i, j, raiz, Vazia); setTabuleiro(i+1, j-1, raiz, Vazia); setTabuleiro(i+2, j-2, raiz, cont); copiaDadosTabuleiro(raiz, melhorTabuleiro); brancas--; return; } if (getTabuleiro(i+1, j-1, tabuleiro) == Vazia) { copiaDadosTabuleiro(tabuleiro, raiz); cont = getTabuleiro(i, j, raiz); setTabuleiro(i, j, raiz, Vazia); setTabuleiro(i+1, j-1, raiz, cont); peso = calculaPeso(); if (melhorPeso < peso) { melhorPeso = peso; copiaDadosTabuleiro(raiz, melhorTabuleiro); } } } if (j != 8) { if ( (getTabuleiro(i+1, j+1, tabuleiro) == PeaoBranco) && (getTabuleiro(i+2, j+2, tabuleiro) == Vazia) ) { copiaDadosTabuleiro(tabuleiro, raiz); cont = getTabuleiro(i, j, raiz); setTabuleiro(i, j, raiz, Vazia); setTabuleiro(i+1, j+1, raiz, Vazia); setTabuleiro(i+2, j+2, raiz, cont); copiaDadosTabuleiro(raiz, melhorTabuleiro); brancas--; return; } if (getTabuleiro(i+1, j+1, tabuleiro) == Vazia) { copiaDadosTabuleiro(tabuleiro, raiz); cont = getTabuleiro(i, j, raiz); setTabuleiro(i, j, raiz, Vazia); setTabuleiro(i+1, j+1, raiz, cont); peso = calculaPeso(); 53 if (melhorPeso < peso) { melhorPeso = peso; copiaDadosTabuleiro(raiz, melhorTabuleiro); } } } } } } Para verificar o perfeito funcionamento da implementação dinâmica seria preciso comprar a licença do compilador para realizar os testes necessários e verificar se esse era o problema. A figura 7.1 mostra uma jogada realiza da pela criança e figura 7.2 mostra a jogada que o computador pediu para a criança realizar em resposta a do adversário. Figura 7.1 Criança realizando uma jogada Figura 7.2 Jogada do computador 54 7.2. Hardware Para o desenvolvimento do hardware foi desenvolvida uma placa de circuito impresso, onde foram colocados os reed switchs, os leds as latchs de controle dos leds, das colunas e linhas, os open collectors e outros componentes como resistores e diodos. A figura 7.3 mostra como ficou a placa montada. Figura 7.3 Placa de circuito do tabuleiro Para o processamento desenvolveu-se uma placa com o microcontrolador, onde é possível realizar sua gravação via porta serial, a placa contem também o controle de contraste do display, um regulador de tensão que converte a tensão da entrada da bateria de 6, 9 ou 12V para 5V, um decodificador de endereços e os schmitt trigger e uma porta not. A figura 7.4 mostra a placa montada. As figuras 7.5 e 7.6 mostram como ficou o tabuleiro montado. 55 Figura 7.4 Placa de circuito de processamento Figura 7.5 Tabuleiro 56 Figura 7.6 Tabuleiro 8. CONCLUSÃO Durante o projeto muitos problemas surgiram para o desenvolvimento do software. A limitação na geração do código hex foi fator primordial, fazendo com que a estratégia adotada inicialmente para a implementação do MINIMAX fosse alterada no decorrer do desenvolvimento. Outro ponto que dificultou a implementação do algoritmo foi a quantidade de memória RAM do microcontrolador que era muito pequena, fazendo com que fosse implementado somente um nível da árvore. Mesmo diante desses problemas o software desenvolvido apresentou um bom desempenho quando testado. O hardware apresentou instabilidade com relação aos reed switches. Isso dificultou a identificação das peças nas casas. Ora as peças tinham que ser colocadas no centro da casa para serem detectadas, ora não. Foi sugerida a colocação de mais um sensor em cada casa para ver se esse problema seria resolvido, porém isso melhorou para alguns casos outros permaneceram iguais. 57 Muito ainda tem que ser feito para um perfeito funcionamento do tabuleiro: mudar de microcontrolador ou fazer um banco de memória, comprar a licença do compilador para que a geração do código hex seja ilimitada, estudar a possibilidade de acrescentar mais reeds switches por casas ou trocar de sensor. Apesar dos contratempos e problemas ocorridos no decorrer do desenvolvimento do projeto, este apresentou um desempenho satisfatório, podendo ser comprovado na visita feita a Instituição de Ensino Positivo Júnior, onde crianças da 2ª e 3ª séries puderam testar o funcionamento e desempenho do jogo. 9. REFERÊNCIAS BIBLIOGRÁFICAS CARNEIRO, S. Iniciação ao Jogo de Damas. Ed. Presença, 4ª edição, 1994. RICH, E. Inteligência Artificial. Ed. Makron Books, 2ª edição, 1994. ANTUNES, C. As Inteligências Múltiplas e seus Estímulos, Ed. Papirus, 8ª edição, 2002. BARBOSA, Laura Monte Serrat. Caixa de trabalho uma ação psicopedagógica proposta pela Epistemologia Convergente, in Psicopedagogia e Aprendizagem. Coletânea de reflexões. Curitiba, 2002. LUGER, F. Inteligência Artificial. Ed. Bookman, 4ª edição. RUSSELL, S. Inteligência Artificial. Ed. Campus, tradução da 2ª edição. Fleury, C. Display LCD. 1996 JÚNIOR, V. P. S. Aplicações Práticas do Microcontrolador 8051. Ed. Érica, 7ª Edição. Philips Semiconductors. 04/07/2005 <http://www.semiconductors.philips.com> Acesso em: 58 Guilherme, T. Federação Portuguesa de Damas: Opiniões. Disponível em <http://fpdamas.home.sapo.pt/opina.htm>. Acesso em: 20 mar. 2005. Gama, M. C. S. S. A Teoria das Inteligências Múltiplas e suas implicações para Educação. Disponível em <http://www.homemdemello.com.br/psicologia/intelmult.html>. Acesso em: 20 mar. 2005. Laudares, F. Revista Brasileira de Ensino de Física: Usando sensores magnéticos em um trilho de ar. Disponível em: <http://www.scielo.br/scielo.php > . Acesso em: 8 abr. 2005.