Projet ISN - Motus sous Python

Fermé
LisaZoeChloe Messages postés 2 Date d'inscription mardi 9 juin 2015 Statut Membre Dernière intervention 9 juin 2015 - 9 juin 2015 à 18:33
 Utilisateur anonyme - 10 juin 2015 à 21:59
Bonsoir à tous,

Nous sommes en Terminale S spécialité ISN, et nous avons choisi de présenter comme programme une version maison du jeu Motus, renommé pour cela Motuth.

Seulement, nous avons plusieurs problèmes : tout d'abord, une fois que l'utilisateur a trouvé le bon mot, ou qu'il a épuisé toutes ses chances de trouver le bon mot, nous n'arrivons pas à faire afficher une nouvelle grille de jeu (le problème se trouve de la ligne 88 à la ligne 236). Ensuite, nous avons du mal à intégrer une variable score (appelée ici s), qui compterait le nombre de points en fonction du nombre de grilles réussies, problème lié au fait que nous n'arrivons pas à faire une nouvelle grille (lignes 258 à 306). Enfin, le jeu démarre par une animation sous forme de GIF (que vous ne pourrez sûrement pas visualiser puisque vous ne disposez pas des images nécessaires, il vous faudra donc supprimer cette partie pour tester le jeu, je suppose), que nous souhaiterions fermer en cliquant simplement dessus, ce que nous n'arrivons pas à faire.

Nous sommes conscientes de demander beaucoup, mais chaque réponse nous sera précieuse.

Merci d'avance,

Lisa, Zoé, Chloé, trois élèves en détresse

from tkinter import *
import random
import time
trouve = False
a=1
s=0 #score
v=3 #vies


# PSEUDO -----------------------------------------------------------------------

def fetch():
global nom
nom=ent.get()
recap.configure(text='Votre pseudo est : '+ent.get())
ent.delete(0,END)
score=s
resultats=open('scores','r')
r=resultats.read().split()
joueurs=[['0','0'],['0','0'],['0','0'],['0','0'],['0','0']]
joueurs=sorted(joueurs,reverse=True)
nom=ent.get()
z=int(joueurs[4][0])
while s<z:
joueurs[4][0]=s
joueurs[4][1]=nom
joueurs=sorted(joueurs,reverse=True)

resultats.close()
joueurs.remove(joueurs[4])
joueurs.append([score,nom])


# GENERIQUE --------------------------------------------------------------------

root = Tk()
root.title("GIF")

frame=[]

# Pour les images de 01.gif à 020.gif :
for i in range(1,21):
fname = "0"+str(i)+".gif"
frame+=[PhotoImage(file=fname)]

wrap = Canvas(root, width=800, height=276)
wrap.pack()

def do_animation(currentframe):
def do_image():
wrap.create_image(400,138,image=frame[currentframe], tag='ani')
# Permet de supprimer l'image en cours d'utilisation :
wrap.delete('ani')
try:
do_image()
except IndexError:
# Recommencer à la première image :
currentframe = 0
do_image()
wrap.update_idletasks() #Force à rééditer le canvas
currentframe = currentframe + 1
# Lancer l'animation :
root.after(100, do_animation, currentframe)

# Lancer do_animation
root.after(1, do_animation, 0)

#Lancer le jeu :


root.mainloop()


# COMPARAISON MOT ET PROPOSITION -----------------------------------------------


def ouvrirfen1() :

s=0 #score
v=3 #vies

global Continue
Continue = True

def affiche(event):
global i,a, trouve,s,v
while (a<=6) and (trouve==False):

"Votre proposition"
prop=entrerprop.get()
recap.configure(text=' Votre proposition : '+entrerprop.get())

# proposition en majuscule

propMaj=prop.upper()

# Affichage de la propostion dans le tableau

for k in range(5):
txt = can1.create_text(90+k*95, 160 +80*(a-1), text=propMaj[k], font="Arial 46", fill="white")
fen1.update()
time.sleep(0.5)
mot_bis=mot
for l in range (5):
if propMaj[l]==mot[l]:
if l==5:
mot_bis=mot_bis[0:5]+' '
else :
mot_bis=mot_bis[0:l]+' '+mot_bis[l+1:]
can1.create_rectangle(50+l*95,120+(a-1)*80,50+(l+1)*95,120+a*80,fill="red")
print(mot_bis)
for m in range (5):
if propMaj[m] in mot_bis:
if m==0 :
mot_bis=' '+mot_bis[1:]
else :
if l==5:
mot_bis=mot_bis[0:5]+' '
else :
mot_bis=mot_bis[0:m]+' '+mot_bis[m+1:]
can1.create_rectangle(50+m*95,120+(a-1)*80,50+(m+1)*95,120+a*80,fill="yellow")
for k in range(5):
txt = can1.create_text(90+k*95, 160 +80*(a-1), text=propMaj[k], font="Arial 46", fill="white")
fen1.update()
a=a+1
if propMaj==mot:
trouve=True
s=s+50
print('votre score est actuellement de',s) #à enlever
txt = can1.create_text(90+l, 160+l, text=mot[0], font="Arial 46", fill="white")
entrerprop.delete(0,END)
if a==7: #Perdre une vie si pas trouvé le mot
v=v-1
print("le mot à trouver était :",mot)

