python实现五子棋

一.实现五子棋相关

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

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

相关推荐
代码不停几秒前
Java递归综合练习
java·开发语言·算法·回归
派大鑫wink1 分钟前
Python 大数据毕业设计:电影票房可视化分析系统(Flask+Echarts + 爬虫实战)
大数据·python·课程设计
小灰灰搞电子3 分钟前
Qt SCXML 模块详解
开发语言·qt
JAVA+C语言5 分钟前
Python+Django 核心介绍
开发语言·python·django
中年程序员一枚6 分钟前
不想花钱买会员,自己动手用python制作视频
开发语言·python·音视频
江公望6 分钟前
为什么Rust的编译工具依赖C语言的编译工具?
开发语言·rust
编程大师哥7 分钟前
Java Web 核心全解析
java·开发语言·前端
qq_214782618 分钟前
Hadley Wickham长文回顾:R语言tidyverse过去20年的演进之路、现状与未来展望!
python·算法·线性回归
资深web全栈开发8 分钟前
Golang 最常用的库介绍
开发语言·后端·golang
霍田煜熙11 分钟前
C++ 部署小型图书管理系统
开发语言·c++·算法