wall_chess.py

Created by florian-allard

Created on July 24, 2025

10.2 KB

Adaptation du jeu Wall Chess (échecs avec des murs ?) ou Quoridor.

Le but du jeu est de déplacer son pion jusqu’à avoir traversé le plateau. Chaque joueur peut soit déplacer son pion, soit placer un mur pour ralentir son adversaire.

Il est interdit de bloquer totalement ou d’enfermer son adversaire. Il faut toujours lui laisser au moins un chemin qui lui permette de traverser le plateau.


# ajouter un algorithme qui vérifie que l'on n'enferme pas l'adversaire en posant un mur

from kandinsky import *
from ion import *
from time import *

Plateau=[[0]*9 for k in range(9)]
clr_plateau=(220,180,50)#"brown"
Positions=[[-1,4],[9,4]] # on commence en-dehors du plateau
try:
  import os
  clr_mur=(56,224,32) # sorte de vert
except:
  clr_mur=(49,219,24)

joueur=0
mode_mur=1
orientation_horiz=1

def afficher_mur(x,y,orientation_h,clr=clr_mur):
  #clr=clr_mur
  if orientation_h:
    dX=64+22*x-22*(x==-1)+22*(x==8)
    dY=24+22*y+16
    #fill_rect(dX+1,dY+1,16+6+16-2,4,clr) # rectangle unique
    fill_rect(dX+1,dY+1,16-2,4,clr)
    fill_rect(dX+1+16,dY+1,4,4,clr)
    fill_rect(dX+1+16+6,dY+1,16-2,4,clr)

  else:
    dX=64+22*x+16
    dY=24+22*y
    #fill_rect(dX+1,dY+1,4,16+6+16-2,clr) # rectangle unique
    fill_rect(dX+1,dY+1,4,16-2,clr)
    fill_rect(dX+1,dY+1+16,4,4,clr)
    fill_rect(dX+1,dY+1+16+6,4,16-2,clr)

def afficher_plateau():
  for ligne in range(-1,9):
    afficher_mur(-1,ligne,1)
    afficher_mur(8,ligne,1)
    #dX=70
    #dY=24+22*ligne-5
    #fill_rect(dX-16-6-16-6+1,dY,16+6+16-2,4,"g")
    #fill_rect(dX+22*11-16-6-16-6+1,dY,16+6+16-2,4,"g")
  for ligne in range(9):
    dY=24+22*ligne
    fill_rect(64-16-6-16-6,dY,16+6+16,16,clr_plateau)
    fill_rect(64+22*9,dY,16+6+16,16,clr_plateau)

    for colonne in range(9):
      dX=64+22*colonne
      fill_rect(dX,dY,16,16,clr_plateau)

def dessine_pion(x,y,clr):
  dX=64+22*x
  dY=24+22*y
  #fill_rect(dX,dY,16,16,clr)
  fill_rect(dX+5,dY,6,1,clr)
  fill_rect(dX+3,dY+1,10,1,clr)
  fill_rect(dX+2,dY+2,12,1,clr)
  fill_rect(dX+1,dY+3,14,2,clr)
  fill_rect(dX,dY+5,16,6,clr)
  fill_rect(dX+1,dY+11,14,2,clr)
  fill_rect(dX+2,dY+13,12,1,clr)
  fill_rect(dX+3,dY+14,10,1,clr)
  fill_rect(dX+5,dY+15,6,1,clr)

def dessine_curseur(x,y,clr):
  if x==-1 or x==9 or mode_mur:
    if orientation_horiz:
      dX=64+22*x-22*(x==-1)+22*(x==8)
      dY=24+22*y+16
      for i in range(2):
        #fill_rect(dX,dY+5*i,16,1,clr)
        #fill_rect(dX+16+6,dY+5*i,16,1,clr)
        fill_rect(dX,dY+5*i,16+6+16,1,clr)
        fill_rect(dX+16*i+(5+16)*i,dY,1,6,clr)
    else:
      dX=64+22*x+16
      dY=24+22*y
      for i in range(2):
        fill_rect(dX,dY+16*i+(5+16)*i,6,1,clr)
        fill_rect(dX+5*i,dY,1,16+6+16,clr)
  else:
    dX=64+22*x
    dY=24+22*y
    for i in range(2):
      fill_rect(dX-1,dY-1+17*i,18,1,clr)
      fill_rect(dX-1+17*i,dY-1,1,18,clr)


