(Python) Codage Puissance 4 + affichage console

Résolu/Fermé
Scoldt - Modifié par Scoldt le 8/02/2013 à 21:48
 Scoldt - 9 févr. 2013 à 22:19
Bonsoir,

Depuis quelques temps je souhaite créer un programme en Python (PyScripter 3.2.0.1).
Ce programme est en fait une réalisation numérique d'un Puissance 4 (le jeu de société)

Or, après avoir créé il y a quelques temps un début de programme, permettant de jouer depuis la console Python avec des "X" et des "O" pour compléter un tableau.
Le jeu fonctionne donc, les conditions de victoire également, que ce soit en ligne, en colonne ou en diagonal.
Cependant, j'ai des "effets de bords", en gros des soucis, notamment lorsque la colonne est remplie, ou qu'elle n'existe pas, un message d'erreur fait s'arrêter le programme, et je n'arrive pas à faire simplement apparaître un message demandant de refaire une demande pour un même joueur ...

Seconde partie, j'ai fais un second codage, permettant (toujours sur Python), l'affichage d'une console TK sur laquelle s'affiche une sorte de grille de Puissance 4.

Le soucis majeur à présent, c'est que je souhaite faire fusionner les deux codages, et que l'on puisse jouer directement à partir de la console TK.
Qu'en dessous de chaque colonne s'affiche un bouton permettant de faire tomber un jeton d'une couleur différente (rouge et jaune) en utilisant le code premier des conditions de victoires et de jeu ...
Et étant donné que je n'ai pas pratiqué depuis pas mal de temps, je suis plutôt perdu et malgré différents ouvrages de lu je n'arrive pas à trouver un début de solution sur la méthode à suivre ...

Quelqu'un pourrait-il m'aider ?
Voici les différents codes, fonctionnels, que j'ai fais jusqu'à présent (1 sur le jeu fonctionnel depuis la console python, l'autre sur l'affichage d'une console TK d'une grille de puissance 4)

Programme jeu :
def affmat(A): # affichage d'une matrice ligne par ligne 
    for i in range(len(A)): 
        print (A[i]) 
def creatmat(): #creation de la matrice rectangle de 6X7 remplie avec '_' 
    A=[] 
    for i in range (6): 
        B=[] 
        for j in range (7): 
            B.append('_') 
        A.append(B) 
    return A 
mat=creatmat() 

VICTOIRE= False #variable changee en cas de victoire 
tour=0 #nombres de tours (pair, joueur 1, X, rouge) (impair, joueur 2, O, jaune) 

while VICTOIRE is False: 
    OK= False #variable pour la verification de la colonne 

    colonne=int(input("colonne?")) 
    i=5 
    j=colonne-1 
    while OK is False: 
        test= mat[i][j] 
        if test=='O' or test=='X': 
            i-=1 
        elif test == '_': 
            if tour%2==0: 
                mat[i][j]='X' 
            if tour%2==1: 
                mat[i][j]='O' 
            OK=True 
    affmat (mat) 
    print('') 
    tour+=1 
                                                                            #VERIFICATION DE VICTOIRE 
    if tour>6: 
        gagnevertic=False                                                           #VERTICALEMENT 
        n=0                                                                         #du haut vers le bas 
        while n<4 and i+n<6 and mat[i+n][j]==mat[i][j]: 
            n+=1 
        if n>=4: 
            gagnevertic=True 

        gagnehoriz=False                                                            #HORIZONTALEMENT 
        n=0                                                                         #vers la gauche 
        while n<4 and j-n>=0 and mat[i][j-n]==mat[i][j]: 
            n+=1 
        m=0                                                                         #vers la droite 
        while m<4 and j+m<7 and mat[i][j+m]==mat[i][j]: 
            m+=1 
        if n+m-1>=4: 
            gagnehoriz=True 

        gagnediago1=False                                                           #OBLIQUEMENT (SO->NE) 
        n=0                                                                         #vers le SO 
        while n<4 and i-n>=0 and j-n>=0  and mat[i-n][j-n]==mat[i][j]: 
            n+=1 
        m=0                                                                         #vers le NE 
        while m<4 and i+m<6 and j+m<7 and mat[i+m][j+m]==mat[i][j]: 
            m+=1 
        if n+m-1>=4: 
            gagnediago1=True 

        gagnediago2=False                                                           #OBLIQUEMENT (NO->SE) 
        n=0                                                                         #vers le NO 
        while n<4 and i+n<6 and j-n>=0 and mat[i+n][j-n]==mat[i][j]: 
            n+=1 
        m=0                                                                         #vers le SE 
        while m<4 and i-m>=0 and j+m<7 and mat[i-m][j+m]==mat[i][j]: 
            m+=1 
        if n+m-1>=4: 
            gagnediago2=True 

        if gagnevertic==True or gagnehoriz==True or gagnediago1==True or gagnediago2==True: #si l'un d'une condition est remplie le joueur gagne 
            VICTOIRE=True                                                                    

print ("Partie finie, les", mat[i][j], " gagnent")



Programme console TK


from tkinter import * 

def cercleplein(x, y, r, coul ='black'): 
    "trace d'un cercle de centre (x,y) et de rayon r" 
    can.create_oval(x-r, y-r, x+r, y+r, outline=coul,fill=coul) 

def quadrillegecercle():                                                                # définition du contenu 
    can.delete(ALL) 
    texte.configure(text= varchoix.get() ) 
    i=0 
    while i<7 : 
        i=i+1 
        j=0 
        while j<6: 
            j=j+1 
            couleur='white' 
            cercleplein(60*i,60*j,20,couleur) 

fen = Tk() 
can = Canvas(fen, width =500, height =420, bg ='blue') 
can.pack(side =TOP, padx =40, pady =40) 

# # # # # # # # 

def envoimessage(event):                                                                # Boite de dialogue 
   texte.configure(text=saisiecol.get()) 
   pass 

saisiecol = Entry(fen) 
saisiecol.bind("<Return>", envoimessage) 
saisiecol.pack() 

# # # # # # # # 

b1 = Button(fen, text ='Jouer', command =quadrillegecercle)                             # Lanceur 
b1.pack(side =BOTTOM, padx =0, pady =0) 

texte=Label(fen) 
texte.configure(text="Puissance 4") 
texte.pack(side=TOP,padx=3,pady=3) 

varchoix=StringVar() 

fen.mainloop()
A voir également:

1 réponse

Aucune âme charitable pour essayer de m'aider ? :/
10