echecs.py

Created by caucaucybu

Created on June 25, 2024

8.67 KB


Échecs


Images

home start game settings


Installation

Pour pouvoir bénéficier du jeu, installer aussi :


Fonctionnalités

  • Déplacement des pièces
  • Prise en passant
  • Roque
  • Promotion du pion
  • Affichage des coups possibles
  • Affichage des coups joués
  • Affichage de l’échec et de l’échec et mat
  • Affichage du pat
  • Affichage de la nulle par manque de matériel
  • Menu de configuration
  • Sauvegarde et chargement des parties

Utilisation

  • Pour jouer, il suffit d’exécuter le script echecs.py.
  • Pour déplacer une pièce, il suffit de sélectionner la pièce à déplacer puis de sélectionner la case de destination en utilisant les flèches directionnelles et la touche OK pour valider le coup.
  • Pour annuler un coup, il suffit de cliquer sur le bouton BACK.
  • Pour revenir en arrière dans la partie, il faut utiliser les boutons shift (pour aller en arrière) et backspace (pour aller en avant).
  • Pour afficher le menu, il suffit de cliquer sur le bouton HOME.
  • Pour sauvegarder la partie, il suffit de quitter la partie puis de copier les lignes qui se sont affichées et de les coller dans le script parties_echecs.py entre les crochets.

Code source

Disponible ici.


