Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@

*.pyc
128 changes: 77 additions & 51 deletions othello/natymundo/game.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,44 +14,58 @@ def __missing__(self, key):
couleurs[oth.BLANC] = 'Green'
couleurs[oth.VIDE] = 'White'

# des valeurs utiles, facilement changeables qui pourront faire partie un jour d'un fichier config
# quelques valeurs utiles
sizeV = oth.SIZE
sizeH = len(oth.COLONNES)
zoom = 20


class Game(tk.Frame):
def __init__(self, master=None, couleur=oth.NOIR):
def __init__(self, master=None, table=None, couleur=oth.NOIR):
tk.Frame.__init__(self, master)
self.master = master
self.jeu = oth.Othello()
# self.joueur est la couleur du joueur, self.jeu.joueur est la couleur de celui dont c'est le tour
self.joueur = couleur
self.couleur = couleur
self.jeu = oth.Othello(table, self.couleur)
self.create_widgets()

def jouer(self, event): # activé par un clic sur la surface de jeu
if self.jeu.joueur == self.joueur:
if oth.JOUEURS[self.jeu.joueur] == 'Player':
ligne = int((event.x - zoom)/zoom)
colonne = int((event.y - zoom)/zoom)
case = self.jeu.playJoueur(ligne, colonne)
if case:
case = self.jeu.playJoueur((ligne, colonne))
if case == 'EOG':
self.end_of_game()
elif case:
self.drawtable(self.jeu.jeu)
self.set_label_case(case)
else:
self.set_label_case(
f'La case {self.jeu.toString((ligne, colonne))} \nn\'est pas jouable...')
f"La case {self.jeu.toString((ligne, colonne))} \nn'est pas jouable...")
else:
self.message_box(
'Ce n\'est pas votre tour\n(veuillez cliquer sur le bouton AI)')
"Ce n'est pas votre tour\n(veuillez cliquer sur le bouton AI)")

def next(self): # activé par le bouton 'AI'
if self.jeu.joueur == -self.joueur:
if oth.JOUEURS[self.jeu.joueur] == 'AI':
case = self.jeu.playAI()
self.drawtable(self.jeu.jeu)
self.set_label_case(case)
if case == 'EOG':
self.end_of_game()
else:
self.drawtable(self.jeu.jeu)
self.set_label_case(case)
else:
# évitez les backslashes quand c'est possible
self.message_box("C'est à vous de jouer...")

def end_of_game(self):
self.drawtable(self.jeu.jeu)
if self.gagnant() == self.couleur:
self.message_box(f"Bravo!!!\nVous avez gagné!\n\
\nVotre score: {self.score(self.couleur)}\
\n(le score de votre adversaire: {self.score(-self.couleur)})")
else:
self.message_box(f"Vous avez perdu\n\
\nVotre score: {self.score(self.couleur)}\
\n(le score de votre adversaire: {self.score(-self.couleur)})")

def message_box(self, message):
"""
Expand All @@ -66,22 +80,21 @@ def message_box(self, message):
label_text.grid(row=1, column=1)
bouton_ok = tk.Button(m_box, text='Ok', command=m_box_root.destroy)
bouton_ok.grid(row=2, column=1)
m_box.mainloop()

def nouveau_jeu(self): # activé par le bouton 'Changer de couleur'
def nouveau_jeu(self): # activé par le bouton Nouvelle partie
""" Commence une nouvelle partie avec l'autre couleur """
self.label_couleur_couleur.destroy()
self.label_score_score.destroy()
self.label_case_case.destroy()
self.__init__(master=self.master, couleur=-self.joueur)
if self.joueur != self.jeu.joueur:
case = self.jeu.playAI()
self.set_label_case(case)
self.drawtable(self.jeu.jeu)
self.__init__(master=self.master, table=None, couleur=-self.couleur)

def help(self):
""" Fait apparaître les cases jouables """
hilfe = self.jeu.casesJouables(self.jeu.joueur)
self.drawtable(hilfe)
hilfe = self.jeu.casesJouables(self.jeu.get_couleur(self.jeu.joueur))
for (l,k) in hilfe:
cir = self.C.create_oval(
(l+1)*zoom, (k+1)*zoom, (l+2)*zoom, (k+2)*zoom, fill=couleurs['help'])

def set_label_case(self, text):
self.label_case_case.destroy()
Expand All @@ -93,6 +106,9 @@ def scoreN(self):

def scoreB(self):
return self.jeu.score()[1]

def score(self, couleur):
return self.scoreN() if couleur == oth.NOIR else self.scoreB()

