Este es un ajedrez-KOTH con reglas simplificadas (porque el ajedrez en sí mismo ya es complicado, jugarlo a través de un programa simple no lo hace más fácil). Por el momento está limitado a Java (versión 8), pero crear una clase de envoltura no es tan difícil (en caso de que alguien quiera hacer esto).
Tablero de ajedrez
El tablero de ajedrez en el programa de control usa una versión modificada de la notación numérica ICCF . Está basado en cero, lo que significa que el campo inferior izquierdo es la posición 0,0
, mientras que el campo superior derecho es la posición 7,7
.
Reglas modificadas
- En passant será ignorado.
- El enroque no es posible.
- La regla de los cincuenta movimientos se aplica automáticamente (lo que significa que el juego termina en empate).
- La promoción de peones a reinas se realiza automáticamente cuando llegan al final del tablero.
- Si un jugador necesita más de 2 segundos para moverse, perderá el juego.
- Devolver un movimiento no válido dará como resultado la pérdida del juego.
- Para ganar, tienes que capturar al rey enemigo . No es suficiente jaquetear al enemigo.
- Esto también te permite mover a tu rey a campos donde el enemigo puede capturarte.
- Las blancas comienzan el juego.
- El blanco se coloca "en la parte inferior" del campo (y = 0), el negro se encuentra en la parte superior (y = 7).
- Está prohibido acceder a otros recursos que no sean su bot (internet, archivos, otros bots, ...).
Tanteo
- Ganar te otorga 3 puntos, un empate de 1 punto y perder 0 puntos.
- Cada presentación jugará una contra la otra 10 veces (5 veces como blanco, 5 como negro).
Controlador
Puede encontrar el programa de control en github .
Para participar, debe crear una clase dentro delplayer
paquete y debe ser una subclase dePlayer
. Como ejemplo, mira TestPlayer (que también se incluirá en la puntuación).
Cada juego, el controlador creará una nueva instancia de tu jugador. Luego, cada turno tienes que devolver un movimiento. El controlador le proporciona una copia de la placa , que contiene una matriz de campos de 8x8 . Un campo contiene información sobre su color, su posición y la pieza que contiene , si hay uno.
El controlador también te proporciona información sobre el jugador enemigo, como isCheck
y getPieces()
. Llamar getMove()
al enemigo te descalificará.
Marcador
01) AlphaBetaPV: 229 02) AlphaBeta: 218 03) PieceTaker: 173 04) Queso: 115 05) ThreeMoveMonte: 114 06) StretchPlayer: 93 07) No pienses adelante: 81 08) SimplePlayer: 27 09) TestPlayer: 13
El concurso se limita a Java porque facilita la creación de respuestas, ya que puede beneficiarse de los métodos proporcionados por el controlador. Sin embargo, si alguien crea un contenedor, incluiré otros idiomas.
fuente
you can profit from the methods provided by the controller
: Esto no es del todo cierto. La mayoría de los métodos útiles son paquetes privados, por lo que no se pueden usar. ¿Te importaría quizás agregar unsimulateMove
método a laBoard
clase, que devuelva una copia profunda del tablero con el movimiento dado aplicado? De esa manera, no tenemos que escribirlo nosotros mismos (o copiar y pegar todo el código ^^).public
ahora;)Throwable
o inclusoError
ya que evitará perder. Yo lo llamaría el BoardTipper.Respuestas:
AlphaBetaPV
AlphaBetaPV significa Alpha Beta con variación principal (no es una búsqueda de variación principal). Con solo unas pocas líneas más entrelazadas en el código de AlphaBeta.java, supera a AlphaBeta.java. Y de nuevo, lo siento, por solo transformar y fusionar códigos de otras fuentes de Internet en este código JAVA.
Sigue jugando aburrido.
fuente
PieceTaker
El código es un poco desordenado, pero funciona. En este momento gana contra todos los demás jugadores, incluso si solo recibe 400 ms en lugar de los 2000 ms permitidos.
Estoy usando la poda alfa beta con profundización iterativa para asegurarme de que la IA no supere el límite de tiempo. La heurística actual es muy simple (solo se toman en cuenta las piezas perdidas / tomadas; no la posición en el tablero, etc.).
En el futuro, también podría agregar heurísticas asesinas y ordenar los movimientos antes de examinarlos.
fuente
StretchPlayer
¡Este bot juega igual que yo!
Por cierto, soy terrible en el ajedrez.
Los comentarios explican lo que realmente está haciendo. Se parece mucho a mi proceso de pensamiento.
Como beneficio adicional, supera a todos los demás bots por un margen considerable. (hasta aquí)
EDITAR: ¡ahora predice al oponente ejecutándose como el enemigo!
EDITAR 2: El programa cometió el error de no matar al rey cuando estaba abierto. Fue reprendido en consecuencia.
fuente
Three Move Monte
Este tipo observa los siguientes tres movimientos (el mío, el tuyo, el mío) y elige el movimiento que otorga la puntuación más alta. Si hay más de 60 movimientos disponibles, solo elegirá 60 aleatorios en cada paso. Por supuesto, si cualquier movimiento individual (de todos ellos, no los 60 elegidos) terminará el juego, lo tomaré de inmediato.
Para anotar un tablero, le doy a cada pieza un valor base. Luego se modifica por la movilidad de la pieza, cuántas (y qué) piezas amenaza y cuántas piezas la amenazan.
Por supuesto, los reyes móviles no son necesariamente buenos al principio del juego, por lo que en especial los valores para ellos un poco.
Esto funciona bastante rápido y puede terminar un juego con la cosecha actual en 3-4 segundos. Parece que hay espacio para subirlo un par de movimientos si es necesario.
actualizar:
fuente
color.opposite()
lugar degetOpponent()
;)Alfa Beta
Lo sentimos, solo por haber transformado y fusionado código de otras fuentes de Internet en este código JAVA. Pero supera a todos los demás oponentes (incluido PieceMaker) ... hasta ahora.
Y lo siento, por jugar tan aburrido.
fuente
No es una respuesta, sino una simulación para ayudar
Agregué una nueva clase: GamePanel y edité Game and Controller
No es muy bonito ... todavía.¿Sabías que Unicode tenía personajes de ajedrez? (¡totalmente increíble!)Por cierto, necesitas UTF-8 para que se muestren estos personajes. Funcionó para mí, pero no estoy seguro de cómo funcionará en otros sistemas operativos.
Se corrigió el error del final de los juegos (gracias a Tim por señalarlo).
GamePanel:
Juego:
Controlador:
fuente
SimulationListener
, y si no hay más juegos, se lanza una excepción. Y hubiera puesto blanco en la parte inferior, pero supongo que tu camino también funciona :)No pienses adelante
A esta 'IA' no le gusta pensar en el futuro. Si ve que puede atrapar una pieza enemiga, lo hará de inmediato. Si no puede, solo moverá una pieza al azar.
Es un poco mejor que
SimplePlayer
y,TestPlayer
y lo escribí principalmente para tener una idea del código del controlador y tener algo para probar.fuente
Queso
Sí, has leído bien. Un bloque de queso, jugando al ajedrez.
Algoritmo
El queso verifica todos los movimientos posibles y los puntúa en consecuencia. Él (el queso, y sí, es un hombre) usa la siguiente guía para calificar sus elecciones:
Comiendo
Riesgo de ser comido
Posibilidad de comer el próximo turno
Mejoras pendientes
Errores corregidos
fuente
SimplePlayer
Este jugador solo se asegura de usar movimientos válidos, pero por lo demás es bastante tonto.
fuente