Skip to content Skip to sidebar Skip to footer

Tic Tac Toe Game Using Turtle

This is for an extra credit assignment in Python. I've finished most until the last part where I have to determine the area of the tictactoe box chosen. Edit: Update, I can only d

Solution 1:

I believe you're making the problem harder than necessary by not taking full advantage of Python turtle. Instead of trying to find a square within the board when clicking on the screen, make the squares of the board themselves turtles that respond to mouse clicks. Then there's nothing to figure out, position-wise.

Here's a reimplementation that draws a board, allows you to click on it, alternately sets the clicked sections to 'X' or 'O':

from turtle import Turtle, Screen

CURSOR_SIZE = 20
SQUARE_SIZE = 50
FONT_SIZE = 40
FONT = ('Arial', FONT_SIZE, 'bold')

class TicTacToe:
    def __init__(self):
        self.board = [['?'] * 3 for i in range(3)] # so you can interrogate squares later
        self.turn = 'X'

    def drawBoard(self):
        background = Turtle('square')
        background.shapesize(SQUARE_SIZE * 3 / CURSOR_SIZE)
        background.color('black')
        background.stamp()
        background.hideturtle()

        for j in range(3):
            for i in range(3):
                box = Turtle('square', visible=False)
                box.shapesize(SQUARE_SIZE / CURSOR_SIZE)
                box.color('white')
                box.penup()
                box.goto(i * (SQUARE_SIZE + 2) - (SQUARE_SIZE + 2), j * (SQUARE_SIZE + 2) - (SQUARE_SIZE + 2))
                box.showturtle()
                box.stamp()  # blank out background behind turtle (for later)

                self.board[j][i] = box
                box.onclick(lambda x, y, box=box, i=i, j=j: self.mouse(box, i, j))

    def mouse(self, box, i, j):
        box.onclick(None)  # disable further moves on this square

        # replace square/turtle with (written) X or O
        box.hideturtle()
        box.color('black')
        box.sety(box.ycor() - FONT_SIZE / 2)
        box.write(self.turn, align='center', font=FONT)

        self.board[j][i] = self.turn  # record move

        self.turn = ['X', 'O'][self.turn == 'X']  # switch turns

screen = Screen()

game = TicTacToe()

game.drawBoard()

screen.mainloop()

You can use board to do scoring, or implement a smart computer player, or whatever you desire.

enter image description here


Solution 2:

This should give you the basic idea, which is compute the minimum and maximum x and y values of each box and store them in BOXES. This makes it very easy to determine if the given x and y coordinates passed to the mouse() callback function are within any of them.

With the multiple boxes in your real code, make sure to apply the new minmax() function to the corners of each one of them.

import turtle

""" This will be based off 1 box  instead of all 9"""
pen = turtle.Turtle()
corners = []
BOXES = {}

for line in range(0, 4):
    pen.forward(50)
    pen.left(90)
    corners.append(pen.pos())

def minmax(points):
    """ Find extreme x and y values in a list of 2-D coordinates. """
    minx, miny, maxx, maxy = points[0][0], points[0][1], points[0][0], points[0][1]
    for x, y in points[1:]:
        if x < minx:
            minx = x
        if y < minx:
            miny = y
        if x > maxx:
            maxx = x
        if y > maxy:
            maxy = y
    return minx, miny, maxx, maxy


BOXES['MIDDLEBOX'] = minmax(corners)

for i in BOXES:
    print(i, BOXES[i])
"""
    POINTS FROM LEFT TO RIGHT
    (1) - TOP LEFT CORNER
    (2) - BOTTOM LEFT CORNER
    (3) - BOTTOM RIGHT CORNER
    (4) - TOP RIGHT CORNER
"""

def mouse(x, y):
    """ Return key of box if x, y are within global BOXES
        or None if it's not.
    """
    for key in BOXES:
        minx, miny, maxx, maxy = BOXES[key]
        if (minx <= x <= maxx) and (miny <= y <= maxy):
            print(key)
            return key
    print('None')
    return None  # Not found.

turtle.onscreenclick(mouse)
turtle.mainloop()

Post a Comment for "Tic Tac Toe Game Using Turtle"