echecs_simp.py

Created by caucaucybu

Created on March 07, 2023

12.8 KB

Ce jeu d’échecs nécessite deux autres scripts pieces_echecs.py et parties_echecs.py disponible sur mon compte numworks Caucaucybu. Pour les modes de jeu il y a continuer pour continuer la partie enregistrée, aleatoire pour voir une partie aleatoire, bot_blanc et bot_noir pour jouer contre un bot ou jeu pour jouer. On peut interrompre le jeu aleatoire et jouer soi-même en appuyant sur la touche 0. Si la partie est interrompue, on peut la relancer en tapant restart() ou l’enregistrez pour la continuer plus tard en tapant donnees_partie() puis en copiant les lignes qui s’affichent et en les collant dans les lignes correspondantes dans le script parties_echecs. Vous pouvez modifiez les couleurs en haut du script pieces_echecs avec les variables blanc, noir et plt (plt c’est les deux couleurs du plateau). Ce script existe dans une version plus explicite ici.


from ion import keydown as keyp
from random import randint
aleat=0;ke=[0,0,0,0,0,0];rbb=rnb=tgb=tgn=tdb=tdn=1;rb=(0,4);rn=(7,4);pbb=pbhb=pbhn=pbn=0;grey=(165,166,165)
clf_av=[-5,-5,(0,0,0)];clf_ap=[-5,-6,"nopiece",(0,0,0)]
def keydown(k):
  if keyp(k) or ke[k]:return 1
def kerand():
  global ke
  if not keyp(48):ke=[randint(0,1) for i in range(6)]
  else:ke=[0,0,0,0,0,0]
def fin():
  try:
    while keydown(5):pass
  except KeyboardInterrupt:fin()
def sauver(tour):
  global svg
  svg_pbb=[];svg=[];svg_pbn=[];tr=tour
  for k in (0,-1):
    svg.append([])
    for i in range(8):
      for j in range(8):
        tst=chercher(i,j)
        if tst and tst[1]==k:svg[k].append((i,j,tst[0]))
  for i in range(9,7,-1):
    for j in range(7,0,-1):
      tst=chercher(i+0.4,j,1)
      if not tst[1]:svg_pbn.append((i+0.4,j,tst[0]))
      else:break
    if tst[1]:break
  for i in range(-2,0):
    for j in range(7,-1,-1):
      tst=chercher(i-0.4,j,1)
      if tst[1]==-1:svg_pbb.append((i-0.4,j,tst[0]))
      else:break
    if tst[1]!=-1:break
  svg.append(svg_pbn);svg.append(svg_pbb);svg.append([pbb,pbhb,pbhn,pbn,rb,rn,rnb,rbb,tdb,tdn,tgb,tgn,clf_av,clf_ap,tr,alea,aleat])
