Derby aux échecs

16

Quoi de plus opposés polaires que les échecs et le derby de démolition . On pourrait penser que personne qui aime l'un ne profiterait de l'autre ... jusqu'à aujourd'hui.

Règles

La position de départ est un échiquier standard:

RNBQKBNR
PPPPPPPP 





PPPPPPPP 
RNBQKBNR

Semble assez normal, jusqu'à ce que vous découvriez que c'est une compétition CHAQUE PIÈCE POUR ELLE-MÊME ET DERNIÈRE PIÈCE :

  • À chaque tour, chaque pièce du plateau peut effectuer un coup valide sélectionné au hasard * (en utilisant ses règles de déplacement standard). Cependant, l'ordre dans lequel les pièces se déplacent est aléatoire à chaque tour.
  • Une pièce peut capturer N'IMPORTE QUELLE PIÈCE , même si elle est de la même couleur qu'elle, même un roi.
  • Peuvent capturer Pions AVANT , ainsi que la diagonale. De plus, comme d'habitude, s'il y a un espace vide devant lui, un pion peut déplacer deux espaces lors de son premier mouvement (ils peuvent également capturer de cette façon). pion.
  • Le gagnant est la dernière pièce debout. Cependant, si après 1000 tours , il reste plus d'une pièce, toutes les pièces restantes sont gagnantes.
  • Pas de passants, chèques, châteaux, etc.

Production

Après chaque tour, sortez le numéro du tour et l'apparence de la carte. Une fois qu'une pièce est tuée, elle est retirée du plateau. Après le premier tour, le tableau peut ressembler à ceci:

1.
   K    
RBQ N BR  
NP  P P
  PP P P
R PP
BPN PNP
    K  R 
       Q

Après 1000 mouvements, le tableau peut ressembler à ceci:

1000.
  Q  K


P  N R

 R  B N   

  Q

Et le jeu se termine.

Ou peut-être qu'après 556 tours, la planche ressemble à ceci:

556.


     R





Donc le jeu s'arrête là.

* Veuillez vous assurer que toutes les randomisations effectuées dans ce défi sont uniformes (chaque possibilité a une chance égale de se produire).

geokavel
la source
Si un pion peut capturer sans se déplacer en diagonale, peut-il également se déplacer en diagonale sans capturer?
trichoplax
1
@tri non, ça ne peut pas.
geokavel
Un pion peut-il capturer deux pièces à la fois lorsqu'il effectue un double mouvement?
orlp
1
@orlp Non, je dois préciser cela. Vous ne pouvez en déplacer que deux, s'il y a un espace vide devant vous.
geokavel
1
De plus, dans vos exemples, vous devez distinguer les pions en noir ou blanc (le pnoir et Pblanc est standard dans FEN ), car ils se déplacent dans des directions différentes.
mbomb007

Réponses:

3

Python 2 , 862 846 844 octets

from random import*
A=-1;a,b=[(0,1),(0,A),(A,0),(1,0)],[(A,A),(A,1),(1,A),(1,1)]
r=range(8)
C='RNBQK';q=C+'BNR'
def m(x,y,B,t):
 P=B[y][x];M=[]
 for w,z in dict(zip('pP'+C,[[],[],a,zip([A,1,-2,2]*2,[2,2,1,1,-2,-2,A,A]),b]+[a+b]*2))[P]:
	for i in r[1:]:
	 X,Y=x+z*i,y+w*i;M+=(X,Y),
	 if P in'NK'or 1-(8>X>A<Y<8)or' '<B[Y][X]:break
 if P in'pP':d=[A,1][P<'p'];M=zip((x-1,x,x+1)[B[y+d][x-1]<'!':2+(B[y+d][-~x%8]>' ')],(y+d,)*3)+[(x,y+2*d)]*(t*B[y+d][x]<'!')
 return choice([(X,Y)for X,Y in M if-1<X<8>Y>A])
B=map(list,[q,'P'*8]+[' '*8]*4+['p'*8,q])
t=0
while t<1e3:
 t+=1;p=[(x,y)for y in r for x in r if' '<B[y][x]];shuffle(p)
 if len(p)<2:break
 while p:x,y=p.pop();Z=X,Y=m(x,y,B,t<2);B[Y][X],B[y][x]=B[y][x],' ';Z in p and p.remove(Z)
 for j in 0,7:
	for i in r:
	 if B[j][i]in'pP':B[j][i]=choice(C)
 print t
 for l in B:print''.join(l).upper()

Essayez-le en ligne!

18 octets enregistrés grâce à Jonathan Frech

