puissance4.py

Created by florian-allard

Created on July 31, 2020

4.15 KB

Jeu du Puissance 4. À tour de rôle, deux joueurs lâchent un jeton dans une colonne au choix. Le premier joueur qui aligne au moins 4 jetons de sa couleur, en ligne, en colonne ou en diagonale, a gagné. Les versions précédentes sont disponibles ici et . Une version optimisée avec un script plus court est disponible par ici.


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 remplir(x,y,couleur):
  fill_rect(35-2+30*x,55-1+30*y,4,4,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:
      remplir(elt[1],elt[0],couleur)
    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:
      remplir(elt[1],elt[0],couleur)
    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:
      remplir(elt[1],elt[0],couleur)
    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:
      remplir(elt[1],elt[0],couleur)
    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