出于教育目的,我正在用Python实现一个tic tac toe游戏。
设置玩家X或O的功能是递归的:
def set_marker(player,board):
print "\nplayer",player
x = y = 3
while(x not in range(0,3)):
x = input("x: ")
while(y not in range(0,3)):
y = input("y: ")
if board[x][y] == 0:
board[x][y]=player
return board
else:
set_marker(player,board)
# return board
参数:
board = 2dimensional list ( [[0, 0, 0], [0, 0, 0], [0, 0, 0]] )
player = int (value = '1' or '2')
如果我将'X'设置为已经使用的字段,我再次调用该函数。 当这种情况发生并且我在主循环中再次使用'board'时,脚本会抛出以下错误:
Python: TypeError: 'NoneType' object has no attribute '__getitem__'
在这种情况下,董事会的类型是:none
。
我只是在board
部分返回else:
来解决问题。
这是我的问题:
为什么我必须在其他地方返回电路板,因为我正在调用该功能,直到我返回正确的电路板?
答案 0 :(得分:2)
set_marker(player,board)
应该是:
return set_marker(player,board)
否则你只是递归调用而不传递结果。在第一次迭代中说它进入else,它将调用set_marker
,然后可以返回board
,此时外部调用将完成而不返回任何内容,因此{{1} }。
虽然不使用递归可能会更好:
TypeError
答案 1 :(得分:0)
我希望使用以下语法:
else:
return set_marker(player,board)
当您进行导致if语句的第一部分的调用时,它将返回'board',但该返回值需要通过调用链传播回来。如果你没有从else块返回递归调用中找到的值,那么就不会返回任何内容。