驴友花雕 发表于 2025-9-17 14:51:32

【花雕动手做】基于Kitronik可编程开发板之穿越鸭子游戏

Kitronik ARCADE 是一款由英国教育科技公司 Kitronik 精心打造的可编程游戏机开发板,专为编程教学与创客实践而设计。该设备原生支持微软的 MakeCode Arcade 平台,用户可通过图形化或 JavaScript 编程方式,轻松创建、下载并运行复古风格的街机游戏。

它集成了彩色 LCD 显示屏、方向控制键、功能按键、蜂鸣器和震动马达等交互组件,提供完整的游戏输入输出体验。无论是初学者进行编程启蒙,还是创客群体开发交互式作品,Kitronik ARCADE 都能作为理想的硬件载体,助力创意实现。

凭借其开源友好、易于上手、兼容性强等特点,该开发板广泛应用于中小学编程课程、创客工作坊、游戏开发教学以及个人项目原型设计,深受教育者与技术爱好者的喜爱。







驴友花雕 发表于 2025-9-17 14:54:38

【花雕动手做】基于Kitronik可编程开发板之穿越鸭子游戏

作为学习、练习与尝试,这里创建一个穿越鸭子的小游戏。
打开网页版:https://arcade.makecode.com/,设置项目名称:穿越鸭子

MicroPython实验代码

class ActionKind(Enum):
    Walking = 0
    Idle = 1
    Jumping = 2
@namespace
class SpriteKind:
    Gap = SpriteKind.create()

def on_on_overlap(sprite, otherSprite):
    if otherSprite.right - sprite.left < 2:
      info.change_score_by(1)
sprites.on_overlap(SpriteKind.player, SpriteKind.Gap, on_on_overlap)

def on_on_overlap2(sprite2, otherSprite2):
    game.over(False)
sprites.on_overlap(SpriteKind.player, SpriteKind.projectile, on_on_overlap2)

def on_button_pressed():
    mySprite.vy = -100
    animation.set_action(mySprite, ActionKind.Walking)
    mySprite.start_effect(effects.rings, 300)
controller.any_button.on_event(ControllerButtonEvent.PRESSED, on_button_pressed)

projectile: Sprite = None
gapSprite: Sprite = None
gapImage: Image = None
bottomImage: Image = None
topImage: Image = None
gap = 0
mySprite: Sprite = None
scene.set_background_color(9)
info.set_score(0)
effects.blizzard.start_screen_effect()
mySprite = sprites.create(img("""
      . . . . . . . . . . b 5 b . . .
      . . . . . . . . . b 5 b . . . .
      . . . . . . . . . b c . . . . .
      . . . . . . b b b b b b . . . .
      . . . . . b b 5 5 5 5 5 b . . .
      . . . . b b 5 d 1 f 5 5 d f . .
      . . . . b 5 5 1 f f 5 d 4 c . .
      . . . . b 5 5 d f b d d 4 4 . .
      b d d d b b d 5 5 5 4 4 4 4 4 b
      b b d 5 5 5 b 5 5 4 4 4 4 4 b .
      b d c 5 5 5 5 d 5 5 5 5 5 b . .
      c d d c d 5 5 b 5 5 5 5 5 5 b .
      c b d d c c b 5 5 5 5 5 5 5 b .
      . c d d d d d d 5 5 5 5 5 d b .
      . . c b d d d d d 5 5 5 b b . .
      . . . c c c c c c c c b b . . .
      """),
    SpriteKind.player)
mySprite.ay = 300
anim = animation.create_animation(ActionKind.Walking, 25)
anim.add_animation_frame(img("""
    . . . . . . . . . . . . . . . .
    . . . . . . . . . . . . . . . .
    . . . . . . . . . b 5 5 b . . .
    . . . . . . b b b b b b . . . .
    . . . . . b b 5 5 5 5 5 b . . .
    . b b b b b 5 5 5 5 5 5 5 b . .
    . b d 5 b 5 5 5 5 5 5 5 5 b . .
    . . b 5 5 b 5 d 1 f 5 d 4 f . .
    . . b d 5 5 b 1 f f 5 4 4 c . .
    b b d b 5 5 5 d f b 4 4 4 4 b .
    b d d c d 5 5 b 5 4 4 4 4 4 4 b
    c d d d c c b 5 5 5 5 5 5 5 b .
    c b d d d d d 5 5 5 5 5 5 5 b .
    . c d d d d d d 5 5 5 5 5 d b .
    . . c b d d d d d 5 5 5 b b . .
    . . . c c c c c c c c b b . . .
    """))
