一.实现五子棋相关
python
import pygame
import sys
# 初始化 Pygame
pygame.init()
# 游戏常量
WIDTH, HEIGHT = 600, 600
BOARD_SIZE = 15 # 棋盘大小:15×15
CELL_SIZE = WIDTH // BOARD_SIZE
LINE_COLOR = (100, 100, 100)
GRID_COLOR = (200, 200, 200)
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
TEXT_COLOR = (255, 255, 255)
# 创建窗口
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("五子棋 - 五子连珠")
font = pygame.font.SysFont('SimHei', 40)
small_font = pygame.font.SysFont('SimHei', 24)
# 棋盘:0表示空,1表示黑子,2表示白子
board = [[0 for _ in range(BOARD_SIZE)] for _ in range(BOARD_SIZE)]
current_player = 1 # 1: 黑子,2: 白子
game_over = False
winner = None
# 绘制棋盘网格
def draw_board():
screen.fill(GRID_COLOR)
for i in range(BOARD_SIZE):
# 水平线
pygame.draw.line(screen, LINE_COLOR,
(0, i * CELL_SIZE),
(WIDTH, i * CELL_SIZE), 1)
# 垂直线
pygame.draw.line(screen, LINE_COLOR,
(i * CELL_SIZE, 0),
(i * CELL_SIZE, HEIGHT), 1)
# 绘制天元(中心点)
center = CELL_SIZE * (BOARD_SIZE // 2)
pygame.draw.circle(screen, BLACK, (center, center), 5)
# 绘制棋子
def draw_pieces():
for row in range(BOARD_SIZE):
for col in range(BOARD_SIZE):
if board[row][col] == 1: # 黑子
pygame.draw.circle(screen, BLACK,
(col * CELL_SIZE + CELL_SIZE // 2,
row * CELL_SIZE + CELL_SIZE // 2),
CELL_SIZE // 2 - 5)
elif board[row][col] == 2: # 白子
pygame.draw.circle(screen, WHITE,
(col * CELL_SIZE + CELL_SIZE // 2,
row * CELL_SIZE + CELL_SIZE // 2),
CELL_SIZE // 2 - 5)
# 白子加一圈边框
pygame.draw.circle(screen, BLACK,
(col * CELL_SIZE + CELL_SIZE // 2,
row * CELL_SIZE + CELL_SIZE // 2),
CELL_SIZE // 2 - 5, 2)
# 检查是否获胜(五子连珠)
def check_winner(row, col, player):
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 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 board[r][c] == player:
count += 1
r -= dr
c -= dc
if count >= 5:
return True
return False
# 显示提示文字
def show_message(text, color=TEXT_COLOR):
msg = font.render(text, True, color)
rect = msg.get_rect(center=(WIDTH // 2, HEIGHT // 2))
screen.blit(msg, rect)
# 主游戏循环
def main():
global board, current_player, game_over, winner
running = True
while running:
screen.fill(GRID_COLOR)
# 事件处理
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.MOUSEBUTTONDOWN and not game_over:
x, y = event.pos
col = x // CELL_SIZE
row = y // CELL_SIZE
# 检查是否在有效范围内且格子为空
if 0 <= row < BOARD_SIZE and 0 <= col < BOARD_SIZE and board[row][col] == 0:
board[row][col] = current_player
# 检查是否胜利
if check_winner(row, col, current_player):
game_over = True
winner = "黑子" if current_player == 1 else "白子"
# 切换玩家
current_player = 2 if current_player == 1 else 1
# 按 R 重置游戏
if event.type == pygame.KEYDOWN and event.key == pygame.K_r:
board = [[0 for _ in range(BOARD_SIZE)] for _ in range(BOARD_SIZE)]
current_player = 1
game_over = False
winner = None
# 绘制
draw_board()
draw_pieces()
# 显示当前玩家
turn_text = f"轮到{'黑子' if current_player == 1 else '白子'}"
turn_surface = small_font.render(turn_text, True, TEXT_COLOR)
screen.blit(turn_surface, (10, 10))
# 显示结果
if game_over:
if winner:
show_message(f"{winner} 获胜!按 R 重玩", RED)
else:
show_message("平局!", RED)
# 更新屏幕
pygame.display.flip()
clock = pygame.time.Clock()
clock.tick(60)
if __name__ == "__main__":
main()
二.补充重玩机制
python
import pygame
import sys
# 初始化 Pygame
pygame.init()
# 游戏常量
WIDTH, HEIGHT = 600, 600
BOARD_SIZE = 15
CELL_SIZE = WIDTH // BOARD_SIZE
LINE_COLOR = (100, 100, 100)
GRID_COLOR = (200, 200, 200)
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
TEXT_COLOR = (255, 255, 255)
# 创建窗口
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("五子棋 - 五子连珠")
font = pygame.font.SysFont('SimHei', 40)
small_font = pygame.font.SysFont('SimHei', 24)
# 棋盘:0=空,1=黑子,2=白子
board = [[0 for _ in range(BOARD_SIZE)] for _ in range(BOARD_SIZE)]
current_player = 1 # 1: 黑子,2: 白子
game_over = False
winner = None
# 绘制棋盘网格
def draw_board():
screen.fill(GRID_COLOR)
for i in range(BOARD_SIZE):
# 水平线
pygame.draw.line(screen, LINE_COLOR,
(0, i * CELL_SIZE),
(WIDTH, i * CELL_SIZE), 1)
# 垂直线
pygame.draw.line(screen, LINE_COLOR,
(i * CELL_SIZE, 0),
(i * CELL_SIZE, HEIGHT), 1)
# 绘制天元(中心点)
center = CELL_SIZE * (BOARD_SIZE // 2)
pygame.draw.circle(screen, BLACK, (center, center), 5)
# 绘制棋子
def draw_pieces():
for row in range(BOARD_SIZE):
for col in range(BOARD_SIZE):
if board[row][col] == 1: # 黑子
pygame.draw.circle(screen, BLACK,
(col * CELL_SIZE + CELL_SIZE // 2,
row * CELL_SIZE + CELL_SIZE // 2),
CELL_SIZE // 2 - 5)
elif board[row][col] == 2: # 白子
pygame.draw.circle(screen, WHITE,
(col * CELL_SIZE + CELL_SIZE // 2,
row * CELL_SIZE + CELL_SIZE // 2),
CELL_SIZE // 2 - 5)
# 白子加黑边框
pygame.draw.circle(screen, BLACK,
(col * CELL_SIZE + CELL_SIZE // 2,
row * CELL_SIZE + CELL_SIZE // 2),
CELL_SIZE // 2 - 5, 2)
# 检查是否五子连珠
def check_winner(row, col, player):
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 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 board[r][c] == player:
count += 1
r -= dr
c -= dc
if count >= 5:
return True
return False
# 显示提示信息
def show_message(text, color=TEXT_COLOR):
msg = font.render(text, True, color)
rect = msg.get_rect(center=(WIDTH // 2, HEIGHT // 2))
screen.blit(msg, rect)
# 重置游戏
def reset_game():
global board, current_player, game_over, winner
board = [[0 for _ in range(BOARD_SIZE)] for _ in range(BOARD_SIZE)]
current_player = 1
game_over = False
winner = None
# 主游戏循环
def main():
global current_player, game_over, winner
clock = pygame.time.Clock() # 正确初始化时钟
running = True
while running:
# 事件处理
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.MOUSEBUTTONDOWN and not game_over:
x, y = event.pos
col = x // CELL_SIZE
row = y // CELL_SIZE
# 判断是否合法落子
if 0 <= row < BOARD_SIZE and 0 <= col < BOARD_SIZE and board[row][col] == 0:
board[row][col] = current_player
# 检查胜利
if check_winner(row, col, current_player):
game_over = True
winner = "黑子" if current_player == 1 else "白子"
# 切换玩家
current_player = 2 if current_player == 1 else 1
# 按 R 重置游戏
if event.type == pygame.KEYDOWN and event.key == pygame.K_r:
reset_game()
# 绘制
draw_board()
draw_pieces()
# 显示当前玩家
turn_text = f"轮到{'黑子' if current_player == 1 else '白子'}"
turn_surface = small_font.render(turn_text, True, TEXT_COLOR)
screen.blit(turn_surface, (10, 10))
# 显示结果
if game_over:
if winner:
show_message(f"{winner} 获胜!按 R 重玩", RED)
else:
show_message("平局!按 R 重玩", RED)
# 更新屏幕 & 控制帧率
pygame.display.flip()
clock.tick(60) # 保持 60 FPS
if __name__ == "__main__":
main()

整理不易,诚望各位看官点赞 收藏 评论 予以支持,这将成为我持续更新的动力源泉。若您在阅览时存有异议或建议,敬请留言指正批评,让我们携手共同学习,共同进取,吾辈自当相互勉励!

