Python Forum
Help with tic tac toe game.
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Help with tic tac toe game.
#1
import pygame, random


class Player:
    def __init__(self):
        self.speed = 5
        self.tick = 0
        self.interval = 30
        self.rect = pygame.rect.Rect((50, 50, 70, 70))
        self.x_image = pygame.image.load("player_x.png").convert_alpha()
        self.o_image = pygame.image.load("player_y.png").convert_alpha()
        self.one_pos = (85, 205)
        self.two_pos = (410, 205)
        self.three_pos = (750, 205)
        self.four_pos = (80, 430)
        self.five_pos = (410, 430)
        self.six_pos = (755, 430)
        self.seven_pos = (80, 650)
        self.eight_pos = (425, 650)
        self.nine_pos = (750, 650)


class Scene:
    def __init__(self, game):
        self.game = game
        self.background = pygame.image.load("background.png")
        self.player = Player()

    def draw(self, surface):
        surface.blit(self.background, (0, 0))
        pygame.draw.rect(surface, (0, 0, 255), self.player.rect)

    def event(self, event):
        pass

    def update(self, ticks):
        if ticks > self.player.tick:
            self.player.tick += self.player.interval
            keys = pygame.key.get_pressed()
            if keys[pygame.K_LEFT]:
                self.player.rect.move_ip(-5, 0)
                print(self.player.rect)
            elif keys[pygame.K_RIGHT]:
                self.player.rect.move_ip(5, 0)
                print(self.player.rect)
            elif keys[pygame.K_UP]:
                self.player.rect.move_ip(0, -5)
                print(self.player.rect)
            elif keys[pygame.K_DOWN]:
                self.player.rect.move_ip(0, 5)
                print(self.player.rect)


class Game:
    def __init__(self, caption, width, height):
        pygame.display.set_caption(caption)
        self.rect = pygame.Rect(0, 0, width, height)
        self.surface = pygame.display.set_mode(self.rect.size)
        self.clock = pygame.time.Clock()
        self.running = True
        self.scene = Scene(self)

    def mainloop(self):
        while self.running:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    self.running = False
                else:
                    self.scene.event(event)

            self.scene.update(pygame.time.get_ticks())
            self.scene.draw(self.surface)

            pygame.display.flip()
            self.clock.tick(30)


if __name__ == "__main__":
    pygame.init()
    game = Game("Tic Tac Toe", 900, 900)
    game.mainloop()
I'm having trouble setting up the turn system (x goes then o). Any help or tips are appreciated :).
Reply
#2
The scene should maybe have a list of players, instead of just one, along with an index for which player's turn it currently is. And once a player's turn is complete, you move onto the next with something like self.current_player = (self.current_player + 1) % len(self.players)
Reply
#3
Created an example how you could improve some code.
import pygame
import random


class TicTacToe:
    def __init__(self, game):
        self.game = game
        #self.background = pygame.image.load("background.png")
        self.background = pygame.Surface(game.rect.size)
        self.background.fill(pygame.Color('Black'))

        #self.images = {
        #   'x':pygame.image.load("player_x.png").convert_alpha(),
        #   'y':pygame.image.load("player_o.png").convert_alpha() }
        font = pygame.font.Font(None, 72)
        self.images = {
            'x': font.render('X', 1, pygame.Color('Blue')),
            'o': font.render('O', 1, pygame.Color('Green')) }

        self.turn = random.choice(['x', 'o'])
        self.build_rects()
        self.new_game()

    def new_game(self):
        self.board = [None for x in range(9)]


    def build_rects(self):
        self.rects = []
        center = self.game.rect.center
        rect = self.images['x'].get_rect()
        width = rect.width * 2
        height = rect.height * 2
        x_pos = center[0] - rect.width * 3
        y_pos = center[1] - rect.height * 3
        x_end = x_pos + width * 3
        y_end = y_pos + height * 3

        for x in range(x_pos, x_end, width):
            for y in range(y_pos, y_end, height):
                self.rects.append(pygame.Rect(x, y, width, height))

    def draw(self, surface):
        surface.blit(self.background, (0, 0))
        for rect in self.rects:
            pygame.draw.rect(surface, (255, 255, 255), rect, 1)

        for enum, play in enumerate(self.board):
            if play:
                rect = self.images[play].get_rect()
                rect.center = self.rects[enum].center
                surface.blit(self.images[play], rect)

    def event(self, event):
        if event.type == pygame.QUIT:
            self.game.running = False

        elif event.type == pygame.MOUSEBUTTONDOWN:
            if event.button == 1:
                for enum, rect in enumerate(self.rects):
                    if rect.collidepoint(event.pos):
                        if self.board[enum] is None:
                            self.board[enum] = self.turn
                            if self.turn == 'x':
                                self.turn = 'o'
                            else:
                                self.turn = 'x'

        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                self.new_game()


class Game:
    def __init__(self, caption, width, height):
        pygame.display.set_caption(caption)
        self.rect = pygame.Rect(0, 0, width, height)
        self.surface = pygame.display.set_mode(self.rect.size)
        self.clock = pygame.time.Clock()
        self.running = True
        self.scene = None

    def mainloop(self):
        while self.running:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    self.running = False
                else:
                    self.scene.event(event)

            #self.scene.update(pygame.time.get_ticks())
            self.scene.draw(self.surface)

            pygame.display.flip()
            self.clock.tick(30)


if __name__ == "__main__":
    pygame.init()
    game = Game("Tic Tac Toe", 800, 600)
    game.scene = TicTacToe(game)
    game.mainloop()
99 percent of computer problems exists between chair and keyboard.
Reply


Forum Jump:

User Panel Messages

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