📜  pygame 中的网格 - Python (1)

📅  最后修改于: 2023-12-03 15:33:49.943000             🧑  作者: Mango

Pygame 中的网格

Pygame 是 Python 中一个很有趣的游戏开发库,它自带了对网格的支持,这为游戏开发者提供了很大的便利。本文将介绍 Pygame 中的网格操作方法。

安装 Pygame

在使用 Pygame 之前,需要先安装。

可以通过 pip 安装:

pip install pygame

或者下载源代码安装:

python setup.py
网格表现

Pygame 中的网格可以通过重复绘制矩形来实现。

import pygame

pygame.init()

cell_size = 20
num_cols = 20
num_rows = 20

screen_width = cell_size * num_cols
screen_height = cell_size * num_rows

screen = pygame.display.set_mode((screen_width, screen_height))

# 绘制矩形
for col in range(num_cols):
    for row in range(num_rows):
        pygame.draw.rect(screen, (255, 255, 255), (col * cell_size, row * cell_size, cell_size, cell_size), 1)

pygame.display.update()

# 等待退出
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()

上述代码会创建一个 20x20 的网格,并绘制。其中,cell_size 表示每个网格的尺寸,num_colsnum_rows 分别表示列数和行数,pygame.draw.rect 是 Pygame 中绘制矩形的方法。

简单操作及交互

通过使用 Pygame 的键盘事件监听,一个简单的交互网格就可以实现。

import pygame

pygame.init()

cell_size = 20
num_cols = 20
num_rows = 20

screen_width = cell_size * num_cols
screen_height = cell_size * num_rows

screen = pygame.display.set_mode((screen_width, screen_height))

# 初始化网格
grid = [[0 for x in range(num_cols)] for y in range(num_rows)]

# 初始绘制
for col in range(num_cols):
    for row in range(num_rows):
        pygame.draw.rect(screen, (255, 255, 255), (col * cell_size, row * cell_size, cell_size, cell_size), 1)

pygame.display.update()

# 等待退出
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()

        if event.type == pygame.MOUSEBUTTONDOWN:
            mouse_x, mouse_y = pygame.mouse.get_pos()
            # 鼠标位置对应的网格
            grid_x, grid_y = int(mouse_x / cell_size), int(mouse_y / cell_size)
            # 更改网格状态
            grid[grid_y][grid_x] = 1
            # 绘制
            pygame.draw.rect(screen, (255, 0, 0), (grid_x * cell_size, grid_y * cell_size, cell_size, cell_size))
            pygame.display.update()

上述代码增加了一个网格的状态保存,初始化时全部为 0 表示未填充,当鼠标点击时改变对应的网格状态,绘制边框颜色为红色。

网格算法

在游戏开发过程中,Pygame 的网格还可以使用于游戏中的 AI 算法,如 A* 寻路等。这里我们以最简单的广度优先搜索算法为例实现。

import pygame
from collections import deque

pygame.init()

cell_size = 20
num_cols = 20
num_rows = 20

screen_width = cell_size * num_cols
screen_height = cell_size * num_rows

screen = pygame.display.set_mode((screen_width, screen_height))

# 初始化网格
grid = [[0 for x in range(num_cols)] for y in range(num_rows)]

# 随机障碍物
for i in range(int(num_cols * num_rows * 0.3)):
    grid[int(num_rows * random.uniform(0, 1))][int(num_cols * random.uniform(0, 1))] = 1

# 起始点和终止点
start = (0, 0)
end = (num_rows - 1, num_cols - 1)

# 广度优先搜索
queue = deque([start])
path = {}

while queue:
    current_pos = queue.popleft()

    # 达到终点
    if current_pos == end:
        break

    for direction in [(0, 1), (0, -1), (1, 0), (-1, 0)]:
        next_pos = (current_pos[0] + direction[0], current_pos[1] + direction[1])

        if 0 <= next_pos[0] < num_rows and 0 <= next_pos[1] < num_cols and grid[next_pos[0]][next_pos[1]] == 0 and next_pos not in path:
            path[next_pos] = current_pos
            queue.append(next_pos)

# 绘制网格和路径
for col in range(num_cols):
    for row in range(num_rows):
        color = (0, 255, 0) if grid[row][col] == 0 else (0, 0, 0)
        pygame.draw.rect(screen, color, (col * cell_size, row * cell_size, cell_size, cell_size))

if end in path:
    current_pos = end

    while current_pos != start:
        pygame.draw.rect(screen, (0, 0, 255), (current_pos[1] * cell_size, current_pos[0] * cell_size, cell_size, cell_size))
        current_pos = path[current_pos]

pygame.display.update()

# 等待退出
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()

上述代码通过广度优先搜索算法,绘制从起点到终点的路径,其中路径使用蓝色矩形表示。其中,deque 为 Python 自带的队列实现,用来存放广度优先搜索的结果。

至此,Pygame 中的网格操作方法的介绍就结束了。