Derby da Xadrez

16

O que poderia ser mais oposto do que o derby de xadrez e demolição . Você pensaria que ninguém que goste de um desfrutaria do outro ... até hoje.

Regras

A posição inicial é um tabuleiro de xadrez padrão:

RNBQKBNR
PPPPPPPP 





PPPPPPPP 
RNBQKBNR

Parece normal o suficiente, até você descobrir que é uma competição de TODAS AS PEÇAS POR ÚLTIMA PARTE :

  • A cada turno, cada peça do tabuleiro faz um movimento válido selecionado aleatoriamente * (usando suas regras de movimento padrão). No entanto, a ordem em que as peças se movem é aleatória a cada turno.
  • Uma peça pode capturar QUALQUER PEÇA , mesmo que seja da mesma cor, até mesmo um rei.
  • Os peões podem capturar FORWARD e diagonal. Além disso, como normal, se houver um espaço vazio à sua frente, um peão pode mover dois espaços no primeiro movimento (eles também podem capturar dessa maneira). Além disso, os peões promovem qualquer peça aleatória (incluindo rei) que não seja um penhor.
  • O vencedor é a última peça em pé. No entanto, se após 1000 turnos houver mais de uma peça, todas as peças restantes serão vencedoras.
  • Sem passageiros, cheques, castelos, etc.

Resultado

Após cada turno, imprima o número do turno e a aparência do quadro. Depois que uma peça é morta, ela é removida do tabuleiro. Após o primeiro turno, o quadro pode ficar assim:

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

Após 1000 movimentos, o tabuleiro pode ficar assim:

1000.
  Q  K


P  N R

 R  B N   

  Q

E o jogo termina.

Ou talvez depois de 556 girar o quadro, fique assim:

556


     R





Então o jogo termina aí.

* Certifique-se de que toda a randomização realizada neste desafio seja uniforme (todas as possibilidades têm a mesma chance de ocorrer).

geokavel
fonte
Se um peão pode capturar sem se mover na diagonal, ele também pode se mover na diagonal sem capturar?
Trichoplax
1
@ Tri não, não posso.
precisa saber é
Um peão pode capturar duas peças ao mesmo tempo quando faz um movimento duplo?
orlp
1
@orlp Não, devo esclarecer isso. Você só pode mover dois, se houver um espaço vazio à sua frente.
geokavel
1
Além disso, em seus exemplos, você precisa distinguir os peões como preto ou branco ( ppreto e Pbranco é padrão no FEN ), porque eles movem direções diferentes.
mbomb007

Respostas:

3

Python 2 , 862 846 844 bytes

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()

Experimente online!

Guardado 18 bytes graças a Jonathan Frech

TFeld
fonte
855 bytes (não totalmente testado).
Jonathan Frech 27/10
847 bytes .
Jonathan Frech 27/10
Eu acho que ...]+[(a+b)]*2pode ser um ...]+[a+b]*2ou outro ...,a+b,a+b].
Jonathan Frech 27/10
0

PHP, 1849 bytes

<?$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))."
";}

Experimente online!

Definitivamente, pode- se jogar mais e parece um pouco com o funcionamento de um louco (o que, suponho, pode ser).

Estou impressionado com a rapidez com que os movimentos aleatórios podem limpar o tabuleiro (já vi 15 movimentos com isso). Além disso, acho que o único que vi atingir o limite de 1000 foram dois bispos com cores diferentes dançando.

Jo.
fonte