def navig(tour):
  global pbb,pbhb,pbhn,pbn,rb,rn,rnb,rbb,tdb,tdn,tgb,tgn,clf_av,clf_ap,ke
  sauver(tour);clf_ap_svg=clf_ap.copy();clf_av_svg=clf_av.copy();chess0=chess1=0;mat0=1;mat1=1
  pcsb=[svg[1][i][2] for i in range(len(svg[1]))];pcsn=[svg[0][i][2] for i in range(len(svg[0]))];del pcsb[pcsb.index("k")];del pcsn[pcsn.index("k")];ln=len(pcsn);lb=len(pcsb)
  if not echec(rn[0],rn[1],0):txt("ECHEC",265,3,(255,0,0),noir);chess0=1
  else:draw(265,3,50,18,noir)
  for i in svg[0]:
    depiece(i[0],i[1]);tst=chpsb(i[0],i[1],i[2],0);repiece0(i[0],i[1],i[2])
    if tst:mat0=0;break
  if mat0 and not tour:
    if chess0:txt(" MAT ",265,3,(255,0,0),noir)
    else:txt(" PAT ",265,3,(255,0,0),noir)
    return 1
  if not echec(rb[0],rb[1],-1):txt("ECHEC",5,3,(255,0,0),blanc);chess1=1
  else:draw(5,3,50,18,blanc)
  for i in svg[1]:
    depiece(i[0],i[1]);tst=chpsb(i[0],i[1],i[2],-1);repiece1(i[0],i[1],i[2])
    if tst:mat1=0;break
  if mat1 and tour==-1:
    if chess1:txt(" MAT ",5,3,(255,0,0),blanc)
    else:txt(" PAT ",5,3,(255,0,0),blanc)
    return 1
  if (lb==0 and ln==0) or (lb==0 and ln==1 and (pcsn[0]=="f" or pcsn[0]=="c")) or (ln==0 and lb==1 and (pcsb[0]=="f" or pcsb[0]=="c")):txt(" PAT ",5,3,(255,0,0));txt(" PAT ",265,3,(255,0,0),(0,0,0));return 1
  while 1:
    if not tour:c=chpiece(tour,7,-1)
    else:c=chpiece(tour,0,1)
    if aleat:kerand()
    else:ke=[0,0,0,0,0,0]
    while not keydown(4):
      if keydown(1):
        while keydown(1):
          if aleat:kerand()
        if not tour:
          w(c[0],c[1],c[2])
          c=chpiece(tour,c[0],-1,c[1],-1)
        else:
          r(c[0],c[1],c[2])
          c=chpiece(tour,c[0],1,c[1],-1)
      if keydown(2):
        while keydown(2):
          if aleat:kerand()
        if not tour:
          w(c[0],c[1],c[2])
          c=chpiece(tour,c[0],-1,c[1],1)
        else:
          r(c[0],c[1],c[2])
          c=chpiece(tour,c[0],1,c[1],1)
      if keydown(0):
        while keydown(0):
          if aleat:kerand()
        if not tour:
          w(c[0],c[1],c[2])
          c=chpiece(tour,c[0]-1,-1,c[1]+1,-1)
        else:
          r(c[0],c[1],c[2])
          c=chpiece(tour,c[0]-1,1,c[1]-1,1)
      if keydown(3):
        while keydown(3):
          if aleat:kerand()
        if not tour:
          w(c[0],c[1],c[2])
          c=chpiece(tour,c[0]+1,-1,c[1]-1,1)
        else:
          r(c[0],c[1],c[2])
          c=chpiece(tour,c[0]+1,1,c[1]+1,-1)
      if aleat:kerand()
    try:
      while keydown(4):
        if aleat:kerand()
      rang=0;go=1;depiece(c[0],c[1]);psb=chpsb(c[0],c[1],c[2],tour);psb.sort()
      try:
        psb[0]
        depiece(clf_av[0],clf_av[1],clf_av[2]);depiece(clf_ap[0],clf_ap[1],clf_ap[3]);clf=get(xn(c[0]),yn(c[1]));depiece(c[0],c[1],grey)
        if aleat:kerand()
        if not tour:repiece0(c[0],c[1],c[2]);repiece1(clf_ap[0],clf_ap[1],clf_ap[2])
        else:repiece1(c[0],c[1],c[2]);repiece0(clf_ap[0],clf_ap[1],clf_ap[2])
        for i in psb:repieceg(tour,i,c[2])
        while not keydown(4):
          if go:gris(psb[rang][0],psb[rang][1]);repieceg(tour,psb[rang],c[2]);go=0
          if keydown(2) and len(psb)!=1:
            while keydown(2):
              if aleat:kerand()
            depiece(psb[rang][0],psb[rang][1]);repieceg(tour,psb[rang],c[2])
            rang+=1;go=1
            if rang==len(psb):rang=0
          if keydown(1) and len(psb)!=1:
            while keydown(1):
              if aleat:kerand()
            depiece(psb[rang][0],psb[rang][1]);repieceg(tour,psb[rang],c[2])
            rang-=1;go=1
            if rang==-1:rang=len(psb)-1
          if keydown(0) and len(psb)!=1:
            while keydown(0):
              if aleat:kerand()
            depiece(psb[rang][0],psb[rang][1]);repieceg(tour,psb[rang],c[2]);arang=rang;rang-=1;go=1
            if rang==-1:rang=len(psb)-1
            while psb[arang][0]==psb[rang][0]:
              rang-=1
              if rang==-1:rang=len(psb)-1
              if rang==arang:
                rang-=1
                if rang==-1:rang=len(psb)-1
                break
          if keydown(3) and len(psb)!=1:
            while keydown(3):
              if aleat:kerand()
            depiece(psb[rang][0],psb[rang][1]);repieceg(tour,psb[rang],c[2]);arang=rang;rang+=1;go=1
            if rang==len(psb):rang=0
            while psb[arang][0]==psb[rang][0]:
              rang+=1
              if rang==len(psb):rang=0
              if rang==arang:
                rang+=1
                if rang==len(psb):rang=0
                break
          if aleat:kerand()
        while keydown(4):
          if aleat:kerand()
        for i in range(len(psb)):
          depiece(psb[i][0],psb[i][1])
          if len(psb[i])==3:
            if not tour:repiece1(psb[i][0],psb[i][1],psb[i][2])
            else:repiece0(psb[i][0],psb[i][1],psb[i][2])
      except IndexError:pass
      depiece(c[0],c[1])
      try:
        if len(psb[rang])>2:
          if psb[rang][2]!="roque":
            depiece(psb[rang][0],psb[rang][1])
            if not tour:
              repiece0(9.4-pbhn,7-pbn,psb[rang][2],blanc);pbn+=1
              if pbn==8:pbhn+=1;pbn=0
            else:
              repiece1(-2.4+pbhb,7-pbb,psb[rang][2],noir);pbb+=1
              if pbb==8:pbhb+=1;pbb=0
            if len(psb[rang])==5:depiece(psb[rang][3],psb[rang][4])
          else:
            pos=(psb[rang][0],psb[rang][1])
            if pos==(0,6):depiece(0,7);tourb(0,5)
            if pos==(0,2):depiece(0,0);tourb(0,3)
            if pos==(7,6):depiece(7,7);tourn(7,5)
            if pos==(7,2):depiece(7,0);tourn(7,3)
        pcs=["r","t","c","f"];rng=0;clf_ap=[psb[rang][0],psb[rang][1],c[2],get(xn(psb[rang][0]),yn(psb[rang][1]))]
        if not tour:
          repiece0(psb[rang][0],psb[rang][1],c[2])
          if c[2]=="p" and psb[rang][0]==0:
            depiece(psb[rang][0],psb[rang][1]);repiece0(psb[rang][0],psb[rang][1],pcs[rng]);gris(psb[rang][0],psb[rang][1])
            if aleat:kerand()
            while not keydown(4):
              if keydown(0) or keydown(1):
                while keydown(0) or keydown(1):
                  if aleat:kerand()
                rng+=1
                if rng==4:rng=0
                depiece(psb[rang][0],psb[rang][1]);repiece0(psb[rang][0],psb[rang][1],pcs[rng]);gris(psb[rang][0],psb[rang][1])
              if keydown(3) or keydown(2):
                while keydown(3) or keydown(2):
                  if aleat:kerand()
                rng+=1
                if rng==4:rng=0
                depiece(psb[rang][0],psb[rang][1]);repiece0(psb[rang][0],psb[rang][1],pcs[rng]);gris(psb[rang][0],psb[rang][1])
              if aleat:kerand()
            depiece(psb[rang][0],psb[rang][1]);repiece0(psb[rang][0],psb[rang][1],pcs[rng]);clf_ap[2]=pcs[rng]
        else:
          repiece1(psb[rang][0],psb[rang][1],c[2])
          if c[2]=="p" and psb[rang][0]==7:
            depiece(psb[rang][0],psb[rang][1]);gris(psb[rang][0],psb[rang][1]);repiece1(psb[rang][0],psb[rang][1],pcs[rng])
            if aleat:kerand()
            while not keydown(4):
              if keydown(0) or keydown(1):
                while keydown(0) or keydown(1):
                  if aleat:kerand()
                rng+=1
                if rng==4:rng=0
                depiece(psb[rang][0],psb[rang][1]);gris(psb[rang][0],psb[rang][1]);repiece1(psb[rang][0],psb[rang][1],pcs[rng])
              if keydown(3) or keydown(2):
                while keydown(3) or keydown(2):
                  if aleat:kerand()
                rng+=1
                if rng==4:rng=0
                depiece(psb[rang][0],psb[rang][1]);gris(psb[rang][0],psb[rang][1]);repiece1(psb[rang][0],psb[rang][1],pcs[rng])
              if aleat:kerand()
            depiece(psb[rang][0],psb[rang][1]);repiece1(psb[rang][0],psb[rang][1],pcs[rng]);clf_ap[2]=pcs[rng]
        if c[2]=="k":
          if not tour:rnb=0;rn=(psb[rang][0],psb[rang][1])
          else:rbb=0;rb=(psb[rang][0],psb[rang][1])
        if c[2]=="t":
          if c[1]==0:
            if not tour:tgn=0
            else:tgb=0
          if c[1]==7:
            if not tour:tdn=0
            else:tdb=0
        depiece(clf_ap[0],clf_ap[1],grey);clf_av=[c[0],c[1],clf]
        if not tour:repiece0(clf_ap[0],clf_ap[1],clf_ap[2])
        else:repiece1(clf_ap[0],clf_ap[1],clf_ap[2])
        while keydown(4):
          if aleat:kerand()
        break
      except IndexError:
        if not tour:repiece0(c[0],c[1],c[2])
        else:repiece1(c[0],c[1],c[2])
    except KeyboardInterrupt:
      fin()
      try:
        for i in range(len(psb)):
          depiece(psb[i][0],psb[i][1])
          if len(psb[i])==3:
            if not tour:repiece1(psb[i][0],psb[i][1],psb[i][2])
            else:repiece0(psb[i][0],psb[i][1],psb[i][2])
      except NameError:pass
      clf_av=clf_av_svg.copy();clf_ap=clf_ap_svg.copy();depiece(c[0],c[1],clf);depiece(clf_av[0],clf_av[1],grey);depiece(clf_ap[0],clf_ap[1],grey)
      if not tour:repiece0(c[0],c[1],c[2]);repiece1(clf_ap[0],clf_ap[1],clf_ap[2])
      else:repiece1(c[0],c[1],c[2]);repiece0(clf_ap[0],clf_ap[1],clf_ap[2])
