You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 22:24:24