Dagaz: Detalhes

imagem Não conte os números em "pi",
"E" é infinitamente o mesmo.
E se você os escrever do final, o que será mais?

Martin Gardner "Tic Tac Toe"

Para este artigo, eu queria escolher uma epígrafe diferente, mas achei muito patética. O próximo lançamento foi atrasado novamente. Durante esse período, consegui mudar de emprego! Trabalhar em um novo local exige muita energia, mas continuo encontrando tempo para meu pequeno hobby. E devo dizer que o que tenho de enfrentar no processo está se tornando cada vez mais difícil. Eu vou lhe contar. Eu queria começar com outra epígrafe, mas essa também não é ruim.

Desta vez, houve novos mankals e " jogos de transição " (esses são Halma e seus parentes). Um tipo de corrida em que você precisa levar a casa do adversário com suas peças antes dele. Os números (tanto os nossos quanto os outros) podem ser saltados (como em damas ), mas não há capturas. O que estou explicando para você? Certamente, muitos de vocês jogaram Corners na infância.


À primeira vista, o jogo parece simples, mas os problemas já começaram no nível do kernel. Lembre-se, eu falei sobre movimentos compostos? Por muitas razões, é mais conveniente representá-las como compostas - como um todo único, e não como uma sequência de movimentos parciais. Isso é mais conveniente para a IA e, do ponto de vista do design, existem jogos cuja descrição na forma de movimentos compostos parece muito mais natural. Mas há um problema.

Nas damas, ao executar um movimento composto, as peças são removidas do tabuleiro (possivelmente no final do movimento). Nos cantos - você pode pular por cima das suas próprias peças ou do oponente até o infinito. Literalmente. E nenhuma extensão aqui salva, porque tudo corre em ciclos sem alcançá-las, no kernel, mesmo no estágio de gerar a lista de movimentos. Eu tive que mudar essa lógica, implementando aí a opção ( detect-loops ), que valeria a pena pensar com antecedência.

Também não foi fácil com o bot.
O principal problema dessa família de jogos é que não é tão fácil selecionar uma função de avaliação que represente adequadamente a situação no tabuleiro. Como o objetivo do jogo é alcançar a “casa” do oponente, é possível estimar a distância total de todas as peças até os campos de destino ( Manhattan ou Euclidiano - sem diferença), mas em Halm, sob um conjunto de circunstâncias bem-sucedidas, as peças podem pular o tabuleiro inteiro de uma só vez, de modo que essa estimativa dá pouco.

Com os campos de destino, tudo também não está claro. Você não pode direcionar todas as figuras para o mesmo campo. A primeira figura que chega até ele e leva. Seria ideal determinar os campos-alvo ideais para cada uma das figuras e mudar para elas, mas é difícil, no plano computacional. Além disso, a situação no quadro muda a cada movimento. Em geral, decidi não olhar muito à frente e me restringir a um algoritmo puramente heurístico .

Com essa avaliação da qualidade do AVC
Dagaz.AI.heuristic = function(ai, design, board, move) { var t = getTargets(design, board, board.player); var m = getMove(move); var r = 1; if (m !== null) { if (!design.inZone(0, board.player, m.start)) { if (_.indexOf(t.first, m.end) >= 0) { r = 1000 + getDistance(t.first, m.start) - getDistance(t.first, m.end); } if (_.indexOf(t.goal, m.end) >= 0) { r = 700 + getDistance(t.first, m.start) - getDistance(t.first, m.end); } if ((r == 1) && (_.indexOf(t.second, m.end) >= 0)) { r = 500 - getDistance(t.second, m.end); } } if (r == 1) { if (design.inZone(2, board.player, m.end) && !design.inZone(2, board.player, m.start)) { r = 300; } } if (bestFound(design, board, 300)) return -1; if (r == 1) { var goals = getGoals(design, board, board.player); if (!_.isUndefined(goals[m.start])) { var goal = goals[m.start]; if (m.next == goal.next) { r = 100 + distance(goal.end, m.start) - distance(goal.end, m.end); } } } if (notBest(design, board, r)) return -1; var b = board.apply(move); if (isRestricted(design, b, board.player)) return -1; } return r; } 

