Udemy Python井字棋项目疑问:参数使用与后续开发方向
井字棋开发疑问与优化推进建议
我正在Udemy的《Python从入门到精通》课程中完成里程碑项目1(井字棋游戏),目前已实现创建棋盘、分配玩家、首次玩家落子功能,但不确定代码实现是否合理,有两个核心疑问:
- 现有代码可运行,是否应使用参数提升灵活性?(仍对参数使用场景存疑)
- 需实现胜负/平局判断功能,是否应让该函数返回布尔值并在其他函数中调用?
不想提前看课程答案,希望得到针对性的推进建议,开发工具为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"表示平局。这样调用方可以直接根据返回值执行后续逻辑(宣布结果、结束游戏等)。
具体实现思路:
- 先定义所有可能的获胜位置组合(共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)]。 - 遍历这些组合,检查棋盘上对应位置是否被同一个非空玩家标记占据。
- 如果没有获胜情况,检查棋盘是否已无空格,是则判定平局,否则游戏继续。
调用时机:每次玩家落子完成后,立即调用该判断函数,根据结果决定是切换玩家还是终止游戏。
三、其他推进建议
- 修复
position_placement的逻辑缺陷:当前仅支持第一个玩家落子,没有切换玩家的逻辑;且position作为全局变量,第二次落子会直接复用之前的值导致错误。建议将position改为函数内部变量,落子完成后返回新的棋盘状态,由外部逻辑处理玩家切换。 - 拆分输入验证逻辑:把“验证玩家输入是否为有效数字且属于可用位置”的逻辑拆成独立函数(如
get_valid_position(available_positions)),让代码结构更清晰,也方便复用。 - 利用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
相关产品推荐
相关产品推荐