def inter():print("restart()\ndonnees_partie()")
def donnees_partie():print("Copiez les lignes suivantes","","pieces_noires :\n"+str(svg[0]),"\npieces_blanches :\n"+str(svg[1]),"\npieces_mangees_noires :\n"+str(svg[2]),"\npieces_mangees_blanches :\n"+str(svg[3]),"\nautres_parametres :\n"+str(svg[4]))
def restart(partie=0):
  global pbb,pbhb,pbhn,pbn,rb,rn,rnb,rbb,tdb,tdn,tgb,tgn,clf_av,clf_ap,tour,aleat,alea
  if not partie:partie=svg
  pbb=partie[4][0];pbhb=partie[4][1];pbhn=partie[4][2];pbn=partie[4][3];rb=partie[4][4];rn=partie[4][5];rnb=partie[4][6];rbb=partie[4][7]
  tdb=partie[4][8];tdn=partie[4][9];tgb=partie[4][10];tgn=partie[4][11];clf_av=partie[4][12];clf_ap=partie[4][13];tour=partie[4][14];alea=partie[4][15];aleat=partie[4][16]
  plateau();depiece(clf_av[0],clf_av[1],grey);depiece(clf_ap[0],clf_ap[1],grey)
  for j in range(2):
    for i in partie[j]:
      if  not j:repiece0(i[0],i[1],i[2])
      else:repiece1(i[0],i[1],i[2])
  for i in partie[3]:repiece1(i[0],i[1],i[2],(0,0,0))
  for i in partie[2]:repiece0(i[0],i[1],i[2],(255,255,255))
  if not tour:
    try:
      while 1:
        if navig(0):break
        if alea==-10:aleat=0
        elif alea==-1:aleat=1
        if navig(-1):break
        if alea==-10:aleat=1
        elif alea==-1:aleat=0
    except KeyboardInterrupt:inter()
  else:
    try:
      while 1:
        if navig(-1):break
        if alea==-10:aleat=1
        elif alea==-1:aleat=0
        if navig(0):break
        if alea==-10:aleat=0
        elif alea==-1:aleat=1
    except KeyboardInterrupt:inter()
