五子棋
运行截图

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()

浙公网安备 33010602011771号