平平爱恰糖糖
平平爱恰糖糖
发布于 2025-07-07 / 24 阅读
0
0

四子棋游戏开发:从基础实现到功能扩展

四子棋(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 图形界面编程的基础知识。

官方群聊:703681056


评论