Derby a scacchiera


16

Quali potrebbero essere più opposti polari degli scacchi e derby demolizioni . Penseresti che nessuno a cui piace l'uno godrebbe l'altro ... fino ad oggi.

Regole

La posizione di partenza è una scacchiera standard:

RNBQKBNR
PPPPPPPP 





PPPPPPPP 
RNBQKBNR

Sembra abbastanza normale, fino a quando non scopri che è OGNI PEZZO PER SE STESSO, ULTIMO PEZZO IN PIEDI concorrenza :

  • Ad ogni turno, ogni pezzo sulla scacchiera fa una mossa valida selezionata casualmente * (usando le sue regole di mossa standard). Tuttavia, l'ordine in cui i pezzi si muovono è randomizzato ogni turno.
  • Un pezzo può catturare QUALSIASI PEZZO , anche se ha lo stesso colore, persino un re.
  • I pedoni possono catturare AVANTI , oltre che diagonali. Inoltre, come al solito, se c'è uno spazio vuoto davanti a sé, una pedina può muovere di due spazi alla sua prima mossa (possono anche catturare in quel modo.) Inoltre, le pedine promuovono a qualsiasi pezzo casuale (incluso il re) diverso da un pedone.
  • Il vincitore è l'ultimo pezzo in piedi. Tuttavia se dopo 1000 turni rimane più di un pezzo, tutti i pezzi rimanenti sono vincitori.
  • No En Passants, Check, Castles, ecc.

Produzione

Dopo ogni turno, inserisci il numero del turno e l'aspetto della scheda. Dopo che un pezzo viene ucciso, viene rimosso dal tabellone. Dopo il primo turno, il tabellone potrebbe apparire così:

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

Dopo 1000 mosse la scacchiera potrebbe apparire così:

1000.
  Q  K


P  N R

 R  B N   

  Q

E il gioco finisce.

O forse dopo 556 giri il tabellone assomiglia a questo:

556.


     R





Quindi il gioco finisce qui.

* Assicurati che tutta la randomizzazione fatta in questa sfida sia uniforme (ogni possibilità ha pari possibilità di verificarsi).


Se una pedina può catturare senza muoversi in diagonale, può anche muoversi in diagonale senza catturare?
trichoplax,

1
@tri no, non può.
geokavel,

Una pedina può catturare due pezzi contemporaneamente quando fa una doppia mossa?
orlp

1
@orlp No, dovrei chiarirlo. Puoi muoverne solo due, se c'è uno spazio vuoto davanti a te.
geokavel,

1
Inoltre, nei tuoi esempi, devi distinguere i pedoni come bianchi o neri (il pbianco e Pnero è standard nella FEN ), perché si muovono in direzioni diverse.
mbomb007,

Risposte:


3

Python 2 , 862 846 844 byte

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

Provalo online!

Risparmiato 18 byte grazie a Jonathan Frech


855 byte (non completamente testato).
Jonathan Frech,


Penso che ...]+[(a+b)]*2possa essere ...]+[a+b]*2o ...,a+b,a+b].
Jonathan Frech,

0

PHP, 1849 byte

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

Provalo online!

Può sicuramente giocare a golf di più, e sembra un po 'come il funzionamento di un pazzo (che, suppongo, potrebbe essere).

Sono impressionato dalla rapidità con cui le mosse casuali possono liberare il tabellone (ho visto 15 mosse farlo). Inoltre, penso che l'unico che ho visto colpire il limite del 1000 sia stato due vescovi su diversi colori che danzavano.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.