anim.add_animation_frame(img("""
    . . . . . . . . . . . . . . . .
    . . . . . . . . . . b 5 b . . .
    . . . . . . . . . b 5 b . . . .
    . . . . . . b b b b b b . . . .
    . . . . . b b 5 5 5 5 5 b . . .
    . b b b b b 5 5 5 5 5 5 5 b . .
    . b d 5 b 5 5 5 5 5 5 5 5 b . .
    . . b 5 5 b 5 d 1 f 5 d 4 f . .
    . . b d 5 5 b 1 f f 5 4 4 c . .
    b b d b 5 5 5 d f b 4 4 4 4 4 b
    b d d c d 5 5 b 5 4 4 4 4 4 b .
    c d d d c c b 5 5 5 5 5 5 5 b .
    c b d d d d d 5 5 5 5 5 5 5 b .
    . c d d d d d d 5 5 5 5 5 d b .
    . . c b d d d d d 5 5 5 b b . .
    . . . c c c c c c c c b b . . .
    """))
anim.add_animation_frame(img("""
    . . . . . . . . . . b 5 b . . .
    . . . . . . . . . b 5 b . . . .
    . . . . . . . . . b c . . . . .
    . . . . . . b b b b b b . . . .
    . . . . . b b 5 5 5 5 5 b . . .
    . . . . b b 5 d 1 f 5 5 d f . .
    . . . . b 5 5 1 f f 5 d 4 c . .
    . . . . b 5 5 d f b d d 4 4 . .
    b d d d b b d 5 5 5 4 4 4 4 4 b
    b b d 5 5 5 b 5 5 4 4 4 4 4 b .
    b d c 5 5 5 5 d 5 5 5 5 5 b . .
    c d d c d 5 5 b 5 5 5 5 5 5 b .
    c b d d c c b 5 5 5 5 5 5 5 b .
    . c d d d d d d 5 5 5 5 5 d b .
    . . c b d d d d d 5 5 5 b b . .
    . . . c c c c c c c c b b . . .
    """))
anim.add_animation_frame(img("""
    . . . . . . . . . . b 5 b . . .
    . . . . . . . . . b 5 b . . . .
    . . . . . . b b b b b b . . . .
    . . . . . b b 5 5 5 5 5 b . . .
    . . . . b b 5 d 1 f 5 d 4 c . .
    . . . . b 5 5 1 f f d d 4 4 4 b
    . . . . b 5 5 d f b 4 4 4 4 b .
    . . . b d 5 5 5 5 4 4 4 4 b . .
    . . b d d 5 5 5 5 5 5 5 5 b . .
    . b d d d d 5 5 5 5 5 5 5 5 b .
    b d d d b b b 5 5 5 5 5 5 5 b .
    c d d b 5 5 d c 5 5 5 5 5 5 b .
    c b b d 5 d c d 5 5 5 5 5 5 b .
    . b 5 5 b c d d 5 5 5 5 5 d b .
    b b c c c d d d d 5 5 5 b b . .
    . . . c c c c c c c c b b . . .
    """))
anim.add_animation_frame(img("""
    . . . . . . . . . . b 5 b . . .
    . . . . . . . . . b 5 b . . . .
    . . . . . . b b b b b b . . . .
    . . . . . b b 5 5 5 5 5 b . . .
    . . . . b b 5 d 1 f 5 d 4 c . .
    . . . . b 5 5 1 f f d d 4 4 4 b
    . . . . b 5 5 d f b 4 4 4 4 b .
    . . . b d 5 5 5 5 4 4 4 4 b . .
    . b b d d d 5 5 5 5 5 5 5 b . .
    b d d d b b b 5 5 5 5 5 5 5 b .
    c d d b 5 5 d c 5 5 5 5 5 5 b .
    c b b d 5 d c d 5 5 5 5 5 5 b .
    c b 5 5 b c d d 5 5 5 5 5 5 b .
    b b c c c d d d 5 5 5 5 5 d b .
    . . . . c c d d d 5 5 5 b b . .
    . . . . . . c c c c c b b . . .
    """))
