import pygame import sys import time import tictactoe as ttt pygame.init() size = width, height = 600, 400 # Colors black = (0, 0, 0) white = (255, 255, 255) screen = pygame.display.set_mode(size) mediumFont = pygame.font.Font("OpenSans-Regular.ttf", 28) largeFont = pygame.font.Font("OpenSans-Regular.ttf", 40) moveFont = pygame.font.Font("OpenSans-Regular.ttf", 60) user = None board = ttt.initial_state() ai_turn = False while True: for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() screen.fill(black) # Let user choose a player. if user is None: # Draw title title = largeFont.render("Play Tic-Tac-Toe", True, white) titleRect = title.get_rect() titleRect.center = ((width / 2), 50) screen.blit(title, titleRect) # Draw buttons playXButton = pygame.Rect((width / 8), (height / 2), width / 4, 50) playX = mediumFont.render("Play as X", True, black) playXRect = playX.get_rect() playXRect.center = playXButton.center pygame.draw.rect(screen, white, playXButton) screen.blit(playX, playXRect) playOButton = pygame.Rect(5 * (width / 8), (height / 2), width / 4, 50) playO = mediumFont.render("Play as O", True, black) playORect = playO.get_rect() playORect.center = playOButton.center pygame.draw.rect(screen, white, playOButton) screen.blit(playO, playORect) # Check if button is clicked click, _, _ = pygame.mouse.get_pressed() if click == 1: mouse = pygame.mouse.get_pos() if playXButton.collidepoint(mouse): time.sleep(0.2) user = ttt.X elif playOButton.collidepoint(mouse): time.sleep(0.2) user = ttt.O else: # Draw game board tile_size = 80 tile_origin = (width / 2 - (1.5 * tile_size), height / 2 - (1.5 * tile_size)) tiles = [] for i in range(3): row = [] for j in range(3): rect = pygame.Rect( tile_origin[0] + j * tile_size, tile_origin[1] + i * tile_size, tile_size, tile_size ) pygame.draw.rect(screen, white, rect, 3) if board[i][j] != ttt.EMPTY: move = moveFont.render(board[i][j], True, white) moveRect = move.get_rect() moveRect.center = rect.center screen.blit(move, moveRect) row.append(rect) tiles.append(row) game_over = ttt.terminal(board) player = ttt.player(board) # Show title if game_over: winner = ttt.winner(board) if winner is None: title = f"Game Over: Tie." else: title = f"Game Over: {winner} wins." elif user == player: title = f"Play as {user}" else: title = f"Computer thinking..." title = largeFont.render(title, True, white) titleRect = title.get_rect() titleRect.center = ((width / 2), 30) screen.blit(title, titleRect) # Check for AI move if user != player and not game_over: if ai_turn: time.sleep(0.5) move = ttt.minimax(board) board = ttt.result(board, move) ai_turn = False else: ai_turn = True # Check for a user move click, _, _ = pygame.mouse.get_pressed() if click == 1 and user == player and not game_over: mouse = pygame.mouse.get_pos() for i in range(3): for j in range(3): if (board[i][j] == ttt.EMPTY and tiles[i][j].collidepoint(mouse)): board = ttt.result(board, (i, j)) if game_over: againButton = pygame.Rect(width / 3, height - 65, width / 3, 50) again = mediumFont.render("Play Again", True, black) againRect = again.get_rect() againRect.center = againButton.center pygame.draw.rect(screen, white, againButton) screen.blit(again, againRect) click, _, _ = pygame.mouse.get_pressed() if click == 1: mouse = pygame.mouse.get_pos() if againButton.collidepoint(mouse): time.sleep(0.2) user = None board = ttt.initial_state() ai_turn = False pygame.display.flip()