python练习之“用 Python 的 Pygame 库创建五子棋游戏”

一、引言

在 Python 开发中,如果我们想要创建一个五子棋游戏,那么可以借助 Python 的 pygame 库来创建图形用户界面(GUI)。pygame 是一个开源的 Python 库,常用于制作多媒体应用程序,包括各类游戏,下面就为大家展示一个使用 pygame 实现的五子棋游戏示例代码及相关讲解。

二、准备工作

首先要确保已经安装了 pygame 库,如果没有安装,可以通过以下命令进行安装:

pip install pygame

三、代码实现

(一)导入模块与初始化设置

以下是具体的 Python 代码示例:

import pygame
import sys

# 初始化pygame
pygame.init()

# 设置棋盘大小和窗口大小
BOARD_SIZE = 15
TILE_SIZE = 40
WINDOW_WIDTH = BOARD_SIZE * TILE_SIZE
WINDOW_HEIGHT = BOARD_SIZE * TILE_SIZE
BG_COLOR = (255, 255, 204)
LINE_COLOR = (0, 0, 0)
PLAYER_X = (255, 0, 0)
PLAYER_O = (0, 0, 255)
SELECTED_TILE_COLOR = (255, 255, 0)

# 设置字体
FONT = pygame.font.SysFont('Arial', 24)

class Gomoku:
    def __init__(self):
        self.game_over = False
        self.winner = None
        self.player_turn = 'X'
        self.board = [['.' for _ in range(BOARD_SIZE)] for _ in range(BOARD_SIZE)]
        self.window = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
        pygame.display.set_caption('Gomoku')
        self.clock = pygame.time.Clock()

这里先是导入了必要的模块pygamesys,接着对pygame进行初始化操作。然后定义了棋盘大小、窗口大小、各种颜色以及字体等相关参数,还创建了一个名为Gomoku的类,在类的初始化函数中对游戏的初始状态(比如游戏是否结束、获胜者、当前玩家回合等)以及游戏界面相关元素(如棋盘、窗口标题等)进行了设置。

