# puissance4.py

Created by cent20

Created on May 05, 2023

5.42 KB

### 𝗣𝘂𝗶𝘀𝘀𝗮𝗻𝗰𝗲𝟰

Python Game 🎮 v1.01 for Numworks, all models.

By Robin C. & Vincent ROBERT avril 2023.

Un projet libre réalisé dans la cadre de l'enseignement de spécialité NSI.

#### Changelog

Convert v1.0 - 25/04/2023:
- Initial version

Convert v1.01 - 26/04/2023:
- gris = (242,242,242) <3

```from kandinsky import fill_rect as rect, draw_string as txt
from time import sleep
from ion import keydown

# Puissance 4 1.01 NumWorks, 23.04.2023
# Par Robin C. & Vincent ROBERT
# https://nsi.xyz/puissance4

# 1 = rouge // 2 = jaune

# Variables globales
player = 1
grille_preview = [0, 0, 0, 0, 0, 0, 0]
grille = [[0 for i in range(7)] for i in range(6)]

rouge = (182, 2, 5)
jaune = (255, 181, 49)
gris = (242,242,242) #Best grey

pos = 3

points_rouge = 0
points_jaune = 0

def verifie(): #Gagnant ?
for i in range(6): #lignes
for j in range(4):
if grille[i][j] == player and grille[i][j+1] == player and grille[i][j+2] == player and grille[i][j+3] == player:
gagnant(player)
for i in range(3): #colonnes
for j in range(7):
if grille[i][j] == player and grille[i+1][j] == player and grille[i+2][j] == player and grille[i+3][j] == player:
gagnant(player)
for i in range(3): #diagonales
for j in range(4):
if grille[i][j] == player and grille[i+1][j+1] == player and grille[i+2][j+2] == player and grille[i+3][j+3] == player:
gagnant(player)
for i in range(3, 6):
for j in range(4):
if grille[i][j] == player and grille[i-1][j+1] == player and grille[i-2][j+2] == player and grille[i-3][j+3] == player:
gagnant(player)

def gagnant(winner): #Met fin à une partie avec un gagnant ou pas
global points_jaune, points_rouge, player, nb_partie, grille, partie
affichage_grille()
if winner == 1 :
points_rouge += 1
player = 2
txt("Rouge a gagné !", 88, 20)
elif winner == 2 :
points_jaune += 1
player = 1
txt("Jaune a gagné !", 88,20)
else :
txt("C'est une égalité", 76, 20)
wait()
actu_src()
grille = [[0 for i in range(7)] for i in range(6)]
affichage_grille()

def selection():
global pos
affichage_grille()
preview(pos)
while True :
preview(pos)
while colonne_pleine(pos):
preview(pos)
key_pressed = wait()
if key_pressed == 0:
if key_pressed == 3:
if key_pressed==0 or key_pressed==3:
preview(pos)
if key_pressed == 4 or key_pressed == 52 :
rect(75, 17, 170, 20, (255,255,255))
jouer(pos)

def jouer(colonne): # Ajoute un jeton dans la colonne donnée
global player
if player == 1 :
animation(colonne)
grille[gravite(colonne)][colonne] = 1
verifie()
player = 2
elif player == 2 :
animation(colonne)
grille[gravite(colonne)][colonne] = 2
verifie()
player = 1
grille_pleine()

def animation(colonne): #Animation chute
if player == 1 :
color = rouge
else :
color = jaune
for i in range(0, gravite(colonne)+1):
ligne = (i-1)*(i!=0)
rect(75+(25*colonne),42+(ligne*25),20,20,gris)
sleep(0.05)
draw_cercle(75 + (25*colonne) + 7, 42 + (i*25) + 2, color)
sleep(0.05)

def draw_cercle(x,y,color): #Fait des cercles (Par VR)
for d in range(6):
rect(x-d+(d==0),y+d+(d==5),6+2*d-2*(d==0),16-2*d-2*(d==5), color)

def colonne_pleine(colonne):
if (grille[0][colonne] == 1) or (grille[0][colonne] == 2):
return True
return False

def grille_pleine(): #Vérifie si égalité
colonne_pleines = 0
for i in range(7):
if colonne_pleine(i):
colonne_pleines += 1
if colonne_pleines == 7:
gagnant(0)

def gravite(colonne): #Détermine la ligne où le jeton peut se placer
ligne = 5
while grille[ligne][colonne] != 0:
if ligne == 0 :
return ligne
ligne -= 1
return ligne

def affichage_grille():
rect(75, 42, 175, 150, (255,255,255))
pos_x, pos_y_base, marge = 50, 42, 25
for i in range(7):
pos_x += marge
pos_y = pos_y_base
for y in range(6):
cote = 20
if grille[y][i] == 1:
color = rouge
elif grille[y][i] == 2:
color = jaune
else :
color = gris
if grille[y][i] == 1 or grille[y][i] == 2:
rect(pos_x, pos_y, cote, cote, gris)
draw_cercle(pos_x + 7, pos_y + 2,color)
else:
rect(pos_x, pos_y, cote, cote, gris)
pos_y += marge

def affichage_preview(col_preview):
if player == 1 :
color = rouge
else :
color = jaune
draw_cercle(75 + (col_preview * 25) + 7, 17+2, color)

def preview(col): #Détermine ou le jeton de prévisualisation sera affiché
affichage_preview(col)
if player == 1:
pos_preview = [0, col]
if grille_preview[col] == 0:
grille_preview[col] = '3'
elif player == 2:
pos_preview = [0, col]
if grille_preview[col] == 0:
grille_preview[col] = '4'
rect(75, 17, 170, 20, (255,255,255))
affichage_preview(col)
grille_preview[col] = 0

def wait(buttons=(0,1,2,3,4,52)):
while True:
for i in buttons:
if keydown(i):
while keydown(i): True
return i

#Score par Thomas S. mais code par Robin C.
def affichage_src():
txt("J-1", 22, 42)
draw_cercle(35,70,rouge)
txt("Score", 12, 117)
if points_rouge < 10 :
largeur = 32
else :
largeur = 27
txt(str(points_rouge),32,142)
txt("J-2", 267, 42)
draw_cercle(280,70,jaune)
txt("Score", 257, 117)
if points_jaune < 10 :
largeur = 277
else :
largeur = 272
txt(str(points_jaune),277,142)

def actu_src():
txt(str(points_rouge),37-5*len(str(points_rouge)),142)
txt(str(points_jaune),282-5*len(str(points_jaune)),142)

rect(0,200,320,22,(148,113,222))
txt("Code by nsi.xyz/puissance4",33,202,(242,)*3,(148,113,222))

affichage_src()
selection()```