puissance4.py

Created by florian-allard

Created on August 01, 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

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 <a href="https://www.numworks.com/legal/cookies-policy/">cookies policy</a>.