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])