驴友花雕 发表于 2025-9-24 11:23:45

【花雕动手做】基于Kitronik可编程开发板之草莓公主游戏



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

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

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



驴友花雕 发表于 2025-9-24 11:25:05

【花雕动手做】基于Kitronik可编程开发板之草莓公主游戏

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

MicroPython实验代码

@namespace
class SpriteKind:
    Taco = SpriteKind.create()

def on_on_overlap(sprite, otherSprite):
    info.change_score_by(10)
    otherSprite.destroy()
sprites.on_overlap(SpriteKind.player, SpriteKind.Taco, on_on_overlap)

# Eating a strawberry or a cherry gives 1 point
#
# Eating taco gives 10 points
#
# If you try to eat the death pill you will lose a life, but gain 15 points.
#
# Princess, you have 60 seconds and 3 life to finish the game.
def randomAssets():
    global strawberry, cherry, taco, deathpill
    strawberry = sprites.create(img("""
            . . . . . . . 6 . . . . . . . .
            . . . . . . 8 6 6 . . . 6 8 . .
            . . . e e e 8 8 6 6 . 6 7 8 . .
            . . e 2 2 2 2 e 8 6 6 7 6 . . .
            . e 2 2 4 4 2 7 7 7 7 7 8 6 . .
            . e 2 4 4 2 6 7 7 7 6 7 6 8 8 .
            e 2 4 5 2 2 6 7 7 6 2 7 7 6 . .
            e 2 4 4 2 2 6 7 6 2 2 6 7 7 6 .
            e 2 4 2 2 2 6 6 2 2 2 e 7 7 6 .
            e 2 4 2 2 4 2 2 2 4 2 2 e 7 6 .
            e 2 4 2 2 2 2 2 2 2 2 2 e c 6 .
            e 2 2 2 2 2 2 2 4 e 2 e e c . .
            e e 2 e 2 2 4 2 2 e e e c . . .
            e e e e 2 e 2 2 e e e c . . . .
            e e e 2 e e c e c c c . . . . .
            . c c c c c c c . . . . . . . .
            """),
      SpriteKind.food)
    strawberry.x = randint(0, scene.screen_width())
    strawberry.y = randint(0, scene.screen_height())
    cherry = sprites.create(img("""
            . . . . . . . . . . . 6 6 6 6 6
            . . . . . . . . . 6 6 7 7 7 7 8
            . . . . . . 8 8 8 7 7 8 8 6 8 8
            . . e e e e c 6 6 8 8 . 8 7 8 .
            . e 2 5 4 2 e c 8 . . . 6 7 8 .
            e 2 4 2 2 2 2 2 c . . . 6 7 8 .
            e 2 2 2 2 2 2 2 c . . . 8 6 8 .
            e 2 e e 2 2 2 2 e e e e c 6 8 .
            c 2 e e 2 2 2 2 e 2 5 4 2 c 8 .
            . c 2 e e e 2 e 2 4 2 2 2 2 c .
            . . c 2 2 2 e e 2 2 2 2 2 2 2 e
            . . . e c c e c 2 2 2 2 2 2 2 e
            . . . . . . . c 2 e e 2 2 e 2 c
            . . . . . . . c e e e e e e 2 c
            . . . . . . . . c e 2 2 2 2 c .
            . . . . . . . . . c c c c c . .
            """),
      SpriteKind.food)
    cherry.x = randint(0, scene.screen_width())
    cherry.y = randint(0, scene.screen_height())
    if Math.percent_chance(20):
      taco = sprites.create(img("""
                . . . . . . . e e e e . . . . .
                . . . . . e e 4 5 5 5 e e . . .
                . . . . e 4 5 6 2 2 7 6 6 e . .
                . . . e 5 6 6 7 2 2 6 4 4 4 e .
                . . e 5 2 2 7 6 6 4 5 5 5 5 4 .
                . e 5 6 2 2 8 8 5 5 5 5 5 4 5 4
                . e 5 6 7 7 8 5 4 5 4 5 5 5 5 4
                e 4 5 8 6 6 5 5 5 5 5 5 4 5 5 4
                e 5 c e 8 5 5 5 4 5 5 5 5 5 5 4
                e 5 c c e 5 4 5 5 5 4 5 5 5 e .
                e 5 c c 5 5 5 5 5 5 5 5 4 e . .
                e 5 e c 5 4 5 4 5 5 5 e e . . .
                e 5 e e 5 5 5 5 5 4 e . . . . .
                4 5 4 e 5 5 5 5 e e . . . . . .
                . 4 5 4 5 5 4 e . . . . . . . .
                . . 4 4 e e e . . . . . . . . .
                """),
            SpriteKind.Taco)
      taco.x = randint(0, scene.screen_width())
      taco.y = randint(0, scene.screen_height())
    else:
      deathpill = sprites.create(img("""
                ........................
                ........................
                ........................
                ........................
                ........................
                ..........ffff..........
                ........ff1111ff........
                .......fb111111bf.......
                .......f11111111f.......
                ......fd11111111df......
                ....7.fd11111111df......
                ...7..fd11111111df......
                ...7..fd11111111df......
                ...7..fddd1111dddff.....
                ...77.fbdbfddfbdbfcf....
                ...777fcdcf11fcdcfbf....
                ....77fffbdb1bdffcf.....
                ....fcb1bcffffff........
                ....f1c1c1ffffff........
                ....fdfdfdfffff.........
                .....f.f.f..............
                ........................
                ........................
                ........................
                """),
            SpriteKind.enemy)
      deathpill.x = randint(0, scene.screen_width())
      deathpill.y = randint(0, scene.screen_height())

