Python 创建一个简单的 Tic-Tac-Toe 游戏类(深入浅出)

快速解决

class TicTacToe:
    def __init__(self):
        self.board = [' ' for _ in range(9)]  # 初始化3x3棋盘
        self.current_player = 'X'  # 默认先手为X
    
    def print_board(self):
        print(f"{self.board[0]} | {self.board[1]} | {self.board[2]}")  # 打印棋盘上部
        print("-" * 9)  # 分隔线
        print(f"{self.board[3]} | {self.board[4]} | {self.board[5]}")  # 打印棋盘中部
        print("-" * 9)  # 分隔线
        print(f"{self.board[6]} | {self.board[7]} | {self.board[8]}")  # 打印棋盘下部

    def make_move(self, position):
        if self.board[position] == ' ':  # 检查位置是否可用
            self.board[position] = self.current_player
            self.current_player = 'O' if self.current_player == 'X' else 'X'  # 切换玩家
            return True
        return False

    def check_winner(self):
        # 定义所有可能的胜利组合
        win_combinations = [
            [0,1,2], [3,4,5], [6,7,8],  # 行
            [0,3,6], [1,4,7], [2,5,8],  # 列
            [0,4,8], [2,4,6]            # 对角线
        ]
        for combo in win_combinations:  # 遍历所有胜利组合
            if all(self.board[i] == self.current_player for i in combo):  # 检查是否满足胜利条件
                return True
        return False

    def is_full(self):
        return ' ' not in self.board  # 检查棋盘是否填满

    def reset_game(self):
        self.board = [' ' for _ in range(9)]  # 重置棋盘
        self.current_player = 'X'  # 重置当前玩家

常用方法

方法名 参数 返回值 用途说明
__init__ 初始化游戏类实例
print_board 打印当前棋盘状态
make_move position Boolean 执行玩家移动并切换回合
check_winner Boolean 检查当前玩家是否胜利
is_full Boolean 检查棋盘是否已满(平局)
reset_game 重置游戏状态

详细说明

初始化游戏类

def __init__(self):
    self.board = [' ' for _ in range(9)]  # 创建长度为9的列表,每个元素初始化为' ',代表3x3棋盘
    self.current_player = 'X'  # 设置当前玩家为X

动态显示棋盘

def print_board(self):
    # 使用f-string格式化输出棋盘,每行包含三个位置和竖线分隔符
    print(f"{self.board[0]} | {self.board[1]} | {self.board[2]}")
    print("-" * 9)  # 打印横线作为棋盘行分隔
    print(f"{self.board[3]} | {self.board[4]} | {self.board[5]}")
    print("-" * 9)
    print(f"{self.board[6]} | {self.board[7]} | {self.board[8]}")

胜利检查逻辑

def check_winner(self):
    # 定义所有可能的胜利组合(行、列、对角线)
    win_combinations = [
        [0,1,2], [3,4,5], [6,7,8],  # 行
        [0,3,6], [1,4,7], [2,5,8],  # 列
        [0,4,8], [2,4,6]            # 对角线
    ]
    for combo in win_combinations:
        # 使用all()函数检查当前玩家是否在某一行/列/对角线占据所有位置
        if all(self.board[i] == self.current_player for i in combo):
            return True
    return False

高级技巧

1. 添加游戏历史记录

class TicTacToeAdvanced:
    def __init__(self):
        self.board = [' ' for _ in range(9)]
        self.current_player = 'X'
        self.move_history = []  # 新增历史记录列表
    
    def make_move(self, position):
        if self.board[position] == ' ':
            self.board[position] = self.current_player
            self.move_history.append((position, self.current_player))  # 记录移动位置和玩家
            self.current_player = 'O' if self.current_player == 'X' else 'X'
            return True
        return False

    def undo_move(self):
        # 支持撤销最后一步操作
        if self.move_history:
            position, player = self.move_history.pop()  # 弹出最后一步记录
            self.board[position] = ' '  # 清空对应位置
            self.current_player = player  # 切换回上一玩家
            return True
        return False

2. 实现AI对手

import random

class TicTacToeAI(TicTacToe):
    def ai_move(self):
        # 1. 优先检查获胜位置
        for position in range(9):
            if self.board[position] == ' ':
                self.board[position] = 'O'
                if self.check_winner():
                    self.current_player = 'X'  # 切换回玩家X
                    return True
                self.board[position] = ' '  # 恢复棋盘
        
        # 2. 检查对手的获胜位置
        for position in range(9):
            if self.board[position] == ' ':
                self.board[position] = 'X'
                if self.check_winner():
                    self.board[position] = 'O'  # 阻止对手获胜
                    self.current_player = 'X'
                    return True
                self.board[position] = ' '
        
        # 3. 随机移动
        available = [i for i, x in enumerate(self.board) if x == ' ']
        if available:
            pos = random.choice(available)  # 从可用位置中随机选择
            self.board[pos] = 'O'
            self.current_player = 'X'
            return True
        return False

常见问题

为什么胜利检查要使用all()函数?

使用all()函数可以简洁地验证所有索引位置是否都为当前玩家标记。例如all(self.board[i] == 'X' for i in [0,1,2])会检查前三格是否全是'X',相比传统for循环更高效且易读。

如何处理无效输入?

make_move方法中添加边界检查和类型验证:

def make_move(self, position):
    if position < 0 or position > 8:  # 检查输入是否在0-8范围内
        return False  # 无效位置直接返回False
    if self.board[position] == ' ':
        self.board[position] = self.current_player
        self.current_player = 'O' if self.current_player == 'X' else 'X'
        return True
    return False

为什么切换玩家要使用条件表达式?

self.current_player = 'O' if self.current_player == 'X' else 'X'

这种写法比if-else更简洁,当当前玩家是'X'时切换为'O',否则设为'X',能有效减少代码量并提高可读性。

总结

本文提供了完整的 Python 创建一个简单的 Tic-Tac-Toe 游戏类 实现方案,包含核心方法解析、胜利检测逻辑和扩展功能设计,适合直接集成到项目中使用。