Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- """
- Code by: erynur
- Contact: [email protected]
- Feel free to use this code for personal or educational purpose
- """
- from functools import partial
- try:
- from tkinter import Tk, Button, Label, Frame, Menu, StringVar, messagebox
- except ImportError:
- from Tkinter import Tk, Button, Label, Frame, Menu, StringVar, messagebox
- class ThreeInARow:
- # Create game window
- def __init__(self):
- self.root = Tk()
- self.root.geometry('128x160+500+300')
- self.menuBar = Menu(self.root)
- self.subMenuFile = Menu(self.menuBar, tearoff=0)
- self.frame_list = []
- self.label_text_list = []
- self.label_list = []
- self.button_list = []
- self.create_menu_bar()
- self.create_grid()
- self.create_label()
- self.create_button()
- self.root.mainloop()
- # Create a menu bar to quit the game
- def create_menu_bar(self):
- self.root.config(menu=self.menuBar)
- self.menuBar.add_cascade(label='File', menu=self.subMenuFile)
- self.subMenuFile.add_command(label='Quit', command=self.quit_application)
- # For menu bar to quit
- @staticmethod
- def quit_application():
- quit()
- # Creating a 3x3 grid
- def create_grid(self):
- for i in range(9):
- self.frame_list.append(Frame(self.root))
- i = 0
- for j in range(3):
- for k in range(3):
- self.frame_list[i].grid(row=j, column=k, padx=2, ipadx=19, ipady=25)
- self.frame_list[i].propagate(False)
- i += 1
- pass
- pass
- # Create label text-variables to display 'X' or 'O' and placement in grid
- def create_label(self):
- for i in range(9):
- self.label_text_list.append(StringVar())
- self.label_text_list[i].set('?')
- self.label_list.append(Label(self.frame_list[i], textvariable=self.label_text_list[i]))
- self.label_list[i].pack(side='top')
- # Create buttons to choose 'X' or 'O'
- def create_button(self):
- for i in range(9):
- self.button_list.append(
- Button(
- self.frame_list[i],
- text='X',
- command=partial(self.hide_button, i, self.label_list[i])
- )
- )
- self.button_list[i].pack()
- # If pressed, change label to X or O and make buttons disappear
- def hide_button(self, n, label):
- self.button_list[n].pack_forget()
- for m in range(len(self.label_list)):
- if self.button_list[n].cget('text') == 'X':
- if label == self.label_list[m]:
- self.label_text_list[m].set('X')
- for btn in self.button_list:
- btn.config(text='O')
- elif self.button_list[n].cget('text') == 'O':
- if label == self.label_list[m]:
- self.label_text_list[m].set('O')
- for btn in self.button_list:
- btn.config(text='X')
- self.is_won()
- # Check if three X or O in a row
- def is_won(self):
- # X won the game
- if (self.label_list[0].cget('text') == 'X') & (self.label_list[1].cget('text') == 'X') & (self.label_list[2].cget('text') == 'X'):
- self.label_list[0].config(bg='green')
- self.label_list[1].config(bg='green')
- self.label_list[2].config(bg='green')
- self.show_winner('X')
- elif (self.label_list[3].cget('text') == 'X') & (self.label_list[4].cget('text') == 'X') & (self.label_list[5].cget('text') == 'X'):
- self.label_list[3].config(bg='green')
- self.label_list[4].config(bg='green')
- self.label_list[5].config(bg='green')
- self.show_winner('X')
- elif (self.label_list[6].cget('text') == 'X') & (self.label_list[7].cget('text') == 'X') & (self.label_list[8].cget('text') == 'X'):
- self.label_list[6].config(bg='green')
- self.label_list[7].config(bg='green')
- self.label_list[8].config(bg='green')
- self.show_winner('X')
- elif (self.label_list[0].cget('text') == 'X') & (self.label_list[3].cget('text') == 'X') & (self.label_list[6].cget('text') == 'X'):
- self.label_list[0].config(bg='green')
- self.label_list[3].config(bg='green')
- self.label_list[6].config(bg='green')
- self.show_winner('X')
- elif (self.label_list[1].cget('text') == 'X') & (self.label_list[4].cget('text') == 'X') & (self.label_list[7].cget('text') == 'X'):
- self.label_list[1].config(bg='green')
- self.label_list[4].config(bg='green')
- self.label_list[7].config(bg='green')
- self.show_winner('X')
- elif (self.label_list[2].cget('text') == 'X') & (self.label_list[5].cget('text') == 'X') & (self.label_list[8].cget('text') == 'X'):
- self.label_list[2].config(bg='green')
- self.label_list[5].config(bg='green')
- self.label_list[8].config(bg='green')
- self.show_winner('X')
- elif (self.label_list[0].cget('text') == 'X') & (self.label_list[4].cget('text') == 'X') & (self.label_list[8].cget('text') == 'X'):
- self.label_list[0].config(bg='green')
- self.label_list[4].config(bg='green')
- self.label_list[8].config(bg='green')
- self.show_winner('X')
- elif (self.label_list[2].cget('text') == 'X') & (self.label_list[4].cget('text') == 'X') & (self.label_list[6].cget('text') == 'X'):
- self.label_list[2].config(bg='green')
- self.label_list[4].config(bg='green')
- self.label_list[6].config(bg='green')
- self.show_winner('X')
- # O won the game
- elif (self.label_list[0].cget('text') == 'O') & (self.label_list[1].cget('text') == 'O') & (self.label_list[2].cget('text') == 'O'):
- self.label_list[0].config(bg='green')
- self.label_list[1].config(bg='green')
- self.label_list[2].config(bg='green')
- self.show_winner('O')
- elif (self.label_list[3].cget('text') == 'O') & (self.label_list[4].cget('text') == 'O') & (self.label_list[5].cget('text') == 'O'):
- self.label_list[3].config(bg='green')
- self.label_list[4].config(bg='green')
- self.label_list[5].config(bg='green')
- self.show_winner('O')
- elif (self.label_list[6].cget('text') == 'O') & (self.label_list[7].cget('text') == 'O') & (self.label_list[8].cget('text') == 'O'):
- self.label_list[6].config(bg='green')
- self.label_list[7].config(bg='green')
- self.label_list[8].config(bg='green')
- self.show_winner('O')
- elif (self.label_list[0].cget('text') == 'O') & (self.label_list[3].cget('text') == 'O') & (self.label_list[6].cget('text') == 'O'):
- self.label_list[0].config(bg='green')
- self.label_list[3].config(bg='green')
- self.label_list[6].config(bg='green')
- self.show_winner('O')
- elif (self.label_list[1].cget('text') == 'O') & (self.label_list[4].cget('text') == 'O') & (self.label_list[7].cget('text') == 'O'):
- self.label_list[1].config(bg='green')
- self.label_list[4].config(bg='green')
- self.label_list[7].config(bg='green')
- self.show_winner('O')
- elif (self.label_list[2].cget('text') == 'O') & (self.label_list[5].cget('text') == 'O') & (self.label_list[8].cget('text') == 'O'):
- self.label_list[2].config(bg='green')
- self.label_list[5].config(bg='green')
- self.label_list[8].config(bg='green')
- self.show_winner('O')
- elif (self.label_list[0].cget('text') == 'O') & (self.label_list[4].cget('text') == 'O') & (self.label_list[8].cget('text') == 'O'):
- self.label_list[0].config(bg='green')
- self.label_list[4].config(bg='green')
- self.label_list[8].config(bg='green')
- self.show_winner('O')
- elif (self.label_list[2].cget('text') == 'O') & (self.label_list[4].cget('text') == 'O') & (self.label_list[6].cget('text') == 'O'):
- self.label_list[2].config(bg='green')
- self.label_list[4].config(bg='green')
- self.label_list[6].config(bg='green')
- self.show_winner('O')
- # No one has won
- elif (
- ((self.label_list[0].cget('text') == 'O') or (self.label_list[0].cget('text') == 'X')) and
- ((self.label_list[1].cget('text') == 'O') or (self.label_list[1].cget('text') == 'X')) and
- ((self.label_list[2].cget('text') == 'O') or (self.label_list[2].cget('text') == 'X')) and
- ((self.label_list[3].cget('text') == 'O') or (self.label_list[3].cget('text') == 'X')) and
- ((self.label_list[4].cget('text') == 'O') or (self.label_list[4].cget('text') == 'X')) and
- ((self.label_list[5].cget('text') == 'O') or (self.label_list[5].cget('text') == 'X')) and
- ((self.label_list[6].cget('text') == 'O') or (self.label_list[6].cget('text') == 'X')) and
- ((self.label_list[7].cget('text') == 'O') or (self.label_list[7].cget('text') == 'X')) and
- ((self.label_list[8].cget('text') == 'O') or (self.label_list[8].cget('text') == 'X'))
- ):
- self.show_winner('No one')
- # Show winner window
- def show_winner(self, winner):
- retry = messagebox.askretrycancel(title='Game is finished', message=f'{winner} has won the game.')
- if retry:
- self.root.destroy()
- ThreeInARow()
- else:
- self.root.destroy()
- # End of Class
- game = ThreeInARow()
Advertisement
Add Comment
Please, Sign In to add comment