echecs.py

Created by caucaucybu

Created on December 05, 2023

15.5 KB

Ce jeu d’échecs nécessite deux autres scripts pieces_echecs.py et parties_echecs.py disponible sur mon compte numworks Caucaucybu. 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 condensée ici. Pour l’utiliser il vaut mieux bien savoir utiliser le script de base.


Vous pouvez trouvez d’autres jeux comme un jeu de farming sur mon compte NumWorks : Caucaucybu.


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("La partie a ete interrompue.\nPour la reprendre, entrez \nrestart()\nPour l'enregistrer, entrez \ndonnees_partie()")
def donnees_partie():
  print("Copiez les lignes suivantes et\ncollez-les aux endroits\ncorrespondants dans le script\nparties_echecs.")
  for i in range(99999):pass
  print("","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
  charger("chargement partie enregistre");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()
def charger(t=0):
  if not t:t="chargement"
  if t==" ":print()
  else:print(t+"...")
  for i in range(16):print()
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("Ce script d'echecs necessite\nabsolument pour fonctionner 2\nautres scripts pieces_echecs\net parties_echecs disponible\nsur mon compte numworks\nCaucaucybu ici :\nhttps://my.numworks.com/python\n/caucaucybu/pieces_echecs\nhttps://my.numworks.com/python\n/caucaucybu/parties_echecs")
elif bug_piec:print("Ce script d'echecs necessite\nabsolument pour fonctionner un\nautre script pieces_echecs.py\ndisponible sur mon compte\nnumworks Caucaucybu ici :\nhttps://my.numworks.com/python\n/caucaucybu/pieces_echecs")
elif bug_part:print("Ce script d'echecs necessite\nabsolument pour fonctionner un\nautre script parties_echecs.py\ndisponible sur mon compte\nnumworks Caucaucybu ici :\nhttps://my.numworks.com/python\n/caucaucybu/parties_echecs")
else:
  charger(" ")
  print("Bienvenue sur ce jeu d'echecs\ndeveloppe par Caucaucybu !")
  for i in range(9999):pass
  charger(" ")
  print("Vous pouvez entrer :\n-\"jeu\" pour commencer une\nnouvelle partie\n-\"tutoriel\" pour comprendre\ncomment jouer\n-\"continuer\" pour continuer la\npartie enregistree")
  rep=input("\n  ->")
  if rep=="continuer":
    try:restart([pieces_noires]+[pieces_blanches]+[pieces_mangees_noires]+[pieces_mangees_blanches]+[autres_parametres])
    except:print("Il n'y as pas de partie\nenregistre ou les donnees\nsont incompletes ou erronees.")
  elif rep=="tutoriel":
    charger();print("Deplacez la zone grisee vers\nla piece a jouer avec les\nfleches, puis appuyez sur OK.\nLes deplacements possibles\nvont vous etre propose.\nChoisissez le bon avec les\nfleches puis appuyez sur OK.\nS'il y a echec mat ou pat par\nimpossibilite de bouger ce\nsera indiques en haut a droite\nou a gauche de l'ecran.")
  elif rep=="jeu":
    charger();print("Cette version possede\ndifferents modes de jeu.\nVous pouvez entrer :\n-\"normal\" pour jouer un\nun contre un\n-\"aleatoire\" pour voir une\npartie jouee aleatoirement\n-\"bot_noir\" / \"bot_blanc\" pour\njouer contre un bot")
    rep=input("\n  ->")
    if rep=="aleatoire":
      charger("chargement partie aleatoire");print("Vous pouvez interrompre\nl'execution et jouer vous-meme\nen restant appuye sur la\ntouche 0.")
      for i in range(19999):pass
      charger(" ");jeu(1)
    elif rep=="normal":charger("chargement partie normale");jeu(0)
    elif rep=="bot_blanc":charger("en attente bot_blanc");jeu(-1)
    elif rep=="bot_noir":charger("en attente bot_noir");jeu(-10)
    else:charger("chargement nouvelle partie");jeu(0)
  elif rep=="aleatoire":
    charger("chargement partie aleatoire");print("Vous pouvez interrompre\nl'execution et jouer vous-meme\nen restant appuye sur la\ntouche 0.")
    for i in range(19999):pass
    charger(" ");jeu(1)
  elif rep=="normal":charger("chargement partie normale");jeu(0)
  elif rep=="bot_blanc":charger("en attente bot_blanc");jeu(-1)
  elif rep=="bot_noir":charger("en attente bot_noir");jeu(-10)
  else:charger("chargement nouvelle partie");jeu(0)