puissance4_2.py

Created by florian-allard

Created on July 31, 2020

3.97 KB

Jeu du Puissance 4, améliorée avec la mise en évidence de l’alignement gagnant et légèrement optimisée par rapport à la version précédente, disponible ici. La version basique 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):
  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')
    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
    l+=1
  while kd(KE) or kd(KO):True
  return l-1

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

def fin():
  k=num_joueur
  maxi_voisins=0
  #ligne
  voisins=1
  liste_gagnant=[[y,x]]
  for lig in range(1,y+1):
    if Jeu[y-lig][x]==k:
      voisins+=1
      liste_gagnant.append([y-lig,x])
    else:break
  for lig in range(1,5-y+1):
    if Jeu[y+lig][x]==k:
      voisins+=1
      liste_gagnant.append([y+lig,x])
    else:break
  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]]
  for col in range(1,x+1):
    if Jeu[y][x-col]==k:
      voisins+=1
      liste_gagnant.append([y,x-col])
    else:break
  for col in range(1,6-x+1):
    if Jeu[y][x+col]==k:
      voisins+=1
      liste_gagnant.append([y,x+col])
    else:break
  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]]
  for diag in range(1,min(x,y)+1):
    if Jeu[y-diag][x-diag]==k:
      voisins+=1
      liste_gagnant.append([y-diag,x-diag])
    else:break
  for diag in range(1,min(6-x,5-y)+1):
    if Jeu[y+diag][x+diag]==k:
      voisins+=1
      liste_gagnant.append([y+diag,x+diag])
    else:break
  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]]
  for diag in range(1,min(x,5-y)+1):
    if Jeu[y+diag][x-diag]==k:
      voisins+=1
      liste_gagnant.append([y+diag,x-diag])
    else:break
  for diag in range(1,min(6-x,y)+1):
    if Jeu[y-diag][x+diag]==k:
      voisins+=1
      liste_gagnant.append([y-diag,x+diag])
    else:break
  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 fin():
      while not (kd(KE) or kd(KO)):True
      init()
      while kd(KE) or kd(KO):True
    num_joueur=3-num_joueur