📜  井字游戏 GUI 在Python中使用 PyGame(1)

📅  最后修改于: 2023-12-03 15:06:21.315000             🧑  作者: Mango

井字游戏 GUI 在 Python 中使用 PyGame

简介

本篇文章将教你如何用 Python 和 PyGame 创建井字游戏图形用户界面(GUI)。

井字游戏是一种智力游戏。它的游戏盘是一个3×3的格子,游戏者分别用O和X作为游戏标记,谁先将自己的标记连成一条线,便算谁赢。关于游戏的详细规则请参考:https://zh.wikipedia.org/wiki/%E4%BA%95%E5%AD%97%E6%B8%B8%E6%88%8F

PyGame 是 Python 社区中用于开发2D游戏或多媒体应用程序的框架。PyGame 的优势在于,它对底层图像和声音处理提供了更强的控制,同时也容易上手。更多关于 PyGame 的信息可以在这里了解到:https://www.pygame.org/

准备

在开始之前,我们需要确保以下环境已配置:

  1. Python 3.x。
  2. 安装 PyGame。在命令行中运行以下命令:pip install pygame
代码实现

首先,我们要导入 PyGame 库:

import pygame

接着,我们定义游戏板的大小:

WIDTH = 600
HEIGHT = 600

然后,我们可以定义一个类来表示井字游戏:

class TicTacToe():
    def __init__(self):
        self.board = [['', '', ''], ['', '', ''], ['', '', '']]
        self.player = 'X'

在上述代码中,我们定义了一个列表来表示井字游戏板的状态,并初始化为空。我们还定义了一个 player 变量,表示当前玩家的标记。

接下来,我们可以在初始化函数中创建一个 PyGame 屏幕对象:

class TicTacToe():
    def __init__(self):
        self.board = [['', '', ''], ['', '', ''], ['', '', '']]
        self.player = 'X'

        self.screen = pygame.display.set_mode((WIDTH, HEIGHT))
        pygame.display.set_caption('Tic Tac Toe')

在创建屏幕对象后,我们可以为游戏编写一个开始函数 start。在此函数中,我们可以设置游戏循环和事件处理:

class TicTacToe():
    def __init__(self):
        self.board = [['', '', ''], ['', '', ''], ['', '', '']]
        self.player = 'X'

        self.screen = pygame.display.set_mode((WIDTH, HEIGHT))
        pygame.display.set_caption('Tic Tac Toe')

    def start(self):
        running = True

        while running:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    running = False

            self.screen.fill((255, 255, 255))
            pygame.display.flip()

在上述代码中,running 变量表示游戏是否正在运行。若关闭窗口,则设置 running = Falseself.screen.fill((255, 255, 255)) 能够将窗口填充为白色,并通过 pygame.display.flip() 来更新屏幕。

现在,我们可以测试代码是否正确运行。在代码的末尾添加以下代码行:

if __name__ == '__main__':
    game = TicTacToe()
    game.start()

运行程序 python main.py,你应该会看到一个白色屏幕,同时在标题中可以看到 'Tic Tac Toe'。

接下来,我们需要画出游戏板。为此,我们可以使用 PyGame 的绘图功能:

class TicTacToe():
    def __init__(self):
        self.board = [['', '', ''], ['', '', ''], ['', '', '']]
        self.player = 'X'

        self.screen = pygame.display.set_mode((WIDTH, HEIGHT))
        pygame.display.set_caption('Tic Tac Toe')

    def start(self):
        running = True

        while running:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    running = False

            self.screen.fill((255, 255, 255))
            pygame.draw.line(self.screen, (0, 0, 0), (WIDTH // 3, 0), (WIDTH // 3, HEIGHT), 5)
            pygame.draw.line(self.screen, (0, 0, 0), (WIDTH // 3 * 2, 0), (WIDTH // 3 * 2, HEIGHT), 5)
            pygame.draw.line(self.screen, (0, 0, 0), (0, HEIGHT // 3), (WIDTH, HEIGHT // 3), 5)
            pygame.draw.line(self.screen, (0, 0, 0), (0, HEIGHT // 3 * 2), (WIDTH, HEIGHT // 3 * 2), 5)
            pygame.display.flip()

在上述代码中,我们使用 pygame.draw.line 函数来画出水平和垂直的游戏网格线。

现在,我们可以测试代码是否正确运行。运行程序,你应该会看到一个带有游戏网格线的白色屏幕。

接下来,我们可以为游戏编写一个函数来更新游戏板。这个函数应该接收一个 (x, y) 元组作为参数,并在该位置放置当前玩家的标记,然后切换到另一个玩家:

class TicTacToe():
    def __init__(self):
        self.board = [['', '', ''], ['', '', ''], ['', '', '']]
        self.player = 'X'

        self.screen = pygame.display.set_mode((WIDTH, HEIGHT))
        pygame.display.set_caption('Tic Tac Toe')

    def start(self):
        running = True

        while running:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    running = False
                elif event.type == pygame.MOUSEBUTTONDOWN:
                    pos = pygame.mouse.get_pos()
                    self.board_click(pos)

            self.screen.fill((255, 255, 255))
            self.draw_board()
            pygame.display.flip()

    def board_click(self, pos):
        x, y = pos[0], pos[1]
        row = y // (HEIGHT // 3)
        col = x // (WIDTH // 3)

        if self.board[row][col] == '':
            self.board[row][col] = self.player

            if self.player == 'X':
                self.player = 'O'
            else:
                self.player = 'X'

    def draw_board(self):
        for i in range(3):
            for j in range(3):
                if self.board[i][j] == 'X':
                    pygame.draw.line(self.screen, (0, 0, 0), (j * WIDTH // 3 + 50, i * HEIGHT // 3 + 50), (j * WIDTH // 3 + WIDTH // 3 - 50, i * HEIGHT // 3 + HEIGHT // 3 - 50), 10)
                    pygame.draw.line(self.screen, (0, 0, 0), (j * WIDTH // 3 + WIDTH // 3 - 50, i * HEIGHT // 3 + 50), (j * WIDTH // 3 + 50, i * HEIGHT // 3 + HEIGHT // 3 - 50), 10)
                elif self.board[i][j] == 'O':
                    pygame.draw.circle(self.screen, (0, 0, 0), (j * WIDTH // 3 + WIDTH // 6, i * HEIGHT // 3 + HEIGHT // 6), WIDTH // 6 - 50, 5)

在上述代码中,我们在 start 函数中处理了 pygame.MOUSEBUTTONDOWN 事件,当事件出现时,就会调用 board_click 函数。

board_click 函数中,我们根据鼠标点击位置 pos 确定了最近的游戏格,并在该位置放置了标记。我们还切换了 player,以改变当前玩家的标记。

draw_board 函数中,我们使用 pygame.draw.linepygame.draw.circle 函数来绘制 'X' 和 'O' 标记。

现在,我们可以测试代码是否正确运行。运行程序,你应该看到一个可以玩井字游戏的 GUI 应用程序。

总结

本篇文章介绍了如何使用 Python 和 PyGame 来创建井字游戏图形用户界面。我们使用了 PyGame 库中的绘图功能和事件处理来实现这个游戏。在文章的末尾,我们完成了一个完整的井字游戏GUI,它具有一个可供用户点击的游戏板,可以在其中下'S'和'O'的标记,我们可以轮流下棋,并在界面上显示出来。