Este é um KOTH de xadrez com regras simplificadas (porque o próprio xadrez já é complicado, jogá-lo através de um programa simples não facilita as coisas). No momento, ele está limitado ao java (versão 8), mas a criação de uma classe de wrapper não é tão difícil (caso alguém queira fazer isso).
Tabuleiro de xadrez
O tabuleiro de xadrez no programa de controle usa uma versão modificada da notação numérica da ICCF . É baseado em zero, o que significa que o campo inferior esquerdo é a posição 0,0
, enquanto o campo superior direito é a posição7,7
.
Regras modificadas
- En passant será ignorado.
- Castling não é possível.
- A regra dos cinquenta movimentos se aplica automaticamente (o que significa que o jogo termina em empate).
- A promoção de peões para rainhas acontece automaticamente quando eles chegam ao final do tabuleiro.
- Se um jogador precisar de mais de 2 segundos para se mover, ele perderá o jogo.
- Retornar uma jogada inválida resultará na perda do jogo.
- Para ganhar, você tem que capturar o rei inimigo . Não basta checar o inimigo.
- Isso também permite que você mova seu rei para campos onde o inimigo pode capturá-lo.
- As brancas começam o jogo.
- O branco é colocado "na parte inferior" do campo (y = 0), o preto está localizado na parte superior (y = 7).
- É proibido acessar outros recursos que não o seu bot (internet, arquivos, outros bots, ...).
Pontuação
- Ganhar concede 3 pontos, um empate 1 ponto e a perda de 0 pontos.
- Cada envio jogará um contra o outro 10 vezes (5 vezes branco, 5 preto).
Controlador
Você pode encontrar o programa de controle no github .
Para participar, você precisa criar uma classe dentro doplayer
pacote e deve ser uma subclasse dePlayer
. Como exemplo, veja o TestPlayer (que também será incluído na pontuação).
A cada jogo, o controlador criará uma nova instância do seu jogador. Então, a cada turno, você deve retornar uma jogada. O controlador fornece uma cópia da placa , que contém uma matriz 8x8 de campos . Um campo contém informações sobre sua cor, sua posição e a peça , se houver uma.
O controlador também fornece informações sobre o jogador inimigo, como isCheck
e getPieces()
. Invocar getMove()
o inimigo fará com que você seja desclassificado.
Placar
01) AlphaBetaPV: 229 02) AlphaBeta: 218 03) PeçaTaker: 173 04) Queijo: 115 05) ThreeMoveMonte: 114 06) StretchPlayer: 93 07) Não pense antes: 81 08) SimplePlayer: 27 09) TestPlayer: 13
O concurso é limitado ao java porque facilita a criação de respostas, pois você pode lucrar com os métodos fornecidos pelo controlador. No entanto, se alguém criar um wrapper, incluirei outros idiomas.
fonte
you can profit from the methods provided by the controller
: Isso não é tão verdade assim. A maioria dos métodos úteis é privada de pacote, portanto, não pode ser usada. Você se importaria em adicionar umsimulateMove
método àBoard
classe, que retorne uma cópia profunda do quadro com a movimentação aplicada? Dessa forma, não precisamos escrever por conta própria (ou copiar e colar todo o código ^^).public
agora;)Throwable
ou mesmoError
porque ele evitará perder. Eu chamaria isso de BoardTipper.Respostas:
AlphaBetaPV
AlphaBetaPV significa Alpha Beta com variação principal (não é uma pesquisa de variação principal). Com apenas mais algumas linhas tecidas no código do AlphaBeta.java, ele supera o AlphaBeta.java. E, novamente, desculpe, apenas por códigos de transformação e fusão de outras fontes da Internet nesse código JAVA.
Ainda jogando chato.
fonte
PieceTaker
O código é um pouco confuso, mas funciona. No momento, ele vence todos os outros jogadores, mesmo que receba apenas 400ms em vez dos 2000ms permitidos.
Estou usando a poda alfa beta com aprofundamento iterativo para garantir que a IA não ultrapasse o limite de tempo. A heurística atual é muito simples (apenas peças perdidas / retiradas são levadas em consideração; não posição no tabuleiro, etc.).
No futuro, eu também poderia adicionar heurísticas matadoras e classificar os movimentos antes de examiná-los.
fonte
StretchPlayer
Este bot joga como eu!
Aliás, sou péssimo no xadrez.
Os comentários explicam o que realmente estão fazendo. É muito parecido com o meu processo de pensamento.
Como um bônus adicional, supera todos os outros bots por uma margem considerável. (tão longe)
EDIT: agora prevê adversário, executando-se como o inimigo!
EDIT 2: O programa cometeu o erro de não matar o rei quando estava aberto. Foi repreendido em conformidade.
fonte
Three Move Monte
Esse cara olha para os próximos três movimentos (o meu, o seu, o meu) e escolhe o que dá a maior pontuação. Se houver mais de 60 movimentos disponíveis, ele escolherá apenas 60 aleatórios em cada etapa. É claro que, se um único movimento (dentre todos eles, e não os 60 escolhidos) terminar o jogo, eu o tomo imediatamente.
Para pontuar um quadro, dou a cada peça um valor base. É então modificado pela mobilidade da peça, quantas (e quais) peças ameaça e quantas peças a ameaçam.
É claro que os reis móveis não são necessariamente bons no começo do jogo, então eu lembro os valores deles um pouco.
Isso é executado rapidamente e pode terminar um jogo com a colheita atual em 3-4 segundos. Parece que há espaço para aumentar alguns movimentos, se necessário.
atualizar:
fonte
color.opposite()
vez degetOpponent()
;)Alpha Beta
Desculpe, por ter apenas código transformado e fundido de outras fontes da Internet nesse código JAVA. Mas ele vence todos os outros adversários (incluindo o PieceMaker) ... até agora.
E desculpe, por jogar tão chato de máquina.
fonte
Não é uma resposta, mas uma simulação para ajudar
Adicionei uma nova classe: GamePanel e editei Game and Controller
Não é muito bonito ... ainda.Você sabia que o Unicode tinha caracteres de xadrez!?!? (totalmente incrível!)A propósito, você precisa de UTF-8 para que esses personagens sejam exibidos. Funcionou para mim, mas não tenho certeza de como funcionará em outros sistemas operacionais.
Corrigido o erro no final dos jogos (graças a tim por apontar isso).
GamePanel:
Jogos:
Controlador:
fonte
SimulationListener
e, se não houver mais jogos, uma exceção será lançada. E eu coloquei branco na parte inferior, mas acho que sua maneira obras bem :)DontThinkAhead
Essa 'IA' não gosta de pensar no futuro. Se vir que pode pegar uma peça inimiga, o fará imediatamente. Se não puder, apenas moverá uma peça aleatoriamente.
É um pouco melhor do que
SimplePlayer
eTestPlayer
eu o escrevi principalmente para ter uma ideia do código do controlador e ter algo para testar.fonte
Queijo
Sim, você leu certo. Um pedaço de queijo, jogando xadrez.
Algoritmo
O queijo verifica todos os movimentos possíveis e os pontua de acordo. Ele (o queijo, e sim, é um homem) usa o seguinte guia para marcar suas escolhas:
Comendo
Risco de ser comido
Chance de comer no próximo turno
Melhorias pendentes
Defeitos consertados
fonte
SimplePlayer
Este jogador apenas garante que ele use jogadas válidas, mas, caso contrário, é bem idiota.
fonte