驴友花雕 发表于 昨天 17:25

【花雕动手做】基于 Kitronik 可编程开发板之猛禽奔跑

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

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

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







驴友花雕 发表于 昨天 17:27

【花雕动手做】基于 Kitronik 可编程开发板之猛禽奔跑

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

MicroPython实验代码

class ActionKind(Enum):
    Walking = 0
    Idle = 1
    Jumping = 2
    Dead = 3
@namespace
class SpriteKind:
    Ground = SpriteKind.create()
    Cloud = SpriteKind.create()
def initGround():
    global ground1, ground2
    ground1 = sprites.create(img("""
            ...................................................................................cccc...........................................................................
            ..................................................................................c....c..........................................................................
            cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc......ccccccccccccccccc....ccccccccccccccccccccccccccccccccccccccccccccccccccccc
            .........................................................................................................cccc.....................................................
            ..................................................................................................................................................................
            ..cccc..c.......................c..cccc.........................cccc..c.............c..........................cccc..c...........c..ccc.................c..ccc....
            ..................................................................................................................................................................
            ...............cccc..c.........................cccc.c.......c..............cc.c........cccc..c.....cccc..c..................c...............cccc..c...............
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            """),
      SpriteKind.Ground)
    ground2 = sprites.create(img("""
            .....................................................cccc..................cccc...................................................................................
            ....................................................c....c................c....c..................................................................................
            cccccccccccccccccccccccccccccccccccccccccccccccccccc......cccccccccccccccc......cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            ....ccc..c.................ccc..c...........c..cccc..........................c.............c..cccc.........................cccc..c.......................c..cccc..
            ..................................................................................................................................................................
            ...............c..cccc...............c..................c..cccc.....c..cccc........c.cc..............c.......c.cccc.........................c..cccc...............
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            ..................................................................................................................................................................
            """),
      SpriteKind.Ground)
    ground1.set_position(scene.screen_width() / 2, 120)
    ground2.set_position(ground1.x + scene.screen_width(), 120)
    ground1.vx = -100
    ground2.vx = -100
    ground1.z = 2
    ground2.z = 2
