Как дополнить мой код игры Крестики-нолики, чтобы добавить режим против компьютера(рандомно ставит нолик)?
У меня есть код игры Крестики-нолики и мне надо дополнить его так чтобы был режим против компьютера(рандомно ставит нолик). В моем коде есть только режим против человека(1 чел. нажимает на мышку - ставится Х, 2 чел. - О), нужно дополнить его режимом против бота. Есть кнопки выбора режима, но я к ним ничего не привязывал, смысла нет без второго режима. Режим против компьютера такой: ты ставишь Х, комп. ставит О в другой рандомной клетке. ВОТ КОД:
import pygame
import sys
from random import randint
#Создаём игровое окно:
pygame.init()
SIZE = (600, 600)
SCREEN = pygame.display.set_mode(SIZE)
pygame.display.set_caption("КРЕСТИКИ НОЛИКИ")
#Создаем параметры для игры:
BOARD_SIZE = 3
TILE_SIZE = int(SIZE[0] / BOARD_SIZE)
LINE_WIDTH = 5
CROSS_WIDTH = 25
CIRCLE_WIDTH = 15
FONT_SIZE = 100
PEOPLE_BOT = 0
#Устанавливаем цвета(---можете взять любые---):
BLACK = (0, 0, 0)
RED = '#ff0000'
BLUE = '#0000ff'
GREEN = '#00FF00'
WHITE = (255, 255, 255)
#Создаем игровое поле:
board = [[None] * BOARD_SIZE for _ in range(BOARD_SIZE)]
#Пишем функцию отрисовки игрового поля:
def draw_board():
SCREEN.fill(WHITE)
for i in range(1, BOARD_SIZE):
pygame.draw.line(SCREEN, BLACK, (0, i * TILE_SIZE), (SIZE[0], i * TILE_SIZE), LINE_WIDTH)
pygame.draw.line(SCREEN, BLACK, (i * TILE_SIZE, 0), (i * TILE_SIZE, SIZE[0]), LINE_WIDTH)
for i in range(BOARD_SIZE):
for j in range(BOARD_SIZE):
if board[i][j] == 'X':
pygame.draw.line(SCREEN, RED, (i * TILE_SIZE + CROSS_WIDTH, j * TILE_SIZE + CROSS_WIDTH),
((i + 1) * TILE_SIZE - CROSS_WIDTH, (j + 1) * TILE_SIZE - CROSS_WIDTH), CROSS_WIDTH)
pygame.draw.line(SCREEN, RED, ((i + 1) * TILE_SIZE - CROSS_WIDTH, j * TILE_SIZE + CROSS_WIDTH),
(i * TILE_SIZE + CROSS_WIDTH, (j + 1) * TILE_SIZE - CROSS_WIDTH), CROSS_WIDTH)
elif board[i][j] == 'O':
pygame.draw.circle(SCREEN, BLUE, (int(i * TILE_SIZE + TILE_SIZE / 2), int(j* TILE_SIZE + TILE_SIZE / 2)),
int(TILE_SIZE / 2 - CIRCLE_WIDTH), CIRCLE_WIDTH)
def Button():
clock = pygame.time.Clock()
# Создаем объект шрифта
font = pygame.font.Font(None, 24)
font2 = pygame.font.Font(None, 24)
# Создайте поверхность для кнопки
button_surface = pygame.Surface((150, 50))
button_surface2 = pygame.Surface((150, 50))
# Отображение текста на кнопке
text = font.render("Против человека", True, (0, 0, 0))
text_rect = text.get_rect(
center=(button_surface.get_width() /2,
button_surface.get_height()/2))
text2 = font2.render("Против бота", True, (0, 0, 0))
text_rect2 = text2.get_rect(
center=(button_surface2.get_width() /2,
button_surface2.get_height()/2))
# Создайте объект pygame.Rect, который представляет границы кнопки
button_rect = pygame.Rect(125, 125, 150, 50) # Отрегулируйте положение
button_rect2 = pygame.Rect(300, 125, 300, 150)
while True:
clock.tick(60)
SCREEN.fill((155, 255, 155))
# Получаем события из очереди событий
for event in pygame.event.get():
# Проверьте событие выхода
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
# Проверяем событие нажатия кнопки мыши
if event.type == pygame.MOUSEBUTTONDOWN:
# Вызовите функцию on_mouse_button_down()
if button_rect.collidepoint(event.pos):
PEOPLE_BOT = 0
draw_board()
main()
return
if event.type == pygame.MOUSEBUTTONDOWN:
# Вызовите функцию on_mouse_button_down()
if button_rect2.collidepoint(event.pos):
PEOPLE_BOT = 1
draw_board()
return
# Проверьте, находится ли мышь над кнопкой.
# Это создаст эффект наведения кнопки.
if button_rect.collidepoint(pygame.mouse.get_pos()):
pygame.draw.rect(button_surface, (127, 255, 212), (1, 1, 148, 48))
else:
pygame.draw.rect(button_surface, (0, 0, 0), (0, 0, 150, 50))
pygame.draw.rect(button_surface, (255, 255, 255), (1, 1, 148, 48))
pygame.draw.rect(button_surface, (0, 0, 0), (1, 1, 148, 1), 2)
pygame.draw.rect(button_surface, (0, 100, 0), (1, 48, 148, 10), 2)
if button_rect2.collidepoint(pygame.mouse.get_pos()):
pygame.draw.rect(button_surface2, (127, 255, 212), (1, 1, 148, 48))
else:
pygame.draw.rect(button_surface2, (0, 0, 0), (0, 0, 150, 50))
pygame.draw.rect(button_surface2, (255, 255, 255), (1, 1, 148, 48))
pygame.draw.rect(button_surface2, (0, 0, 0), (1, 1, 148, 1), 2)
pygame.draw.rect(button_surface2, (0, 100, 0), (1, 48, 148, 10), 2)
# Показать текст кнопки
button_surface.blit(text, text_rect)
button_surface2.blit(text2, text_rect2)
# Нарисуйте кнопку на экране
SCREEN.blit(button_surface, (button_rect.x, button_rect.y))
SCREEN.blit(button_surface2, (button_rect2.x, button_rect2.y))
# Обновить состояние
pygame.display.update()
#Теперь самое главное функция проверки победителя:
def check_winner():
for i in range(BOARD_SIZE):
if (board[i][0] == board[i][1] == board[i][2]) and (board[i][0] is not None):
return board[i][0]
if (board[0][i] == board[1][i] == board[2][i]) and (board[0][i] is not None):
return board[0][i]
if (board[0][0] == board[1][1] == board[2][2]) and (board[0][0] is not None):
return board[0][0]
if (board[0][2] == board[1][1] == board[2][0]) and (board[0][2] is not None):
return board[0][2]
return None
#Теперь создаем основной цикл игры:
def main():
turn = 'X'
font = pygame.font.SysFont("Arial", FONT_SIZE)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
return
elif event.type == pygame.MOUSEBUTTONDOWN:
x, y = event.pos
tile_x = x // TILE_SIZE
tile_y = y // TILE_SIZE
if board[tile_x][tile_y] is None:
board[tile_x][tile_y] = turn
if turn == 'X':
turn = 'O'
else:
turn = 'X'
draw_board()
winner = check_winner()
if winner is not None:
SCREEN.blit(font.render("{0} Победил!".format(winner), True, BLACK, GREEN), (SIZE[0] / 4 - FONT_SIZE, SIZE[0] / 1.75 - FONT_SIZE))
pygame.display.update()
pygame.time.wait(1000)
return
elif all([all(row) for row in board]) and (winner is None):
SCREEN.blit(font.render("Ничья!", True, BLACK, GREEN), (SIZE[0] / 2.5 - FONT_SIZE, SIZE[0] / 1.75 - FONT_SIZE))
pygame.display.update()
pygame.time.wait(1000)
return
pygame.display.update()
Button()
if __name__ == "__main__":
main()