TFeld
la source
855 octets (non entièrement testés).
Jonathan Frech
847 octets .
Jonathan Frech
Je pense que ...]+[(a+b)]*2peut être soit ...]+[a+b]*2ou ...,a+b,a+b].
Jonathan Frech
0

PHP, 1849 octets

<?$z=[R,N,B,Q,K,B,N,R];$y=[_,_,_,_,_,_,_,_];$u=shuffle;$b=[$z,[P,P,P,P,P,P,P,P],$y,$y,$y,$y,[p,p,p,p,p,p,p,p],$z];$z=[R,N,B,Q,K];for($i=0;$i<8;$i++)for($j=0;$j<8;$j++)$r[]=[$i,$j];for(;$c++<=999;){for($i=$_=0;$i<8;$i++)for($j=0;$j<8;$j++)if($b[$i][$j]!=_)++$_;if($_<2)break;$u($r);$n=[];foreach($r as$l){list($y,$x)=$l;$a=$y+1;$d=$y-1;$j=$x+1;$t=$x-1;$p=$b[$y][$x];if($n[$y][$x]!=1&&$p!=_){$v=$e=$f=$g=$h=$k=$o=$q=$s=[];if($p==R||$p==K||$p==Q){$m=($p==K)?2:9;for($i=1;$i<$m;$i++){if(!$e&&$y-$i>=0){$v[]=[$y-$i,$x];if($b[$y-$i][$x]!=_)$e=1;}if(!$f&&$y+$i<8){$v[]=[$y+$i,$x];if($b[$y+$i][$x]!=_)$f=1;}if(!$g&&$x-$i>=0){$v[]=[$y,$x-$i];if($b[$y][$x-$i]!=_)$g=1;}if(!$h&&$x+$i<8){$v[]=[$y,$x+$i];if($b[$y][$x+$i]!=_)$h=1;}}}if($p==B||$p==K||$p==Q){$m=($p==K)?2:9;for($i=1;$i<$m;$i++){if(!$k&&$y-$i>=0&&$x-$i>=0){$v[]=[$y-$i,$x-$i];if($b[$y-$i][$x-$i]!=_)$k=1;}if(!$o&&$y-$i>=0&&$x+$i<8){$v[]=[$y-$i,$x+$i];if($b[$y-$i][$x+$i]!=_)$o=1;}if(!$q&&$y+$i<8&&$x-$i>=0){$v[]=[$y+$i,$x-$i];if($b[$y+$i][$x-$i]!=_)$q=1;}if(!$s&&$y+$i<8&&$x+$i<8){$v[]=[$y+$i,$x+$i];if($b[$y+$i][$x+$i]!=_)$s=1;}}}if($p==N){if($y-2>=0&&$t>=0)$v[]=[$y-2,$t];if($y-2>=0&&$j<8)$v[]=[$y-2,$j];if($d>=0&&$x-2>=0)$v[]=[$d,$x-2];if($d>=0&&$x+2<8)$v[]=[$d,$x+2];if($a<8&&$x-2>=0)$v[]=[$a,$x-2];if($a<8&&$x+2<8)$v[]=[$a,$x+2];if($y+2<8&&$t>=0)$v[]=[$y+2,$t];if($y+2<8&&$j<8)$v[]=[$y+2,$j];}if($p==P){if($y==1&&$b[$a][$x]==_)$v[]=[$y+2,$x];if($j<8&&$b[$a][$j]!=_)$v[]=[$a,$j];if($t>=0&&$b[$a][$t]!=_)$v[]=[$a,$t];$v[]=[$a,$x];}if($p==p){if($y==6&&$b[$d][$x]==_)$v[]=[$y-2,$x];if($j<8&&$b[$d][$j]!=_)$v[]=[$d,$j];if($t>=0&&$b[$d][$t]!=_)$v[]=[$d,$t];$v[]=[$d,$x];}$u($v);$v=$v[0];$b[$y][$x]=_;$w=$p;if($w==P&&$v[0]>6&&$u($z)&&$w=$z[0]);if($w==p&&$v[0]<1&&$u($z)&&$w=$z[0]);$b[$v[0]][$v[1]]=$w;$n[$v[0]][$v[1]]=1;}}echo $c.".
";foreach($b as$a)echo str_replace([_,p],[' ',P],join("",$a))."
";}

Essayez-le en ligne!

Ça peut certainement être plus joué au golf, et il ressemble un peu au fonctionnement d'un fou (ce qui, je suppose, peut-être).

Je suis impressionné par la rapidité avec laquelle les mouvements aléatoires peuvent vider le plateau (j'ai vu 15 mouvements le faire). De plus, je pense que le seul que j'ai vu atteindre la limite de 1000 était deux évêques de couleurs différentes qui dansaient.

Jo.
la source