我正在开展一个井字游戏,一切顺利,但我想知道是否有更好的方法来执行以下代码:
def straight_check(play_board, item):
inc_up = 1
inc_down = 1
for num in range(3):
for second in range(3):
if play_board[second][num] == 'x':
if inc_up == 3:
return True
inc_up += 1
else:
continue
if play_board[num][second] == 'x':
if inc_down == 3:
return True
inc_down += 1
else:
continue
return False
此功能接收游戏的板(3x3嵌套列表)以及用户char(x或o)。此功能检查用户char是否在电路板上连续出现3次(水平或垂直)。有没有其他方法可以做到这一点,而不使用嵌套的for循环和变量?此外,这种编程是否与编程良好实践的大小一致?
答案 0 :(得分:1)
实际上,存在一些问题。您应该重置外部循环内的计数器(或者您将继续增加先前失败的chcks的计数)并删除else: continue
部分,否则如果相应的item
中没有def straight_check(play_board, item):
for x in range(3):
# reset the counters in inner loop
cnt_hori, cnt_vert = 0, 0
for y in range(3):
if play_board[x][y] == item:
cnt_hori += 1
if cnt_hori == 3:
return True
if play_board[y][x] == item:
cnt_vert += 1
if cnt_vert == 3:
return True
return False
,您将跳过列检查行:
zip(*...)
一般来说嵌套循环本身没有任何错误(因为你事先知道这只是一个3x3矩阵)。但请注意,内置函数any
和all
以及def straight_check(play_board, item):
if any(all(x == item for x in row) for row in play_board):
return True
if any(all(x == item for x in col) for col in zip(*play_board)):
return True
return False
转置模式可用于实现某些效果,以缩短代码)让它更具可读性:
apt-get install php7.2-xml
你可以用自然语言来思考:它是否适用于“任何”行,其中“所有”项目都是'x'等?