def initRaptor():
    global raptor, run, jump, dead
    raptor = sprites.create(img("""
            ................................
            ................................
            ................................
            ................................
            ................................
            ................................
            ................................
            ................................
            ................................
            ................................
            ................................
            ................................
            ................................
            ................................
            ................................
            ........................fff.....
            .......................fcccff...
            ......................fc1fcccf..
            ......................fccccccf..
            .................fffffcccccff...
            .............ffffcccccccccf.....
            .........ffffccccccccccccf......
            .....ffffcccccccccccccccf.......
            ...fccccccccccccccccccccf.......
            ..fccc......fffccccccfffcf......
            ...............ffcccf...cf......
            .................fccf..ff.......
            .................fcf............
            ................fccf............
            ................fcf.............
            ................fcf.............
            .................f..............
            """),
      SpriteKind.player)
    run = animation.create_animation(ActionKind.Walking, 100)
    run.add_animation_frame(img("""
      ................................
      ................................
      ................................
      ................................
      ................................
      ................................
      ................................
      ................................
      ................................
      ................................
      ................................
      ................................
      ................................
      ................................
      ................................
      ........................fff.....
      .......................fcccff...
      ......................fc1fcccf..
      ......................fccccccf..
      .................fffffcccccff...
      .............ffffcccccccccf.....
      .........ffffccccccccccccf......
      .....ffffcccccccccccccccf.......
      ..ffccccccccccccccccccccf.......
      ............fffccccccfffcf......
      ...............ffcccff..cf......
      .................fccff.ff.......
      .................fcfff..........
      ................fccf.ff.........
      ................fcf...f.........
      ................fcf....f........
      .................f..............
      """))
    run.add_animation_frame(img("""
      ................................
      ................................
      ................................
      ................................
      ................................
      ................................
      ................................
      ................................
      ................................
      ................................
      ................................
      ................................
      ................................
      ................................
      ................................
      ........................fff.....
      .......................fcccff...
      ......................fc1fcccf..
      ......................fccccccf..
      .................fffffcccccff...
      .........ffffffffcccccccccf.....
      .....ffffccccccccccccccccf......
      ..ffccccccccccccccccccccf.......
      ............ffcccccccccccf......
      ..............fcccccccffccf.....
      ...............ffffcccf..cf.....
      ................fffffcf.ff......
      ................fff.fcf.........
      ................ff.fccf.........
      ...............ff..fcf..........
      ..............f....fcf..........
      ....................f...........
      """))
    animation.attach_animation(raptor, run)
    jump = animation.create_animation(ActionKind.Jumping, 200)
    jump.add_animation_frame(img("""
      ................................
      ................................
      ................................
      ................................
      ................................
      ................................
      ................................
      ................................
      ................................
      ................................
      ................................
      ................................
      ................................
      ................................
      ................................
      ........................fff.....
      .......................fcccff...
      ......................fc1fcccf..
      ......................fccccccf..
      .................fffffcccccff...
      .............ffffcccccccccf.....
      ...........ffccccccccccccf......
      .........ffcccccccccccccf.......
      .......ffcccccccccccccccf.......
      ......fccc..fffccccccfffcf......
      .....fcc.......ffcccf...cf......
      .....fc..........fccf..ff.......
      ....cc...........fcf............
      ....f...........fccf............
      ................fcf.............
      ................fcf.............
      .................f..............
      """))
    animation.attach_animation(raptor, jump)
    dead = animation.create_animation(ActionKind.Dead, 200)
    dead.add_animation_frame(img("""
      ................................
      ................................
      ................................
      ................................
      ................................
      ................................
      ................................
      ................................
      ................................
      ................................
      ................................
      ................................
      ................................
      ................................
      ................................
      ........................fff.....
      .......................f111ff...
      ......................fc1f1ccf..
      ......................fc111ccf..
      .................fffffcccccff...
      .............ffffcccccccccf.....
      .........ffffccccccccccccf......
      .....ffffcccccccccccccccf.......
      ...fccccccccccccccccccccf.......
      ..fccc......fffccccccfffcf......
      ...............ffcccf...cf......
      .................fccf..ff.......
      .................fcf............
      ................fccf............
      ................fcf.............
      ................fcf.............
      .................f..............
      """))
    animation.attach_animation(raptor, dead)
    raptor.z = 3
    raptor.set_position(15, 94)

def on_on_overlap(sprite, otherSprite):
    global end
    end = 1
    animation.set_action(raptor, ActionKind.Dead)
    pause(50)
    game.over(False, effects.dissolve)
sprites.on_overlap(SpriteKind.player, SpriteKind.projectile, on_on_overlap)

def on_button_pressed():
    if raptor.y == 94 and end == 0:
      raptor.vy = -160
      animation.set_action(raptor, ActionKind.Jumping)
controller.any_button.on_event(ControllerButtonEvent.PRESSED, on_button_pressed)

cloud: Sprite = None
cactus: Sprite = None
choice = 0
dead: animation.Animation = None
jump: animation.Animation = None
run: animation.Animation = None
raptor: Sprite = None
ground2: Sprite = None
ground1: Sprite = None
end = 0
idle = None
game.set_dialog_cursor(img("""
    ................................
    ..1111111111111111111111111111..
    .111111111111111111111111111111.
    11111111111111111111111111111111
    11111111111111111111111111111111
    11111111111111111111111111111111
    11111111111111111111111111111111
    11111111111111111111111111111111
    11111111111111111111111111111111
    111111111111111111111111fff11111
    11111111111111111111111fcccff111
    1111111111111111111111fc1fcccf11
    1111111111111111111111fccccccf11
    11111111111111111fffffcccccff111
    1111111111111ffffcccccccccf11111
    111111111ffffccccccccccccf111111
    11111ffffcccccccccccccccf1111111
    111fccccccccccccccccccccf1111111
    11fccc111111fffccccccfffcf111111
    111111111111111ffcccf111cf111111
    11111111111111111fccf11ff1111111
    11111111111111111fcf111111111111
    1111111111111111fccf111111111111
    1111111111111111fcf1111111111111
    1111111111111111fcf1111111111111
    11111111111111111f11111111111111
    11111111111111111111111111111111
    11111111111111111111111111111111
    11111111111111111111111111111111
    11111111111111111111111111111111
    .111111111111111111111111111111.
    ..1111111111111111111111111111..
    """))
