pygame 实现五子棋
时间: 2025-01-03 12:41:17 浏览: 47
### 使用 Pygame 实现五子棋游戏
#### 游戏初始化设置
为了构建一个基于 Pygame 的五子棋游戏,首先要导入必要的库并完成初始配置。这包括初始化 Pygame 库、设定屏幕尺寸以及加载图像资源等。
```python
import pygame
from pygame.locals import *
# 初始化Pygame模块
pygame.init()
# 设置窗口大小和标题栏文字
screen = pygame.display.set_mode((600, 600))
pygame.display.set_caption('Gomoku Game')
# 加载黑白两色棋子图片
black_stone_img = pygame.image.load('images/black.png')
white_stone_img = pygame.image.load('images/white.png')
```
#### 定义常量与变量
定义一些全局使用的参数,比如网格间距、起始坐标偏移量等;同时还需要准备用于存储当前棋局状态的数据结构——二维列表`board`,用来表示棋盘格子里是否有放置过棋子及其颜色属性。
```python
GRID_SIZE = 40 # 单元格边长像素值
OFFSET_X = OFFSET_Y = 20 # 坐标轴起点距离边缘留白宽度
BOARD_WIDTH = BOARD_HEIGHT = 15 # 棋盘行列数目
# 创建空白棋盘矩阵,默认填充None代表未落子位置
board = [[None]*BOARD_WIDTH for _ in range(BOARD_HEIGHT)]
current_player = 'BLACK' # 当前轮到哪方走动
winner = None # 记录胜者信息
running = True # 控制循环执行标志位
```
#### 绘制函数
编写绘制静态背景图案(如线条构成的交叉点)、动态更新画面内容的功能方法。每当发生新的事件触发时调用此部分重新渲染整个场景。
```python
def draw_board():
screen.fill((255, 204, 153)) # 背景色设为米黄色
# 画横线
for y in range(BOARD_HEIGHT):
start_pos = (OFFSET_X, GRID_SIZE*y + OFFSET_Y)
end_pos = (OFFSET_X + GRID_SIZE*(BOARD_WIDTH-1), GRID_SIZE*y + OFFSET_Y)
pygame.draw.line(screen, (0, 0, 0), start_pos, end_pos)
# 画竖线
for x in range(BOARD_WIDTH):
start_pos = (GRID_SIZE*x + OFFSET_X, OFFSET_Y)
end_pos = (GRID_SIZE*x + OFFSET_X, OFFSET_Y + GRID_SIZE*(BOARD_HEIGHT-1))
pygame.draw.line(screen, (0, 0, 0), start_pos, end_pos)
def update_display():
global board
draw_board()
# 遍历所有节点判断是否存在已下的棋子,并据此贴图显示出来
for row_idx,row_data in enumerate(board):
for col_idx,status in enumerate(row_data):
pos_x,pos_y=col_idx*GRID_SIZE+OFFSET_X,row_idx*GRID_SIZE+OFFSET_Y
if status=='BLACK':
screen.blit(black_stone_img,(pos_x-GRID_SIZE//2,pos_y-GRID_SIZE//2))
elif status=='WHITE':
screen.blit(white_stone_img,(pos_x-GRID_SIZE//2,pos_y-GRID_SIZE//2))
pygame.display.flip() # 刷新缓冲区使改动生效
```
#### 主要逻辑处理流程
最后一步是搭建主程序框架,在其中监听用户的输入操作(即鼠标按键),依据点击的位置计算对应的棋盘索引,验证合法性之后更改相应单元的状态,切换回合给对手继续行动直到有一方获胜为止。
```python
while running:
for event in pygame.event.get():
if event.type == QUIT: # 关闭按钮被按下则退出应用
running=False
elif winner is not None or current_player is None: continue
elif event.type==MOUSEBUTTONDOWN and event.button==1:# 左键单击才响应
mouse_x,mouse_y=event.pos
clicked_col=(mouse_x-OFFSET_X)//GRID_SIZE
clicked_row=(mouse_y-OFFSET_Y)//GRID_SIZE
try:
assert 0<=clicked_col<BOARD_WIDTH and 0<=clicked_row<BOARD_HEIGHT,"Out of bounds"
target_square=board[clicked_row][clicked_col]
if target_square is None: # 若该处为空,则允许放子
board[clicked_row][clicked_col]=current_player
check_winner(clicked_row,clicked_col) # 每次下完后都要检查是否有人赢了
current_player='WHITE'if current_player=='BLACK'else'BLACK'# 更换下一个玩家
except AssertionError as e:
print(e)
update_display()
```
以上代码片段展示了如何利用 Python 和 Pygame 来制作一款简易版的人类双人对弈模式下的五子棋小游戏[^2]。
阅读全文
相关推荐
