anim.add_animation_frame(img("""
    . . . . . . . . . . b 5 b . . .
    . . . . . . . . . b 5 b . . . .
    . . . . . . b b b b b b . . . .
    . . . . . b b 5 5 5 5 5 b . . .
    . . . . b b 5 d 1 f 5 5 d f . .
    . . . . b 5 5 1 f f 5 d 4 c . .
    . . . . b 5 5 d f b d d 4 4 . .
    . b b b d 5 5 5 5 5 4 4 4 4 4 b
    b d d d b b d 5 5 4 4 4 4 4 b .
    b b d 5 5 5 b 5 5 5 5 5 5 b . .
    c d c 5 5 5 5 d 5 5 5 5 5 5 b .
    c b d c d 5 5 b 5 5 5 5 5 5 b .
    . c d d c c b d 5 5 5 5 5 d b .
    . . c b d d d d d 5 5 5 b b . .
    . . . c c c c c c c c b b . . .
    . . . . . . . . . . . . . . . .
    """))
animation.attach_animation(mySprite, anim)

def on_on_update():
    if mySprite.vy > 0:
      animation.set_action(mySprite, ActionKind.Walking)
    if mySprite.bottom > 120 or mySprite.top < 0:
      game.over(False)
game.on_update(on_on_update)

def on_update_interval():
    global gap, topImage, bottomImage, gapImage, gapSprite, projectile
    gap = randint(0, 3)
    if gap == 0:
      topImage = img("""
            .....6eeeeeeeeeece6.....
            ....6776eeeeeeeee676....
            ...6776666eeee6766776...
            ..6776ee77777777667776..
            ...668ce7768867788666...
            ......ce77eeee67ee......
            ......eeeeeeeeeeee......
            ......eeeeeeeeeeee......
            ......eeeeeeeeeeee......
            ......eeeeeeeeeeee......
            ......eeeeeeeeeeee......
            ......eeeeeeeeeeee......
            ......eeeeeeeeeeee......
            ......beeeeeeeeeeb......
            .......beeeeeeeeb.......
            ........beeeeeeb........
            """)
      bottomImage = img("""
            ........................
            ........................
            ..........bbbb..........
            ........bbddddbb........
            .......bddbbbbddb.......
            ......bdbbddddbbdb......
            .....bdbbdbbbbdbbdb.....
            .....bdbdbddddbdbdb.....
            .....cdbbdbbbbdbbdc.....
            .....cbdbbddddbbdbc.....
            .....efbddbbbbddbce.....
            .....eeffbddddbccee.....
            .....eeeeffcccceee......
            .....ceeeeeeeeeeee......
            .....ceeeeeeeeeeee......
            .....feeeeeeeeeeee......
            .....cceeeeeeeeeee......
            ......feeeeeeeeeee......
            .....6fceeeeeeeeee6.....
            ....6776eeeeeeeee676....
            ...6777666eeee6666776...
            ..67768e67766777667776..
            ...668ee7768867788666...
            ......ee77eeee77ecee....
            ......ee6eeeeee6eef.....
            ......eeeeeeeeeeeef.....
            ......eeeeeeeeeeeef.....
            ......eeeeeeeeeeecf.....
            ......ceeeeeeeeeecf.....
            ......ceeeeeeeeeeff.....
            ......feeeeeeeeeefe.....
            .....6feeeeeeeeeef6.....
            ....6776eeeeeeeee676....
            ...6777666eeee6667776...
            ..6776ee67777777667776..
            ...668ee7768867788666...
            ......ee77eeee67ee......
            ......ee6eeeeee6ce......
            ......eefeeeeeeece......
            ......eeceeeeeeece......
            ......eeceeeeeeefe......
            ......eeceeeeeeefe......
            ......eeeeeeeeeefe......
            ......eeeeeeeeeece......
            .....6eeeeeeeeeece6.....
            ....6776eeeeeeeee676....
            ...6776666eeee6766776...
            ..6776ee77777777667776..
            ...668ce7768867788666...
            ......ce77eeee67ee......
            ......ce6eeeeee6ee......
            ......ceeeeeeeeeee......
            ......fcceeeeeecee......
            ......fccceeececce......
            ......fcceeecceccc......
            ......fccceecceccc......
            ......fccccceceecc......
            .....6fccccccccccf6.....
            ....6776ccccccccc676....
            ...6776676cccc6766776...
            ..6776cc77777777667776..
            ...668cc7768867788666...
            ......cc77cccc67cf......
            ......cc6cccccc6cf......
            """)
    elif gap == 1:
      topImage = img("""
            .....6feeeeeeeeeef6.....
            ....6776eeeeeeeee676....
            ...6777666eeee6667776...
            ..6776ee67777777667776..
            ...668ee7768867788666...
            ......ee77eeee67ee......
            ......ee6eeeeee6ce......
            ......eefeeeeeeece......
            ......eeceeeeeeece......
            ......eeceeeeeeefe......
            ......eeceeeeeeefe......
            ......eeeeeeeeeefe......
            ......eeeeeeeeeece......
            .....6eeeeeeeeeece6.....
            ....6776eeeeeeeee676....
            ...6776666eeee6766776...
            ..6776ee77777777667776..
            ...668ce7768867788666...
            ......ce77eeee67ee......
            ......eeeeeeeeeeee......
            ......eeeeeeeeeeee......
            ......eeeeeeeeeeee......
            ......eeeeeeeeeeee......
            ......eeeeeeeeeeee......
            ......eeeeeeeeeeee......
            ......eeeeeeeeeeee......
            ......beeeeeeeeeeb......
            .......beeeeeeeeb.......
            ........beeeeeeb........
            ........................
            ........................
            ........................
            """)
      bottomImage = img("""
            ........................
            ........................
            ........................
            ........................
            ........................
            ........................
            ........................
            ..........bbbb..........
            ........bbddddbb........
            .......bddbbbbddb.......
            ......bdbbddddbbdb......
            .....bdbbdbbbbdbbdb.....
            .....bdbdbddddbdbdb.....
            .....cdbbdbbbbdbbdc.....
            .....cbdbbddddbbdbc.....
            .....efbddbbbbddbce.....
            .....eeffbddddbccee.....
            .....eeeeffcccceee......
            .....ceeeeeeeeeeee......
            .....ceeeeeeeeeeee......
            .....feeeeeeeeeeee......
            .....cceeeeeeeeeee......
            ......feeeeeeeeeee......
            .....6fceeeeeeeeee6.....
            ....6776eeeeeeeee676....
            ...6777666eeee6666776...
            ..67768e67766777667776..
            ...668ee7768867788666...
            ......ee77eeee77ecee....
            ......ee6eeeeee6eef.....
            ......eeeeeeeeeeeef.....
            ......eeeeeeeeeeeef.....
            ......eeeeeeeeeeecf.....
            ......ceeeeeeeeeecf.....
            ......ceeeeeeeeeeff.....
            ......feeeeeeeeeefe.....
            .....6feeeeeeeeeef6.....
            ....6776eeeeeeeee676....
            ...6777666eeee6667776...
            ..6776ee67777777667776..
            ...668ee7768867788666...
            ......ee77eeee67ee......
            ......ee6eeeeee6ce......
            ......eefeeeeeeece......
            ......eeceeeeeeece......
            ......eeceeeeeeefe......
            ......eeceeeeeeefe......
            ......eeeeeeeeeefe......
            ......eeeeeeeeeece......
            .....6eeeeeeeeeece6.....
            ....6776eeeeeeeee676....
            ...6776666eeee6766776...
            ..6776ee77777777667776..
            ...668ce7768867788666...
            ......ce77eeee67ee......
            ......ce6eeeeee6ee......
            """)
    elif gap == 2:
      topImage = img("""
            .....6feeeeeeeeeef6.....
            ....6776eeeeeeeee676....
            ...6777666eeee6667776...
            ..6776ee67777777667776..
            ...668ee7768867788666...
            ......ee77eeee67eeee....
            ......ee6eeeeee6cef.....
            ......eeeeeeeeeeeef.....
            ......eeeeeeeeeeeef.....
            ......eeeeeeeeeeecf.....
            ......eeeeeeeeeeecf.....
            ......eeeeeeeeeeeff.....
            ......feeeeeeeeeefe.....
            .....6feeeeeeeeeef6.....
            ....6776eeeeeeeee676....
            ...6777666eeee6667776...
            ..6776ee67777777667776..
            ...668ee7768867788666...
            ......ee77eeee67ee......
            ......ee6eeeeee6ce......
            ......eefeeeeeeece......
            ......eeceeeeeeece......
            ......eeceeeeeeefe......
            ......eeceeeeeeefe......
            ......eeeeeeeeeefe......
            ......eeeeeeeeeece......
            .....6eeeeeeeeeece6.....
            ....6776eeeeeeeee676....
            ...6776666eeee6766776...
            ..6776ee77777777667776..
            ...668ce7768867788666...
            ......ce77eeee67ee......
            ......eeeeeeeeeeee......
            ......eeeeeeeeeeee......
            ......eeeeeeeeeeee......
            ......eeeeeeeeeeee......
            ......eeeeeeeeeeee......
            ......eeeeeeeeeeee......
            ......eeeeeeeeeeee......
            ......beeeeeeeeeeb......
            .......beeeeeeeeb.......
            ........beeeeeeb........
            ........................
            ........................
            ........................
            ........................
            ........................
            ........................
            """)
      bottomImage = img("""
            ........................
            ........................
            ........................
            ........................
            ..........bbbb..........
            ........bbddddbb........
            .......bddbbbbddb.......
            ......bdbbddddbbdb......
            .....bdbbdbbbbdbbdb.....
            .....bdbdbddddbdbdb.....
            .....cdbbdbbbbdbbdc.....
            .....cbdbbddddbbdbc.....
            .....efbddbbbbddbce.....
            .....eeffbddddbccee.....
            .....eeeeffcccceee......
            .....ceeeeeeeeeeee......
            .....ceeeeeeeeeeee......
            .....feeeeeeeeeeee......
            .....cceeeeeeeeeee......
            ......feeeeeeeeeee......
            .....6fceeeeeeeeee6.....
            ....6776eeeeeeeee676....
            ...6777666eeee6666776...
            ..67768e67766777667776..
            ...668ee7768867788666...
            ......ee77eeee77ecee....
            ......ee6eeeeee6eef.....
            ......eeeeeeeeeeeef.....
            ......eeeeeeeeeeeef.....
            ......eeeeeeeeeeecf.....
            ......ceeeeeeeeeecf.....
            ......ceeeeeeeeeeff.....
            ......feeeeeeeeeefe.....
            .....6feeeeeeeeeef6.....
            ....6776eeeeeeeee676....
            ...6777666eeee6667776...
            ..6776ee67777777667776..
            ...668ee7768867788666...
            ......ee77eeee67ee......
            ......ee6eeeeee6ce......
            """)
    else:
      topImage = img("""
            .....6fceeeeeeeeee6.....
            ....6776eeeeeeeee676....
            ...6777666eeee6666776...
            ..67768e67766777667776..
            ...668ee7768867788666...
            ......ee77eeee77ecee....
            ......ee6eeeeee6eef.....
            ......eeeeeeeeeeeef.....
            ......eeeeeeeeeeeef.....
            ......eeeeeeeeeeecf.....
            ......ceeeeeeeeeecf.....
            ......ceeeeeeeeeeff.....
            ......feeeeeeeeeefe.....
            .....6feeeeeeeeeef6.....
            ....6776eeeeeeeee676....
            ...6777666eeee6667776...
            ..6776ee67777777667776..
            ...668ee7768867788666...
            ......ee77eeee67eeee....
            ......ee6eeeeee6cef.....
            ......eeeeeeeeeeeef.....
            ......eeeeeeeeeeeef.....
            ......eeeeeeeeeeecf.....
            ......eeeeeeeeeeecf.....
            ......eeeeeeeeeeeff.....
            ......feeeeeeeeeefe.....
            .....6feeeeeeeeeef6.....
            ....6776eeeeeeeee676....
            ...6777666eeee6667776...
            ..6776ee67777777667776..
            ...668ee7768867788666...
            ......ee77eeee67ee......
            ......ee6eeeeee6ce......
            ......eefeeeeeeece......
            ......eeceeeeeeece......
            ......eeceeeeeeefe......
            ......eeceeeeeeefe......
            ......eeeeeeeeeefe......
            ......eeeeeeeeeece......
            .....6eeeeeeeeeece6.....
            ....6776eeeeeeeee676....
            ...6776666eeee6766776...
            ..6776ee77777777667776..
            ...668ce7768867788666...
            ......ce77eeee67ee......
            ......eeeeeeeeeeee......
            ......eeeeeeeeeeee......
            ......eeeeeeeeeeee......
            ......eeeeeeeeeeee......
            ......eeeeeeeeeeee......
            ......eeeeeeeeeeee......
            ......eeeeeeeeeeee......
            ......beeeeeeeeeeb......
            .......beeeeeeeeb.......
            ........beeeeeeb........
            ........................
            """)
      bottomImage = img("""
            ........................
            ..........bbbb..........
            ........bbddddbb........
            .......bddbbbbddb.......
            ......bdbbddddbbdb......
            .....bdbbdbbbbdbbdb.....
            .....bdbdbddddbdbdb.....
            .....cdbbdbbbbdbbdc.....
            .....cbdbbddddbbdbc.....
            .....efbddbbbbddbce.....
            .....eeffbddddbccee.....
            .....eeeeffcccceee......
            .....ceeeeeeeeeeee......
            .....ceeeeeeeeeeee......
            .....feeeeeeeeeeee......
            .....cceeeeeeeeeee......
            ......feeeeeeeeeee......
            .....6fceeeeeeeeee6.....
            ....6776eeeeeeeee676....
            ...6777666eeee6666776...
            ..67768e67766777667776..
            ...668ee7768867788666...
            ......ee77eeee77ecee....
            ......ee6eeeeee6eef.....
            """)
    gapImage = image.create(2, scene.screen_height())
    gapImage.fill(1)
    gapSprite = sprites.create(gapImage, SpriteKind.Gap)
    gapSprite.set_flag(SpriteFlag.AUTO_DESTROY, True)
    gapSprite.set_flag(SpriteFlag.INVISIBLE, True)
    gapSprite.left = scene.screen_width()
    gapSprite.vx = -45
    projectile = sprites.create_projectile_from_side(topImage, -45, 0)
    projectile.top = 0
    projectile = sprites.create_projectile_from_side(bottomImage, -45, 0)
    projectile.bottom = scene.screen_height()
