pieces_echecs.py

Created by caucaucybu

Created on June 25, 2024

5.43 KB


from kandinsky import fill_rect as d,draw_string as dt,set_pixel as dp
from math import cos,sin,pi
from time import monotonic as h,sleep as p
ee=enumerate
z=type
r=round
ga=getattr
q=print
it=int
ft=float
sr=str
K=KeyboardInterrupt
E=Exception
rg=range
CCN=222,89,0
CCB=255,219,132
CPN=0,0,0
CPB=255,255,255
CT=165,166,165
se={-1:(1,1),0:(1,1),1:(-1,1),"x":0,"y":0,"i":1}
ii=lambda val:-1<val<8
cf=lambda un,de:1 if un and de and(un.c and not de.c or not un.c and de.c)else 0
def g(x,y):
 if se["x"]:x=7-x
 if se["y"]:y=7-y
 x,y=[x,y][::se["i"]];return[r(60+y*25),r(20+x*25)]
def rd(x,y,r=5,cl=0,v=1):
 if v:x,y=g(x,y)
 x+=13;y+=13;cl=cl or CT
 for i in rg(91):c=cos((i*pi)/180)*r;s=sin((i*pi)/180)*r;d(it(x-c),it(y-s),it(2*c),it(2*s),cl)
def st(x,y,c=25,v=1):
 if v:x,y=g(x,y)
 tt=0
 for i in rg(c):
  if c % 2:t=tt
  for j in rg(c):
   if t:dp(x+i,y+j,CT);t=0
   else:t=1
  if tt:tt=0
  else:tt=1
def m(x,y,pb=None):return {"x":x,"y":y,"pb":pb}
class C:
 dn=[]
 def __init__(sf,gm=None,x=-1,y=-1,c=-1):
  sf.gm,sf.x,sf.y,sf.c=gm,x,y,c;sf.sd=0
 def __bool__(sf):return False if sf.c==-1 else True
 def __repr__(sf):return""
 def d(sf,il=0,ps=None,cl=None,pos=None,jg=0,dy=0):
  ps=ps or se[sf.c];x,y=pos or g(sf.x,sf.y);y+=dy
  if cl is None:d(x,y,25,25,CT)if sf.sd else d(x,y,25,25,[CCN,CCB][(sf.x+sf.y)% 2])
  else:d(x,y,25,25,cl)
  if il:st(sf.x,sf.y)
  if not jg:
   for xb,i in ee(sf.dn[::ps[0]]):
    for yb,j in ee("{0:21b}".format(i)):
     xx,yy=[xb,yb][::ps[1]]
     if j=="1":dp(xx+2+x,yy+2+y,CPB if sf.c else CPN)
class P(C):
 n="";pn=0;ms=()
 def __init__(sf,*a,sl=0,cg=None,**ka):
  sf.sl=sl;super().__init__(*a,**ka)
  if cg:sf.sg(cg)
 def __repr__(sf):a=set(dir(sf));return(sf.n.upper()if sf.c else sf.n)+("," if a else"")+",".join([sr(ga(sf,i))for i in set(dir(sf)).difference(["x","y","c"])if z(ga(sf,i))is it])
 def sg(sf,cg):sf.gt=it(cg[0])
 def tg(sf,x,y):
  if sf.sl:return 1
  r=sf.gm.r[sf.c];xx,yy=sf.x,sf.y;sf.gm.p[sf.x][sf.y]=C(sf.gm,sf.x,sf.y);sf.gm.p[x][y],pc_av=sf,sf.gm.p[x][y];sf.x,sf.y=x,y
  if r.ec():r=0
  else:r=1
  sf.gm.p[xx][yy]=sf;sf.gm.p[x][y]=pc_av;sf.x,sf.y=xx,yy;return r
 def t(sf):
  ms=[]
  for i,j in sf.ms:
   av=1
   while ii(sf.x+av*i)and ii(sf.y+av*j):
    ct=sf.gm.p[sf.x+av*i][sf.y+av*j]
    if not ct:
     if sf.tg(sf.x+av*i,sf.y+av*j):ms.append(m(sf.x+av*i,sf.y+av*j))
    else:
     if cf(ct,sf)and sf.tg(sf.x+av*i,sf.y+av*j):ms.append(m(sf.x+av*i,sf.y+av*j,ct))
     break
    av+=1
  return ms
 def b(sf,mv,sv=1):
  if sv:sf.gm.pe+=sr(sf.x)+sr(sf.y)+":"+sr(mv["x"])+sr(mv["y"])
  sf.gm.vb(mv,sv);sf.gm.p[mv["x"]][mv["y"]]=sf;nc=C(sf.gm,sf.x,sf.y);sf.gm.p[sf.x][sf.y]=nc;sf.x,sf.y=mv["x"],mv["y"];sf.d();nc.d();return nc,sf
 def d(sf,*a,**ka):
  av,se["i"]=se["i"],1 if it(sf.y)!=sf.y else se["i"];super().d(*a,**ka);se["i"]=av
