👤

Bonjour,
J'aimerai savoir pour quel raison, mon programme python crash quand je l'exécute.
Voici mon programme ;
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
*** NSI 1ère ***

Canevas générique pour un jeu de plateau avec la bibliothèque TKINTER

"""

from tkinter import *
from tkinter.messagebox import showinfo
from random import randrange


coteCanevas = 600 # Côté du canevas en pixels
marge = 20 # Marge entre le bord du canevas et le plateau de jeu
areteCase = (coteCanevas - 2*marge)/3

etatJeu = [[0,0,0],
[0,0,0],
[0,0,0]]

nombreCoups = 0
humainCommence = True
humainJoue = True
partieFinie = True

def initJeu():
"""
Initialisation du jeu. Structures de données propres au jeu
"""
global nombreCoups

for i in range(2):
for j in range(2):
etatJeu[i][j] = 0

nombreCoups = 0


def nouvellePartie():
global humainCommence, humainJoue, partieFinie

print("nouvelle partie")
partieFinie = False

#if randrange(2) == 1:
if True:
humainCommence = True
humainJoue = True
else:
humainCommence = False
humainJoue = False

can.delete("all")
dessinePlateau()
if not(humainJoue):
machineJoue()


def about():
"""
Affiche la fenêtre "A propos"
"""

showinfo(
"A propos\n\n",

"*** Programme écrit par ***\n"
" EL MASAOUDI Raymân \n"
"1èreE NSI - Lycée Louis Armand - Mulhouse \n"
)

return()


def reglesJeu():
"""
Affiche les règles du jeu dans une boîte d'information
"""

showinfo(
"Règles du jeu\n\n",

"Premièrement : Le but du jeu est d'aligner avant son adversaire 3 symboles identiques horizontalement, verticalement ou en diagonale. \n"
"Deuxièmement : Attention, le joueur qui débute est toujours avantagé pour gagner. Pensez donc à alterner pour équilibré le combat ! \n"
)

return()


def dessinePlateau():
"""
Dessin du plateau de jeu
"""

# Exemple avec un plateau de Tic Tac Toe

areteCase = (coteCanevas - 2*marge)/3

x = 0
y = 0

for i in range(4): # Tracé des lignes horizontales
can.create_line(marge, y + marge, coteCanevas - marge, y + marge, width=4, fill="black")
y += areteCase

x = 0
y = 0

for i in range(4): # Tracé des lignes verticales
can.create_line(x + marge, marge, x + marge, coteCanevas - marge, width=4, fill="black")
x += areteCase


def dessineCroix(i,j):
delta = 15
x0 = marge + j*areteCase
y0 = marge + i*areteCase

x1 = x0 + delta
y1 = y0 + delta
x2 = x0 + areteCase - delta
y2 = y0 + areteCase - delta

can.create_line(x1, y1, x2, y2, width = 5, fill ='DeepSkyBlue2')
can.create_line(x2, y1, x1, y2, width = 5, fill ='DeepSkyBlue2')


def dessineCercle(i,j):
delta = 15
x0 = marge + j*areteCase
y0 = marge + i*areteCase

x1 = x0 + delta
y1 = y0 + delta
x2 = x0 + areteCase - delta
y2 = y0 + areteCase - delta

can.create_ovale(x1, y1, x2, y2, width = 5, fill ='Green')
can.create_ovale(x2, y1, x1, y2, width = 5, fill ='Green')
return

def machineJoue():
global humainJoue
caseVide = False
while not caseVide:
i = randrange(0,3)
j = randrange(0,3)
if etatJeu[i][j] == 0:
CaseVide = True
if humainCommence:
etatJeu[i][j] = -1
else:
etatJeu[i][j] = 1
if etatJeu[i][j] == 1:
dessineCroix(i,j)
else:
dessineCercle(i,j)
verifiePlateau()
humainJoue = True
return

def verifiePlateau():
global humainCommence,humainJoue
if randrange(2) == 0:
humainCommence = False
humainJoue = False
else:
humainJoue = False
if not machineJoue():
humainJoue

def convertitClick(x, y):
if (x >= marge) and (x < coteCanevas - marge) and (y >= marge) and (y < coteCanevas - marge):
i = int((y - marge)//areteCase)
j = int((x - marge)//areteCase)
else:
i = -1
j = -1

return (i,j)

def clickSouris(event):
"""
Fonction appelée lors d'un click du bouton gauche
de la souris/trackpad
"""
global nombreCoups, humainJoue

print("Clic au point", (event.x, event.y))

if not(partieFinie) and humainJoue:
(i,j) = convertitClick(event.x, event.y)
#print(i,j)

if (i,j) != (-1,-1):
if etatJeu[i][j] == 0: # Case vide ?
if humainCommence: # humain a les croix
dessineCroix(i,j)
etatJeu[i][j] = 1
else:
dessineCercle(i,j)
etatJeu[i][j] = -1

nombreCoups += 1
verifiePlateau()
if not(partieFinie):
humainJoue = False
machineJoue()

# Main

fen = Tk()

fen.title("Jeu de ...")
fen.config(bg = "bisque") # Couleur du fond de la fenêtre
fen.resizable(width=False, height=False) # Interdit le redimensionnement de la fenêtre

can = Canvas(fen, width=coteCanevas, height=coteCanevas, bg = "snow2")
can.pack(side=LEFT, padx=25, pady=25)

bouton0 = Button(fen, text="A propos", command = about)
bouton0.pack(side=TOP, padx=20, pady=50)

bouton1 = Button(fen, text="Règles du jeu", command = reglesJeu)
bouton1.pack(side=TOP, padx=20, pady=50)

bouton2 = Button(fen, text="Nouvelle partie", command = nouvellePartie)
bouton2.pack(side=TOP, padx=20, pady=50)

can.bind("", clickSouris) # Gestion des clicks

dessinePlateau()

# Gestionnaire d'évènements
fen.mainloop()

© 2024 IDNLearn. All rights reserved.