国际象棋德比


16

与国际象棋和拆除德比相比,极性可能更大。您可能会认为,直到今天,没有一个人喜欢另一个人。

规则

起始位置是标准棋盘:

RNBQKBNR
PPPPPPPP 





PPPPPPPP 
RNBQKBNR

看起来已经足够正常了,直到您发现这是一场比赛的最后一场比赛:

  • 每一回合,棋盘上的每个棋子都会随机做出*选择的有效举动(使用其标准举动规则)。但是,棋子的移动顺序每轮都是随机的
  • 即使与它的颜色相同,一块也可以捕获任何一块,甚至是国王。
  • 兵可以捕获FORWARD以及对角线。而且,像平常一样,如果在其前面有一个空白空间,则典当可以在其第一步移动两个空间(它们也可以捕捉到该空间)。此外,典当可以提升为除典当。
  • 获胜者是最后一站。但是,如果经过1000转之后,剩下的筹码不止一个,那么其余所有筹码都是赢家。
  • 没有En Passants,Checks,Castle等

输出量

每次转弯后,输出转弯编号以及板子的外观。杀死一块后,将其从板上移除。在第一回合之后,棋盘可能看起来像这样:

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

经过1000次移动后,木板可能如下所示:

1000.
  Q  K


P  N R

 R  B N   

  Q

游戏结束。

或者,在556转动板后,如下所示:

556。


     [R





游戏到此结束。

*请确保在此挑战中完成的所有随机化都是统一的(所有可能性均等发生)。


如果典当可以在不对角移动的情况下捕获,那么它也可以对角在不捕获的情况下移动吗?
trichoplax

1
@tri不,它不能。
geokavel

当棋子进行两次移动时,它可以一次捕获两个棋子吗?
orlp

1
@orlp不,我应该澄清一下。如果前方没有空间,则只能移动两个。
geokavel

1
此外,在你的例子,你需要区分棋子的黑或白色(p黑色和P白色是标准FEN),因为它们移到不同的方向。
mbomb007'1

Answers:


3

Python 2中862个 846 844字节

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

在线尝试!

由于乔纳森·弗雷希(Jonathan Frech),节省了18个字节


855个字节(未完全测试)。
乔纳森·弗雷希


我认为...]+[(a+b)]*2可以是...]+[a+b]*2...,a+b,a+b]
乔纳森·弗雷奇

0

PHP,1849字节

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

在线尝试!

肯定可以打更多的球,而且看起来有点像疯子的作品(我想可能是这样)。

我对随机移动能以多快的速度清除木板印象深刻(我已经看过15个移动能做到)。另外,我认为我看到的唯一一个达到1000个极限的就是两个主教跳舞,他们的肤色各不相同。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.