game.on_update_interval(1500, on_update_interval)

驴友花雕 发表于 2025-9-17 14:58:43

【花雕动手做】基于Kitronik可编程开发板之穿越鸭子游戏

ARCADE MakeCode 之穿越鸭子游戏代码解读
这是一个类似Flappy Bird的躲避游戏,玩家控制一只鸭子穿越障碍物。
代码结构分析

1. 动作枚举定义
python
class ActionKind(Enum):

    Walking = 0

    Idle = 1

    Jumping = 2
定义了三种动画状态:行走、空闲和跳跃。

2. 自定义精灵类型
python
@namespace

class SpriteKind:

    Gap = SpriteKind.create()
创建了一个新的精灵类型"Gap",用于表示障碍物之间的空隙。

3. 碰撞检测事件
python
def on_on_overlap(sprite, otherSprite):

    if otherSprite.right - sprite.left < 2:

      info.change_score_by(1)

sprites.on_overlap(SpriteKind.player, SpriteKind.Gap, on_on_overlap)
当玩家精灵穿过空隙时增加分数。

python
def on_on_overlap2(sprite2, otherSprite2):

    game.over(False)

sprites.on_overlap(SpriteKind.player, SpriteKind.projectile, on_on_overlap2)
当玩家碰到障碍物时游戏结束。

