You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Udemy Python井字棋项目疑问:参数使用与后续开发方向

井字棋开发疑问与优化推进建议

我正在Udemy的《Python从入门到精通》课程中完成里程碑项目1(井字棋游戏),目前已实现创建棋盘、分配玩家、首次玩家落子功能,但不确定代码实现是否合理,有两个核心疑问:

  1. 现有代码可运行,是否应使用参数提升灵活性?(仍对参数使用场景存疑)
  2. 需实现胜负/平局判断功能,是否应让该函数返回布尔值并在其他函数中调用?

不想提前看课程答案,希望得到针对性的推进建议,开发工具为PyCharm。


一、参数使用的必要性与场景建议

当前代码大量依赖全局变量(如board、players、acceptable_range),这会导致函数的复用性、可测试性大幅降低。参数的核心使用场景是:当函数需要的输入并非自身生成,且这些输入可能在不同场景下有不同取值时。具体优化方向:

  • 保留game_board接收board参数的设计,这是良好的实践,让函数只负责渲染逻辑,不依赖外部状态。
  • 改造assign_players:不要修改全局变量,而是直接返回玩家组合(例如return player_1, player_2),让调用方处理后续的玩家存储与切换逻辑,让函数更独立。
  • 改造position_placement:将board、current_player、available_positions作为参数传入,同时将落子后的新棋盘和剩余可用位置作为返回值。这样函数完全不依赖全局状态,后续扩展多局游戏或AI对战时会更轻松。

为什么要这么做?全局变量会让代码逻辑变得隐晦,你很难快速追踪状态变化;而参数+返回值的设计让函数的输入输出清晰,调试和测试时也无需担心全局状态被污染。

二、胜负/平局判断的实现建议

让判断函数返回布尔值是合理的,甚至可以进一步优化返回值类型,让它能区分不同结果:比如返回None表示游戏继续,"X"/"O"表示对应玩家获胜,"tie"表示平局。这样调用方可以直接根据返回值执行后续逻辑(宣布结果、结束游戏等)。

具体实现思路:

  1. 先定义所有可能的获胜位置组合(共8种:3行、3列、2条对角线),例如winning_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)]。
  2. 遍历这些组合,检查棋盘上对应位置是否被同一个非空玩家标记占据。
  3. 如果没有获胜情况,检查棋盘是否已无空格,是则判定平局,否则游戏继续。

调用时机:每次玩家落子完成后,立即调用该判断函数,根据结果决定是切换玩家还是终止游戏。

三、其他推进建议

  1. 修复position_placement的逻辑缺陷:当前仅支持第一个玩家落子,没有切换玩家的逻辑;且position作为全局变量,第二次落子会直接复用之前的值导致错误。建议将position改为函数内部变量,落子完成后返回新的棋盘状态,由外部逻辑处理玩家切换。
  2. 拆分输入验证逻辑:把“验证玩家输入是否为有效数字且属于可用位置”的逻辑拆成独立函数(如get_valid_position(available_positions)),让代码结构更清晰,也方便复用。
  3. 利用PyCharm工具辅助开发:开启代码检查功能(右上角的警告标记),它会自动提示全局变量滥用的问题;使用调试功能设置断点,逐步运行观察变量变化,快速定位逻辑错误。

现有代码

board = [' '] * 9
player_1 = None
player_2 = None
current_player = None
position = None
acceptable_range = [0,1,2,3,4,5,6,7,8]
players = None

def game_board(board):
    print('\n' * 100)
    print(board[0] + "|" + board[1] + "|" + board[2])
    print(" ---")
    print(board[3] + "|" + board[4] + "|" + board[5])
    print(" ---")
    print(board[6] + "|" + board[7] + "|" + board[8])


def assign_players():
    #only allow 'X' or 'O'
    acceptable_values= ['X','O']
    # asks player 1 what letter he wants
    global player_1
    global player_2
    global current_player
    global players
    player_1 = input('Player 1 would you like to be X or O: ').upper()
    while player_1 not in acceptable_values:
        player_1 = input('Please choose only X or O: ').upper()

    if player_1 == 'X':
        player_2 = 'O'
    else:
        player_2 = 'X'
    players = [player_1, player_2]



def position_placement():
    #request input from player_1 and make sure its int and within range
    global acceptable_range
    global current_player
    global position
    global players

    current_player = players[0]

    while position == None:
        position = int(input('Please choose a number between 0-8: '))
        while position not in acceptable_range:
            position = int(input('Incorrect value! Sorry please try again: '))

    # take position and assign to player_1 value
    board[position] = current_player
    # pop off position from acceptable_range so it can't be chosen again
    acceptable_range.pop(position)

    #show the new board
    return (game_board(board))

内容的提问来源于stack exchange,提问作者Josh Fellus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 01:15:33