draw_string("Wall Chess",110,70,"purple")
draw_string("Quoridor",120,95,"purple")
draw_string("Valider avec OK",85,135,"purple")
for k in range(2): 
  fill_rect(70,50+k*122,180,1,"g")

for i in (0,1):
  for k in (0,1):
    afficher_mur(-2+10*k,-1+8*i,1,"g")
    afficher_mur(-3+13*k,6*i,0,"g")
  afficher_mur(-2+10*i,2+2*i,1,"g")
  afficher_mur(-2+11*i,3,0,"g")

for ligne in range(8):
  for colonne in (-2,-1,9,10):
    dX=64+22*colonne
    dY=24+22*ligne
    fill_rect(dX,dY,16,16,clr_plateau)
for k in range(2):
  dessine_pion(-2+12*k,3+k,"rb"[k])

while not (keydown(KEY_OK) or keydown(KEY_EXE)):1
while keydown(KEY_OK) or keydown(KEY_EXE):1

fill_rect(0,0,320,222,"w")

draw_string("Présentation",100,10,(80,150,50))
Regles=("Chaque joueur doit traverser","le plateau avec son pion.","","À chaque tour, on peut soit","déplacer son pion soit placer","un mur pour faire faire un","détour à son adversaire.","","Il est interdit d'enfermer","son adversaire.")
for k in range(len(Regles)):
  draw_string(Regles[k],20,33+18*k,"b")

while not (keydown(KEY_OK) or keydown(KEY_EXE)):1
while keydown(KEY_OK) or keydown(KEY_EXE):1

fill_rect(0,0,320,222,"w")
afficher_plateau()

for j in (0,1):
  dessine_pion(Positions[j][0],Positions[j][1],"rb"[j])
  #dX=64+22*Positions[j][0]
  #dY=24+22*Positions[j][1]
  #fill_rect(dX,dY,16,16,"rb"[j])

for j in (0,1):
  sleep(1)
  draw_string("Placement du pion "+("rouge","bleu ")[j],45,0,"rb"[j])
  # placement initial du pion
  chg=1
  dessine_pion(Positions[j][0],Positions[j][1],clr_plateau)
  Positions[j][0]=8*j # déplacement en abscisse à 0 ou 8 suivant le joueur
  Positions[j][1]-=chg

  while not (keydown(KEY_OK) or keydown(KEY_EXE)):
    if chg:
      dessine_pion(Positions[j][0],Positions[j][1],clr_plateau)
      Positions[j][1]=(Positions[j][1]+chg)%9
      dessine_pion(Positions[j][0],Positions[j][1],"rb"[j])
      sleep(0.2)
    chg=keydown(KEY_DOWN)-keydown(KEY_UP)

  while keydown(KEY_OK) or keydown(KEY_EXE):1

