Python开发Connect 4四子棋 如何优雅实现平局判断逻辑
Connect 4(四子棋)平局判断的简洁Python实现
问题背景
使用Python开发6行7列规格的Connect 4(四子棋)时,平局判断规则为:棋盘所有位置均被代表双方棋子的1或2占满,即判定为平局。
初始错误实现
最初编写的判断代码如下:
curr_board = [[1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [2, 2, 2, 2, 2, 2], [2, 2, 2, 2, 2, 2], [1, 1, 1, 1, 1, 1], [2, 2, 2, 2, 2, 2]] for row in curr_board: if curr_board and all(piece == 1 or piece == 2 for piece in row): print("draw")
运行这段代码会重复输出6次draw:
draw draw draw draw draw draw
问题原因
代码逐行遍历棋盘,每检测到一行全为1或2就直接打印平局结果,没有完成所有行的校验后再做统一判定。
临时修复版本
通过添加计数器统计符合要求的行数,修复了重复输出的问题:
counter = 0 for row in curr_board: if curr_board and all(piece == 1 or piece == 2 for piece in row): counter += 1 if counter == 6: print("draw")
该版本可以正常工作,但存在更简洁优雅的实现方式。
更优实现方案
不需要额外维护计数器变量,直接通过两层生成器表达式配合all()即可完成判定,逻辑更紧凑。另外原代码中if curr_board属于冗余判断,固定规格的棋盘初始化后不会为空,不需要额外加这个判空逻辑:
# 写法1:扁平化遍历所有格子 if all(piece in (1, 2) for row in curr_board for piece in row): print("draw") # 写法2:按行校验,逻辑和计数器版本完全一致 if all(all(piece in (1, 2) for piece in row) for row in curr_board): print("draw")
如果你的代码中用0代表未落子的空位(这是四子棋实现的通用约定),判断逻辑还可以进一步简化:只要棋盘中不存在空位0,就判定为平局:
if not any(0 in row for row in curr_board): print("draw")
以上写法都会在完成全棋盘校验后才返回结果,不会出现重复输出的问题,且不需要额外定义计数变量,可读性和执行效率都更优。
内容的提问来源于stack exchange,提问作者namdosan
相关产品推荐
相关产品推荐

