puissance4_1.py

Created by florian-allard

Created on July 31, 2020

4.63 KB

Jeu du Puissance 4, améliorée avec la mise en évidence de l’alignement gagnant. La version précédente est disponible ici, une version légèrement optimisée est disponible ici et la version terminée est disponible .


from kandinsky import *
from ion import *
from random import randint
from time import sleep
kd = keydown
KE = KEY_EXE
KO = KEY_OK
purple = (160,0,255)

def init():
  global Jeu
  Jeu=[[0 for m in range(7)] for n in range(6)]
  #nettoyage du haut de l'écran
  draw_string(" "*32,0,3)
  draw_string(" "*17,80,21)
  # nettoyage du plateau de jeu
  for i in range(7):
    for j in range(6):
      jeton(i,j,'white')
  
# Affichage du curseur
def curseur(x,couleur='orange'):
  draw_string("v",30+30*x,22,couleur)

# Déplacement du curseur
def deplacement():
  global x
  dx = kd(KEY_RIGHT)-kd(KEY_LEFT)
  if dx !=0:
    curseur(x,'white')#draw_string(" ",45+30*x,32)
    x = (x+dx)%7
    curseur(x,couleur)
    while kd(KEY_LEFT) or kd(KEY_RIGHT):True

def descente(x):
  global Jeu
  l=0
  while l<6 and Jeu[l][x]==0: # tant que la case est libre
    sleep(0.1)
    if l>0:
      jeton(x,l-1,'white')
      Jeu[l-1][x]=0
    jeton(x,l,couleur)
    Jeu[l][x]=num_joueur
    y=l
    l+=1
  while kd(KE) or kd(KO):True
  return y

def jeton(x,y,couleur):
  draw_string("o",35-5+30*x,55-9+30*y,couleur)

def test_fin():
  #global score ?
  k=num_joueur
  if str(k)*4 in chaine:
    draw_string("Joueur"+str(k)+" a gagné",85,3,couleur)
    curseur(x,'white')
    draw_string("Appuyer sur EXE",85,21,purple)
    draw_string("Score : ",240,110,'purple')
    score[k-1]+=1
    draw_string("J"+str(k)+" : "+str(score[k-1]),240,110+18*k,couleur)
    if score[2-k]==0:
      draw_string("J"+str(3-k)+" : 0",240,110+18*(3-k),'blue'*(k-1)+'red'*(2-k))
    return True
  return False

def fin2():
  k=num_joueur
  maxi_voisins=0
  #ligne
  voisins=1
  liste_gagnant=[[y,x]]
  lig=0
  while y-lig>0:
    lig+=1
    if Jeu[y-lig][x]==k:
      voisins+=1
      liste_gagnant.append([y-lig,x])
    else:lig+=10
  lig=0
  while y+lig<5:
    lig+=1
    if Jeu[y+lig][x]==k:
      voisins+=1
      liste_gagnant.append([y+lig,x])
    else:lig+=10
  if voisins>=4:
    for elt in liste_gagnant:
      jeton(elt[1],elt[0],'green')
    maxi_voisins=max(voisins,maxi_voisins)
  #colonne
  voisins=1
  liste_gagnant=[[y,x]]
  col=0
  while x-col>0:
    col+=1
    if Jeu[y][x-col]==k:
      voisins+=1
      liste_gagnant.append([y,x-col])
    else:col+=10
  col=0
  while x+col<6:
    col+=1
    if Jeu[y][x+col]==k:
      voisins+=1
      liste_gagnant.append([y,x+col])
    else:col+=10
  if voisins>=4:
    for elt in liste_gagnant:
      jeton(elt[1],elt[0],'green')
    maxi_voisins=max(voisins,maxi_voisins)
  #diag 1
  voisins=1
  liste_gagnant=[[y,x]]
  lig=0
  col=0
  while y-lig>0 and x-col>0:
    lig+=1
    col+=1
    if Jeu[y-lig][x-col]==k:
      voisins+=1
      liste_gagnant.append([y-lig,x-col])
    else:lig+=10
  lig=0
  col=0
  while y+lig<5 and x+col<6:
    lig+=1
    col+=1
    if Jeu[y+lig][x+col]==k:
      voisins+=1
      liste_gagnant.append([y+lig,x+col])
    else:lig+=10
  if voisins>=4:
    for elt in liste_gagnant:
      jeton(elt[1],elt[0],'green')
    maxi_voisins=max(voisins,maxi_voisins)
  #diag 2
  voisins=1
  liste_gagnant=[[y,x]]
  lig=0
  col=0
  while y+lig<5 and x-col>0:
    lig+=1
    col+=1
    if Jeu[y+lig][x-col]==k:
      voisins+=1
      liste_gagnant.append([y+lig,x-col])
    else:lig+=10
  lig=0
  col=0
  while y-lig>0 and x+col<6:
    lig+=1
    col+=1
    if Jeu[y-lig][x+col]==k:
      voisins+=1
      liste_gagnant.append([y-lig,x+col])
    else:lig+=10
  if voisins>=4:
    for elt in liste_gagnant:
      jeton(elt[1],elt[0],'green')
    maxi_voisins=max(voisins,maxi_voisins)
  if maxi_voisins>=4:
    draw_string("Joueur"+str(k)+" a gagné : Puissance"+str(maxi_voisins)+" "+"!"*min((maxi_voisins-3),3),10-5*min((maxi_voisins-4),2),3,couleur)
    curseur(x,'white')
    draw_string("Appuyer sur EXE",85,21,purple)
    draw_string("Score : ",240,110,'purple')
    score[k-1]+=1
    draw_string("J"+str(k)+" : "+str(score[k-1]),240,110+18*k,couleur)
    if score[2-k]==0:
      draw_string("J"+str(3-k)+" : 0",240,110+18*(3-k),'blue'*(k-1)+'red'*(2-k))
    return True
  elif sum(int(Jeu[k][l]) for k in range(6) for l in range(7))==63:
    draw_string("Personne n'a gagné",70,3)
    curseur(x,'white')
    draw_string("Appuyer sur EXE",85,21,purple)
    return True
  return False



num_joueur=1 # vaudra 1 ou 2
x=3
for i in range(8): # tracé du plateau
  fill_rect(20+30*i,40,1,181,'orange')
  fill_rect(20,40+min(30*i,30*6),211,1,'orange')
score=[0,0]
init()
while True:
  couleur='blue'*(num_joueur==1)+'red'*(num_joueur==2)
  curseur(x,couleur)
  while not (kd(KE) or kd(KO)):
    deplacement()
  if Jeu[0][x] == 0:
    y=descente(x)
    if fin2():
      while not (kd(KE) or kd(KO)):True
      init()
      while kd(KE) or kd(KO):True
    num_joueur=3-num_joueur