game.splash("Raptor Run")
scene.set_background_color(1)
initGround()
initRaptor()
info.set_score(0)
end = 0
game.show_long_text("Press any button to jump.", DialogLayout.TOP)

def on_on_update():
    if raptor.y < 94:
      raptor.ay = 400
    else:
      raptor.ay = 0
      raptor.y = 94
      if end == 0:
            animation.set_action(raptor, ActionKind.Walking)
game.on_update(on_on_update)

def on_update_interval():
    info.change_score_by(1)
game.on_update_interval(50, on_update_interval)

def on_update_interval2():
    global choice, cactus
    choice = randint(0, 4)
    if choice == 0:
      cactus = sprites.create_projectile_from_side(img("""
                ................................
                ................................
                ................................
                ................................
                ................................
                ................................
                ................................
                ................................
                ................................
                ................................
                ................................
                ................................
                ..............ccc...............
                .............ccccc..............
                .............ccccc..............
                .............ccccc...c..........
                .........c...ccccc..ccc.........
                ........ccc..ccccc..ccc.........
                ........ccc..ccccc..ccc.........
                ........ccc..ccccc..ccc.........
                ........cccccccccc..ccc.........
                ........cccccccccc..ccc.........
                .........cccccccccccccc.........
                .............cccccccccc.........
                .............ccccccccc..........
                .............ccccc..............
                .............ccccc..............
                .............ccccc..............
                .............ccccc..............
                .............ccccc..............
                .............ccccc..............
                .............ccccc..............
                """),
            ground1.vx,
            0)
      cactus.y = 94
      cactus.z = 2
    elif choice == 1:
      cactus = sprites.create_projectile_from_side(img("""
                ................................
                ................................
                ................................
                ................................
                ................................
                ................................
                ................................
                ................................
                ................................
                ................................
                ................................
                ................................
                ..............ccc...............
                .............ccccc..............
                .............ccccc..............
                .............ccccc..............
                .........c...ccccc...c..........
                ........ccc..ccccc..ccc.........
                ........ccc..ccccc..ccc.........
                ........ccc..ccccc..ccc.........
                ........ccc..cccccccccc.........
                ........ccc..cccccccccc.........
                ........cccccccccccccc..........
                ........cccccccccc..............
                .........ccccccccc..............
                .............ccccc..............
                .............ccccc..............
                .............ccccc..............
                .............ccccc..............
                .............ccccc..............
                .............ccccc..............
                .............ccccc..............
                """),
            ground1.vx,
            0)
      cactus.y = 94
      cactus.z = 2
    elif choice == 2:
      cactus = sprites.create_projectile_from_side(img("""
                ................................
                ................................
                ................................
                ................................
                ................................
                ................................
                ................................
                ................................
                ................................
                ................................
                ................................
                ................................
                ................................
                ................................
                ................................
                ................................
                ................................
                ................................
                ................................
                ................................
                ...........c....................
                ..........ccc...................
                ..........ccc......c............
                ........c.ccc.....ccc...........
                ........c.ccc.....ccc.c.........
                ........ccccc.c...ccc.c.........
                ..........ccc.c.c.ccccc.........
                ..........ccccc.c.ccc...........
                ..........ccc...ccccc...........
                ..........ccc.....ccc...........
                ..........ccc.....ccc...........
                ..........ccc.....ccc...........
                """),
            ground1.vx,
            0)
      cactus.y = 94
      cactus.z = 2
