Aide pour notre projet Isn

Fermé
Kingwarras Messages postés 16 Date d'inscription mercredi 8 août 2012 Statut Membre Dernière intervention 17 décembre 2014 - Modifié par Kingwarras le 8/05/2014 à 16:34
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 - 10 mai 2014 à 23:32
Bonjour, pour notre projet d'Isn, nous avons décidé de créer un morpion; mais nous n'arrivons pas à le terminer.
Nous avons notre fenêtre, la grille, les formes et nous pouvons les positionner à l'aide du clavier numérique.

Nous avons 2 problèmes:
- si je place une croix dans une case, le joueur suivant peux y placer un cercle. Je ne sais pas comment y remédier
- et le dernier problème c'est de définir quand est ce qu'un joueur gagne; je sais qu'il faut dire au programme que si 3 ronds/cercles sont alignés le joueur gagne, mais je ne sais pas comment définir cet alignement.

En espérant que quelqu'un nous vienne en aide



Programme:


from Tkinter import *


def dessin_partie(x,y):
    if joueur==1:
        s='c'
        t='r'
    else:
        s='r'
        t='c'
    t=t+str(x)+str(y)
    s=s+str(x)+str(y)
    fond.itemconfig(t,state=HIDDEN)
    fond.itemconfig(s,state=NORMAL)

def alignement():
    global table
    aligne = (table[0]==[1,1,1] or table[1]==[1,1,1] or table[2]==[1,1,1])  #alignement horiz
    aligne = aligne or (table[0]==[2,2,2] or table[1]==[2,2,2] or table[2]==[2,2,2]) #alignement horiz
    aligne = aligne or (table[0][0] in [1,2] and table[0][0]==table[0][1] and table[0][1]==table[0][2]) #alignement vertical
    return aligne

def jouer(event):
    global joueur,table,finpartie,informe
    zz=event.char
    informe.config(text='touche='+zz)
    fini = not (zz in ['1','2','3','4','5','6','7','8','9'])
    while not fini:
        if zz=='1':   x=0;y=2
        elif zz=='2': x=1;y=2
        elif zz=='3': x=2;y=2
        elif zz=='4': x=0;y=1
        elif zz=='5': x=1;y=1
        elif zz=='6': x=2;y=1
        elif zz=='7': x=0;y=0
        elif zz=='8': x=1;y=0
        elif zz=='9': x=2;y=0
        if table[x][y]==0 :
            table[x][y]==joueur
            finpartie=alignement()
            dessin_partie(x,y)
            joueur=joueur+1
            if joueur>2:joueur=1
        fini=True


def nouvelle_partie():
    global joueur,finpartie
    nomJoueur1 = 'Joueur 1'
    typeJoueur1 = 'humain'
    scoreJoueur1 = 0
    #textnomJoueur1=fond.create_text(10,10,text=nomJoueur1)
    #fond.itemconfig(textScore1,text=str(scoreJoueur1))
    nomJoueur2 =  'Joueur 2'
    typeJoueur2 = 'ordinateur'
    scoreJoueur2 = 0
    joueur=1
    finpartie=False
    #fond.itemconfig(textNomJoueur2,text=nomJoueur2)
    #fond.itemconfig(textScore2,text=str(scoreJoueur2))
    fond.delete(img)
    fond.update()
    """tracer plateau"""
    fond.create_line(120, 30, 120, 280, width = 10)
    fond.create_line(205, 30, 205, 280, width = 10)
    fond.create_line(30, 120, 280, 120, width = 10)
    fond.create_line(30, 205, 280, 205, width = 10)
    #fond.create_text(100, 50, text='Appuyez sur une touche du pavé numérique')

table=[ [0,0,0],
        [0,0,0],
        [0,0,0]]


racine=Tk()
#photo=Tkinter.PhotoImage(file="image morpion.gif")
photo=PhotoImage(file="Z:\ISN\image morpion.gif")
largeur=photo.width(); hauteur=photo.height()
fond=Canvas(racine, width=300, height=300, bg='white')
fond.pack()
img=fond.create_image(largeur/2+1,hauteur/2+1,image=photo)
taille=20
for k in range(3):
    for j in range(3):
        fond.create_oval(80+k*80-taille,80+j*80-taille,80+k*80+taille,80+j*80+taille,fill = "red",state=HIDDEN,tags='c'+str(k)+str(j))
        fond.create_rectangle(80+k*80-taille,80+j*80-taille,80+k*80+taille,80+j*80+taille,fill = "blue",state=HIDDEN,tags='r'+str(k)+str(j))

bouton1=Button(racine, text="Quitter", command=racine.destroy)
bouton1.pack(side=BOTTOM)
bouton2=Button(racine, text="Jouer", command=nouvelle_partie)
bouton2.pack(side=BOTTOM)
informe=Label(racine,text='Coucou')
informe.pack()
racine.bind('<KeyPress>',jouer)
racine.mainloop()
A voir également:

3 réponses

ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 228
8 mai 2014 à 16:32
'lut, modifie ton post et place ton code Python entre balises <@code python></code> (sans le @), pour que ça conserve l'indentation qui est obligatoire sur Python.
0
Kingwarras Messages postés 16 Date d'inscription mercredi 8 août 2012 Statut Membre Dernière intervention 17 décembre 2014
10 mai 2014 à 17:28
La modification a été effectuée
0
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 228
10 mai 2014 à 23:32
'lut, pour éviter que l'on ne puisse repasser sur la même case, il faut enregistrer l'état de cette case dans ton tableau
table
. De toute façon tu en auras besoin pour vérifier si un joueur a gagné ou non.
Quand on veut placer une forme, il faudra donc vérifier si cette case n'est pas déjà pleine:
def dessin_partie(x,y):
    if table[x][y] != 0:
        return
    # [Reste du code]
    table[x][y] = joueur
Ici j'inscris le numéro du joueur dans la case. Si c'est zéro, c'est que la case est vide, donc ça va, sinon, on annule la fonction avec
return
.
Pour vérifier si un joueur a gagné, il faut faire une fonction qui te renverra si un joueur a gagné; je te conseille de renvoyer 0 si personne ne gagne, et 1 ou 2 respectivement si le joueur 1 ou 2 gagne.
C'est juste un tas de
if
à mettre; pour réduire la taille du code tu peut utiliser des boucles
for
quand tu vérifies les lignes/colonnes; suivi de 2
if
s "à la main" pour les 2 diagonales.
0