Schacholition Derby

16

Was könnte polarer sein als Schach und Abriss Derby . Sie würden denken, dass niemand, der das eine genießt, das andere genießen würde ... bis heute.

Regeln

Die Ausgangsposition ist ein Standardschachbrett:

RNBQKBNR
PPPPPPPP 





PPPPPPPP 
RNBQKBNR

Sieht normal genug, bis Sie es ein herausfinden, jedes Stück für sich LAST PIECE STANDING Wettbewerb:

  • In jedem Spielzug darf jede Figur auf dem Spielbrett einen zufällig ausgewählten gültigen Zug ausführen (gemäß den Standardzugregeln). Die Reihenfolge, in der sich die Teile bewegen, wird jedoch in jeder Runde zufällig festgelegt .
  • Ein Stück kann JEDES STÜCK einfangen , auch wenn es dieselbe Farbe hat wie es, sogar ein König.
  • Bauern können sowohl VORWÄRTS als auch diagonal fangen . Darüber hinaus kann ein Bauer, wenn sich ein leeres Feld davor befindet, im ersten Zug zwei Felder bewegen (sie können auch auf diese Weise fangen). Außerdem werden Bauern zu jeder beliebigen Figur (einschließlich König) außer a befördert Pfand.
  • Der Gewinner ist das letzte stehende Stück. Wenn jedoch nach 1000 Runden mehr als ein Teil übrig ist, sind alle verbleibenden Teile Gewinner.
  • Keine En-Passanten, Schecks, Schlösser usw.

Ausgabe

Geben Sie nach jeder Runde die Nummer der Runde und das Aussehen der Tafel aus. Nachdem ein Stück getötet wurde, wird es vom Brett entfernt. Nach dem ersten Zug könnte das Brett so aussehen:

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

Nach 1000 Zügen könnte das Brett so aussehen:

1000.
  Q  K


P  N R

 R  B N   

  Q

Und das Spiel endet.

Oder vielleicht sieht das Board nach 556 Umdrehungen so aus:

556.


     R





Das Spiel endet also dort.

* Bitte stellen Sie sicher, dass alle Randomisierungen in dieser Challenge einheitlich sind (jede Möglichkeit hat die gleiche Chance aufzutreten).

Geokavel
quelle
Wenn ein Bauer fangen kann, ohne sich diagonal zu bewegen, kann er sich auch diagonal bewegen, ohne zu fangen?
Trichoplax
1
@ Tri nein, es kann nicht.
Geokavel
Kann ein Bauer bei einem Doppelzug zwei Figuren gleichzeitig erobern?
Orlp
1
@orlp Nein, das sollte ich klarstellen. Sie können nur zwei bewegen, wenn vor Ihnen ein leerer Raum ist.
Geokavel
1
Außerdem müssen Sie in Ihren Beispielen die Bauern als schwarz oder weiß kennzeichnen ( pschwarz und Pweiß sind in FEN Standard ), da sie sich in verschiedene Richtungen bewegen.
mbomb007

Antworten:

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

Probieren Sie es online!

Dank Jonathan Frech wurden 18 Byte gespeichert

TFeld
quelle
855 Bytes (nicht vollständig getestet).
Jonathan Frech
847 Bytes .
Jonathan Frech
Ich denke ...]+[(a+b)]*2kann entweder ...]+[a+b]*2oder sein ...,a+b,a+b].
Jonathan Frech
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))."
";}

Probieren Sie es online!

Es kann definitiv mehr Golf gespielt werden, und es sieht ein bisschen wie das Verhalten eines Verrückten aus (was ich nehme an, es mag sein).

Ich bin beeindruckt, wie schnell zufällige Bewegungen das Spielfeld räumen können (ich habe gesehen, wie 15 Bewegungen es geschafft haben). Außerdem denke ich, dass der einzige, bei dem ich sah, dass er die 1000-Grenze überschritt, zwei Bischöfe in verschiedenen Farben waren, die tanzten.

Jo.
quelle