导语:
今天我们一起来用 Python 和 Pygame 制作一个带有 AI 功能的井字棋小游戏。项目代码包含了基础的游戏逻辑、玩家与 AI 对战的功能,AI 的决策基于 Minimax 算法实现,能够让你的游戏更具挑战性!
井字棋(Tic-Tac-Toe) 是一个简单却经典的棋类游戏,通常由两名玩家轮流下棋,目标是率先在棋盘的横、竖或对角线上连成一条线。
在本项目中,我们用 Pygame 创建游戏界面,设计了一个基础的 Minimax 算法,让 AI 做出最优决策。
X
,AI 控制 O
在开始之前,请确保你的 Python 环境已安装 pygame
模块。如果未安装,可以使用以下命令安装:
pip install pygame
游戏的核心逻辑封装在 TicTacToe
类中,负责处理游戏状态、绘制棋盘和棋子、检查胜利条件、以及 AI 的决策逻辑。
import pygame
import sys
import random
pygame.init()
# 游戏常量配置
WIDTH, HEIGHT = 600, 600
BG_COLOR = (28, 170, 156)
LINE_COLOR = (23, 145, 135)
class TicTacToe:
def __init__(self):
self.reset()
def reset(self):
"""重置游戏状态"""
self.board = [[None for _ in range(3)] for _ in range(3)]
self.player_turn = random.choice([True, False]) # 随机决定先手
self.game_over = False
self.result_text = ""
def draw_lines(self, surface):
"""绘制棋盘网格线"""
for i in range(1, 3):
pygame.draw.line(surface, LINE_COLOR, (0, i * 200), (WIDTH, i * 200), 15)
pygame.draw.line(surface, LINE_COLOR, (i * 200, 0), (i * 200, HEIGHT), 15)
根据当前棋盘状态,分别绘制 X
或 O
:
def draw_figures(self, surface):
"""绘制棋子"""
for row in range(3):
for col in range(3):
if self.board[row][col] == "X":
# 绘制X
start = (col * 200 + 50, row * 200 + 50)
end = (col * 200 + 150, row * 200 + 150)
pygame.draw.line(surface, (66, 66, 66), start, end, 25)
pygame.draw.line(surface, (66, 66, 66), (start[0], end[1]), (end[0], start[1]), 25)
elif self.board[row][col] == "O":
# 绘制O
center = (col * 200 + 100, row * 200 + 100)
pygame.draw.circle(surface, (239, 231, 200), center, 60, 15)
为了让 AI 做出最优决策,我们使用 Minimax 算法,递归地评估所有可能的落子情况,找到最佳方案。
def minimax(self, is_maximizing):
"""Minimax算法实现"""
winner = self.check_winner()
if winner == "O":
return 1
elif winner == "X":
return -1
elif self.is_board_full():
return 0
if is_maximizing:
best_score = -float("inf")
for row in range(3):
for col in range(3):
if self.board[row][col] is None:
self.board[row][col] = "O"
score = self.minimax(False)
self.board[row][col] = None
best_score = max(score, best_score)
return best_score
else:
best_score = float("inf")
for row in range(3):
for col in range(3):
if self.board[row][col] is None:
self.board[row][col] = "X"
score = self.minimax(True)
self.board[row][col] = None
best_score = min(score, best_score)
return best_score
通过 main()
函数实现游戏循环,处理玩家输入、更新游戏状态,并渲染游戏画面:
def main():
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("AI 井字棋")
clock = pygame.time.Clock()
game = TicTacToe()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.MOUSEBUTTONDOWN and not game.game_over:
x, y = event.pos
row, col = y // 200, x // 200
if game.board[row][col] is None:
game.board[row][col] = "X"
if not game.check_winner() and not game.is_board_full():
game.ai_move()
screen.fill(BG_COLOR)
game.draw_lines(screen)
game.draw_figures(screen)
pygame.display.update()
clock.tick(60)
玩家(X
)与 AI(O
)对战,AI 会根据 Minimax 算法选择最优决策。游戏结束后会提示结果并自动重置。
通过这个项目,我们学习了如何用 Pygame 创建一个简单的棋类游戏,并实现了基础的 AI 决策功能。你可以在此基础上增加更多功能,比如优化 UI 界面、引入更复杂的 AI 算法,甚至加入网络对战功能!
觉得有帮助的话,别忘了点赞+转发支持哦~
微信搜索公众号 编程纵深 后台私信“ AI井字棋1.0 ”即可获取小游戏源码!
关注我一起开发更多小游戏