import machine
import ssd1306
import time
# Inicializa la pantalla OLED
i2c = machine.I2C(0, sda=machine.Pin(0), scl=machine.Pin(1))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
# Definición de los pines de los botones
move_button = machine.Pin(15, machine.Pin.IN, machine.Pin.PULL_UP)
select_button = machine.Pin(14, machine.Pin.IN, machine.Pin.PULL_UP)
reset_button = machine.Pin(13, machine.Pin.IN, machine.Pin.PULL_UP)
# Variables del juego
board = [" "] * 9 # Representación del tablero de 3x3
players = ["X", "O"]
current_player = 0
selected_cell = 0 # Variable para la celda seleccionada
moving_piece = None # Variable para el seguimiento de la figura en movimiento
def draw_board():
oled.fill(0)
for i in range(1, 3):
oled.line(0, i * 21, 128, i * 21, 1)
oled.line(i * 42, 0, i * 42, 64, 1)
for i, cell in enumerate(board):
col = i % 3
row = i // 3
x = col * 42 + 8
y = row * 21 + 10
if i == selected_cell:
oled.rect(x - 4, y - 4, 36, 26, 1) # Resalta la celda seleccionada
if cell != " ":
oled.text(cell, x, y)
oled.show()
def check_winner():
# Verifica si alguno de los jugadores ha ganado
for player in players:
for i in range(3):
if (
board[i] == board[i + 3] == board[i + 6] == player or
board[i * 3] == board[i * 3 + 1] == board[i * 3 + 2] == player
):
return player # Un jugador ha ganado en línea horizontal o vertical
if (
board[0] == board[4] == board[8] == player or
board[2] == board[4] == board[6] == player
):
return player # Un jugador ha ganado en diagonal
return None
def reset_game():
global board, current_player, selected_cell, moving_piece
board = [" "] * 9
current_player = 0
selected_cell = 0
moving_piece = None
oled.fill(0) # Limpia la pantalla OLED
oled.show()
draw_board() # Vuelve a dibujar el tablero vacío
reset_game()
while True:
if current_player < len(players):
if move_button.value() == 0:
if moving_piece is None:
moving_piece = selected_cell
else:
moving_piece = (moving_piece + 1) % 9
selected_cell = moving_piece # Actualiza la celda seleccionada
draw_board()
time.sleep(0.1) # Pausa para mostrar la figura mientras se mueve
if select_button.value() == 0:
if moving_piece is not None and board[moving_piece] == " ":
board[moving_piece] = players[current_player]
current_player = (current_player + 1) % 2 # Cambia entre jugadores X y O
moving_piece = None
draw_board()
winner = check_winner()
if winner:
oled.fill(0)
oled.text(winner + " ha ganado", 8, 26)
oled.show()
time.sleep(2)
reset_game()
while select_button.value() == 0:
pass # Espera a que se suelte el botón antes de continuar
if reset_button.value() == 0:
reset_game() # Restablece el juego
time.sleep(0.3)