(二)绘制棋盘函数

    def draw_board(self):
        self.window.fill(BG_COLOR)
        for x in range(0, WINDOW_WIDTH, TILE_SIZE):
            for y in range(0, WINDOW_HEIGHT, TILE_SIZE):
                pygame.draw.rect(self.window, LINE_COLOR, (x, y, TILE_SIZE, TILE_SIZE), 1)
        for y, row in enumerate(self.board):
            for x, tile in enumerate(row):
                if tile == 'X':
                    pygame.draw.circle(self.window, PLAYER_X, (x * TILE_SIZE + TILE_SIZE // 2, y * TILE_SIZE + TILE_SIZE // 2), TILE_SIZE // 2 - 5)
                elif tile == 'O':
                    pygame.draw.circle(self.window, PLAYER_O, (x * TILE_SIZE + TILE_SIZE // 2, y * TILE_SIZE + TILE_SIZE // 2), TILE_SIZE // 2 - 5)

这个函数draw_board主要用于绘制五子棋的棋盘。先是用指定的背景颜色填充窗口,接着绘制棋盘的网格线,然后遍历棋盘上的每一个格子,根据格子中的内容(是'X'还是'O')来绘制对应的棋子图案。

(三)检查获胜者函数

    def check_winner(self):
        for row in self.board:
            if row.count(self.player_turn) >= 5:
                return True
        for col in zip(*self.board):
            if len([x for x in col if x == self.player_turn]) >= 5:
                return True
        for i in range(BOARD_SIZE - 4):
            for j in range(BOARD_SIZE - 4):
                if all(self.board[i + k][j + l] == self.player_turn for k, l in [(0, 0), (1, 0), (2, 0), (3, 0), (4, 0)]):
                    return True
                if all(self.board[i + k][j + l] == self.player_turn for k, l in [(0, 0), (0, 1), (0, 2), (0, 3), (0, 4)]):
                    return True
                if all(self.board[i + k][j + l] == self.player_turn for k, l in [(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)]):
                    return True
                if all(self.board[i + k][j + l] == self.player_turn for k, l in [(1, 0), (1, 1), (2, 2), (3, 3), (4, 4)]):
                    return True
        return False

check_winner函数用于检查当前回合的玩家是否已经获胜。它会从行、列以及不同方向的斜线上进行判断,只要某一行、列或者斜线中玩家的棋子达到连续的 5 个,就判定该玩家获胜并返回True,否则返回False

(四)游戏主循环函数

    def play(self):
        running = True
        selected_tile = None
        while running:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    running = False
                elif event.type == pygame.MOUSEBUTTONDOWN:
                    x, y = event.pos
                    col = x // TILE_SIZE
                    row = y // TILE_SIZE
                    if 0 <= row < BOARD_SIZE and 0 <= col < BOARD_SIZE:
                        if self.board[row][col] == '.':
                            self.board[row][col] = self.player_turn
                            if self.check_winner():
                                self.game_over = True
                                self.winner = self.player_turn
                            self.player_turn = 'O' if self.player_turn == 'X' else 'X'
                        elif selected_tile:
                            self.board[selected_tile[0]][selected_tile[1]] = self.player_turn
                            selected_tile = None
                elif event.type == pygame.MOUSEMOTION:
                    x, y = event.pos
                    col = x // TILE_SIZE
                    row = y // TILE_SIZE
                    if 0 <= row < BOARD_SIZE and 0 <= col < BOARD_SIZE and self.board[row][col] == '.':
                        selected_tile = (row, col)
                    else:
                        selected_tile = None

            self.draw_board()
            if selected_tile:
                pygame.draw.rect(self.window, SELECTED_TILE_COLOR, (selected_tile[1] * TILE_SIZE, selected_tile[0] * TILE_SIZE, TILE_SIZE, TILE_SIZE), 2)
            pygame.display.flip()
            self.clock.tick(60)

            if self.game_over:
                winner_text = FONT.render(f'Player {self.winner} wins!', True, (0, 0, 0))
                self.window.blit(winner_text, (WINDOW_WIDTH // 2 - 100, WINDOW_HEIGHT // 2))
                pygame.display.flip()
                pygame.time.wait(2000)
                running = False

        pygame.quit()
        sys.exit()

play函数是整个游戏的主循环部分。在循环中,会不断获取各类事件,比如用户点击关闭窗口事件(pygame.QUIT)就会结束游戏循环;当用户鼠标点击(pygame.MOUSEBUTTONDOWN)时,会根据点击位置确定下棋的格子位置,然后进行落子、检查获胜等操作;鼠标移动(pygame.MOUSEMOTION)时会处理鼠标悬停在可落子格子上的相关显示逻辑。同时在循环中不断绘制棋盘、更新界面显示,并控制游戏的帧率。当游戏结束时,会在界面上显示获胜者信息,并停留一段时间后退出游戏。

(五)主程序入口

if __name__ == "__main__":
    game = Gomoku()
    game.play()

这部分代码作为主程序的入口,创建了Gomoku类的实例,并调用play函数来启动整个五子棋游戏。

四、游戏功能概述

通过上述代码创建的五子棋游戏具有图形界面,玩家可以通过鼠标点击来下棋。游戏会在检测到五子连线时结束,并显示获胜者。不过需要注意的是,这个代码实现的游戏仍然比较简单,没有添加复杂的 AI 对手或更多的游戏功能。大家可以根据自己的需要进一步扩展和优化这个游戏,例如添加网络对战功能、改进 AI 对手等,来让这个五子棋游戏变得更加完善和强大。

希望这篇文章能帮助大家利用 Python 和 pygame 库更好地理解和开发五子棋游戏相关项目。你可以根据实际情况对文章内容进行调整和修改,比如添加代码注释解释、进一步完善游戏功能拓展思路等,让文章更符合自己的需求。

相关推荐
莫名其妙小饼干2 小时前
社区生活超市系统|Java|SSM|JSP|
java·开发语言·maven·mssql
凡人的AI工具箱2 小时前
每天40分玩转Django:Django中间件
开发语言·数据库·后端·python·中间件·django
cy玩具2 小时前
Vuex在uniapp中的使用
开发语言·javascript·ecmascript
山山而川粤2 小时前
社区生活超市系统|Java|SSM|JSP|
java·开发语言·后端·学习·mysql
星河梦瑾2 小时前
CTF知识集-SQL注入
linux·运维·python·安全·网络安全
自律的kkk2 小时前
网络编程中的黏包和半包问题
java·开发语言·网络·网络编程·tcp·nio
老码GoRust2 小时前
Rust中自定义Debug调试输出
服务器·开发语言·后端·rust
SomeB1oody2 小时前
【Rust自学】3.2. 数据类型:标量类型
开发语言·后端·rust
编码浪子2 小时前
构建一个rust生产应用读书笔记四(实战3)
开发语言·后端·rust
SomeB1oody2 小时前
【Rust自学】3.4. 函数和注释
开发语言·后端·rust