如何将choose()返回值持久存入board_full()的places列表
棋盘位置累计存储与满盘校验实现
问题原因
当前代码无法累计存储位置的核心原因是:
places列表定义在board_full()函数内部,属于局部变量,每次调用函数都会重新执行places = []创建空列表,之前存入的数值会在函数执行结束后被销毁,自然无法保留历史记录。- 原
choose()函数存在缩进错误,while循环下的输入逻辑没有正确缩进,运行时会直接触发语法报错。 - 缺少重复位置校验逻辑,即使用户重复选同一个位置,也会被计入列表长度,导致满盘判断不准。
可直接运行的修复代码
推荐使用传参的实现方式,避免全局变量带来的调试麻烦:
def choose(): choose_input = 'wrong' # 修正while循环缩进 while choose_input not in ['1','2','3','4','5','6','7','8','9']: choose_input = input('Which place you want to choose from 1 to 9 ') if choose_input not in ['1','2','3','4','5','6','7','8','9']: print('Sorry, wrong input! Please try again!') return int(choose_input) def board_full(selected_places): # 直接基于传入的已选位置列表判断长度,不需要在函数内初始化列表 return len(selected_places) >= 9 if __name__ == "__main__": # 循环外初始化一次已选位置列表,所有选择记录都存在这里 places = [] while not board_full(places): pos = choose() # 增加重复位置校验 if pos in places: print("This position is already occupied, please choose another!") continue places.append(pos) print(f"Current selected positions: {places}") print("All 9 positions are taken, game end!")
逻辑说明
- 存储位置的列表只在游戏启动时初始化一次,不会每次调用校验函数就重置。
- 用户输入合法后先判断位置是否已被占用,没被占用才追加到列表里。
board_full()只负责接收已选列表、返回是否满盘的布尔值,职责单一,后续调整逻辑更方便。
内容的提问来源于stack exchange,提问作者Vaibhav Shinde
相关产品推荐
相关产品推荐