4. 按钮控制事件
python
def on_button_pressed():

    mySprite.vy = -100# 给鸭子一个向上的速度

    animation.set_action(mySprite, ActionKind.Walking)# 设置行走动画

    mySprite.start_effect(effects.rings, 300)# 添加环形特效

controller.any_button.on_event(ControllerButtonEvent.PRESSED, on_button_pressed)
任何按钮按下时,让鸭子跳跃并播放动画效果。

5. 游戏初始化
python
# 变量声明

projectile: Sprite = None

gapSprite: Sprite = None

gapImage: Image = None

bottomImage: Image = None

topImage: Image = None

gap = 0

mySprite: Sprite = None



# 设置背景和初始分数

scene.set_background_color(9)

info.set_score(0)

effects.blizzard.start_screen_effect()# 添加暴风雪屏幕特效



# 创建玩家精灵(鸭子)

mySprite = sprites.create(img("""

    . . . . . . . . . . b 5 b . . .

    . . . . . . . . . b 5 b . . . .

    . . . . . . . . . b c . . . . .

    . . . . . . b b b b b b . . . .

    . . . . . b b 5 5 5 5 5 b . . .

    . . . . b b 5 d 1 f 5 5 d f . .

    . . . . b 5 5 1 f f 5 d 4 c . .

    . . . . b 5 5 d f b d d 4 4 . .

    b d d d b b d 5 5 5 4 4 4 4 4 b

    b b d 5 5 5 b 5 5 4 4 4 4 4 b .

    b d c 5 5 5 5 d 5 5 5 5 5 b . .

    c d d c d 5 5 b 5 5 5 5 5 5 b .

    c b d d c c b 5 5 5 5 5 5 5 b .

    . c d d d d d d 5 5 5 5 5 d b .

    . . c b d d d d d 5 5 5 b b . .

    . . . c c c c c c c c b b . . .

    """), SpriteKind.player)