def gagnant(self):
return oth.NOIR if self.scoreN() > self.scoreB() else oth.VIDE if self.scoreN() == self.scoreB() else oth.BLANC
Expand All @@ -104,7 +120,8 @@ def set_label_score(self):
def create_label_score(self):
self.label_score_score = tk.Label(self.master,
text=f'{couleurs[oth.NOIR]}={self.scoreN()}|{couleurs[oth.BLANC]}={self.scoreB()}',
fg=couleurs[self.gagnant()])
fg=couleurs[self.gagnant()],
bg='White')
self.label_score_score.grid(row=4, column=1, columnspan=2)

def drawtable(self, table):
Expand All @@ -120,32 +137,45 @@ def drawtable(self, table):
(l+1)*zoom, (k+1)*zoom, (l+2)*zoom, (k+2)*zoom, fill=couleurs[table[l][k]])
self.set_label_score()

def create_widgets(self):
# Définition des widgets
self.C = tk.Canvas(self.master, width=(len(oth.COLONNES)+2)*zoom,
height=(oth.SIZE+2)*zoom, bg='white')
def draw_canvas(self, canvas):
x, y = 3*zoom/2, zoom/2
for a in oth.COLONNES:
labelC = canvas.create_text(x, y, text=a)
labelC2 = canvas.create_text(x, (sizeV+3/2)*zoom, text=a)
x += zoom
x, y = zoom/2, 3*zoom/2
for i in oth.LIGNES:
labelL = canvas.create_text(x, y, text=i)
labelL2 = canvas.create_text((sizeH+3/2)*zoom, y, text=i)
y += zoom
self.drawtable(self.jeu.jeu)

def create_boutons(self):
self.bouton_quit = tk.Button(self.master, text='Quitter', fg='red',
command=self.master.destroy)
self.label_couleur_info = tk.Label(self.master, text='Votre couleur: ')
self.label_couleur_couleur = tk.Label(self.master,
text=couleurs[self.joueur],
bg=couleurs[self.joueur])
command=self.master.destroy)
self.bouton_nouveau = tk.Button(
self.master, text='Nouvelle partie', command=self.nouveau_jeu)
self.bouton_help = tk.Button(
self.master, text='Help', command=self.help)
self.label_score = tk.Label(self.master, text='SCORE: ')
self.bouton_AI = tk.Button(
self.master, text='AI', fg=couleurs[-self.joueur], command=self.next)
self.master, text='AI', fg=couleurs[-self.couleur], command=self.next)

def create_labels(self):
self.label_couleur_info = tk.Label(self.master, text='Votre couleur: ')
self.label_couleur_couleur = tk.Label(self.master,
text=couleurs[self.couleur],
bg=couleurs[self.couleur])
self.label_score = tk.Label(self.master, text='SCORE: ')
self.create_label_score()
self.label_case = tk.Label(self.master, text='Dernière case jouée: ')
self.label_case_case = tk.Label(self.master)

# Placement des widgets
def griding(self):
self.C.grid(row=1, column=3, rowspan=sizeV+2,
columnspan=sizeH+2, padx=5, pady=5)
self.bouton_AI.grid(row=sizeV+3, column=3, sticky=tk.W)
self.label_couleur_info.grid(
row=1, column=1, columnspan=2, sticky=tk.W)
row=1, column=1, columnspan=2, sticky=tk.W)
self.label_couleur_couleur.grid(row=2, column=1, columnspan=2)
self.label_score.grid(row=3, column=1, columnspan=2, sticky=tk.W)
self.bouton_nouveau.grid(row=sizeV+3, column=sizeH+3, sticky=tk.E)
Expand All @@ -154,21 +184,17 @@ def create_widgets(self):
self.label_case.grid(row=5, column=1, columnspan=2, sticky=tk.W)
self.rowconfigure(sizeV+4, pad=2)
self.columnconfigure(sizeH+3, pad=2)

def create_widgets(self):
# Définition des widgets
self.C = tk.Canvas(self.master, width=(len(oth.COLONNES)+2)*zoom,
height=(oth.SIZE+2)*zoom, bg='white')
self.create_boutons()
self.create_labels()
self.draw_canvas(self.C) # Attention! draw_canvas ne peut apparaître qu'après avec créé les labels

self.create_label_score()

# Le Canvas
x, y = 3*zoom/2, zoom/2
for a in oth.COLONNES:
labelC = self.C.create_text(x, y, text=a)
labelC2 = self.C.create_text(x, (sizeV+3/2)*zoom, text=a)
x += zoom
x, y = zoom/2, 3*zoom/2
for i in oth.LIGNES:
labelL = self.C.create_text(x, y, text=i)
labelL2 = self.C.create_text((sizeH+3/2)*zoom, y, text=i)
y += zoom
self.drawtable(self.jeu.jeu)
# Placement des widgets
self.griding()

# Events
self.C.bind('<Button-1>', self.jouer)
Expand Down
1 change: 1 addition & 0 deletions othello/natymundo/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import tkinter as tk
import game


root = tk.Tk()
jeu = game.Game(master=root)
jeu.master.title('Othello')
Expand Down
Loading