Não é uma solução ideal, mas para começar, está funcionando. Se o bot vê um movimento pelo qual é possível "pular" na "casa" do inimigo, ele o escolhe. Caso contrário, reduz gradualmente a distância do alvo, tentando evitar congestionamentos. A situação mais triste pode acontecer se um jogador (acidental ou intencionalmente) deixa sua peça na "casa" e o outro - "trava" com uma fileira dupla de suas peças.

Obviamente, a probabilidade de tal situação é bastante baixa.
Graças à regra proposta por Sidney Saxon, o inventor e colecionador de jogos de Nova York. Sua sugestão é a seguinte: se uma peça tem a capacidade de sair de sua "casa", pulando através da peça de um oponente ou por uma cadeia de saltos a partir de tal movimento, deve fazê-lo. Tentei várias versões das regras, excluindo a possibilidade de bloquear figuras em sua própria "casa" e achei a regra Sidney Saxon a mais bem-sucedida. Depois de deixar sua “casa”, a peça não pode mais retornar a ela (embora tenha o direito de passar por ela no processo de concluir a mudança).

Por precaução, proíbo os movimentos de "bloqueio" do oponente (se você não precisar esperar muitos movimentos à frente, poderá se permitir heurísticas bastante complicadas) definindo classificações negativas para eles, mas a situação de "bloquear" campos de alvo vazios não é menos perigosa para o bot (especialmente isso notável no Halma clássico , com seus movimentos puramente ortogonais). Em geral, esse bot tem espaço para crescer.

Nos jogos em que peças podem ser retiradas, é ainda mais complicado. E existem muitos desses jogos! Talvez o mais famoso deles seja o Camelot , inventado por George Parker em 1930. Mas, pessoalmente, eu gosto de jogos muito menos conhecidos, construídos com base na mesma mecânica.


Este jogo é a própria história! Em 1908, os sufragistas propuseram isso para promover suas visões políticas. Está tudo aqui: a Câmara dos Comuns, Albert Hall , a prisão da cidade e o hospital. As mulheres sufragistas estão lutando contra a polícia. Seu objetivo é trazer 6 pessoas para a Câmara dos Comuns. Eles não podem entrar em sua sede, Albert Hall. As formas se movem em qualquer direção. Saltar sobre peças amigas e inimigas também é permitido.

Uma série de saltos, no entanto, pode ser arbitrariamente longa. Se o caso ocorrer na "arena", as figuras inimigas, ao pularem por cima delas, são cortadas e enviadas para uma prisão ou hospital. As figuras comuns são cortadas apenas na diagonal, grandes (policiais e líderes sufragistas) - em qualquer direção. Quando 6 figuras são recrutadas na prisão e no hospital, elas podem ser "trocadas" ao voltar ao jogo. Assim, as peças, como no Shogi ou no Pillar Damas , nunca saem do jogo.

Em geral, esta versão inteira é apenas sobre o tópico dessas opções. Por exemplo, eu finalmente dominei a transformação correta das peças no xadrez (até agora, todos os peões se transformavam apenas em rainhas, o que, de um modo geral, está errado). Eu não me incomodei muito com isso e desenhei uma caixa de diálogo de seleção diretamente na tela. Acabou muito bem (se eu pudesse ter tirado minhas mãos para que elas pudessem ser distinguidas do tapete, teria sido maravilhoso em geral).


Outro refinamento "nuclear" foi associado ao aprimoramento da interface do usuário e tem seu próprio histórico. Há um mecanismo no projeto há bastante tempo que permite codificar a posição atual passando-a pela URL. Considerando que as descrições de todos os estados do jogo nesse formato são gravadas no log, isso ajuda bastante na depuração. Esse é apenas o usuário que não sabe nada sobre o log do navegador, é de pouca utilidade.

