Il s'agit d'un jeu d'échecs avec des règles simplifiées (car les échecs eux-mêmes sont déjà compliqués, le jouer via un programme simple ne le rend pas plus facile). Pour le moment, il est limité à Java (version 8), mais la création d'une classe wrapper n'est pas si difficile (au cas où quelqu'un voudrait le faire).
Échiquier
L'échiquier du programme de contrôle utilise une version modifiée de la notation numérique ICCF . Il est basé sur zéro, ce qui signifie que le champ en bas à gauche est la position 0,0
, tandis que le champ en haut à droite est la position 7,7
.
Règles modifiées
- En passant sera ignoré.
- Le roque n'est pas possible.
- La règle des cinquante coups s'applique automatiquement (ce qui signifie que le jeu se termine par un match nul).
- La promotion des pions aux reines se produit automatiquement lorsqu'ils atteignent la fin du plateau.
- Si un joueur a besoin de plus de 2 secondes pour se déplacer, il perdra la partie.
- Le retour d'un coup invalide entraînera la perte de la partie.
- Pour gagner, vous devez capturer le roi ennemi . Il ne suffit pas de mater l'ennemi.
- Cela vous permet également de déplacer votre roi vers des champs où l'ennemi peut vous capturer.
- Les blancs commencent le jeu.
- Le blanc est placé "en bas" du champ (y = 0), le noir est situé en haut (y = 7).
- L'accès à d'autres ressources que votre bot (internet, fichiers, autres bots, ...) est interdit.
Notation
- Gagner vous accorde 3 points, un match nul 1 point et perdre 0 points.
- Chaque soumission sera jouée 10 fois contre l'autre (5 fois blanche, 5 noire).
Manette
Vous pouvez trouver le programme de contrôle sur github .
Pour participer, vous devez créer une classe à l'intérieur duplayer
package et ce doit être une sous-classe dePlayer
. Par exemple, regardez TestPlayer (qui sera également inclus dans la notation).
À chaque partie, le contrôleur créera une nouvelle instance de votre joueur. Ensuite, à chaque tour, vous devez retourner un coup. Le contrôleur vous fournit une copie de la carte , qui contient un tableau 8x8 de champs . Un champ contient des informations sur sa couleur, sa position et la pièce qu'il contient , s'il y en a une.
Le contrôleur vous fournit également des informations sur le joueur ennemi, telles que isCheck
et getPieces()
. Faire appel getMove()
à l'ennemi vous fera disqualifier.
Tableau d'affichage
01) AlphaBetaPV: 229 02) AlphaBeta: 218 03) PieceTaker: 173 04) Fromage: 115 05) ThreeMoveMonte: 114 06) StretchPlayer: 93 07) DontThinkAhead: 81 08) SimplePlayer: 27 09) TestPlayer: 13
Le concours est limité à java car il facilite la création de réponses, puisque vous pouvez bénéficier des méthodes fournies par le contrôleur. Cependant, si quelqu'un crée un wrapper, j'inclurai d'autres langues.
la source
you can profit from the methods provided by the controller
: Ce n'est pas tout à fait vrai. La plupart des méthodes utiles sont des packages privés, elles ne peuvent donc pas être utilisées. Pourriez-vous peut-être ajouter unesimulateMove
méthode à laBoard
classe, qui renvoie une copie complète du tableau avec le mouvement donné appliqué? De cette façon, nous n'avons pas à l'écrire nous-mêmes (ou à copier-coller l'intégralité de votre code ^^).public
maintenant;)Throwable
ou mêmeError
car il évitera de perdre. Je l'appellerais BoardTipper.Réponses:
AlphaBetaPV
AlphaBetaPV signifie Alpha Beta avec variation principale (ce n'est pas une recherche de variation principale). Avec seulement quelques lignes supplémentaires tissées dans le code d'AlphaBeta.java, il bat AlphaBeta.java. Et encore une fois, désolé, uniquement pour le morphing et la fusion de codes provenant d'autres sources Internet dans ce code JAVA.
Toujours ennuyeux.
la source
PieceTaker
Le code est un peu désordonné, mais il fonctionne. À l'heure actuelle, il gagne contre tous les autres joueurs, même s'il ne dispose que de 400 ms au lieu des 2000 ms autorisés.
J'utilise l'élagage alpha bêta avec un approfondissement itératif pour m'assurer que l'IA ne dépasse pas la limite de temps. L'heuristique actuelle est très simple (seules les pièces perdues / prises sont prises en compte; pas la position sur le plateau, etc.).
À l'avenir, je pourrais également ajouter des heuristiques de tueur et trier les mouvements avant de les examiner.
la source
StretchPlayer
Ce bot joue comme moi!
Au fait, je suis terrible aux échecs.
Les commentaires expliquent ce qu'il fait réellement. Cela ressemble beaucoup à mon processus de réflexion.
En prime, bat tous les autres bots d'une marge considérable. (jusque là)
EDIT: prédit maintenant l'adversaire en se présentant comme l'ennemi!
EDIT 2: Le programme a fait l'erreur de ne pas réellement tuer le roi quand il était grand ouvert. Il a été réprimandé en conséquence.
la source
Three Move Monte
Ce gars regarde les trois prochains mouvements (le mien, le vôtre, le mien) et choisit le mouvement qui donne le score le plus élevé. S'il y a plus de 60 mouvements disponibles, il choisira simplement 60 au hasard à chaque étape. Bien sûr, si un seul mouvement (parmi tous, pas les 60 choisis) mettra fin au jeu, je le prendrai immédiatement.
Pour marquer une planche, je donne à chaque pièce une valeur de base. Il est ensuite modifié par la mobilité de la pièce, combien (et quelles) pièces elle menace et combien de pièces la menacent.
Bien sûr, les rois mobiles ne sont pas nécessairement bons en début de partie, donc je les cas un peu spéciaux.
Cela fonctionne assez rapidement et peut terminer un jeu avec la récolte actuelle en 3-4 secondes. Il semble qu'il y ait de la place pour augmenter quelques mouvements si besoin est.
mise à jour:
la source
color.opposite()
place degetOpponent()
;)Alpha Beta
Désolé, pour avoir uniquement transformé et fusionné le code d'autres sources Internet dans ce code JAVA. Mais il bat tous les autres adversaires (y compris PieceMaker) ... jusqu'à présent.
Et désolé, pour avoir joué si ennuyeux à la machine.
la source
Pas une réponse, mais une simulation pour aider
J'ai ajouté une nouvelle classe: GamePanel et édité Game and Controller
Ce n'est pas très joli ... pour le moment.Saviez-vous qu'Unicode avait des personnages d'échecs!?!? (absolument génial!)Soit dit en passant, vous avez besoin d'UTF-8 pour que ces personnages s'affichent. Cela a fonctionné pour moi, mais je ne sais pas comment cela fonctionnera sur d'autres systèmes d'exploitation.
Correction d'un bug de fin de partie (merci à Tim de l'avoir signalé).
GamePanel:
Jeu:
Manette:
la source
SimulationListener
, et s'il n'y a plus de jeux, une exception est levée. Et j'aurais mis du blanc en bas, mais je suppose que votre chemin fonctionne aussi :)DontThinkAhead
Cette «IA» n'aime pas penser à l'avenir. S'il voit qu'il peut attraper une pièce ennemie, il le fera immédiatement. Si ce n'est pas le cas, il déplacera simplement une pièce au hasard.
Il est légèrement meilleur que
SimplePlayer
etTestPlayer
je l'ai principalement écrit pour avoir une idée du code du contrôleur et avoir quelque chose à tester.la source
Fromage
Oui, vous l'avez bien lu. Un bloc de fromage, jouant aux échecs.
Algorithme
Le fromage vérifie tous les mouvements possibles et les marque en conséquence. Il (le fromage, et oui c'est un mâle) utilise le guide suivant pour noter ses choix:
En mangeant
Risque de se faire manger
Chance de manger au prochain tour
Améliorations en attente
Bugs corrigés
la source
SimplePlayer
Ce joueur s'assure simplement qu'il utilise des mouvements valides, mais sinon, il est assez stupide.
la source