四子棋游戏check函数异常排查:列满校验失效问题
四子棋(4 in a row)游戏check函数修复方案
核心问题分析
- 列索引偏移导致校验与操作列不匹配:主循环中调用
check()验证用户输入后,执行了col -= 1,使得后续function()填充的列是用户输入列号减1,但check()判断的是用户原始输入列对应的matrix[0][col]。例如用户输入列3,check()检测列3是否已满,实际却填充列2,即便列2已满,check()也会因列3为空而放行。 - check函数列范围判断错误:硬编码
col>10作为无效列判断,应使用全局变量SIZE替换(正确条件为col >= SIZE),否则当棋盘尺寸不等于11时,会出现允许无效列或误拦截有效列的问题。 - function函数循环逻辑冗余:通过
i +=1; i *= -1遍历负索引,逻辑绕弯易出错,直接从最后一行向上遍历更清晰。 - SIZE变量未定义:代码多处使用
SIZE但未赋值,会直接引发运行错误,需先定义棋盘尺寸。
修复后的关键代码
1. 修正check函数
def check(): global col global SIZE global booli global matrix # 修正列范围判断,用SIZE替代硬编码值;校验实际要操作的列是否已满 while (col >= SIZE or col < 0) or (col != -1 and matrix[0][col] != EMPTY): col = int(input("try again.")) if col == -1: booli = False return False
2. 移除主循环中的列索引偏移
删除check()后的col -= 1,确保校验与操作的是同一列:
while col != -1 : if who%2 == 0: check() if booli == False: break # 移除 col -= 1 function(FIRST) pboard(matrix) print(win(FIRST)) elif who % 2 != 0: check() if booli == False: break # 移除 col -= 1 function(SECOND) pboard(matrix) print(win(SECOND)) # 后续逻辑保持不变...
3. 优化function函数逻辑
def function(who2): global col # 从最后一行向上遍历,找到第一个空位填充 for row in range(SIZE-1, -1, -1): if matrix[row][col] == EMPTY: matrix[row][col] = who2 break
4. 补充SIZE定义
在代码开头添加棋盘尺寸定义:
SIZE = 7 # 标准四子棋为7列6行,可按需调整
额外优化建议
- 减少全局变量使用:尽量通过参数传递
matrix、col等变量,避免全局变量引发的逻辑混乱 - 完善win函数:当前仅支持横向、纵向四子连线判断,需补充对角线校验逻辑
- 优化输入提示:在
input()中给出明确指引,比如"enter the column (0-6, -1 to quit): "
内容的提问来源于stack exchange,提问作者joee__mama
相关产品推荐
相关产品推荐

