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

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

相关推荐
动感小麦兜2 小时前
应用-常用工具部署命令
java·开发语言
立志成为大牛的小牛2 小时前
数据结构——五十一、散列表的基本概念(王道408)
开发语言·数据结构·学习·程序人生·算法·散列表
明知道的博客4 小时前
解决WSL环境下DeepSeek-OCR运行时内存不足问题
python·ocr·deepseek·deepseek-ocr
机灵猫4 小时前
java锁:从 Mark Word 锁升级到 AQS
java·开发语言
FreeCode5 小时前
LangGraph1.0智能体开发:Graph API概念与设计
python·langchain·agent
test管家5 小时前
如何在Python中使用SQLite数据库进行增删改查操作?
python
扶尔魔ocy5 小时前
【QT opencv】手动去噪--网格化获取区域坐标
开发语言·qt·opencv
程序员与背包客_CoderZ5 小时前
C/C++版LLM推理框架Llama.cpp——入门与编码实战
c语言·开发语言·网络·c++·人工智能·语言模型·llama
喵了几个咪5 小时前
C++ IDE:最适合 C++ 初学者的 IDE 是什么?
开发语言·c++·ide