Использование сетки в 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. Красное поле — это позиция в сетке, по которой щелкнули мышью.

Сетка Python Pygame

На снимке экрана ниже мы видим, что при нажатии на экран мы получаем положение мыши путем щелчка и координаты.

Сетка 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» выигрывает игру.

«X» выигрывает игру

Выход:

В приведенном ниже выводе вы можете видеть, что «О» выигрывает игру.

«О» выигрывает игру

Выход:

В приведенном ниже выводе вы можете видеть, что никто не выигрывает в игре.

никто не выигрывает в игре

Добавить комментарий