Mar-27-2023, 11:07 PM
(This post was last modified: Mar-27-2023, 11:07 PM by freethrownucleus.)
I don't know if you understand me well, sorry. This is what I meant by combining more boards (2 or even more) for winning combinations: https://mega.nz/file/uJw0VBRR#vbKjX5l_cK...2Nso9H2rlM .
That's why I tried drawing all 54 squares at once as you can see in my last reply (I believe I could easily add borders if I wanted those 6 boards separately).
These 3 boards that are horizontal: I treat them as 3 rows in the for loop (rows 3, 4 and 5 (index)). But I can't get the shape that I want. The best I got is this: https://mega.nz/file/XVhyhY7I#PDp0KtlqMr...njY1o1UbRM .
Firstly I saw the old version of the code that you sent so I tried to modify that one in the beginning.
For the new version of the code, I only understand the part with a list or tuple.
EDIT: Okay I think I got it (the idea with all 54 squares at once). If you think of some flaws here, feel free to say!
That's why I tried drawing all 54 squares at once as you can see in my last reply (I believe I could easily add borders if I wanted those 6 boards separately).
These 3 boards that are horizontal: I treat them as 3 rows in the for loop (rows 3, 4 and 5 (index)). But I can't get the shape that I want. The best I got is this: https://mega.nz/file/XVhyhY7I#PDp0KtlqMr...njY1o1UbRM .
Firstly I saw the old version of the code that you sent so I tried to modify that one in the beginning.
For the new version of the code, I only understand the part with a list or tuple.
EDIT: Okay I think I got it (the idea with all 54 squares at once). If you think of some flaws here, feel free to say!
import tkinter as tk class Square(tk.Button): """Special button for playing tic-tac-toe.""" colors = {"O": "blue", "X": "red"} def __init__(self, parent, index): super().__init__(parent, width=3, font=('Comic Sans MS', 20, 'bold')) self.index = index self._mark = None @property def mark(self): """What marker appears in square.""" return self._mark @mark.setter def mark(self, mark): self._mark = mark self["fg"] = self.colors.get(mark, 'black') self["text"] = '' if mark is None else mark class TicTacToe(tk.Tk): """Play tic-tac-toe. Players take turn clicking on empty buttons to place their marker. The first player to get three markers in a row, up/down, sideways or diagonally, wins """ # All possible winning conbinations wins = ((0, 1, 2), (3, 4, 5), (6, 7, 8), (0, 3, 6), (1, 4, 7), (2, 5, 8), (0, 4, 8), (6, 4, 2), (4, 8, 27, 31)) #last one example of a diagonal combo over 2 boards def __init__(self): super().__init__() self.title('Tic Tac Toe') # create a frame to hold all four boards self.boards_frame = tk.Frame(self) self.boards_frame.pack(side="top", padx=5, pady=5) # create the left board self.frame1 = tk.Frame(self.boards_frame) self.frame1.pack(side="left") self.squares1 = [] for i in range(9): self.squares1.append(Square(self.frame1, i)) for square in self.squares1: row = square.index // 3 column = square.index % 3 square.grid(row=row, column=column, padx=5, pady=5) square.configure(command=lambda arg=square: self.play(arg, self.squares1)) self.frame1.pack(side="top") self.frame2 = tk.Frame(self.boards_frame) self.frame2.pack(side="left") for i in range(9, 18): self.squares1.append(Square(self.frame2, i)) for square in self.squares1: row = square.index // 3 column = square.index % 3 square.grid(row=row, column=column, padx=5, pady=5) square.configure(command=lambda arg=square: self.play(arg, self.squares1)) self.frame3 = tk.Frame(self.boards_frame) self.frame3.pack(side="left") for i in range(18, 27): self.squares1.append(Square(self.frame3, i)) for square in self.squares1: row = square.index // 3 column = square.index % 3 square.grid(row=row, column=column, padx=5, pady=5) square.configure(command=lambda arg=square: self.play(arg, self.squares1)) self.frame4 = tk.Frame(self.boards_frame) self.frame4.pack(side="left") for i in range(27, 36): self.squares1.append(Square(self.frame4, i)) for square in self.squares1: row = square.index // 3 column = square.index % 3 square.grid(row=row, column=column, padx=5, pady=5) square.configure(command=lambda arg=square: self.play(arg, self.squares1)) self.frame5 = tk.Frame(self.boards_frame) self.frame5.pack(side="left") for i in range(36, 45): self.squares1.append(Square(self.frame5, i)) for square in self.squares1: row = square.index // 3 column = square.index % 3 square.grid(row=row, column=column, padx=5, pady=5) square.configure(command=lambda arg=square: self.play(arg, self.squares1)) self.frame2.pack(side="bottom") self.frame6 = tk.Frame(self.boards_frame) self.frame6.pack(side="left") for i in range(45, 54): self.squares1.append(Square(self.frame6, i)) for square in self.squares1: row = square.index // 3 column = square.index % 3 square.grid(row=row, column=column, padx=5, pady=5) square.configure(command=lambda arg=square: self.play(arg, self.squares1)) self.frame3.pack(side="bottom") ''' # create the middle-left board self.frame2 = tk.Frame(self.boards_frame) self.frame2.pack(side="left") self.squares2 = [Square(self.frame2, i) for i in range(9)] for square in self.squares2: row = square.index // 3 column = square.index % 3 square.grid(row=row, column=column, padx=5, pady=5) square.configure(command=lambda arg=square: self.play(arg, self.squares2, self.squares1)) # create the middle-right board self.frame3 = tk.Frame(self.boards_frame) self.frame3.pack(side="left") self.squares3 = [Square(self.frame3, i) for i in range(9)] for square in self.squares3: row = square.index // 3 column = square.index % 3 square.grid(row=row, column=column, padx=5, pady=5) square.configure(command=lambda arg=square: self.play(arg, self.squares3, self.squares1, self.squares2, self.squares4, self.squares5, self.squares6)) self.frame4 = tk.Frame(self.boards_frame) self.frame4.pack(side="left") self.squares4 = [Square(self.frame4, i) for i in range(9)] for square in self.squares4: row = square.index // 3 column = square.index % 3 square.grid(row=row, column=column, padx=5, pady=5) square.configure(command=lambda arg=square: self.play(arg, self.squares4, self.squares1, self.squares2, self.squares3, self.squares5, self.squares6)) self.frame5 = tk.Frame(self.boards_frame) self.frame5.pack(side="left") self.squares5 = [Square(self.frame5, i) for i in range(9)] for square in self.squares5: row = square.index // 3 column = square.index % 3 square.grid(row=row, column=column, padx=5, pady=5) square.configure(command=lambda arg=square: self.play(arg, self.squares5, self.squares1, self.squares2, self.squares3, self.squares4, self.squares6)) self.frame1.pack(side="bottom") self.frame2.pack(side="top") self.frame6 = tk.Frame(self.boards_frame) self.frame6.pack(side="left") self.squares6 = [Square(self.frame6, i) for i in range(9)] for square in self.squares6: row = square.index // 3 column = square.index % 3 square.grid(row=row, column=column, padx=5, pady=5) square.configure(command=lambda arg=square: self.play(arg, self.squares6, self.squares1, self.squares2, self.squares3, self.squares4, self.squares5)) self.frame3.pack(side="bottom") ''' self.message = tk.Label(self, text=' ', width=30) self.message.pack(side="bottom") self.new_game = False self.player = "X" self.reset(self.squares1) def reset(self, squares1): """Reset board to empty""" self.open_squares = 18 self.new_game = False for square in squares1: square.mark = None ''' for square in squares2: square.mark = None for square in squares3: square.mark = None for square in squares4: square.mark = None for square in squares5: square.mark = None for square in squares6: square.mark = None ''' self.message['text'] = f"{self.player}'s turn" def play(self, square, squares1): """Put player marker in slot if open. Check for win or tie""" if self.new_game: return if square.mark is not None: self.message['text'] = "Invalid move" return square.mark = self.player self.open_squares -= 1 # check for a win for win in self.wins: if all(squares1[i].mark == self.player for i in win): self.message['text'] = f"{self.player} wins!" self.new_game = True return ''' if all(squares2[i].mark == self.player for i in win): self.message['text'] = f"{self.player} wins!" self.new_game = True return if all(squares3[i].mark == self.player for i in win): self.message['text'] = f"{self.player} wins!" self.new_game = True return if all(squares4[i].mark == self.player for i in win): self.message['text'] = f"{self.player} wins!" self.new_game = True return if all(squares5[i].mark == self.player for i in win): self.message['text'] = f"{self.player} wins!" self.new_game = True return if all(squares6[i].mark == self.player for i in win): self.message['text'] = f"{self.player} wins!" self.new_game = True return ''' # check for a tie if self.open_squares == 0: self.message['text'] = "Tie game" self.new_game = True return # switch players self.player = "O" if self.player == "X" else "X" self.message['text'] = f"{self.player}'s turn" def game_over(self, squares1): """Check for winner or tie""" # Check all winning combinations for win in self.wins: if all(squares1[i].mark == self.player for i in win): for i in win: squares1[i]["fg"] = "green" self.message["text"] = f"{self.player} wins!" return True ''' if all(squares2[i].mark == self.player for i in win): for i in win: squares2[i]["fg"] = "green" self.message["text"] = f"{self.player} wins!" return True if all(squares3[i].mark == self.player for i in win): for i in win: squares3[i]["fg"] = "green" self.message["text"] = f"{self.player} wins!" return True if all(squares4[i].mark == self.player for i in win): for i in win: squares4[i]["fg"] = "green" self.message["text"] = f"{self.player} wins!" return True if all(squares5[i].mark == self.player for i in win): for i in win: squares5[i]["fg"] = "green" self.message["text"] = f"{self.player} wins!" return True if all(squares6[i].mark == self.player for i in win): for i in win: squares6[i]["fg"] = "green" self.message["text"] = f"{self.player} wins!" return True ''' # Check for a tie if self.open_squares <= 0: self.message["text"] = "Game ends in a tie" return True return False TicTacToe().mainloop()According to this code, the last winning combo will be this one (randomly chosen, just wanted to make a win over 2 or more boards possible): https://mega.nz/file/nZhUABAI#S-NVm_a_Tc...tAqDb6QS6A .