# Affichage de la première lettre à la ligne suivante, pour la nouvelle proposition
#txt = can1.create_text(95, 161+80*(a), text=mot[0], font="Arial 46", fill="white")
#a=a+1


#Mot proposé dans la zone de saisie
fen1=Tk()
fen1.title("MOTUTH")
Label(fen1,text="Proposition", width=71,bg='CornflowerBlue',font="Arial 12").grid(row=0,column=0)


trouve=False


entrerprop=Entry(fen1)
entrerprop.bind("<Return>",affiche)
entrerprop.grid(row=0,column=1)
prop=entrerprop.get()
recap=Label(fen1)
recap.grid(row=2,column=0)




#Mot choisi par le programme
liste_mot=['RALER','RAFLE','LIVRE','OBJET','FORCE','MARIE','DEGAT','MATHS','PORTE','COUPE','TABLE','NOTES','CRABE','LATIN','CHOIX','VOILA','ROUGE','JOLIE','OGRES','FELIN','FURET','STYLO','POING','TIGRE','MORTE','OMBRE','HIBOU','HUILE','BIJOU','PIXEL','SUITE','ARMES','DAGUE','PARLE','FUITE','HACHE','MAGIE','BATON','CORDE','FOINS','HOTEL','AUTEL','RUINE','POSTE','CARTE','CHUTE','URNES','OUTRE','COQUE','COPIE','GOULE','TOMES','POIRE','FROID','CHAUD','DEVIN','PRUNE','MELON','FONTE','GLACE','ARCHE','PLAGE','CLEFS','EXTRA','TOILE','BRUIT','MORTS','VELOS','CLAIR','TOURS','POINT','POULE','BONUS','MALUS','USAGE','JOKER','TEMPS','CHAOS','MORAL','CIBLE','COURS','POIDS','GRAND','MONDE','TRONC']
mot = random.choice(liste_mot)
print(mot)


# Tableau de jeu
can1=Canvas(fen1,bg='Cornflowerblue',height=700,width=650)
can1.grid(row=1)
x1,y1,x2,y2=50,40,525,40
x3,y3,x4,y4=50,120,50,600
for k in range (7) : # lignes verticales
y1,y2=y1+80,y2+80
can1.create_line (x1,y1,x2,y2,fill='white')
k=k+1


for l in range (6): # lignes horizontales
can1.create_line (x3,y3,x4,y4,fill='white')
x3,x4=x3+95,x4+95
l=l+1

#Création des rectangles utilisés pour la comparaison
x5,y5,x6,y6=50,120,145,200
x7,y7,x8,y8=50,200,145,280
x9,y9,x10,y10=50,280,145,360
x11,y11,x12,y12=50,360,145,440
x13,y13,x14,y14=50,440,145,520
x15,y15,x16,y16=50,520,145,600
for m in range (5):
can1.create_rectangle(x5,y5,x6,y6)
x5,x6=x5+95,x6+95
m=m+1
for n in range (5):
can1.create_rectangle(x7,y7,x8,y8)
x7,x8=x7+95,x8+95
n=n+1
for o in range (5):
can1.create_rectangle(x9,y9,x10,y10)
x9,x10=x9+95,x10+95
o=o+1
for p in range (5):
can1.create_rectangle(x11,y11,x12,y12)
x11,x12=x11+95,x12+95
p=p+1
for q in range (5):
can1.create_rectangle(x13,y13,x14,y14)
x13,x14=x13+95,x14+95
q=q+1
for r in range (5):
can1.create_rectangle(x15,y15,x16,y16)
x15,x16=x15+95,x16+95
r=r+1


#Afficher la première lettre du mot à trouver dans le tableau
txt = can1.create_text(90, 160, text=mot[0], font="Arial 46", fill="white")

#Labels vie(s)
Label(fen1,text="Nombre de vie(s) restante(s):", width=25, bg='CornflowerBlue', height=20, font='Arial 12').grid(row=1,column=1)
Label(fen1,text=v,bg='CornflowerBlue',width=1,height=20,font='Arial 12').grid(row=1,column=2)

#Fenêtre qui annonce le score


fen1.mainloop()



# FENÊTRE REGLES ---------------------------------------------------------------


def ouvrirfen2() :
fen2=Toplevel()
fen2.title("REGLES")
fen2.grab_set()
fen2.focus_set()

canvas = Canvas(fen2,width=600, height=600)
photo = PhotoImage(file="règles.gif")
item = canvas.create_image(300,300, image=photo)
canvas.pack()
fen2.mainloop()

# FENÊTRE SCORES ---------------------------------------------------------------


def ouvrirfen3() :
fen3=Toplevel()
fen3.title("SCORES")
fen3.grab_set()
fen3.focus_set()
can3=Canvas(fen3,bg='CornflowerBlue',height=400,width=650)
can3.pack(side=LEFT)

