Advertisement
AceScottie

pytictactoe.py

May 4th, 2019
465
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 9.32 KB | None | 0 0
  1. from Tkinter import *
  2. import random
  3. class TKGUI:
  4.     def __init__(self):
  5.         self.root= Tk()
  6.         self.quit = False
  7.         self.board = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
  8.         self.score = 0
  9.         self.compsscore = 0
  10.        
  11.     def reset(self):
  12.         win, team = self.win()
  13.         if win:
  14.             if team == 1:
  15.                 self.score = self.score+1
  16.                 self.log("You Won!")
  17.             elif team == 2:
  18.                 self.compsscore = self.compsscore+1
  19.                 self.log("Computer Won!")
  20.         self.userscore.configure(text=("Your Score: %s" %self.score))
  21.         self.compscore.configure(text=("Comp Score: %s" %self.compsscore))
  22.         self.board = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
  23.         self.p0.configure(text="-")
  24.         self.p1.configure(text="-")
  25.         self.p2.configure(text="-")
  26.         self.p3.configure(text="-")
  27.         self.p4.configure(text="-")
  28.         self.p5.configure(text="-")
  29.         self.p6.configure(text="-")
  30.         self.p7.configure(text="-")
  31.         self.p8.configure(text="-")
  32.  
  33.     def win(self):
  34.         if self.board[0][0] == self.board[0][1] and self.board[0][0] == self.board[0][2] and self.board[0][0] != 0: #top
  35.             return True, self.board[0][0]
  36.         elif self.board[1][0] == self.board[1][1] and self.board[1][0] == self.board[1][2] and self.board[1][0] != 0: #middle
  37.             return True, self.board[1][0]
  38.         elif self.board[2][0] == self.board[2][1] and self.board[2][0] == self.board[2][2] and self.board[2][0] != 0: #down
  39.             return True, self.board[2][0]
  40.         elif self.board[0][0] == self.board[1][0] and self.board[0][0] == self.board[2][0] and self.board[0][0] != 0: #left down
  41.             return True,self.board[0][0]
  42.         elif self.board[0][1] == self.board[1][1] and self.board[0][1] == self.board[2][1] and self.board[0][1] != 0: #middle down
  43.             return True, self.board[0][1]
  44.         elif self.board[0][2] == self.board[1][2] and self.board[0][2] == self.board[2][2] and self.board[0][2] != 0: #right down
  45.             return True, self.board[0][2]
  46.         elif self.board[0][0] == self.board[1][1] and self.board[0][0] == self.board[2][2] and self.board[0][0] != 0: #diaganal left
  47.             return True, self.board[0][0]
  48.         elif self.board[0][2] == self.board[1][1] and self.board[0][2] == self.board[2][0] and self.board[0][2] != 0: #diagonal right
  49.             return True, self.board[0][2]
  50.         else:
  51.             return False, 0
  52.     def check_moves(self):
  53.         st = ""
  54.         for i in range(len(self.board)):
  55.             st += str("%s%s%s" %(self.board[i][0], self.board[i][1],self.board[i][2]))
  56.         if not "0" in st:
  57.             self.log("No Moves Remaining")
  58.             return False
  59.         else:
  60.             return True
  61.        
  62.     def computer_turn(self):
  63.         x = random.randint(0, 8)
  64.        
  65.         if not self.check_moves():
  66.             self.reset()
  67.         else:
  68.             print(x)
  69.             if x == 0:
  70.                 if self.board[0][0] != 1 and self.board[0][0] != 2:
  71.                     self.p0.configure(text="O")
  72.                     self.board[0][0] = 2
  73.                 else:
  74.                     self.computer_turn()
  75.             elif x == 1:
  76.                 if self.board[0][1] != 1 and self.board[0][1] != 2:
  77.                     self.p1.configure(text="O")
  78.                     self.board[0][1] = 2
  79.                 else:
  80.                     self.computer_turn()
  81.             elif x == 2:
  82.                 if self.board[0][2] != 1 and self.board[0][1] != 2:
  83.                     self.p2.configure(text="O")
  84.                     self.board[0][2] = 2
  85.                 else:
  86.                     self.computer_turn()
  87.             elif x == 3:
  88.                 if self.board[1][0] != 1 and self.board[1][0] != 2:
  89.                     self.p3.configure(text="O")
  90.                     self.board[1][0] = 2
  91.                 else:
  92.                     self.computer_turn()
  93.             elif x == 4:
  94.                 if self.board[1][1] != 1 and self.board[1][1] != 2:
  95.                     self.p4.configure(text="O")
  96.                     self.board[1][1] = 2
  97.                 else:
  98.                     self.computer_turn()
  99.             elif x == 5:
  100.                 if self.board[1][2] != 1 and self.board[1][2] != 2:
  101.                     self.p5.configure(text="O")
  102.                     self.board[1][2] = 2
  103.                 else:
  104.                     self.computer_turn()
  105.             elif x == 6:
  106.                 if self.board[2][0] != 1 and self.board[2][0] != 2:
  107.                     self.p6.configure(text="O")
  108.                     self.board[2][0] = 2
  109.                 else:
  110.                     self.computer_turn()
  111.             elif x == 7:
  112.                 if self.board[2][1] != 1 and self.board[2][1] != 2:
  113.                     self.p7.configure(text="O")
  114.                     self.board[2][1] = 2
  115.                 else:
  116.                     self.computer_turn()
  117.             elif x == 8:
  118.                 if self.board[2][2] != 1 and self.board[2][2] != 2:
  119.                     self.p8.configure(text="O")
  120.                     self.board[2][2] = 2
  121.                 else:
  122.                     self.computer_turn()
  123.             win, team = self.win()
  124.             if win:
  125.                 print("%s won" %team)
  126.                 self.reset()
  127.        
  128.     def log(self, message):
  129.         self.note.configure(text=message)
  130.    
  131.     def click(self, pos):
  132.         if not self.check_moves():
  133.             self.reset()
  134.         else:
  135.             print(pos)
  136.             valid = False
  137.             if pos == 0:
  138.                 if self.board[0][0] != 1 and self.board[0][0] != 2:
  139.                     self.p0.configure(text="X")
  140.                     self.board[0][0] = 1
  141.                     valid = True
  142.                 else:
  143.                     self.log("That is not a valid move")
  144.             elif pos == 1:
  145.                 if self.board[0][1] != 1 and self.board[0][1] != 2:
  146.                     self.p1.configure(text="X")
  147.                     self.board[0][1] = 1
  148.                     valid = True
  149.                 else:
  150.                     self.log("That is not a valid move")
  151.             elif pos == 2:
  152.                 if self.board[0][2] != 1 and self.board[0][2] != 2:
  153.                     self.p2.configure(text="X")
  154.                     self.board[0][2] = 1
  155.                     valid = True
  156.                 else:
  157.                     self.log("That is not a valid move")
  158.             elif pos == 3:
  159.                 if self.board[1][0] != 1 and self.board[1][0] != 2:
  160.                     self.p3.configure(text="X")
  161.                     self.board[1][0] = 1
  162.                     valid = True
  163.                 else:
  164.                     self.log("That is not a valid move")
  165.             elif pos == 4:
  166.                 if self.board[1][1] != 1 and self.board[1][1] != 2:
  167.                     self.p4.configure(text="X")
  168.                     self.board[1][1] = 1
  169.                     valid = True
  170.                 else:
  171.                     self.log("That is not a valid move")
  172.             elif pos == 5:
  173.                 if self.board[1][2] != 1 and self.board[1][2] != 2:
  174.                     self.p5.configure(text="X")
  175.                     self.board[1][2] = 1
  176.                     valid = True
  177.                 else:
  178.                     self.log("That is not a valid move")
  179.             elif pos == 6:
  180.                 if self.board[2][0] != 1 and self.board[2][0] != 2:
  181.                     self.p6.configure(text="X")
  182.                     self.board[2][0] = 1
  183.                     valid = True
  184.                 else:
  185.                     self.log("That is not a valid move")
  186.             elif pos == 7:
  187.                 if self.board[2][1] != 1 and self.board[2][1] != 2:
  188.                     self.p7.configure(text="X")
  189.                     self.board[2][1] = 1
  190.                     valid = True
  191.                 else:
  192.                     self.log("That is not a valid move")
  193.             elif pos == 8:
  194.                 if self.board[2][2] != 1 and self.board[2][2] != 2:
  195.                     self.p8.configure(text="X")
  196.                     self.board[2][2] = 1
  197.                     valid = True
  198.                 else:
  199.                     self.log("That is not a valid move")
  200.             if valid:
  201.                 win, team = self.win()
  202.                 if win:
  203.                     print("%s won" %team)
  204.                     self.reset()
  205.                 self.computer_turn()
  206.  
  207.     def run(self): ##main part of the application
  208.         self.root.configure(bg="white") #sets the background to white rather than default gray.
  209.         self.root.protocol("WM_DELETE_WINDOW", self.quitting) ##changes the X (close) Button to run a function instead.
  210.         try:
  211.             self.root.iconbitmap("fav.ico") ##sets the application Icon
  212.         except:
  213.             pass
  214.         self.root.title("MyApp")
  215.         self.root.geometry("800x600")
  216.         labelfont = ('times', 20, 'bold')
  217.         overwidth = 16
  218.         sframe = Frame(self.root)
  219.         sframe.pack(fill=X)
  220.         self.userscore = Label(sframe, text="Your Score: 0")
  221.         self.userscore.pack(side=LEFT, fill=X, expand=1)
  222.         self.compscore = Label(sframe, text="Comp Score: 0")
  223.         self.compscore.pack(side=RIGHT, fill=X, expand=1)
  224.         l1 = Frame(self.root)
  225.         l1.pack(side=TOP, fill=BOTH, expand=1)
  226.         self.p0 = Button(l1, command=lambda :self.click(0), text="-", font=labelfont, width=overwidth)
  227.         self.p0.pack(side=LEFT, fill=BOTH)
  228.         packer = Frame(l1, width=10, bg="black")
  229.         packer.pack(side=LEFT, fill=Y)
  230.         self.p1 = Button(l1, command=lambda :self.click(1), text="-", font=labelfont, width=overwidth)
  231.         self.p1.pack(side=LEFT, fill=BOTH)
  232.         packer = Frame(l1, width=10, bg="black")
  233.         packer.pack(side=LEFT, fill=Y)
  234.         self.p2 = Button(l1, command=lambda :self.click(2), text="-", font=labelfont, width=overwidth)
  235.         self.p2.pack(side=LEFT, fill=BOTH)
  236.         packer = Frame(self.root, height=10, bg="black")
  237.         packer.pack(side=TOP, fill=X)
  238.         l2 = Frame(self.root)
  239.         l2.pack(side=TOP, fill=BOTH, expand=1)
  240.         self.p3 = Button(l2, command=lambda :self.click(3), text="-", font=labelfont, width=overwidth)
  241.         self.p3.pack(side=LEFT, fill=BOTH)
  242.         packer = Frame(l2, width=10, bg="black")
  243.         packer.pack(side=LEFT, fill=Y)
  244.         self.p4 = Button(l2, command=lambda :self.click(4), text="-", font=labelfont, width=overwidth)
  245.         self.p4.pack(side=LEFT, fill=BOTH)
  246.         packer = Frame(l2, width=10, bg="black")
  247.         packer.pack(side=LEFT, fill=Y)
  248.         self.p5 = Button(l2, command=lambda :self.click(5), text="-", font=labelfont, width=overwidth)
  249.         self.p5.pack(side=LEFT, fill=BOTH)
  250.         packer = Frame(self.root, height=10, bg="black")
  251.         packer.pack(side=TOP, fill=X)
  252.         l3 = Frame(self.root)
  253.         l3.pack(side=TOP, fill=BOTH, expand=1)
  254.         self.p6 = Button(l3, command=lambda :self.click(6), text="-", font=labelfont, width=overwidth)
  255.         self.p6.pack(side=LEFT, fill=BOTH)
  256.         packer = Frame(l3, width=10, bg="black")
  257.         packer.pack(side=LEFT, fill=Y)
  258.         self.p7 = Button(l3, command=lambda :self.click(7), text="-", font=labelfont, width=overwidth)
  259.         self.p7.pack(side=LEFT, fill=BOTH)
  260.         packer = Frame(l3, width=10, bg="black")
  261.         packer.pack(side=LEFT, fill=Y)
  262.         self.p8 = Button(l3, command=lambda :self.click(8), text="-", font=labelfont, width=overwidth)
  263.         self.p8.pack(side=LEFT, fill=BOTH)
  264.         self.note = Label(self.root, text="")
  265.         self.note.pack(fill=X)
  266.         while not self.quit:
  267.             self.root.update_idletasks()
  268.             self.root.update()
  269.            
  270.  
  271.     def quitting(self):
  272.         self.quit = True
  273.            
  274. if __name__ == "__main__":
  275.     app = TKGUI()
  276.     try:
  277.         app.run()
  278.     except KeyboardInterrupt:
  279.         app.quitting()
  280.     except:
  281.         raise
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement