Python 一步一步教你用pyglet制作汉诺塔游戏(续)

在之前的文章中,我们介绍了汉诺塔游戏的基本概念和结构,并初步搭建了游戏的框架。接下来,我们将继续完善这个游戏,增加游戏的逻辑、界面以及动画效果。我们将使用 pyglet 库来实现这些功能。

1. 游戏逻辑

汉诺塔的基本规则是:只有一个盘子可以在每次移动中被移动,较大的盘子不能放在较小的盘子上。我们可以用一个列表来模拟汉诺塔的三个柱子(A、B、C),其中每个柱子都是一个用来存放盘子的栈。

towers = {
    'A': [3, 2, 1],  # 初始状态,A柱子上有3个盘子
    'B': [],
    'C': []
}

2. 创建游戏界面

使用 pyglet 来创建窗口并绘制盘子和柱子。我们需要定义一个 draw_tower 函数来绘制柱子和盘子。

import pyglet

window = pyglet.window.Window(600, 400)

def draw_tower(x, y, tower):
    pyglet.draw.Rectangle(x, y, 10, 120, color=(139, 69, 19))  # 绘制塔柱
    offset = 0
    for disc in tower:
        # 这里的 disc 用于表示盘子的大小
        width = disc * 20  # 盘子的宽度
        height = 10  # 盘子的高度
        pyglet.draw.Rectangle(x - width / 2, y + offset, width, height, color=(255, 0, 0))  # 绘制盘子
        offset += height

@window.event
def on_draw():
    window.clear()
    # 绘制三个柱子
    draw_tower(100, 100, towers['A'])
    draw_tower(300, 100, towers['B'])
    draw_tower(500, 100, towers['C'])

pyglet.app.run()

3. 移动盘子

接下来,我们需要定义一个函数来处理盘子的移动。我们可以用一个简单的步骤函数 move_disk 来实现这个功能。

def move_disk(source, target):
    if towers[source]:
        # 从源柱子取出最上面的盘子
        disk = towers[source].pop()
        # 放到目标柱子上
        towers[target].append(disk)

4. 处理用户输入

为了让用户能够通过鼠标点击来移动盘子,我们需要监听鼠标事件,并在点击柱子时调用 move_disk 函数。

selected_tower = None

@window.event
def on_mouse_press(x, y, button, modifiers):
    global selected_tower
    if x < 200:  # A柱子
        selected_tower = 'A'
    elif x < 400:  # B柱子
        selected_tower = 'B'
    else:  # C柱子
        selected_tower = 'C'

    # 如果已经选择了一个柱子,则进行移动
    if selected_tower:
        if selected_tower == 'A':
            move_disk('A', 'B')  # 示例:总是将A到B
        selected_tower = None

5. 完整代码

将上述代码整合在一起,形成一个完整的汉诺塔游戏。

import pyglet

# 初始化柱子
towers = {
    'A': [3, 2, 1],
    'B': [],
    'C': []
}

window = pyglet.window.Window(600, 400)

def draw_tower(x, y, tower):
    pyglet.graphics.draw(4, pyglet.gl.GL_QUADS, ('v2f', [x, y, x + 10, y, x + 10, y + 120, x, y + 120]), ('c3B', [139, 69, 19] * 4))
    offset = 0
    for disk in tower:
        width = disk * 20
        height = 10
        pyglet.graphics.draw(4, pyglet.gl.GL_QUADS, ('v2f', [x - width / 2, y + offset, x + width / 2, y + offset, x + width / 2, y + offset + height, x - width / 2, y + offset + height]), ('c3B', [255, 0, 0] * 4))
        offset += height

@window.event
def on_draw():
    window.clear()
    draw_tower(100, 100, towers['A'])
    draw_tower(300, 100, towers['B'])
    draw_tower(500, 100, towers['C'])

selected_tower = None

@window.event
def on_mouse_press(x, y, button, modifiers):
    global selected_tower
    if x < 200:
        selected_tower = 'A'
    elif x < 400:
        selected_tower = 'B'
    else:
        selected_tower = 'C'

    if selected_tower:
        if selected_tower == 'A':
            move_disk('A', 'B')  # 示例:总是将A到B
        selected_tower = None

def move_disk(source, target):
    if towers[source]:
        disk = towers[source].pop()
        towers[target].append(disk)

pyglet.app.run()

总结

在这篇文章中,我们逐步完成了使用 pyglet 实现汉诺塔游戏的基本框架。通过定义游戏逻辑、绘制图形界面、处理用户输入,我们基本上搭建好了一个简单的汉诺塔游戏。后续可以继续完善游戏,例如添加动画效果、计时器、游戏胜利的提示等功能。

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部