五子棋

运行截图

微信图片_20260703140658_493_1

import pygame
import sys

--- 游戏常量设置 ---

BOARD_SIZE = 15 # 15x15 棋盘
CELL_SIZE = 40 # 每个格子的大小
MARGIN = 40 # 棋盘边缘留白
PIECE_RADIUS = 16 # 棋子半径
WINDOW_SIZE = CELL_SIZE * (BOARD_SIZE - 1) + 2 * MARGIN

颜色定义

COLOR_BG = (220, 179, 92) # 棋盘背景色
COLOR_LINE = (0, 0, 0) # 棋盘线颜色
COLOR_BLACK = (0, 0, 0) # 黑棋
COLOR_WHITE = (255, 255, 255) # 白棋
COLOR_HIGHLIGHT = (255, 0, 0) # 最后一步高亮颜色

class Gomoku:
def init(self):
pygame.init()
self.screen = pygame.display.set_mode((WINDOW_SIZE, WINDOW_SIZE))
pygame.display.set_caption("Python 五子棋")
self.clock = pygame.time.Clock()

0: 空, 1: 黑棋, 2: 白棋

self.board = [[0 for _ in range(BOARD_SIZE)] for _ in range(BOARD_SIZE)]
self.current_player = 1 # 1 黑棋先手
self.game_over = False
self.winner = None
self.last_move = None # 记录最后一步位置 (row, col)

def get_grid_pos(self, mouse_pos):
"""将鼠标坐标转换为棋盘网格坐标"""
x, y = mouse_pos
col = round((x - MARGIN) / CELL_SIZE)
row = round((y - MARGIN) / CELL_SIZE)

边界检查

if 0 <= row < BOARD_SIZE and 0 <= col < BOARD_SIZE:
return row, col
return None

def make_move(self, row, col):
"""落子并检查胜负"""
if self.board[row][col] == 0 and not self.game_over:
self.board[row][col] = self.current_player
self.last_move = (row, col)

if self.check_win(row, col):
self.game_over = True
self.winner = self.current_player
else:
# 切换玩家
self.current_player = 3 - self.current_player # 1变2, 2变1

def check_win(self, row, col):
"""检查当前落子是否形成五连"""
player = self.board[row][col]
directions = [(0, 1), (1, 0), (1, 1), (1, -1)] # 横、竖、斜、反斜

for dr, dc in directions:
count = 1
# 正向检查
r, c = row + dr, col + dc
while 0 <= r < BOARD_SIZE and 0 <= c < BOARD_SIZE and self.board[r][c] == player:
count += 1
r += dr
c += dc
# 反向检查
r, c = row - dr, col - dc
while 0 <= r < BOARD_SIZE and 0 <= c < BOARD_SIZE and self.board[r][c] == player:
count += 1
r -= dr
c -= dc

if count >= 5:
return True
return False

def draw_board(self):
"""绘制棋盘和棋子"""
self.screen.fill(COLOR_BG)

画网格线

for i in range(BOARD_SIZE):
# 横线
start_x = MARGIN
end_x = MARGIN + (BOARD_SIZE - 1) * CELL_SIZE
y = MARGIN + i * CELL_SIZE
pygame.draw.line(self.screen, COLOR_LINE, (start_x, y), (end_x, y), 2)

竖线

start_y = MARGIN
end_y = MARGIN + (BOARD_SIZE - 1) * CELL_SIZE
x = MARGIN + i * CELL_SIZE
pygame.draw.line(self.screen, COLOR_LINE, (x, start_y), (x, end_y), 2)

画棋子

for r in range(BOARD_SIZE):
for c in range(BOARD_SIZE):
if self.board[r][c] != 0:
center_x = MARGIN + c * CELL_SIZE
center_y = MARGIN + r * CELL_SIZE
color = COLOR_BLACK if self.board[r][c] == 1 else COLOR_WHITE

pygame.draw.circle(self.screen, color, (center_x, center_y), PIECE_RADIUS)
# 给白棋加个边框,防止在白底上看不清
if self.board[r][c] == 2:
pygame.draw.circle(self.screen, COLOR_LINE, (center_x, center_y), PIECE_RADIUS, 1)

高亮最后一步

if self.last_move:
r, c = self.last_move
center_x = MARGIN + c * CELL_SIZE
center_y = MARGIN + r * CELL_SIZE
pygame.draw.circle(self.screen, COLOR_HIGHLIGHT, (center_x, center_y), 5)

游戏结束提示

if self.game_over:
font = pygame.font.Font(None, 60)
text = font.render(f"Player {'BLACK' if self.winner == 1 else 'WHITE'} Wins!", True, (255, 0, 0))
text_rect = text.get_rect(center=(WINDOW_SIZE // 2, 20))
self.screen.blit(text, text_rect)

pygame.display.flip()

def run(self):
"""游戏主循环"""
while True:
self.draw_board()
self.clock.tick(60)

for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()

if event.type == pygame.MOUSEBUTTONDOWN and not self.game_over:
if event.button == 1: # 鼠标左键
pos = self.get_grid_pos(event.pos)
if pos:
self.make_move(pos[0], pos[1])

按 R 键重新开始

if event.type == pygame.KEYDOWN:
if event.key == pygame.K_r:
self.init()
name == "main"
game = Gomoku()
game.run()

posted @ 2026-07-03 14:07  H懿  阅读(23)  评论(0)    收藏  举报