四子棋(Connect Four)是一款经典的两人棋盘游戏,玩家轮流在垂直网格中放置彩色圆盘,率先在水平、垂直或对角线上连成四个同色棋子的一方获胜。本文将基于 Python 的 turtle
库实现一个简单的四子棋游戏,并探讨如何对其进行功能扩展。
🎮 想象一下:黄色和红色的棋子交替落下,率先连成四子的一方获胜...
基础游戏实现
我们首先来看基础游戏的实现代码:
from turtle import *
from freegames import line
turns = {'red': 'yellow', 'yellow': 'red'}
state = {'player': 'yellow', 'rows': [0] * 8}
def grid():
"""绘制四子棋网格"""
bgcolor('light blue')
# 绘制垂直线
for x in range(-150, 200, 50):
line(x, -200, x, 200)
# 绘制空白格子(白色圆圈)
for x in range(-175, 200, 50):
for y in range(-175, 200, 50):
up()
goto(x, y)
dot(40, 'white')
update()
def tap(x, y):
"""在点击的列中放置红或黄圆"""
player = state['player']
rows = state['rows']
# 计算点击的列
row = int((x + 200) // 50)
count = rows[row]
# 计算放置棋子的坐标
x = ((x + 200) // 50) * 50 - 200 + 25
y = count * 50 - 200 + 25
# 绘制棋子
up()
goto(x, y)
dot(40, player)
update()
# 更新列计数和玩家
rows[row] = count + 1
state['player'] = turns[player]
# 设置游戏窗口
setup(420, 420, 370, 0)
hideturtle()
tracer(False)
grid()
onscreenclick(tap)
done()
网格绘制
grid()
函数负责绘制游戏网格和空白位置的白色圆圈
点击处理
tap()
函数处理鼠标点击事件,放置棋子并切换玩家
游戏状态
使用字典维护当前玩家和每列已放置的棋子数量
功能扩展
现在让我们探讨如何对这个基础游戏进行扩展:
改变颜色
要改变游戏的颜色,只需修改 grid()
函数中的背景色和棋子颜色:
def grid():
"""绘制四子棋网格(修改后的颜色)"""
bgcolor('navy') # 深蓝色背景
# 绘制灰色网格线
pencolor('gray')
for x in range(-150, 200, 50):
line(x, -200, x, 200)
# 使用紫色和橙色作为棋子颜色
turns = {'purple': 'orange', 'orange': 'purple'}
state['player'] = 'purple' # 初始玩家为紫色
# 绘制空白格子(浅灰色正方形)
for x in range(-175, 200, 50):
for y in range(-175, 200, 50):
draw_square(x, y, 'light gray') # 绘制正方形而非圆形
update()
绘制正方形而非圆形
添加一个新函数来绘制正方形:
def draw_square(x, y, color):
"""在指定位置绘制正方形"""
up()
goto(x-20, y-20) # 调整位置以居中
down()
fillcolor(color)
begin_fill()
for _ in range(4):
forward(40) # 边长为40
left(90)
end_fill()
检测满行逻辑
在 tap()
函数中添加满行检测:
def tap(x, y):
"""处理点击事件,添加满行检测"""
player = state['player']
rows = state['rows']
row = int((x + 200) // 50)
# 检查列是否已满
if rows[row] >= 6: # 每列最多6个棋子
print(f"列 {row} 已满!")
return # 不执行任何操作
# 其余代码保持不变...
创建随机电脑玩家
添加一个新函数来实现电脑玩家:
import random
def computer_move():
"""电脑随机选择一列放置棋子"""
player = state['player']
rows = state['rows']
# 寻找未满的列
available_columns = [i for i in range(8) if rows[i] < 6]
if not available_columns:
print("游戏平局!")
return
# 随机选择一列
row = random.choice(available_columns)
count = rows[row]
# 计算放置位置
x = row * 50 - 200 + 25
y = count * 50 - 200 + 25
# 绘制棋子
up()
goto(x, y)
dot(40, player)
update()
# 更新状态
rows[row] = count + 1
state['player'] = turns[player]
检测获胜者
添加一个新函数来检测是否有玩家获胜:
def check_winner():
"""检查是否有玩家获胜"""
player = turns[state['player']] # 检查上一个落子的玩家
rows = state['rows']
# 获取当前棋盘状态
board = [[None for _ in range(8)] for _ in range(6)]
for col in range(8):
for row in range(rows[col]):
board[row][col] = turns[state['player']] if row % 2 == 0 else state['player']
# 检查水平方向
for row in range(6):
for col in range(5):
if (board[row][col] == player and
board[row][col+1] == player and
board[row][col+2] == player and
board[row][col+3] == player):
return True
# 检查垂直方向
for col in range(8):
for row in range(3):
if (board[row][col] == player and
board[row+1][col] == player and
board[row+2][col] == player and
board[row+3][col] == player):
return True
# 检查对角线(正斜)
for row in range(3):
for col in range(5):
if (board[row][col] == player and
board[row+1][col+1] == player and
board[row+2][col+2] == player and
board[row+3][col+3] == player):
return True
# 检查对角线(反斜)
for row in range(3, 6):
for col in range(5):
if (board[row][col] == player and
board[row-1][col+1] == player and
board[row-2][col+2] == player and
board[row-3][col+3] == player):
return True
return False
🏆 现在,你已经了解了如何扩展四子棋游戏,尝试实现这些功能并挑战电脑对手吧!
总结
通过以上扩展,我们将一个简单的四子棋游戏变得更加完善。主要的改进包括视觉样式的调整、游戏逻辑的增强以及添加了电脑对手。这个例子展示了如何从基础代码出发,逐步添加新功能,同时保持代码的结构清晰和可维护性。
你可以进一步扩展这个游戏,例如添加更智能的 AI 对手、保存游戏记录、设计更精美的界面等。通过这个简单的项目,你可以学习到游戏开发的基本原理和 Python 图形界面编程的基础知识。