亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> Python

Python打造井字游戏:分步代码教程

Python井字游戏是有趣项目,助掌握基础概念。可用PyCharm或命令行开发。

井字游戏规则

  1. 空白方格网格开始
  2. 双方选符号(通常X/O)
  3. 轮流标记格子,直至某方凑成整行/列/对角线同符号获胜
  4. 棋盘填满无赢家则平局

前置要求

算法流程

  1. 创建棋盘
  2. 用户输入维度N(≥3)
  3. 随机决定先手
  4. 游戏开始
  5. 玩家选空位落子
  6. 更新棋盘
  7. 判定胜负/平局
  8. 每步后刷新显示
  9. 输出结果
  10. 询问再来一局

完整Python代码

# Guru99井字游戏
def getInput(prompt, cast=None, condition=None, errorMessage=None):
    while True:
        try:
            val = cast(input(prompt))
            assert condition is None or condition(val)
            return val
        except:
            print(errorMessage or "Invalid input.")

def printBoard(board):
    print()
    for row in board:
        print(*row)
    print()

def checkWin(board):
    # 检查行
    for row in range(len(board)):
        for col in range(len(board)-1):
            if board[row][col] == "_" or board[row][col+1] == "_" or board[row][col] != board[row][col+1]:
                break
        else:
            return True
    # 检查列
    for col in range(len(board)):
        for row in range(len(board)-1):
            if board[row][col] == "_" or board[row+1][col] == "_" or board[row][col] != board[row+1][col]:
                break
        else:
            return True
    # 检查主对角线
    for cell in range(len(board)-1):
        if board[cell][cell] == "_" or board[cell+1][cell+1] == "_" or board[cell][cell] != board[cell+1][cell+1]:
            break
    else:
        return True
    # 检查副对角线
    for cell in range(len(board)-1):
        emptyCell = board[cell][len(board)-cell-1] == "_" or board[cell+1][len(board)-cell-2] == "_"
        different = board[cell][len(board)-cell-1] != board[cell+1][len(board)-cell-2]
        if emptyCell or different:
            break
    else:
        return True
    return False

def play():
    print("------------\nN-DIMENSIONAL TIC TAC TOE game by guru99.com\n------------")
    N = getInput(prompt="Enter N (board dimension, >=3): ", cast=int, condition=lambda x: x >= 3, errorMessage="Invalid input. Enter integer >=3.")
    board = [['_'] * N for _ in range(N)]
    used = 0
    turn = 0
    while True:
        printBoard(board)
        pick = getInput(prompt=f"Player {turn+1} - Pick location (row col): ", cast=lambda line: tuple(map(int, line.split())), condition=lambda pair: 0 <= pair[0] < N and 0 <= pair[1] < N and board[pair[0]][pair[1]] == "_", errorMessage="Invalid input. Enter valid empty cell as 'row col'.")
        board[pick[0]][pick[1]] = "X" if turn == 0 else "O"
        used += 1
        if checkWin(board):
            printBoard(board)
            print(f"Game over, Player {turn+1} wins.")
            break
        elif used == N*N:
            printBoard(board)
            print("Game over. Tie.")
            break
        turn = (turn + 1) % 2
    playAgain = getInput(prompt="Play again? (y/n): ", cast=str, condition=lambda ans: ans.strip().lower() in {"y","n"}, errorMessage="Enter 'y' or 'n'.")
    if playAgain == 'n':
        print("\nGame ended.")
        return
    else:
        play()

if __name__ == '__main__':
    play()

运行示例(3x3棋盘)

------------
N-DIMENSIONAL TIC TAC TOE game by guru99.com
------------
Enter N (board dimension, >=3): 3
_ _ _
_ _ _
_ _ _
Player 1 - Pick location (row col): 1 1
_ _ _
_ X _
_ _ _
Player 2 - Pick location (row col): 0 1
_ O _
_ X _
_ _ _
... (后续步骤省略)
Game over, Player 1 wins.
Play again? (y/n):

代码核心解析

棋盘打印

printBoard遍历二维列表逐行打印,*row解包列表元素以空格分隔。

胜负判定

checkWin分四向检查:行、列、主对角线、副对角线。采用for-else结构:若循环未break(即全满足同符号非空),else返回True。任意方向满足即胜利。

游戏主循环

结语

Python

  1. 精通 Python range() 函数:从基础到高级用法
  2. 加入 Real Python 专属 Slack 社区,与全球 Python 开发者同行
  3. Python timeit():精准测量代码执行时间与实战示例
  4. Python calendar 模块专家指南:代码示例详解
  5. 精通 Python 异常处理:try、except、else 与 finally 详解
  6. Python 函数详解:构建可复用代码模块的最佳实践
  7. 精通Python函数参数:位置、关键字与默认参数
  8. Python 文件 I/O:掌握输入输出操作
  9. Python 计算平均值:从循环到 NumPy 的四种实战方法
  10. Python 字典基础:键值对操作、访问与核心方法大全
  11. 精通 Python 装饰器:专家技巧增强函数
  12. 精通 Python strptime():准确解析日期字符串