class Q(P):
 n="p";pn=1;dn=[0]*7+[7936,16256]+[32704]*4+[16256,7936]+[3584]*2+[7936,32704]+[131056]*2
 def __init__(sf,*a,**ka):sf.gt=-1;super().__init__(*a,**ka)
 def t(sf):
  ms=[];av=1 if sf.c else -1
  if av==-1 and not sf.y or av==1 and sf.y==7:return ms
  if not sf.gm.p[sf.x][sf.y+av]:
   if sf.tg(sf.x,sf.y+av):ms.append(m(sf.x,sf.y+av))
   if (sf.c and sf.y==1 or not sf.c and sf.y==6) and not sf.gm.p[sf.x][sf.y+2*av]and sf.tg(sf.x,sf.y+2*av):ms.append(m(sf.x,sf.y+2*av))
  for i in -1,1:
   if ii(sf.x+i):
    pt=sf.gm.p[sf.x+i][sf.y+av]
    if cf(sf,pt)and sf.tg(sf.x+i,sf.y+av):ms.append(m(sf.x+i,sf.y+av,pt))
    if sf.c and sf.y==4 or not sf.c and sf.y==3:
     pp=sf.gm.p[sf.x+i][sf.y]
     if z(pp)is Q and pp.gt==sf.gm.rt-1:
      sf.gm.p[sf.x+i][sf.y]=None
      if sf.tg(sf.x+i,sf.y+av):ms.append(m(sf.x+i,sf.y+av,pp))
      sf.gm.p[sf.x+i][sf.y]=pp
  return ms
 def b(sf,mv,sv=1):
  if abs(mv["y"]-sf.y)==2:sf.gt=sf.gm.rt
  if mv["y"]==7 or mv["y"]==0:
   xx,yy=sf.x,sf.y
   if sv:sf.gm.pe+=sr(sf.x)+sr(sf.y)+":"+sr(mv["x"])+sr(mv["y"])
   sf.gm.vb(mv,sv);sf.x,sf.y=mv["x"],mv["y"];sf.sd=1;sf.d();nc=C(sf.gm,xx,yy);sf.gm.p[xx][yy]=nc;nc.sd=1;nc.d()
   try:np=sf.gm.gn(sf)
   except(E,K)as e:
    sf.x,sf.y=xx,yy;sf.gm.p[xx][yy]=sf;sf.sd=0;sf.d();lm=sf.gm.pe.split()[-1]
    if lm.split(":")[2]:
     if sf.c:nc=sf.gm.pb[0].pop();nc.d(cl=CCB,jg=1)
     else:nc=sf.gm.pb[1].pop();nc.d(cl=CCN,jg=1)
    else:nc=C(sf.gm)
    nc.x,nc.y=mv["x"],mv["y"];sf.gm.p[nc.x][nc.y]=nc;nc.d();sf.gm.pe=" ".join(sf.gm.pe.split()[:-1]);raise e
   sf.gm.sc+=(np.pn-1)*(1 if sf.c else -1);np.gt=sf.gt;sf.gm.p[sf.x][sf.y]=np;np.x,np.y=sf.x,sf.y
   if sv:sf.gm.pe+=":"+np.n
   return nc,np
  else:return super().b(mv,sv)
class V(P):
 n="c";pn=3;dn=[0]*4+[15872,16256,16320]+[16368]*4+[16128]*6+[32704,65504]+[262136]*2
 def t(sf):
  ms=[]
  for i in 1,-1,2,-2:
   iii=i;i+=sf.x
   for j in 1,-1,2,-2:
    jjj=j;j+=sf.y
    if abs(iii)!=abs(jjj)and ii(i)and ii(j):
     pt=sf.gm.p[i][j]
     if(not pt or cf(sf,pt))and sf.tg(i,j):ms.append(m(i,j,pt))
  return ms
class F(P):n="f";pn=3;dn=[0,1024,3584,7936]+[16256]*2+[32512,32320,31936,32192]+[32704]*2+[16256]+[7936]*3+[16256]*2+[65504]+[262136]*2;ms=(-1,-1),(-1,1),(1,-1),(1,1)
class T(P):
 n="t";pn=5;dn=[0]*3+[118384]*2+[131056]*3+[32704]+[16256]*8+[32704,65504]+[262136]*2;ms=(0,-1),(0,1),(-1,0),(1,0)
 def __init__(sf,*a,**ka):sf.v=0;super().__init__(*a,**ka)
 def sg(sf,cg):
  if len(cg)==2:super().sg(cg);sf.v=it(cg[1])
  else:sf.v=it(cg[0])
 def b(sf,*a,**ka):
  if not sf.v:sf.v=sf.gm.rt
  return super().b(*a,**ka)
class D(P):n="d";pn=9;dn=[0]*7+[394252,986654,1966071,1638371,1576451,1838599,921102,462364,233016,101936]+[52832]*2+[262136]*2;ms=F.ms+T.ms
N={"p":Q,"c":V,"f":F,"t":T,"d":D}

During your visit to our site, NumWorks needs to install "cookies" or use other technologies to collect data about you in order to:

With the exception of Cookies essential to the operation of the site, NumWorks leaves you the choice: you can accept Cookies for audience measurement by clicking on the "Accept and continue" button, or refuse these Cookies by clicking on the "Continue without accepting" button or by continuing your browsing. You can update your choice at any time by clicking on the link "Manage my cookies" at the bottom of the page. For more information, please consult our cookies policy.