Não, não, isso não é tudo de bom!
Existem vários jogos, cuja jogabilidade consiste em muitos estágios (possivelmente heterogêneos). Como exemplo, você pode citar o popular jogo de 2008 - Kamisado . Cada estágio deste jogo (antes de passar uma das figuras para a última horizontal) é relativamente curto, mas após a conclusão, o jogo continua. Os jogadores, de acordo com as regras acordadas, colocam suas peças novamente na primeira linha e tentam alcançar a última horizontal à frente do oponente (a figura que trouxe a vitória no estágio anterior recebe novas habilidades).


É esse aspecto do jogo que a opção " níveis progressivos " automatiza, que passa automaticamente para a próxima fase do jogo quando um dos jogadores vence. E como o arranjo inicial das figuras difere de um estágio para outro, é calculado pelo módulo de configuração comum e passado para o próximo estágio do jogo através do URL .


De mãos dadas com esta oportunidade, é outra maneira, permitindo diversificar o arranjo inicial dos números. A opção " seletor " permite codificar várias disposições iniciais (e até configurações da placa) em um único arquivo JS . Atualize sua página inicial do Reversi e você entenderá o que quero dizer.

O novo plug-in foi projetado para resolver o problema. Estruturalmente, essa é uma árvore comum na qual todos os estados do jogo que foram apresentados na sessão do jogo são salvos (e, como essa árvore, no futuro, todo o histórico do jogo poderá ser carregado no arquivo SGF ). O usuário pode "inverter" esses estados usando os botões que aparecem na parte superior da tela.


Isso é realmente conveniente, mas você pode obter ainda mais benefícios das duas setas na parte superior. É exatamente isso que a opção " modo orientador " faz. Se o usuário pensa mais do que o tempo especificado, o bot com o qual ele joga calcula o percurso e coloca o novo estado do jogo no "gerenciador de sessões". O movimento proposto pode ser aceito simplesmente pressionando o botão "avançar". E se você não gostar da mudança, sempre poderá revertê-la.

Muita alegria, no processo de desenvolvimento, trouxe som (ao que parece, o que é muito mais fácil). A primeira implementação foi muito ingênua. Não sei com o que está conectado, mas em algum lugar no meio do jogo, o som simplesmente parou de tocar sem nenhuma mensagem no log. Isso se manifestou em todos os navegadores que eu tinha, até começar a armazenar em cache os objetos Sound criados na memória. Mas então outro problema veio.

Se o som era reproduzido por um longo tempo e o bot pensava rápido o suficiente (como em chamarizes , por exemplo), então o som de seu movimento era simplesmente "engolido", o que parecia extremamente desagradável. Aqui eu tive que xamã por um longo tempo e terminou com muletas . Com o sinalizador "clonável" definido, ainda crio várias instâncias do som, uma para cada jogador (mesmo que elas percam o mesmo som). Obviamente, isso não ajudou em nada o IE, que se recusou (obviamente por razões religiosas) a lidar com os arquivos "wav" e "ogg". Este navegador, para mim, funciona silenciosamente!

Caso contrário, o lançamento ocorreu sem incidentes. Halme e mankalam eram compostos de alguns jogos de xadrez , além de muitas variações de Shogi lidas por mim na próxima edição de Il fogliaccio degli astratti e outro jogo simples de camaradas chineses. Ah, sim, aqui está outra coisa:


Apenas um pequeno simulador de memória de curto prazo. É necessário abrir os mesmos pares (rainha com rainha, rei com rei, etc.) da mesma cor. Pontos são dados por isso e por tudo sobre os 200 cliques. Como os bônus são atribuídos a pontos (por alternância de roupas vermelhas e pretas, por exemplo), você pode competir com os amigos sobre quem tem melhor memória. Vá em frente!

E todo um feliz ano novo!

Source: https://habr.com/ru/post/pt429494/


All Articles