game.on_update_interval(1000, on_update_interval2)

def on_update_interval3():
    ground1.vx += -1
    ground2.vx += -1
game.on_update_interval(1000, on_update_interval3)

def on_update_interval4():
    global cloud
    if Math.percent_chance(40):
      cloud = sprites.create_projectile_from_side(img("""
                ................................
                ................................
                ................................
                ................................
                ................................
                ................................
                ................................
                ................................
                ................................
                ................................
                ................................
                ................................
                ................................
                ................................
                ................bbbb.bb.........
                ...............bb.....b.........
                .............bbb......bbb.......
                .............b..........bbbb....
                .............b.............b....
                ..........bbbb.............bbb..
                .........bb..................b..
                .....bbbbb...................bb.
                .....b........................b.
                .bb.bb..b......................b
                bb.......bbbbbbbbbbbbbbbbbbbbbbb
                ................................
                ................................
                ................................
                ................................
                ................................
                ................................
                ................................
                """),
            ground1.vx / 4,
            0)
      cloud.y = randint(20, 60)
      cloud.set_kind(SpriteKind.Cloud)
      cloud.z = 1
game.on_update_interval(1500, on_update_interval4)

def on_forever():
    if ground2.x < -1 * (scene.screen_width() / 2):
      ground2.x = ground1.x + scene.screen_width()
forever(on_forever)

def on_forever2():
    if ground1.x < -1 * (scene.screen_width() / 2):
      ground1.x = ground2.x + scene.screen_width()
forever(on_forever2)


驴友花雕 发表于 昨天 17:36

【花雕动手做】基于 Kitronik 可编程开发板之猛禽奔跑

猛禽奔跑游戏代码解读
这是一个基于ARCADE MakeCode的猛禽奔跑游戏,类似于经典的跑酷游戏。

1. 枚举和自定义精灵类型
python
class ActionKind(Enum):

    Walking = 0

    Idle = 1

    Jumping = 2

    Dead = 3



@namespace

class SpriteKind:

    Ground = SpriteKind.create()

    Cloud = SpriteKind.create()
定义了猛禽的四种动作状态:行走、空闲、跳跃、死亡

创建了两种自定义精灵类型:地面和云朵

2. 初始化地面
python
def initGround():

    global ground1, ground2

    # 创建两个地面精灵

    ground1 = sprites.create(...)

    ground2 = sprites.create(...)

    # 设置位置和速度

    ground1.set_position(scene.screen_width() / 2, 120)

    ground2.set_position(ground1.x + scene.screen_width(), 120)

    ground1.vx = -100# 向左移动

    ground2.vx = -100

    ground1.z = 2# 设置图层

    ground2.z = 2
创建了两个连续的地面,形成无限循环的效果

地面以恒定速度向左移动

3. 初始化猛禽角色
python
def initRaptor():

    global raptor, run, jump, dead

    raptor = sprites.create(...)# 创建猛禽精灵

   

    # 创建行走动画

    run = animation.create_animation(ActionKind.Walking, 100)

    run.add_animation_frame(...)# 添加动画帧

    run.add_animation_frame(...)

   

    # 创建跳跃动画

    jump = animation.create_animation(ActionKind.Jumping, 200)

    jump.add_animation_frame(...)

   

    # 创建死亡动画

    dead = animation.create_animation(ActionKind.Dead, 200)

    dead.add_animation_frame(...)

   

    raptor.z = 3# 设置图层

    raptor.set_position(15, 94)# 设置初始位置
创建了猛禽角色和三种动画状态

设置了角色的初始位置和图层

4. 碰撞检测
python
def on_on_overlap(sprite, otherSprite):

    global end

    end = 1

    animation.set_action(raptor, ActionKind.Dead)# 播放死亡动画

    pause(50)

    game.over(False, effects.dissolve)# 游戏结束