from parties_echecs import *
class Y(Z):
 def st(sf,o=1):
  sf.__init__();sf.p=[[C(sf,x,y)for y in rg(8)]for x in rg(8)];sf.Y=[None]*2;sf.pb=[[],[]];sf.t=1;sf.rt=0;sf.sc=0;sf.l=0;sf.pe=""
  for x in rg(8):sf.p[x][1]=Q(sf,x,1,1);sf.p[x][6]=Q(sf,x,6,0)
  for n in -1,1:sf.p[it(3.5+3.5*n)][0]=T(sf,it(3.5+3.5*n),0,1);sf.p[it(3.5+3.5*n)][7]=T(sf,it(3.5+3.5*n),7,0);sf.p[it(3.5+2.5*n)][0]=V(sf,it(3.5+2.5*n),0,1);sf.p[it(3.5+2.5*n)][7]=V(sf,it(3.5+2.5*n),7,0);sf.p[it(3.5+1.5*n)][0]=F(sf,it(3.5+1.5*n),0,1);sf.p[it(3.5+1.5*n)][7]=F(sf,it(3.5+1.5*n),7,0)
  sf.p[3][0]=D(sf,3,0,1);sf.p[3][7]=D(sf,3,7,0);sf.p[4][0]=R(sf,4,0,1,sf.p[0][0],sf.p[7][0]);sf.p[4][7]=R(sf,4,7,0,sf.p[0][7],sf.p[7][7]);sf.r=[sf.p[4][7],sf.p[4][0]]
  if o:sf.m()
 def sw(sf,o=1):
  sf.__init__();cg=sum(pe,"")
  try:
   sf.p=[[C(sf,x,y)for y in rg(8)]for x in rg(8)];sf.Y=[None]*2;sf.pb=[[],[]];sf.r=[None,None];sf.sc=0;p,ff,v,sf.pe=cg.split("|")
   for x,l in ee(p.split("/")):
    for y,o in ee(l.split(" ")):
     if o:
      a=o.split(",");np=N[a[0].lower()](sf,x,y,a[0]not in N,cg=a[1:])
      if z(np)is R:sf.r[a[0]not in N]=np
      else:sf.sc+=np.pn*(1 if np.c else -1)
      sf.p[x][y]=np
   for i,lst in ee(ff.split("/")):
    for j,pc in ee(lst.split()):pc=pc.split(",");sf.pb[i].append(N[pc[0].lower()](sf,j%8,8.3+(j//8)if i else -1.3-(j//8),i,cg=pc[1:]))
   for o in sf.r:
    xx,yy=o.bt
    if yy==it(yy):xx,yy=it(xx),it(yy);o.bt=sf.p[xx][yy]
    else:
     if o.c:o.bt=sf.pb[1][it(xx+8*(yy==-2.3))]
     else:o.bt=sf.pb[0][it(xx+8*(yy==9.3))]
    xx,yy=o.tb
    if yy==it(yy):xx,yy=it(xx),it(yy);o.tb=sf.p[xx][yy]
    else:
     if o.c:o.tb=sf.pb[1][it(xx+8*(yy==-2.3))]
     else:o.tb=sf.pb[0][it(xx+8*(yy==9.3))]
   sf.t,sf.rt,sf.l=map(it,v.split())
  except E as e:sf.s.e("Erreur chargement partie :"," La partie est corrompue" if cg else " La partie n'existe pas",repr(e));return sf.st(o)
  if o:sf.m()
 def sa(sf):
  try:
   sf.d()
   while 1:
    try:sf.s.h()
    except(H,K):bk()
  except J:
   if ga(sf,"r",0)and all(sf.r):q("Pour sauvegarder la partie,\ncopiez les lignes suivantes et\ncollez-les entres les crochets\ndans le script parties_echecs");q(gm)
 def gs(sf):return [j for i in sf.p for j in i if(j.c==sf.t and j.t())]
 def vb(sf,mv,sv=1):
  if mv["pb"]:
   if sv:sf.pe+=":"+mv["pb"].n+sr(mv["pb"].x)+sr(mv["pb"].y)
   nc=C(sf,mv["pb"].x,mv["pb"].y);sf.p[mv["pb"].x][mv["pb"].y]=nc;nc.d();lb=len(sf.pb[mv["pb"].c]);mv["pb"].x=lb % 8
   if not mv["pb"].c:mv["pb"].y=-1.3-(lb//8);mv["pb"].d(cl=CCB,ps=se[1])
   else:mv["pb"].y=8.3+(lb//8);mv["pb"].d(cl=CCN,ps=se[0])
   sf.pb[mv["pb"].c].append(mv["pb"]);sf.sc+=mv["pb"].pn*(-1 if mv["pb"].c else 1)
  elif sv:sf.pe+=":"
 def ve(sf):
  try:gk(1)
  except(O):sf.s.o()
 def d(sf):
  if se["y"]:c1,c2=CCN,CCB
  else:c1,c2=CCB,CCN
  d(0,0,59,222,c1);d(261,0,59,222,c2)
  for i in sf.pb[0]:sf.ve();i.d(cl=CCB,ps=se[1])
  for i in sf.pb[1]:sf.ve();i.d(cl=CCN,ps=se[0])
  d(59,0,202,19,CD);dt("ECHECS by Caucaucybu",60,0,CX,CD);d(59,19,202,203,CX)
  for i in sf.p:
   for j in i:sf.ve();j.d()
  sf.ve()
  if sf.ms:
   for sp in sf.ms:rd(sp["x"],sp["y"])
   st(*sf.sd)
  elif sf.sd:x,y=sf.sd;sf.p[x][y].d(il=1)
 def gn(sf,pc):
  if sf.w:return sf.pp
  if pc.c:
   ck=CCN;ps=[D(sf,2,4,1),V(sf,3,4,1),T(sf,4,4,1),F(sf,5,4,1)];pt=[[C(sf,i,j)for j in rg(8)]for i in rg(8)]
   for i in ps:pt[i.x][i.y]=i
   x,y=g(2,4)[::se["i"]]
  else:
   ck=CCB;ps=[D(sf,2,3,0),V(sf,3,3,0),T(sf,4,3,0),F(sf,5,3,0)];pt=[[C(sf,i,j)for j in rg(8)]for i in rg(8)]
   for i in ps:pt[i.x][i.y]=i
   x,y=g(2,3)[::se["i"]]
  if se["y"]:d(*[x+30,y+30][::se["i"]]+[-35,-25*4-10][::se["i"]]+[ck])if se["x"]else d(*[x+30,y-5][::se["i"]]+[-35,25*4+10][::se["i"]]+[ck])
  else:d(*[x-5,y+30][::se["i"]]+[35,-25*4-10][::se["i"]]+[ck]) if se["x"]else d(*[x-5,y-5][::se["i"]]+[35,25*4+10][::se["i"]]+[ck])
  for i in ps:sf.ve();i.d(cl=ck)
  xx,yy=ps[0].x,ps[0].y;ps[0].d(cl=ck,il=1);k=-1
  try:
   while k!=4:
    try:k=gk(g=1)
    except O:
     sf.s.o()
     if se["y"]:d(*[x+30,y+30][::se["i"]]+[-35,-25*4-10][::se["i"]]+[ck])if se["x"]else d(*[x+30,y-5][::se["i"]]+[-35,25*4+10][::se["i"]]+[ck])
     else:d(*[x-5,y+30][::se["i"]]+[35,-25*4-10][::se["i"]]+[ck]) if se["x"]else d(*[x-5,y-5][::se["i"]]+[35,25*4+10][::se["i"]]+[ck])
     for i in ps:sf.ve();i.d(cl=ck)
     pt[xx][yy].d(cl=ck,il=1);continue
    lx,ly=xx,yy;xx,yy=sm(pt,xx,yy,k);pt[lx][ly].d(cl=ck);pt[xx][yy].d(cl=ck,il=1)
  except(Fw,Bk,K)as e:bk();[(sf.ve(),sf.p[i][j].d())for i in rg(1,7)for j in rg(2,6)];raise e
  [(sf.ve(),sf.p[i][j].d())for i in rg(1,7)for j in rg(2,6)];return pt[xx][yy]
 def f(sf):
  dt(" "*5,265-260*se["y"],2,CW,CCN);dt(" "*5,5+260*se["y"],2,CW,CCB)
  if sf.s.sc and sf.sc:
   if sf.sc>0:dt(" +"+("" if sf.sc//10 else " ")+sr(sf.sc),5+260*se["y"],2,CX,CCB)
   else:dt(" +"+("" if sf.sc//10 else " ")+sr(abs(sf.sc)),265-260*se["y"],2,CX,CCN)
  if sf.s.w:
   if sf.t:
    if sf.r[1].ec():dt("ECHEC",5+260*se["y"],2,CW,CCB)
   else:
    if sf.r[0].ec():dt("ECHEC",265-260*se["y"],2,CW,CCN)
  sa=[],[]
  for lign in sf.p:
   for o in lign:
    if o:sa[o.c].append(o.n)
  r=""
  if len(sa[0])==len(sa[1])==1:r="NULLE"
  else:
   for i,j in(1,0),(0,1):
    if len(sa[i])==1:
     if len(sa[j])==3 and sa[j].count("c")==2:r="NULLE"
     elif len(sa[j])==2 and("c" in sa[j]or "f" in sa[j]):r="NULLE"
  if not sf.gs():r=" PAT "
  if sf.r[sf.t].ec()and r==" PAT ":
   if sf.t:dt(" MAT ",5+260*se["y"],2,CW,CCB)
   else:dt(" MAT ",265-260*se["y"],2,CW,CCN)
  else:dt(r,265-260*se["y"],2,CW,CCN);dt(r,5+260*se["y"],2,CW,CCB)
  return r+" "
 def fw(sf):
  for i in sf.Y:
   if i!=None:i.sd=0;i.d()
  if len(sf.pe.split())==sf.rt-sf.l:return
  if sf.t:sf.t=0
  else:sf.t=1
  nv=sf.pe.split()[sf.rt-sf.l].split(":");dx,dy=map(it,nv[0]);ax,ay=map(it,nv[1]);pe=sf.p[dx][dy]
  if nv[2]:xx,yy=map(it,nv[2][1:]);pf=sf.p[xx][yy]
  else:pf=None
  try:sf.pp=N[nv[3]](sf,ax,ay,pe.c);sf.w=1
  except IndexError:0
  sf.Y=pe.b(m(ax,ay,pf),sv=0);sf.w=0;sf.rt+=1
 def kb(sf):
  if sf.rt-sf.l:sf.rt-=1
  else:return
  if sf.t:sf.t=0
  else:sf.t=1
  lv=sf.pe.split()[sf.rt-sf.l].split(":");dx,dy=map(it,lv[0]);ax,ay=map(it,lv[1]);pc=sf.p[ax][ay];pc.x,pc.y=dx,dy;sf.p[dx][dy]=pc;pc.sd=0;pc.d();nc=C(sf,ax,ay);sf.p[ax][ay]=nc;nc.sd=0;nc.d()
  try:
   if lv[3]:sf.sc-=(N[lv[3]].pn-1)*(1 if sf.t else -1);np=Q(sf,dx,dy,pc.c);np.gt=pc.gt;sf.p[dx][dy]=np;np.d()
  except IndexError:0
  if lv[2]:
   if pc.c:pf=sf.pb[0].pop()
   else:pf=sf.pb[1].pop()
   pf.d(jg=1,cl=CCN if pf.c else CCB);sf.sc-=pf.pn*(-1 if pf.c else 1);pf.x,pf.y=map(it,lv[2][1:]);sf.p[pf.x][pf.y]=pf;pf.d()
  if z(pc)is Q:
   if abs(dx-ax)==2:pc.gt=0
  elif z(pc)is R:
   if sf.rt==pc.v:pc.v=0
   if dx-ax==2:t=pc.bt;t.x=0;t.v=0;sf.p[t.x][t.y]=t;t.d();sf.p[ax+1][t.y]=C(sf,ax+1,ay);sf.p[ax+1][t.y].d()
   elif ax-dx==2:
    t=pc.tb;t.x=7;t.v=0;sf.p[t.x][t.y]=t;t.d();sf.p[ax-1][t.y]=C(sf,ax-1,ay);sf.p[ax-1][t.y].d()
  elif z(pc)is T:
   if pc.v==sf.rt:pc.v=0
  if sf.rt-sf.l:lv=sf.pe.split()[sf.rt-sf.l-1].split(":");dx,dy=map(it,lv[0]);ax,ay=map(it,lv[1]);sf.Y=[sf.p[dx][dy],sf.p[ax][ay]]
  else:sf.Y=[None]*2
  sf.f()
 def m(sf):
  if not ga(sf,"r",0)or not all(sf.r):sf.sw(0)
  if not sf.s.c:sf.d()
  while 1:
   if sf.f()==" PAT " and sf.s.c:se.update(sf.s.b);sf.d()
   elif sf.s.c:se.update(sf.s.ss[sf.t]);sf.d()
   while sf.f():
    for i in sf.Y:
     if i!=None:i.sd=1;i.d()
    ps=sf.gs()
    if ps:
     pt=[[C(i,j)for j in rg(8)]for i in rg(8)]
     for i in ps:pt[i.x][i.y]=i
     x,y=ps[0].x,ps[0].y;ps[0].d(il=1);sf.sd=x,y
    k=-1
    try:
     while k!=4:
      try:k=gk(g=1)
      except O:sf.s.o();continue
      if ps:lx,ly=x,y;x,y=sm(pt,x,y,k);sf.sd=x,y;sf.p[lx][ly].d();sf.p[x][y].d(il=1)
    except(Bk,Fw)as e:
     if ps:sf.p[x][y].d()
     sf.sd=None
     if z(e)is Bk:sf.kb()
     else:sf.fw()
     continue
    pd=sf.p[x][y];pd.sd=1;pd.d()
    for i in sf.Y:
     if i is not None:i.sd=0;i.d()
    ms=pd.t();sf.ms=ms;mt=[[0]*8 for i in rg(8)]
    for i in ms:mt[i["x"]][i["y"]]=i;rd(i["x"],i["y"])
    k=-1;x,y=ms[0]["x"],ms[0]["y"];sf.sd=x,y;st(x,y)
    try:
     while k!=4:
      try:k=gk(g=1)
      except O:sf.s.o();continue
      lx,ly=x,y;x,y=sm(mt,x,y,k);sf.sd=x,y;sf.p[lx][ly].d();rd(lx,ly);st(x,y)
     sf.sd=None;sf.ms=[]
     for i in ms:sf.ve();sf.p[i["x"]][i["y"]].d()
     sf.pe=" ".join(sf.pe.split()[:sf.rt-sf.l]);sf.pe+=" "
     if sf.pe.startswith(" "):sf.pe=sf.pe[1:]
     if len(sf.pe)>LP:
      ib=0;dec=0
      while len(sf.pe)-ib>LP:
       ib+=1
       if sf.pe[ib]==" ":dec+=1
      while sf.pe[ib]!=" ":
       ib+=1
       if sf.pe[ib]==" ":dec+=1;break
      sf.l+=dec;sf.pe=sf.pe[ib+1:]
     sf.Y=pd.b(mt[x][y])
    except(K,Bk,Fw)as e:
     bk();sf.sd=None;sf.ms=[]
     for i in ms:sf.ve();sf.p[i["x"]][i["y"]].d()
     pd.sd=0;pd.d()
     if z(e)is Bk:sf.kb()
     elif z(e)is Fw:sf.fw()
     continue
    sf.rt+=1
    if sf.t:sf.t=0
    else:sf.t=1
    break
gm=Y();gm.sa()

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 <a href="https://www.numworks.com/legal/cookies-policy/">cookies policy</a>.