Использование сетки в Python pygame предназначено для таких игр, как крестики-нолики, сапер и многих других. Приключенческие игры хранят данные в сетке игры. Сетку чисел также можно назвать двумерным массивом или матрицей.
Сетка
- Сначала мы импортируем pygame. pygame.init() используется для инициализации всех необходимых модулей pygame.
- После этого мы определим некоторые цвета, такие как черный, белый и красный.
- Теперь мы установим ширину и высоту каждого местоположения сетки. MARGIN = 5 установит поле между каждой ячейкой.
- Нам нужно создать двумерный массив. Двумерный массив — это просто список списков.
- Создаётся пустой списокgrid=[]. Кроме того, в цикле для каждой строки создается список, который будет представлять целую строку. Чтобы добавить ячейку, мы будем использовать Grid[row].append(0).
- Grid[1][5] = 1 установит строку как 1, а столбец как 5 к единице.
- Установите высоту и ширину экрана, используя window_size = [255, 255].
- Также установите заголовок экрана, используя pygame.display.set_caption(“Grid”). Цикл, пока пользователь не нажмет кнопку закрытия.
- pygame.time.Clock() используется для управления скоростью обновления экрана.
- Основной цикл используется для события щелчка. Если пользователь щелкнет мышью, получите позицию.
- Также измените координаты экрана x/y на координаты сетки.
- Установите фон экрана как scr.fill(черный).
- for row in range(10) используется для рисования сетки. clock.tick(50) — это ограничение количества кадров в секунду.
- pygame.display.flip() используется для обновления экрана тем, что мы нарисовали.
Пример:
import pygame black =(0, 0, 0) white =(255, 255, 255) red =(255, 0, 0) WIDTH = 20 HEIGHT = 20 MARGIN = 5 grid = [] for row in range(10): grid.append([]) for column in range(10): grid[row].append(0) grid[1][5] = 1 pygame.init() window_size = [255, 255] scr = pygame.display.set_mode(window_size) pygame.display.set_caption("Grid") done = False clock = pygame.time.Clock() while not done: for event in pygame.event.get(): if event.type == pygame.QUIT: done = True elif event.type == pygame.MOUSEBUTTONDOWN: pos = pygame.mouse.get_pos() column = pos[0] //(WIDTH + MARGIN) row = pos[1] //(HEIGHT + MARGIN) grid[row][column] = 1 print("Click ", pos, "Grid coordinates: ", row, column) scr.fill(black) for row in range(10): for column in range(10): color = white if grid[row][column] == 1: color = red pygame.draw.rect(scr, color, [(MARGIN + WIDTH) * column + MARGIN, (MARGIN + HEIGHT) * row + MARGIN, WIDTH, HEIGHT]) clock.tick(50) pygame.display.flip() pygame.quit()
В этом выводе мы видим, что появляется новое окно с сеткой в Python pygame. Красное поле — это позиция в сетке, по которой щелкнули мышью.
На снимке экрана ниже мы видим, что при нажатии на экран мы получаем положение мыши путем щелчка и координаты.
Об игре крестики-нолики
Игра «Крестики-нолики» — одна из самых популярных игр. Крестики-нолики — это, по сути, игра для двух игроков. На нем есть нолики и крестики, которые обозначаются буквами «О» и «Х».
- X и O по очереди отмечают места в сетке 3×3.
- Игрок, которому удастся разместить три свои отметки в горизонтальных, вертикальных или диагональных рядах, побеждает в игре, и игра завершается.
- Для создания этой игры мы будем использовать библиотеки Python.
Как создать?
Рекомендуется выполнить следующий шаг.
Шаг 1.
- Во-первых, мы импортируем библиотеки Python pygame, sys и NumPy, которые используются для создания этой игры.
- Установите ширину и высоту игрового окна. Также установите цвет фона как BG_COLOR =(20, 200, 160).
- Установите LINE_COLOR, CIRCLE_COLOR и CROSS_COLOR по вашему выбору.
- Для создания доски мы будем использовать np.zeros().
- pygame.draw.line() используется для рисования горизонтальной и вертикальной линии.
import pygame, sys import numpy as np pygame.init() WIDTH = 600 HEIGHT = 600 LINE_WIDTH = 15 WIN_LINE_WIDTH = 15 BOARD_ROWS = 3 BOARD_COLS = 3 SQUARE_SIZE = 200 CIRCLE_RADIUS = 60 CIRCLE_WIDTH = 15 CROSS_WIDTH = 25 SPACE = 55 BG_COLOR =(20, 200, 160) LINE_COLOR =(23, 145, 135) CIRCLE_COLOR =(239, 231, 200) CROSS_COLOR =(66, 66, 66) screen = pygame.display.set_mode((WIDTH, HEIGHT) ) pygame.display.set_caption( 'TIC TAC TOE' ) screen.fill( BG_COLOR ) board = np.zeros((BOARD_ROWS, BOARD_COLS) ) def draw_lines(): pygame.draw.line( screen, LINE_COLOR,(0, SQUARE_SIZE),(WIDTH, SQUARE_SIZE), LINE_WIDTH ) pygame.draw.line( screen, LINE_COLOR,(0, 2 * SQUARE_SIZE),(WIDTH, 2 * SQUARE_SIZE), LINE_WIDTH ) pygame.draw.line( screen, LINE_COLOR,(SQUARE_SIZE, 0),(SQUARE_SIZE, HEIGHT), LINE_WIDTH ) pygame.draw.line( screen, LINE_COLOR,(2 * SQUARE_SIZE, 0),(2 * SQUARE_SIZE, HEIGHT), LINE_WIDTH )
Шаг 2:
- def draw_figures() используется для рисования круга и линии креста.
- Функция def mark_square() используется для маркировки на доске и имеет 3 параметра.
- def access_square() вернет true, если квадрат доступен, и вернет false, если он недоступен.
- Функция def is_board_full() вернет true, если доска заполнена, а если она не заполнена, то она вернет false. И он будет проходить по строкам и столбцам.
- Если board[row][col] == 0, это означает, что мы нашли пустой квадрат, и он вернет false, а если мы не найдем пустой квадрат, он вернет true.
def draw_figures(): for row in range(BOARD_ROWS): for col in range(BOARD_COLS): if board[row][col] == 1: pygame.draw.circle( screen, CIRCLE_COLOR,(int( col * SQUARE_SIZE + SQUARE_SIZE//2 ), int( row * SQUARE_SIZE + SQUARE_SIZE//2 )), CIRCLE_RADIUS, CIRCLE_WIDTH ) elif board[row][col] == 2: pygame.draw.line( screen, CROSS_COLOR,(col * SQUARE_SIZE + SPACE, row * SQUARE_SIZE + SQUARE_SIZE - SPACE),(col * SQUARE_SIZE + SQUARE_SIZE - SPACE, row * SQUARE_SIZE + SPACE), CROSS_WIDTH ) pygame.draw.line( screen, CROSS_COLOR,(col * SQUARE_SIZE + SPACE, row * SQUARE_SIZE + SPACE),(col * SQUARE_SIZE + SQUARE_SIZE - SPACE, row * SQUARE_SIZE + SQUARE_SIZE - SPACE), CROSS_WIDTH ) def mark_square(row, col, player): board[row][col] = player def available_square(row, col): return board[row][col] == 0 def is_board_full(): for row in range(BOARD_ROWS): for col in range(BOARD_COLS): if board[row][col] == 0: return False return True
Шаг 3:
- Здесь используется функция def check_win(player). Кроме того, for col in range(BOARD_COLS) используется для проверки вертикальной выигрышной линии.
- for row in range(BOARD_ROWS) используется для проверки горизонтальной выигрышной линии.
- Теперь мы проверим выигрыш по диагонали для возрастающего draw_asc_diagonal(player) и для нисходящего draw_desc_diagonal(player).
- def draw_vertical_winning_line(col, player) используется для рисования вертикальной выигрышной линии.
- Если player == 1, то цвет круга, elif player == 2, тогда цвет крестика.
def check_win(player): for col in range(BOARD_COLS): if board[0][col] == player and board[1][col] == player and board[2][col] == player: draw_vertical_winning_line(col, player) return True for row in range(BOARD_ROWS): if board[row][0] == player and board[row][1] == player and board[row][2] == player: draw_horizontal_winning_line(row, player) return True if board[2][0] == player and board[1][1] == player and board[0][2] == player: draw_asc_diagonal(player) return True if board[0][0] == player and board[1][1] == player and board[2][2] == player: draw_desc_diagonal(player) return True return False def draw_vertical_winning_line(col, player): posX = col * SQUARE_SIZE + SQUARE_SIZE//2 if player == 1: color = CIRCLE_COLOR elif player == 2: color = CROSS_COLOR pygame.draw.line( screen, color,(posX, 15),(posX, HEIGHT - 15), LINE_WIDTH )
Шаг 4:
- def draw_horizontal_winning_line() эта функция используется для рисования горизонтальной выигрышной линии.
- Если player == 1, то цвет круга, elif player == 2, тогда цвет креста.
- def draw_asc_diagonal(player) для рисования выигрышной линии по возрастающей диагонали.
- Если player == 1, то цвет круга, elif player == 2, тогда цвет креста
def draw_horizontal_winning_line(row, player): posY = row * SQUARE_SIZE + SQUARE_SIZE//2 if player == 1: color = CIRCLE_COLOR elif player == 2: color = CROSS_COLOR pygame.draw.line( screen, color,(15, posY),(WIDTH - 15, posY), WIN_LINE_WIDTH ) def draw_asc_diagonal(player): if player == 1: color = CIRCLE_COLOR elif player == 2: color = CROSS_COLOR pygame.draw.line( screen, color,(15, HEIGHT - 15),(WIDTH - 15, 15), WIN_LINE_WIDTH )
Шаг 5:
- def draw_desc_diagonal(player) используется для рисования нисходящей выигрышной диагонали.
- Если player == 1, то цвет круга, elif player == 2, тогда цвет крестика.
- pygame.draw.line() используется для рисования линии.
- def restart() эта функция вызывается, когда ваша игра заканчивается и вы хотите играть снова.
def draw_desc_diagonal(player): if player == 1: color = CIRCLE_COLOR elif player == 2: color = CROSS_COLOR pygame.draw.line( screen, color,(15, 15),(WIDTH - 15, HEIGHT - 15), WIN_LINE_WIDTH ) def restart(): screen.fill( BG_COLOR ) draw_lines() for row in range(BOARD_ROWS): for col in range(BOARD_COLS): board[row][col] = 0
Шаг 6:
- Теперь нам нужно установить game_over = False. Если игрок выигрывает, установите для него значение true, и игра окончена.
- Пока True, запускается основной цикл.
- Вызовите функцию check win в основном цикле.
- Мы использовали библиотеку Python sys для выхода из игры.
- Но если мышь нажата, event.get() вернет «MOUSEBUTTONDOWN» и вызовет user_click(). Чтобы узнать точные координаты доски, на которую нажал пользователь.
- Если event.key == pygame.K_r, то перезапустите игру, нажав «r», и начните играть.
draw_lines() player = 1 game_over = False while True: for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() if event.type == pygame.MOUSEBUTTONDOWN and not game_over: mouseX = event.pos[0] mouseY = event.pos[1] clicked_row = int(mouseY // SQUARE_SIZE) clicked_col = int(mouseX // SQUARE_SIZE) if available_square( clicked_row, clicked_col ): mark_square( clicked_row, clicked_col, player ) if check_win( player ): game_over = True player = player % 2 + 1 draw_figures() if event.type == pygame.KEYDOWN: if event.key == pygame.K_r: restart() player = 1 game_over = False pygame.display.update()
Полный код игры в крестики-нолики на Python с использованием pygame:
import pygame, sys import numpy as np pygame.init() WIDTH = 600 HEIGHT = 600 LINE_WIDTH = 15 WIN_LINE_WIDTH = 15 BOARD_ROWS = 3 BOARD_COLS = 3 SQUARE_SIZE = 200 CIRCLE_RADIUS = 60 CIRCLE_WIDTH = 15 CROSS_WIDTH = 25 SPACE = 55 RED =(255, 0, 0) BG_COLOR =(20, 200, 160) LINE_COLOR =(23, 145, 135) CIRCLE_COLOR =(239, 231, 200) CROSS_COLOR =(66, 66, 66) screen = pygame.display.set_mode((WIDTH, HEIGHT) ) pygame.display.set_caption( 'TIC TAC TOE' ) screen.fill( BG_COLOR ) board = np.zeros((BOARD_ROWS, BOARD_COLS) ) def draw_lines(): pygame.draw.line( screen, LINE_COLOR,(0, SQUARE_SIZE),(WIDTH, SQUARE_SIZE), LINE_WIDTH ) pygame.draw.line( screen, LINE_COLOR,(0, 2 * SQUARE_SIZE),(WIDTH, 2 * SQUARE_SIZE), LINE_WIDTH ) pygame.draw.line( screen, LINE_COLOR,(SQUARE_SIZE, 0),(SQUARE_SIZE, HEIGHT), LINE_WIDTH ) pygame.draw.line( screen, LINE_COLOR,(2 * SQUARE_SIZE, 0),(2 * SQUARE_SIZE, HEIGHT), LINE_WIDTH ) def draw_figures(): for row in range(BOARD_ROWS): for col in range(BOARD_COLS): if board[row][col] == 1: pygame.draw.circle( screen, CIRCLE_COLOR,(int( col * SQUARE_SIZE + SQUARE_SIZE//2 ), int( row * SQUARE_SIZE + SQUARE_SIZE//2 )), CIRCLE_RADIUS, CIRCLE_WIDTH ) elif board[row][col] == 2: pygame.draw.line( screen, CROSS_COLOR,(col * SQUARE_SIZE + SPACE, row * SQUARE_SIZE + SQUARE_SIZE - SPACE),(col * SQUARE_SIZE + SQUARE_SIZE - SPACE, row * SQUARE_SIZE + SPACE), CROSS_WIDTH ) pygame.draw.line( screen, CROSS_COLOR,(col * SQUARE_SIZE + SPACE, row * SQUARE_SIZE + SPACE),(col * SQUARE_SIZE + SQUARE_SIZE - SPACE, row * SQUARE_SIZE + SQUARE_SIZE - SPACE), CROSS_WIDTH ) def mark_square(row, col, player): board[row][col] = player def available_square(row, col): return board[row][col] == 0 def is_board_full(): for row in range(BOARD_ROWS): for col in range(BOARD_COLS): if board[row][col] == 0: return False return True def check_win(player): for col in range(BOARD_COLS): if board[0][col] == player and board[1][col] == player and board[2][col] == player: draw_vertical_winning_line(col, player) return True for row in range(BOARD_ROWS): if board[row][0] == player and board[row][1] == player and board[row][2] == player: draw_horizontal_winning_line(row, player) return True if board[2][0] == player and board[1][1] == player and board[0][2] == player: draw_asc_diagonal(player) return True if board[0][0] == player and board[1][1] == player and board[2][2] == player: draw_desc_diagonal(player) return True return False def draw_vertical_winning_line(col, player): posX = col * SQUARE_SIZE + SQUARE_SIZE//2 if player == 1: color = CIRCLE_COLOR elif player == 2: color = CROSS_COLOR pygame.draw.line( screen, color,(posX, 15),(posX, HEIGHT - 15), LINE_WIDTH ) def draw_horizontal_winning_line(row, player): posY = row * SQUARE_SIZE + SQUARE_SIZE//2 if player == 1: color = CIRCLE_COLOR elif player == 2: color = CROSS_COLOR pygame.draw.line( screen, color,(15, posY),(WIDTH - 15, posY), WIN_LINE_WIDTH ) def draw_asc_diagonal(player): if player == 1: color = CIRCLE_COLOR elif player == 2: color = CROSS_COLOR pygame.draw.line( screen, color,(15, HEIGHT - 15),(WIDTH - 15, 15), WIN_LINE_WIDTH ) def draw_desc_diagonal(player): if player == 1: color = CIRCLE_COLOR elif player == 2: color = CROSS_COLOR pygame.draw.line( screen, color,(15, 15),(WIDTH - 15, HEIGHT - 15), WIN_LINE_WIDTH ) def restart(): screen.fill( BG_COLOR ) draw_lines() for row in range(BOARD_ROWS): for col in range(BOARD_COLS): board[row][col] = 0 draw_lines() player = 1 game_over = False while True: for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() if event.type == pygame.MOUSEBUTTONDOWN and not game_over: mouseX = event.pos[0] mouseY = event.pos[1] clicked_row = int(mouseY // SQUARE_SIZE) clicked_col = int(mouseX // SQUARE_SIZE) if available_square( clicked_row, clicked_col ): mark_square( clicked_row, clicked_col, player ) if check_win( player ): game_over = True player = player % 2 + 1 draw_figures() if event.type == pygame.KEYDOWN: if event.key == pygame.K_r: restart() player = 1 game_over = False pygame.display.update()
Выход:
В приведенном ниже выводе вы можете видеть, что «X» выигрывает игру.
Выход:
В приведенном ниже выводе вы можете видеть, что «О» выигрывает игру.
Выход:
В приведенном ниже выводе вы можете видеть, что никто не выигрывает в игре.