sprites.on_overlap(SpriteKind.player, SpriteKind.projectile, on_on_overlap)
当猛禽与障碍物碰撞时触发游戏结束

播放死亡动画后显示游戏结束画面

5. 跳跃控制
python
def on_button_pressed():

    if raptor.y == 94 and end == 0:# 确保在地面上且游戏未结束

      raptor.vy = -160# 设置向上的速度

      animation.set_action(raptor, ActionKind.Jumping)# 播放跳跃动画



controller.any_button.on_event(ControllerButtonEvent.PRESSED, on_button_pressed)
按下任意按钮时触发跳跃

设置垂直速度并播放跳跃动画

6. 游戏初始化
python
game.set_dialog_cursor(...)# 设置对话框光标

game.splash("Raptor Run")# 显示游戏标题

scene.set_background_color(1)# 设置背景颜色

initGround()# 初始化地面

initRaptor()# 初始化猛禽

info.set_score(0)# 初始化分数

end = 0# 游戏结束标志

game.show_long_text("Press any button to jump.", DialogLayout.TOP)# 显示操作提示
7. 物理更新
python
def on_on_update():

    if raptor.y < 94:# 如果在空中

      raptor.ay = 400# 应用重力

    else:

      raptor.ay = 0# 取消重力

      raptor.y = 94# 固定在地面高度

      if end == 0:# 如果游戏未结束

            animation.set_action(raptor, ActionKind.Walking)# 播放行走动画



game.on_update(on_on_update)
处理猛禽的重力物理效果

确保猛禽落回地面时恢复行走状态

8. 分数系统
python
def on_update_interval():

    info.change_score_by(1)# 每50毫秒增加1分



game.on_update_interval(50, on_update_interval)
随着游戏进行,分数不断增加

9. 障碍物生成
python
def on_update_interval2():

    global choice, cactus

    choice = randint(0, 4)# 随机选择障碍物类型

    if choice == 0:

      cactus = sprites.create_projectile_from_side(..., ground1.vx, 0)

      cactus.y = 94# 设置在地面高度

      cactus.z = 2# 设置图层

    # 其他障碍物类型...



game.on_update_interval(1000, on_update_interval2)
每隔1秒随机生成一种障碍物

障碍物与地面同速向左移动

10. 游戏难度递增
python
def on_update_interval3():

    ground1.vx += -1# 逐渐加快地面速度

    ground2.vx += -1# 增加游戏难度



game.on_update_interval(1000, on_update_interval3)
随着时间的推移,地面速度逐渐增加

使游戏难度随时间递增

11. 云朵生成
python
def on_update_interval4():

    global cloud

    if Math.percent_chance(40):# 40%的概率生成云朵

      cloud = sprites.create_projectile_from_side(..., ground1.vx / 4, 0)

      cloud.y = randint(20, 60)# 随机高度

      cloud.set_kind(SpriteKind.Cloud)# 设置为云朵类型

      cloud.z = 1# 设置图层(在背景但在地面前面)



game.on_update_interval(1500, on_update_interval4)
每隔1.5秒有40%的概率生成云朵

云朵移动速度较慢,营造景深效果

12. 地面循环
python
def on_forever():

    if ground2.x < -1 * (scene.screen_width() / 2):

      ground2.x = ground1.x + scene.screen_width()# 重置地面位置



def on_forever2():

    if ground1.x < -1 * (scene.screen_width() / 2):

      ground1.x = ground2.x + scene.screen_width()# 重置地面位置
确保两个地面精灵无缝循环

当一个地面移出屏幕时,将其重置到另一个地面的右侧。

驴友花雕 发表于 昨天 17:39

【花雕动手做】基于 Kitronik 可编程开发板之猛禽奔跑

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





实验场景记录













驴友花雕 发表于 昨天 17:42

【花雕动手做】基于 Kitronik 可编程开发板之猛禽奔跑


页: [1]
查看完整版本: 【花雕动手做】基于 Kitronik 可编程开发板之猛禽奔跑