Inspiré par ce récent article racontant un programmeur français qui a écrit un programme d'échecs à 2 joueurs (humain contre humain) de 487 octets dans Assembly, je me suis demandé comment de petits programmes d'échecs pouvaient être dans d'autres langues.
Détails
- Le programme ne doit accepter que les coups d'échecs légaux.
- La déclaration de chèque / échec et mat n'est pas nécessaire (juste souhaitable), bien que la première règle s'applique en cas de chèque.
- Selon l'article, le roque n'est pas une mise en œuvre nécessaire.
- De plus, vous n'avez pas à implémenter en passant.
- Cependant, vous devez autoriser la promotion des pions lorsque vous atteignez le huitième rang (vous pouvez simplement forcer la conversion en reine).
- C'est à vous de voir comment la carte est affichée - terminal ASCII, GUI, etc.
- Vous devez indiquer de qui il s'agit.
Les règles des échecs peuvent être trouvées ici - ignorez les règles de tournoi spécifiées (par exemple le timing, le toucher), et rappelez-vous que le roque et le passant ne sont pas des implémentations nécessaires.
a1 h8
déplacer une tour en diagonale dans le coin opposé, en sautant par-dessus les pionsRéponses:
C,
650600Pour réduire le code d'initialisation de la carte, l'écran affiche blanc (majuscule) de gauche à droite et noir (minuscule) de droite à gauche. L'entrée est sous la forme de deux nombres décimaux à 2 chiffres (position de départ et position de fin), donnant le fichier (0-7) et le rang (0-7). Pour un peu de code supplémentaire (soustrayez 11 de chaque entrée), une entrée peut être effectuée pour se conformer à http://en.wikipedia.org/wiki/ICCF_numeric_notation (chiffres 1-8)
Voici un exemple de capture d'écran où Black vient de faire avancer son pion de tour. White tente divers mouvements illégaux avec sa reine, avant de finalement capturer le pion. Les clignotants sont
a
pour le noir etA
pour le blanc.Une caractéristique intéressante de ma validation est l'utilisation du carré de la distance euclidienne. Pour le chevalier, c'est toujours 1 ^ 2 + 2 ^ 2 = 5, mais je l'utilise aussi pour le roi et le pion.
Le test de vérification est effectué en sauvegardant le plateau, en exécutant le mouvement des joueurs et en balayant les 64 mouvements possibles de l'adversaire.
Le programme doit être terminé avec Ctrl-C. Je ne peux pas penser à une façon plus gracieuse de le faire, autre que de faire un geste spécial pour mettre fin au programme. Une partie d'échecs se termine en fait lorsqu'un joueur est incapable de se déplacer à son tour (échec et mat) et cela nécessite beaucoup de tests qui ne sont pas requis par la spécification.
Code commenté
la source
s,f
faut-il l'initialiser? Les espaces sur les cases vides sont super imo.s
était un report d'une étape antérieure. Je l'ai supprimé maintenant.e=y*y+x*x=f-s-u*y=f/u-s/u;
.=
ne semble la seule interprétation. Ene=y*y+x*(x=..
ce qui concerne je suis un peu méfiant de l'ordre d'exécution car j'ai obtenu la mauvaise réponse d'un argument modifié dans uneprintf
instruction, mais dans ce cas, cela semble fonctionner correctement sur GCC / Cygwin. J'attendrai plus de changements avant de l'inclure dans le code. Une chose manque encore est une vérification des nombres en dehors de la plage 0..77 (que je ne vois pas comme requis par les spécifications, mais de toute façon ..)t^=32
verst^=w
eta[95],b[95]
versa[z],b[z]
. Le code est étonnamment lisible. Probablement à cause des commentaires verbeux!Python 3,
11661071993 octetsJ'ai seulement réalisé que je devais empêcher les rois de passer au chèque après avoir fini, mais voici ma soumission de toute façon
Pour jouer, entrez quatre nombres délimités par des espaces, les 2 premiers étant les coordonnées de la pièce vers laquelle vous souhaitez vous déplacer et les 2 autres où vous voulez qu'elle se déplace.
la source
a=o*8;j=[list(s) for s in ["RNBKQBNR","P"*8,a,a,a,a,"p"*8,"rnbkqbnr"]]
.spilt()
défaut, il est également divisé en espaces blancs, vous pouvez donc utiliser à lainput().split()
place deinput().split(" ")
2and
,1or
etc.)False
peut être0!=0
.False
peut être0
- çanot 0
devrait bien fonctionner ...Désolé pour le retard.
Le programme s'appelle ChesSkelet. Actuellement, il utilise 352 octets pour le code et les données. Il est écrit en Z80 Assembly, et en particulier pour le ZX Xpectrum.
Si vous n'avez pas envie de le compiler et de le charger dans un émulateur, vous pouvez jouer en ligne sur le site ChesSkelet ( http://chesskelet.x10host.com ).
Le programme est assez simple, une grosse boucle où: - alternativement (1) le blanc entre son mouvement ou (2) le noir exécute son micro AI pour se déplacer. - le tableau est mis à jour à l'écran. encore une fois, il y a un énorme guide décrivant le programme et les techniques sur le site Web.
la source
> <> , 1467 octets
Eh bien, cela ne bat pas tout à fait le record de 487 octets…
Essayez-le au terrain de jeux de poissons ! (Il utilise quelques bogues dans cet interprète, donc je ne peux pas promettre que cela fonctionnera ailleurs. Vous voudrez probablement l'exécuter à la vitesse maximale - cela peut prendre plus d'une minute pour effectuer un mouvement.)
Lorsque vous exécutez le code, il s'imprime
Les majuscules représentent le blanc, les minuscules représentent le noir. Vous pouvez ensuite donner à votre mouvement en entrée sous la forme
[a-h][1-8][a-h][1-8]
, par exemplee2e4
, ce qui signifie « déplacer la pièce àe2
lae4
». Le programme imprimera ensuite, par exemple,La principale forme de mémoire dans> <> est la pile; cependant, ce n'est pas très pratique pour ranger un échiquier. Au lieu de cela, j'ai utilisé la capacité d'auto-modification de> <> pour stocker l'échiquier dans le code source lui-même, y accéder avec
g
etp
.La majeure partie du code consiste à vérifier si votre déménagement est légal. Il y a plusieurs choses à vérifier ici:
Si l'une de ces questions a la mauvaise réponse, le programme lance une erreur et s'arrête; sinon, il édite l'échiquier dans son code source, l'imprime à nouveau et attend le prochain mouvement.
Pour les mouvements de roi et de chevalier, j'ai emprunté l'astuce de Level River St pour vérifier la distance euclidienne au carré: pour un roi, c'est moins de 3, et pour un chevalier, c'est exactement 5.
la source