Python Forum
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Drawing a net of a cube
#9
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!


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 .
Reply


Messages In This Thread
Drawing a net of a cube - by freethrownucleus - Mar-25-2023, 02:14 PM
RE: Drawing a net of a cube - by deanhystad - Mar-25-2023, 04:14 PM
RE: Drawing a net of a cube - by freethrownucleus - Mar-25-2023, 04:40 PM
RE: Drawing a net of a cube - by deanhystad - Mar-25-2023, 07:20 PM
RE: Drawing a net of a cube - by freethrownucleus - Mar-26-2023, 10:33 AM
RE: Drawing a net of a cube - by deanhystad - Mar-26-2023, 01:01 PM
RE: Drawing a net of a cube - by freethrownucleus - Mar-27-2023, 08:52 PM
RE: Drawing a net of a cube - by deanhystad - Mar-27-2023, 09:59 PM
RE: Drawing a net of a cube - by freethrownucleus - Mar-27-2023, 11:07 PM
RE: Drawing a net of a cube - by deanhystad - Mar-28-2023, 03:01 AM
RE: Drawing a net of a cube - by freethrownucleus - Mar-28-2023, 10:42 AM
RE: Drawing a net of a cube - by deanhystad - Mar-28-2023, 01:36 PM
RE: Drawing a net of a cube - by freethrownucleus - Mar-28-2023, 01:54 PM
RE: Drawing a net of a cube - by deanhystad - Mar-28-2023, 09:12 PM
RE: Drawing a net of a cube - by freethrownucleus - Apr-27-2023, 10:47 PM
RE: Drawing a net of a cube - by freethrownucleus - Apr-27-2023, 10:51 PM
RE: Drawing a net of a cube - by deanhystad - Apr-28-2023, 02:25 AM
RE: Drawing a net of a cube - by freethrownucleus - Apr-28-2023, 05:36 PM
RE: Drawing a net of a cube - by deanhystad - Apr-28-2023, 11:22 PM
RE: Drawing a net of a cube - by freethrownucleus - Apr-29-2023, 01:30 PM
RE: Drawing a net of a cube - by freethrownucleus - Apr-29-2023, 01:33 PM
RE: Drawing a net of a cube - by freethrownucleus - May-03-2023, 04:40 PM
RE: Drawing a net of a cube - by deanhystad - May-03-2023, 09:18 PM
RE: Drawing a net of a cube - by freethrownucleus - May-03-2023, 09:30 PM
RE: Drawing a net of a cube - by deanhystad - May-04-2023, 04:27 PM
RE: Drawing a net of a cube - by freethrownucleus - May-05-2023, 04:24 PM
RE: Drawing a net of a cube - by freethrownucleus - May-05-2023, 10:23 PM

Possibly Related Threads…
Thread Author Replies Views Last Post
  Cube drawing freethrownucleus 51 10,565 Apr-12-2023, 08:04 AM
Last Post: ClaytonMorrison
  2D-Cube-Tic-Tac-Toe freethrownucleus 0 1,194 Mar-10-2023, 07:07 PM
Last Post: freethrownucleus
  PyGlet Trouble Drawing Cube. Windspar 3 5,798 Jan-02-2018, 06:37 PM
Last Post: Windspar

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020