📅  最后修改于: 2023-12-03 15:06:21.315000             🧑  作者: Mango
本篇文章将教你如何用 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/
在开始之前,我们需要确保以下环境已配置:
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 = False
。self.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.line
和 pygame.draw.circle
函数来绘制 'X' 和 'O' 标记。
现在,我们可以测试代码是否正确运行。运行程序,你应该看到一个可以玩井字游戏的 GUI 应用程序。
本篇文章介绍了如何使用 Python 和 PyGame 来创建井字游戏图形用户界面。我们使用了 PyGame 库中的绘图功能和事件处理来实现这个游戏。在文章的末尾,我们完成了一个完整的井字游戏GUI,它具有一个可供用户点击的游戏板,可以在其中下'S'和'O'的标记,我们可以轮流下棋,并在界面上显示出来。