mode_mur=0
orientation_horiz=1
joueur=0
chgX,chgY=0,0
[Xc,Yc]=Positions[joueur]
while Positions[0][0]<9 and Positions[1][0]>-1: # tant qu'aucun pion n'a traversé le plateau
  # soit on déplace son pion, soit on pose un mur
  
  #dessine_curseur(Xc,Yc,"purple")
  mode_mur=0
  dessine_curseur(Xc,Yc,"rb"[joueur])
  if chgX or chgY:
    dessine_curseur(Xc,Yc,"w")
    orientation_horiz=(abs(chgX) or Xc==9 or (Xc==-1 and not mode_mur) or (Xc in (-1,8) and Yc+chgY in (-2,-1,8,9)))#1*(Xc+chgX in (-1,8) or chgX)
    Xc=min(8+joueur-mode_mur,max(-1+joueur,Xc+chgX))
    Yc=min(8-mode_mur+1*(mode_mur and orientation_horiz and Xc in (-1,8)),max(-(Xc in (-1,9) or (mode_mur and orientation_horiz and Xc in (-1,8))),Yc+chgY))
    #draw_string("X,Y : "+str(Positions[joueur])+" Xc="+str(Xc)+" Yc="+str(Yc)+" ",50,0,"b")
    dessine_curseur(Xc,Yc,"rb"[joueur])
    sleep(0.2)
  #Positions[joueur]=Xc,Yc
  chgX=keydown(KEY_RIGHT)-keydown(KEY_LEFT)
  chgY=keydown(KEY_DOWN)-keydown(KEY_UP)

  if [Xc,Yc]==Positions[joueur]:
    draw_string(" OK pour déplacer le pion "+("rouge ","bleu  ")[joueur],0,0,"rb"[joueur])
  elif Xc==-1+10*joueur:
    draw_string("     OK pour choisir un mur     ",0,0,"rb"[joueur])
  else:
    draw_string(" Bouger le pion ou placer un mur",-5,0,"rb"[joueur])
  if (keydown(KEY_OK) or keydown(KEY_EXE)) and [Xc,Yc]==Positions[joueur]: # mode déplacement
    while keydown(KEY_OK) or keydown(KEY_EXE):1
    draw_string("  Flèche pour déplacer le pion  ",0,0,"rb"[joueur])
    while 1:
      if keydown(KEY_DOWN) and Positions[joueur][1]<8 and [Xc,Yc+1]!=Positions[1-joueur] and get_pixel(64+22*Xc+8,24+22*Yc+16+3)!=clr_mur:
        dessine_pion(Positions[joueur][0],Positions[joueur][1],clr_plateau)
        dessine_curseur(Xc,Yc,"w")
        Positions[joueur][1]+=1
        dessine_pion(Positions[joueur][0],Positions[joueur][1],"rb"[joueur])
        joueur=1-joueur
        Xc,Yc=Positions[joueur]
        while keydown(KEY_DOWN):1
        break
      if keydown(KEY_UP) and Positions[joueur][1]>0 and [Xc,Yc-1]!=Positions[1-joueur] and get_pixel(64+22*Xc+8,24+22*Yc-3)!=clr_mur:
        dessine_pion(Positions[joueur][0],Positions[joueur][1],clr_plateau)
        dessine_curseur(Xc,Yc,"w")
        Positions[joueur][1]-=1
        dessine_pion(Positions[joueur][0],Positions[joueur][1],"rb"[joueur])
        joueur=1-joueur
        Xc,Yc=Positions[joueur]
        while keydown(KEY_UP):1
        break
      if keydown(KEY_RIGHT) and Positions[joueur][0]<9-joueur and [Xc+1,Yc]!=Positions[1-joueur] and get_pixel(64+22*Xc+16+3,24+22*Yc+8)!=clr_mur:
        dessine_pion(Positions[joueur][0],Positions[joueur][1],clr_plateau)
        dessine_curseur(Xc,Yc,"w")
        Positions[joueur][0]+=1
        dessine_pion(Positions[joueur][0],Positions[joueur][1],"rb"[joueur])
        joueur=1-joueur
        Xc,Yc=Positions[joueur]
        while keydown(KEY_RIGHT):1
        break
      if keydown(KEY_LEFT) and Positions[joueur][0]>-joueur and [Xc-1,Yc]!=Positions[1-joueur] and get_pixel(64+22*Xc-3,24+22*Yc+8)!=clr_mur:
        dessine_pion(Positions[joueur][0],Positions[joueur][1],clr_plateau)
        dessine_curseur(Xc,Yc,"w")
        Positions[joueur][0]-=1
        dessine_pion(Positions[joueur][0],Positions[joueur][1],"rb"[joueur])
        joueur=1-joueur
        Xc,Yc=Positions[joueur]
        while keydown(KEY_LEFT):1
        break
  if (keydown(KEY_OK) or keydown(KEY_EXE)) and Xc==(-1+10*joueur) and get_pixel(64+22*Xc-22*(Xc==-1)+22*(Xc==8)+19,24+22*Yc+16+2)==clr_mur: # on sélectionne un mur à placer
    while keydown(KEY_OK) or keydown(KEY_EXE):1

    mode_mur=1
    if Xc==9:
      Xc=8
    Xm,Ym=Xc,Yc
    afficher_mur(Xm,Ym,1,"orange")
    #set_pixel(64+22*Xc-22*(Xc==-1)+22*(Xc==8)+19-16,24+22*Yc+16+2,"b")
    
    while 1:
      if (Xc,Yc)==(Xm,Ym):
        draw_string("Flèches pour déplacer le curseur",0,0,"rb"[joueur])
      else:
        draw_string("      OK pour placer le mur     ",-5,0,"rb"[joueur])
      if chgX or chgY:
        dessine_curseur(Xc,Yc,"w")
        orientation_horiz=(abs(chgX) or Xc==9 or (Xc==-1 and not mode_mur) or (Xc in (-1,8) and Yc+chgY in (-2,-1,8,9)))#1*(Xc+chgX in (-1,8) or chgX)
        Xc=min(8+joueur-mode_mur,max(-1+joueur,Xc+chgX))
        Yc=min(8-mode_mur+1*(mode_mur and orientation_horiz and Xc in (-1,8)),max(-(Xc in (-1,9) or (mode_mur and orientation_horiz and Xc in (-1,8))),Yc+chgY))
        #draw_string("X,Y : "+str(Positions[joueur])+" Xc="+str(Xc)+" Yc="+str(Yc)+" ",50,0,"b")
        dessine_curseur(Xc,Yc,"rb"[joueur])
        sleep(0.2)
      #Positions[joueur]=Xc,Yc
      chgX=keydown(KEY_RIGHT)-keydown(KEY_LEFT)
      chgY=keydown(KEY_DOWN)-keydown(KEY_UP)
      if keydown(KEY_OK) or keydown(KEY_EXE): # on place le mur
        while keydown(KEY_OK) or keydown(KEY_EXE):1
        if (Xc,Yc)==(Xm,Ym):
          afficher_mur(Xm,Ym,1,clr_mur)
          dessine_curseur(Xc,Yc,"w")
          Xc,Yc=Positions[joueur]
          mode_mur=0
          break
        if orientation_horiz and get_pixel(64+22*Xc-22*(Xc==-1)+22*(Xc==8)+19,24+22*Yc+16+2)!=clr_mur and get_pixel(64+22*Xc-22*(Xc==-1)+22*(Xc==8)+19-16,24+22*Yc+16+2)!=clr_mur and get_pixel(64+22*Xc-22*(Xc==-1)+22*(Xc==8)+19+16,24+22*Yc+16+2)!=clr_mur:
          afficher_mur(Xm,Ym,1,"w") # on efface le mur sélectionné
          afficher_mur(Xc,Yc,1) # horizontal
          dessine_curseur(Xc,Yc,"w")
          joueur=1-joueur
          Xc,Yc=Positions[joueur]
          break
        if not orientation_horiz and get_pixel(64+22*Xc+16+2,24+22*Yc+19)!=clr_mur and get_pixel(64+22*Xc+16+2,24+22*Yc+19-16)!=clr_mur and get_pixel(64+22*Xc+16+2,24+22*Yc+19+16)!=clr_mur:
          afficher_mur(Xm,Ym,1,"w") # on efface le mur sélectionné
          afficher_mur(Xc,Yc,0) # vertical
          dessine_curseur(Xc,Yc,"w")
          joueur=1-joueur
          Xc,Yc=Positions[joueur]
          break

draw_string("     Joueur "+("rouge","bleu")[Positions[1][0]<0]+" a gagné !     ",0,0,"rb"[Positions[1][0]<0])

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.