def on_on_overlap2(sprite2, otherSprite2):
    info.change_score_by(1)
    otherSprite2.destroy()
sprites.on_overlap(SpriteKind.player, SpriteKind.food, on_on_overlap2)

def on_on_overlap3(sprite3, otherSprite3):
    info.change_life_by(-1)
    info.change_score_by(15)
    otherSprite3.destroy()
sprites.on_overlap(SpriteKind.player, SpriteKind.enemy, on_on_overlap3)

deathpill: Sprite = None
taco: Sprite = None
cherry: Sprite = None
strawberry: Sprite = None
info.set_life(3)
info.start_countdown(60)
princess = sprites.create(img("""
      . . . . . . 5 . 5 . . . . . . .
      . . . . . f 5 5 5 f f . . . . .
      . . . . f 1 5 2 5 1 6 f . . . .
      . . . f 1 6 6 6 6 6 1 6 f . . .
      . . . f 6 6 f f f f 6 1 f . . .
      . . . f 6 f f d d f f 6 f . . .
      . . f 6 f d f d d f d f 6 f . .
      . . f 6 f d 3 d d 3 d f 6 f . .
      . . f 6 6 f d d d d f 6 6 f . .
      . f 6 6 f 3 f f f f 3 f 6 6 f .
      . . f f d 3 5 3 3 5 3 d f f . .
      . . f d d f 3 5 5 3 f d d f . .
      . . . f f 3 3 3 3 3 3 f f . . .
      . . . f 3 3 5 3 3 5 3 3 f . . .
      . . . f f f f f f f f f f . . .
      . . . . . f f . . f f . . . . .
      """),
    SpriteKind.player)
princess.set_stay_in_screen(True)
controller.move_sprite(princess)
scene.set_background_color(11)

def on_update_interval():
    randomAssets()
game.on_update_interval(2000, on_update_interval)


驴友花雕 发表于 2025-9-24 11:35:05

【花雕动手做】基于Kitronik可编程开发板之草莓公主游戏

这段 Arcade MakeCode 的《草莓公主游戏》代码是一个轻松有趣的收集类游戏,玩家控制“公主”在屏幕中收集食物并避开危险物品。
游戏目标,在 60 秒内,玩家控制草莓公主收集食物得分,同时避免失去生命。最终得分取决于收集的物品数量与种类。

核心机制解析

1、精灵种类定义
python
@namespace

class SpriteKind:

    Taco = SpriteKind.create()
扩展 SpriteKind,添加自定义类型 Taco,用于识别特殊食物。

2、食物与道具生成逻辑
python
def randomAssets():

    ...

game.on_update_interval(2000, on_update_interval)
每 2 秒自动生成一组随机物品,包括:
草莓(strawberry):得分 +1
樱桃(cherry):得分 +1
塔可(taco):20% 概率生成,得分 +10
死亡药丸(deathpill):80% 概率生成,得分 +15,但失去 1 条生命
每个物品随机出现在屏幕任意位置。

3、玩家控制与角色设置
python
princess = sprites.create(img("""..."""), SpriteKind.player)

controller.move_sprite(princess)

princess.set_stay_in_screen(True)
创建主角“草莓公主”精灵。
启用方向键控制移动。
限制角色不离开屏幕。

4、游戏时间与生命设定
python
info.set_life(3)

info.start_countdown(60)
玩家初始拥有 3 条生命。
游戏限时 60 秒。

5、碰撞事件处理
收集塔可
python
sprites.on_overlap(SpriteKind.player, SpriteKind.Taco, on_on_overlap)
得分 +10,销毁塔可。

收集草莓或樱桃
python
sprites.on_overlap(SpriteKind.player, SpriteKind.food, on_on_overlap2)
得分 +1,销毁食物。

吃到死亡药丸
python
sprites.on_overlap(SpriteKind.player, SpriteKind.enemy, on_on_overlap3)
得分 +15,但生命 -1,销毁药丸。

驴友花雕 发表于 2025-9-24 11:41:28

【花雕动手做】基于Kitronik可编程开发板之草莓公主游戏

图形编程参考实验程序



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



实验场景记录







驴友花雕 发表于 2025-9-24 11:45:08

【花雕动手做】基于Kitronik可编程开发板之草莓公主游戏


页: [1]
查看完整版本: 【花雕动手做】基于Kitronik可编程开发板之草莓公主游戏