Python 制作 AI 井字棋小游戏

目录

    • 项目简介
      • 功能实现
    • 项目环境和依赖
    • 核心代码解析
      • 1. 初始化和游戏主类
      • 2. 绘制棋子
      • 3. Minimax 算法实现 AI 决策
      • 4. 游戏主循环
    • 运行效果展示
    • 总结
    • 完整代码获取


导语
        今天我们一起来用 Python 和 Pygame 制作一个带有 AI 功能的井字棋小游戏。项目代码包含了基础的游戏逻辑、玩家与 AI 对战的功能,AI 的决策基于 Minimax 算法实现,能够让你的游戏更具挑战性!


项目简介

        井字棋(Tic-Tac-Toe) 是一个简单却经典的棋类游戏,通常由两名玩家轮流下棋,目标是率先在棋盘的横、竖或对角线上连成一条线。
在本项目中,我们用 Pygame 创建游戏界面,设计了一个基础的 Minimax 算法,让 AI 做出最优决策。

功能实现

  • 双方轮流下棋,玩家控制 X,AI 控制 O
  • Minimax 算法为 AI 选择最佳移动,保证 AI 具备一定的“智慧”
  • 游戏结束时显示结果(胜利、失败或平局),并在 2 秒后自动重置游戏

项目环境和依赖

        在开始之前,请确保你的 Python 环境已安装 pygame 模块。如果未安装,可以使用以下命令安装:

pip install pygame

核心代码解析

1. 初始化和游戏主类

游戏的核心逻辑封装在 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)

2. 绘制棋子

        根据当前棋盘状态,分别绘制 XO

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)

3. Minimax 算法实现 AI 决策

        为了让 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

4. 游戏主循环

        通过 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 算法选择最优决策。游戏结束后会提示结果并自动重置。

Python 制作 AI 井字棋小游戏_第1张图片


总结

        通过这个项目,我们学习了如何用 Pygame 创建一个简单的棋类游戏,并实现了基础的 AI 决策功能。你可以在此基础上增加更多功能,比如优化 UI 界面、引入更复杂的 AI 算法,甚至加入网络对战功能!

觉得有帮助的话,别忘了点赞+转发支持哦~


完整代码获取

        微信搜索公众号  编程纵深  后台私信“  AI井字棋1.0  ”即可获取小游戏源码!

        关注我一起开发更多小游戏


你可能感兴趣的:(Python小游戏,python,人工智能,pygame,井字棋,AI)