五子棋是练习编程逻辑的经典项目,但不少人在实现时把落子、判断连子和刷新界面写成了一堆相似代码。这样不仅篇幅长,改一处就要改多处。下面看常见重复写法以及简化思路。

一、常见的重复代码问题
很多初学者判断横、竖、斜方向连子时,会写四个几乎一样的循环。例如下面这种重复结构:
# 横向判断
count = 0
for i in range(5):
if board[x+i][y] == color:
count += 1
else:
break
# 纵向判断
count = 0
for i in range(5):
if board[x][y+i] == color:
count += 1
else:
break
# 斜向判断也类似写了两遍
上面只是举例,实际常常四个方向都手写一遍,代码又臭又长。
二、用方向数组消除重复
可以把四个方向写成一个列表,用一层循环处理所有方向,大幅减少重复:
def check_win(board, x, y, color):
# 四个方向:横、竖、左斜、右斜
directions = [(1,0), (0,1), (1,1), (1,-1)]
for dx, dy in directions:
count = 0
# 正方向
i = 0
while 0 <= x+dx*i < len(board) and 0 <= y+dy*i < len(board[0]) and board[x+dx*i][y+dy*i] == color:
count += 1
i += 1
# 反方向
i = 1
while 0 <= x-dx*i < len(board) and 0 <= y-dy*i < len(board[0]) and board[x-dx*i][y-dy*i] == color:
count += 1
i += 1
if count >= 5:
return True
return False
这样原本四段相似逻辑合并成一个函数,重复部分被完全抽掉。
三、统一棋盘表示减少边界判断重复
有人在每个落子处都写一遍越界判断,其实可封装成函数:
def in_board(board, x, y):
return 0 <= x < len(board) and 0 <= y < len(board[0])
def place(board, x, y, color):
if not in_board(board, x, y):
return False
if board[x][y] != 0:
return False
board[x][y] = color
return True
四、界面刷新也别写重复
如果用网页写五子棋,别在每个落子后手写一堆 DOM 操作。可用循环重绘:
<table id="board"></table>
<script>
function draw(board){
var html = '';
for(var i=0;i<board.length;i++){
html += '<tr>';
for(var j=0;j<board[0].length;j++){
var c = board[i][j]==1?'黑':(board[i][j]==2?'白':'空');
html += '<td>'+c+'</td>';
}
html += '</tr>
}
document.getElementById('board').innerHTML = html;
}
</script>
五、小结
简化五子棋重复代码的核心就是:方向用数组、判断封装函数、界面用循环绘制。重构后逻辑清楚,以后加悔棋或 AI 都更轻松。