def jeu(aleation):
  global aleat,alea
  if not aleation or aleation==-10:aleat=0
  else:aleat=1
  alea=aleation;plateau();reineb(0,3);reinen(7,3);roin(7,4);roib(0,4)
  for i in (0,7):tourb(0,i);tourn(7,i)
  for i in range(8):pionb(1,i);pionn(6,i)
  for i in (1,6):cavalierb(0,i);cavaliern(7,i)
  for i in (2,5):foub(0,i);foun(7,i)
  try:
    while 1:
      if navig(-1):break
      if aleation==-10:aleat=1
      elif aleation==-1:aleat=0
      if navig(0):break
      if aleation==-10:aleat=0
      elif aleation==-1:aleat=1
  except KeyboardInterrupt:inter()
try:
  from parties_echecs import *
  bug_part=0
except ImportError:bug_part=1
try:
  from pieces_echecs import *
  bug_piec=0
except ImportError:bug_piec=1
if bug_piec and bug_part:print("necessite pieces_echecs et parties_echecs")
elif bug_piec:print("necessite pieces_echecs.py")
elif bug_part:print("necessite parties_echecs.py")
else:
  rep=input("entrez mode de jeu : ")
  if rep=="continuer":
    try:restart([pieces_noires]+[pieces_blanches]+[pieces_mangees_noires]+[pieces_mangees_blanches]+[autres_parametres])
    except:print("Erreur")
  elif rep=="aleatoire":jeu(1)
  elif rep=="normal":jeu(0)
  elif rep=="bot_blanc":jeu(-1)
  elif rep=="bot_noir":jeu(-10)
  else:jeu(0)