erynur

3 in a row(classes)

Apr 10th, 2019
653
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 9.69 KB | None | 0 0
  1. """
  2. Code by: erynur
  3.  
  4. Feel free to use this code for personal or educational purpose
  5. """
  6.  
  7. from functools import partial
  8. try:
  9.     from tkinter import Tk, Button, Label, Frame, Menu, StringVar, messagebox
  10. except ImportError:
  11.     from Tkinter import Tk, Button, Label, Frame, Menu, StringVar, messagebox
  12.  
  13.  
  14. class ThreeInARow:
  15.  
  16.     # Create game window
  17.     def __init__(self):
  18.         self.root = Tk()
  19.         self.root.geometry('128x160+500+300')
  20.  
  21.         self.menuBar = Menu(self.root)
  22.         self.subMenuFile = Menu(self.menuBar, tearoff=0)
  23.         self.frame_list = []
  24.         self.label_text_list = []
  25.         self.label_list = []
  26.         self.button_list = []
  27.  
  28.         self.create_menu_bar()
  29.         self.create_grid()
  30.         self.create_label()
  31.         self.create_button()
  32.  
  33.         self.root.mainloop()
  34.  
  35.     # Create a menu bar to quit the game
  36.     def create_menu_bar(self):
  37.         self.root.config(menu=self.menuBar)
  38.         self.menuBar.add_cascade(label='File', menu=self.subMenuFile)
  39.         self.subMenuFile.add_command(label='Quit', command=self.quit_application)
  40.  
  41.     # For menu bar to quit
  42.     @staticmethod
  43.     def quit_application():
  44.         quit()
  45.  
  46.     # Creating a 3x3 grid
  47.     def create_grid(self):
  48.         for i in range(9):
  49.             self.frame_list.append(Frame(self.root))
  50.         i = 0
  51.         for j in range(3):
  52.             for k in range(3):
  53.                 self.frame_list[i].grid(row=j, column=k, padx=2, ipadx=19, ipady=25)
  54.                 self.frame_list[i].propagate(False)
  55.                 i += 1
  56.                 pass
  57.             pass
  58.  
  59.     # Create label text-variables to display 'X' or 'O' and placement in grid
  60.     def create_label(self):
  61.         for i in range(9):
  62.             self.label_text_list.append(StringVar())
  63.             self.label_text_list[i].set('?')
  64.             self.label_list.append(Label(self.frame_list[i], textvariable=self.label_text_list[i]))
  65.             self.label_list[i].pack(side='top')
  66.  
  67.     # Create buttons to choose 'X' or 'O'
  68.     def create_button(self):
  69.         for i in range(9):
  70.             self.button_list.append(
  71.                 Button(
  72.                     self.frame_list[i],
  73.                     text='X',
  74.                     command=partial(self.hide_button, i, self.label_list[i])
  75.                 )
  76.             )
  77.             self.button_list[i].pack()
  78.  
  79.     # If pressed, change label to X or O and make buttons disappear
  80.     def hide_button(self, n, label):
  81.         self.button_list[n].pack_forget()
  82.         for m in range(len(self.label_list)):
  83.             if self.button_list[n].cget('text') == 'X':
  84.                 if label == self.label_list[m]:
  85.                     self.label_text_list[m].set('X')
  86.                     for btn in self.button_list:
  87.                         btn.config(text='O')
  88.             elif self.button_list[n].cget('text') == 'O':
  89.                 if label == self.label_list[m]:
  90.                     self.label_text_list[m].set('O')
  91.                     for btn in self.button_list:
  92.                         btn.config(text='X')
  93.         self.is_won()
  94.  
  95.     # Check if three X or O in a row
  96.     def is_won(self):
  97.         # X won the game
  98.         if (self.label_list[0].cget('text') == 'X') & (self.label_list[1].cget('text') == 'X') & (self.label_list[2].cget('text') == 'X'):
  99.             self.label_list[0].config(bg='green')
  100.             self.label_list[1].config(bg='green')
  101.             self.label_list[2].config(bg='green')
  102.             self.show_winner('X')
  103.         elif (self.label_list[3].cget('text') == 'X') & (self.label_list[4].cget('text') == 'X') & (self.label_list[5].cget('text') == 'X'):
  104.             self.label_list[3].config(bg='green')
  105.             self.label_list[4].config(bg='green')
  106.             self.label_list[5].config(bg='green')
  107.             self.show_winner('X')
  108.         elif (self.label_list[6].cget('text') == 'X') & (self.label_list[7].cget('text') == 'X') & (self.label_list[8].cget('text') == 'X'):
  109.             self.label_list[6].config(bg='green')
  110.             self.label_list[7].config(bg='green')
  111.             self.label_list[8].config(bg='green')
  112.             self.show_winner('X')
  113.         elif (self.label_list[0].cget('text') == 'X') & (self.label_list[3].cget('text') == 'X') & (self.label_list[6].cget('text') == 'X'):
  114.             self.label_list[0].config(bg='green')
  115.             self.label_list[3].config(bg='green')
  116.             self.label_list[6].config(bg='green')
  117.             self.show_winner('X')
  118.         elif (self.label_list[1].cget('text') == 'X') & (self.label_list[4].cget('text') == 'X') & (self.label_list[7].cget('text') == 'X'):
  119.             self.label_list[1].config(bg='green')
  120.             self.label_list[4].config(bg='green')
  121.             self.label_list[7].config(bg='green')
  122.             self.show_winner('X')
  123.         elif (self.label_list[2].cget('text') == 'X') & (self.label_list[5].cget('text') == 'X') & (self.label_list[8].cget('text') == 'X'):
  124.             self.label_list[2].config(bg='green')
  125.             self.label_list[5].config(bg='green')
  126.             self.label_list[8].config(bg='green')
  127.             self.show_winner('X')
  128.         elif (self.label_list[0].cget('text') == 'X') & (self.label_list[4].cget('text') == 'X') & (self.label_list[8].cget('text') == 'X'):
  129.             self.label_list[0].config(bg='green')
  130.             self.label_list[4].config(bg='green')
  131.             self.label_list[8].config(bg='green')
  132.             self.show_winner('X')
  133.         elif (self.label_list[2].cget('text') == 'X') & (self.label_list[4].cget('text') == 'X') & (self.label_list[6].cget('text') == 'X'):
  134.             self.label_list[2].config(bg='green')
  135.             self.label_list[4].config(bg='green')
  136.             self.label_list[6].config(bg='green')
  137.             self.show_winner('X')
  138.  
  139.         # O won the game
  140.         elif (self.label_list[0].cget('text') == 'O') & (self.label_list[1].cget('text') == 'O') & (self.label_list[2].cget('text') == 'O'):
  141.             self.label_list[0].config(bg='green')
  142.             self.label_list[1].config(bg='green')
  143.             self.label_list[2].config(bg='green')
  144.             self.show_winner('O')
  145.         elif (self.label_list[3].cget('text') == 'O') & (self.label_list[4].cget('text') == 'O') & (self.label_list[5].cget('text') == 'O'):
  146.             self.label_list[3].config(bg='green')
  147.             self.label_list[4].config(bg='green')
  148.             self.label_list[5].config(bg='green')
  149.             self.show_winner('O')
  150.         elif (self.label_list[6].cget('text') == 'O') & (self.label_list[7].cget('text') == 'O') & (self.label_list[8].cget('text') == 'O'):
  151.             self.label_list[6].config(bg='green')
  152.             self.label_list[7].config(bg='green')
  153.             self.label_list[8].config(bg='green')
  154.             self.show_winner('O')
  155.         elif (self.label_list[0].cget('text') == 'O') & (self.label_list[3].cget('text') == 'O') & (self.label_list[6].cget('text') == 'O'):
  156.             self.label_list[0].config(bg='green')
  157.             self.label_list[3].config(bg='green')
  158.             self.label_list[6].config(bg='green')
  159.             self.show_winner('O')
  160.         elif (self.label_list[1].cget('text') == 'O') & (self.label_list[4].cget('text') == 'O') & (self.label_list[7].cget('text') == 'O'):
  161.             self.label_list[1].config(bg='green')
  162.             self.label_list[4].config(bg='green')
  163.             self.label_list[7].config(bg='green')
  164.             self.show_winner('O')
  165.         elif (self.label_list[2].cget('text') == 'O') & (self.label_list[5].cget('text') == 'O') & (self.label_list[8].cget('text') == 'O'):
  166.             self.label_list[2].config(bg='green')
  167.             self.label_list[5].config(bg='green')
  168.             self.label_list[8].config(bg='green')
  169.             self.show_winner('O')
  170.         elif (self.label_list[0].cget('text') == 'O') & (self.label_list[4].cget('text') == 'O') & (self.label_list[8].cget('text') == 'O'):
  171.             self.label_list[0].config(bg='green')
  172.             self.label_list[4].config(bg='green')
  173.             self.label_list[8].config(bg='green')
  174.             self.show_winner('O')
  175.         elif (self.label_list[2].cget('text') == 'O') & (self.label_list[4].cget('text') == 'O') & (self.label_list[6].cget('text') == 'O'):
  176.             self.label_list[2].config(bg='green')
  177.             self.label_list[4].config(bg='green')
  178.             self.label_list[6].config(bg='green')
  179.             self.show_winner('O')
  180.  
  181. # No one has won
  182.         elif (
  183.             ((self.label_list[0].cget('text') == 'O') or (self.label_list[0].cget('text') == 'X')) and
  184.             ((self.label_list[1].cget('text') == 'O') or (self.label_list[1].cget('text') == 'X')) and
  185.             ((self.label_list[2].cget('text') == 'O') or (self.label_list[2].cget('text') == 'X')) and
  186.             ((self.label_list[3].cget('text') == 'O') or (self.label_list[3].cget('text') == 'X')) and
  187.             ((self.label_list[4].cget('text') == 'O') or (self.label_list[4].cget('text') == 'X')) and
  188.             ((self.label_list[5].cget('text') == 'O') or (self.label_list[5].cget('text') == 'X')) and
  189.             ((self.label_list[6].cget('text') == 'O') or (self.label_list[6].cget('text') == 'X')) and
  190.             ((self.label_list[7].cget('text') == 'O') or (self.label_list[7].cget('text') == 'X')) and
  191.             ((self.label_list[8].cget('text') == 'O') or (self.label_list[8].cget('text') == 'X'))
  192.         ):
  193.             self.show_winner('No one')
  194.  
  195.     # Show winner window
  196.     def show_winner(self, winner):
  197.         retry = messagebox.askretrycancel(title='Game is finished', message=f'{winner} has won the game.')
  198.         if retry:
  199.             self.root.destroy()
  200.             ThreeInARow()
  201.         else:
  202.             self.root.destroy()
  203.  
  204. # End of Class
  205.  
  206.  
  207. game = ThreeInARow()
Advertisement
Add Comment
Please, Sign In to add comment