#fichier scores
resultats=open('scores','r')
r=resultats.read().split()
joueurs=[['0','0'],['0','0'],['0','0'],['0','0'],['0','0']]
for i in range(5):
joueurs[i][0]=r[2*i]
joueurs[i][1]=r[2*i+1]

joueurs=sorted(joueurs,reverse=True)
nom=ent.get()
z=int(joueurs[4][0])
if s>(z):
joueurs[4][0]=s
joueurs[4][1]=nom
joueurs=sorted(joueurs,reverse=True)
else:
print('')

resultats.close()

#tracer du tableau
x1,y1=50,70

for k in range (6) :
can3.create_line (50,y1+k*50,600,y1+k*50,fill='white')


for l in range (3):
can3.create_line (x1+l*275,70,x1+l*275,321,fill='white')


#placement des pseudos et scores dans le tableau
A=48
a=len(joueurs)
for u in range (a):
A=A+50
txt1 = can3.create_text(160,A,text=joueurs[u][0],font="14", fill="white")
txt1 = can3.create_text(455,A,text=joueurs[u][1],font="14", fill="white")

print(joueurs)
fen3.mainloop()


# MENU ACCUEIL -----------------------------------------------------------------


def ouvrirfen0() :
fen0=Toplevel()
fen0.title("ACCUEIL")
fen0.grab_set()
fen0.focus_set()
canvas = Canvas(fen0,width=350, height=110, bg='CornflowerBlue')
photo = PhotoImage(file="final0.gif")
item = canvas.create_image(175,61, image=photo)
canvas.grid(row =1, column =1, rowspan =5, padx =0, pady =0)
bou1=Button(fen0,width=10,text='JEU',fg='white',bg='CornflowerBlue',command=ouvrirfen1)
bou1.grid(row=1,sticky=E)
bou2=Button(fen0,width=10,text='REGLES',fg='white',bg='CornflowerBlue',command=ouvrirfen2)
bou2.grid(row=2,sticky=E)
bou3=Button(fen0,width=10,text='SCORES',fg='white',bg='CornflowerBlue',command=ouvrirfen3)
bou3.grid(row=3,sticky=E)
bou4=Button(fen0,width=10,text='QUITTER',fg='white',bg='CornflowerBlue',command=quit)
bou4.grid(row=4,sticky=E)

fen0.mainloop


# ENTREE DU PSEUDO -------------------------------------------------------------

fen= Tk()
fen.title('Choisissez votre pseudo :')
ent = Entry(fen,width=50)
ent.pack(side=TOP, fill=X)
nom=ent.bind('<Return>',lambda event: fetch())

recap=Label(fen)
recap.pack(side=BOTTOM)

bou001=Button(fen,text="Valider et accéder au jeu",command=ouvrirfen0)
bou001.pack(side=BOTTOM)
A voir également:

1 réponse

Utilisateur anonyme
9 juin 2015 à 18:52
Salut,

J'ai plusieurs propositions. Déjà, il faut que tu inséres correctement ton code. Pour cela (soit dans un nouveau message, soit en modifiant ton post) clique sur le menu déroulant du bouton <> (quand tu écris un message) puis sélectionne Python. Colle ton code entre les deux bannières et c'est bon.

Ensuite, tu as un problème vis-à-vis du fait de recommencer le jeu après qu'il ait trouvé le mot ou qu'il ait épuisé toutes ses chances. Tu peux mettre tout ce qui concerne la fenêtre de jeu dans une fonction (mettons jeu() ) et mettre à la fin (quand il a gagné le jeu) :
fen1.destroy() # si fen1 regroupe bien toute la partie de ton jeu
jeu() # exécute tout le jeu


La fonction jeu() va donc s'appeler elle-même quand le joueur a gagné ou n'a plus de vie.

N'oublie pas de réinitialiser les variables qui ne le sont pas au début de jeu ! (sauf si tu veux qu'elles s'incrémentent comme la variable s).
0
LisaZoeChloe Messages postés 2 Date d'inscription mardi 9 juin 2015 Statut Membre Dernière intervention 9 juin 2015
9 juin 2015 à 19:03
Salut Help-Jason,

Merci pour ta réponse si rapide !
Crois-tu que tu pourrais, en copiant-collant notre programme, nous montrer comment tu envisages que l'on s'y prenne ? Nous sommes un peu perdues, bien que nous essayons de notre côté également de faire ce que tu nous proposes.

Encore merci
0
Utilisateur anonyme
10 juin 2015 à 21:59
Déjà réalise la première étape qui est d'insérer correctement ton code sur le forum. Ensuite, il faut que tu comprennes ce que je veux dire. Je pense qu'il faut que tu crées une fonction jeu() qui englobe toute la partie COMPARAISON MOT ET PROPOSITION (même s'il y a des définitions à l'intérieur). Tu ajoutes :
fen1.destroy()
jeu()

quand le joueur n'a plus de vie ou qu'il a gagné. Comme ça, ça détruit tout l'environnement que tu as crée puis ça recommence du début.

Attention aux variables non initialisées qui vont continuer de varier (pour la variable score c'est pas important mais pour vie c'est important car le nombre de vie est réinitialisé à chaque début de jeu).
0