mySprite.ay = 300# 设置重力加速度
6. 鸭子动画设置
python
# 创建行走动画

anim = animation.create_animation(ActionKind.Walking, 25)

# 添加6个动画帧

anim.add_animation_frame(img("""..."""))

anim.add_animation_frame(img("""..."""))

anim.add_animation_frame(img("""..."""))

anim.add_animation_frame(img("""..."""))

anim.add_animation_frame(img("""..."""))

anim.add_animation_frame(img("""..."""))



# 将动画附加到精灵

animation.attach_animation(mySprite, anim)
7. 游戏更新事件
python
def on_on_update():

    if mySprite.vy > 0:# 如果鸭子正在下落

      animation.set_action(mySprite, ActionKind.Walking)# 设置行走动画

   

    if mySprite.bottom > 120 or mySprite.top < 0:# 如果鸭子飞出屏幕

      game.over(False)# 游戏结束

game.on_update(on_on_update)
8. 障碍物生成逻辑
python
def on_update_interval():

    global gap, topImage, bottomImage, gapImage, gapSprite, projectile

   

    gap = randint(0, 3)# 随机选择4种障碍物配置之一

   

    # 根据gap值选择不同的上下障碍物图像

    if gap == 0:

      topImage = img("""...""")

      bottomImage = img("""...""")

    elif gap == 1:

      topImage = img("""...""")

      bottomImage = img("""...""")

    elif gap == 2:

      topImage = img("""...""")

      bottomImage = img("""...""")

    else:

      topImage = img("""...""")

      bottomImage = img("""...""")

   

    # 创建空隙精灵(用于检测通过)

    gapImage = image.create(2, scene.screen_height())

    gapImage.fill(1)

    gapSprite = sprites.create(gapImage, SpriteKind.Gap)

    gapSprite.set_flag(SpriteFlag.AUTO_DESTROY, True)

    gapSprite.set_flag(SpriteFlag.INVISIBLE, True)# 不可见

    gapSprite.left = scene.screen_width()# 从右侧进入

    gapSprite.vx = -45# 向左移动速度

   

    # 创建顶部障碍物

    projectile = sprites.create_projectile_from_side(topImage, -45, 0)

    projectile.top = 0

   

    # 创建底部障碍物

    projectile = sprites.create_projectile_from_side(bottomImage, -45, 0)

    projectile.bottom = scene.screen_height()



# 每1500毫秒生成一组新障碍物

game.on_update_interval(1500, on_update_interval)
游戏机制解析
控制方式:玩家按下任何按钮使鸭子跳跃
得分机制:当鸭子成功穿过障碍物之间的空隙时得分
失败条件:
鸭子碰到障碍物
鸭子飞出屏幕上下边界
障碍物生成:每隔1.5秒随机生成一组上下障碍物,中间留有可通过的空隙
视觉效果:鸭子有动画效果,跳跃时有环形特效,屏幕有暴风雪效果
这个游戏通过简单的机制创造了有趣的挑战,玩家需要掌握好跳跃时机来穿越不断出现的障碍物。

驴友花雕 发表于 2025-9-17 15:04:16

【花雕动手做】基于Kitronik可编程开发板之穿越鸭子游戏

图形编程参考实验程序



通过模拟器,调试与模拟运行



实验场景记录







驴友花雕 发表于 2025-9-17 16:07:46

【花雕动手做】基于Kitronik开发板


页: [1]
查看完整版本: 【花雕动手做】基于Kitronik可编程开发板之穿越鸭子游戏