驴友花雕 发表于 2025-9-25 09:13:38

【花雕动手做】基于 Kitronik 游戏机开发板之分头送货



Kitronik ARCADE 使用 Microsoft MakeCode 平台,具有以下优势:
图形化编程界面:适合初学者,支持拖拽式编程。
即时模拟器:可以实时测试游戏效果。
硬件兼容性:可部署到 Kitronik ARCADE 设备,实现实体游戏体验。
支持 Python/JavaScript:便于进阶学习。



驴友花雕 发表于 2025-9-25 09:16:25

【花雕动手做】基于 Kitronik 游戏机开发板之分头送货

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

MicroPython实验代码

@namespace
class SpriteKind:
    Object = SpriteKind.create()
# Game over when you reach the end of the
# neighborhood

def on_overlap_tile(sprite, location):
    game.over(True, effects.confetti)
scene.on_overlap_tile(SpriteKind.player, myTiles.tile3, on_overlap_tile)

def on_up_pressed():
    car.set_image(img("""
      . . . . . . . . . . . . . . . .
      . . . . . . 3 3 3 3 3 3 . . . .
      . . . . . 3 3 d d 3 3 3 3 . . .
      . . . . . c d 3 3 3 3 3 c . . .
      . . . . 3 c d 3 3 3 3 3 c 3 . .
      . . . a 3 c d 3 3 3 3 3 c 3 a .
      . . . f 3 c d 3 3 3 3 3 c 3 f .
      . . . f a c 3 3 3 3 3 3 c a f .
      . . . f 3 c 3 b b b b 3 c 3 f .
      . . . a 3 3 b c c c c b 3 3 a .
      . . . a a b c c c c c c b a a .
      . . . f a d d d d d d d d a f .
      . . . f a d 3 3 3 3 3 3 d a f .
      . . . . 3 d d 3 3 3 3 d d 3 f .
      . . . . f 3 d 3 3 3 3 d 3 f . .
      . . . . . a 3 3 3 3 3 3 a . . .
      """))
controller.up.on_event(ControllerButtonEvent.PRESSED, on_up_pressed)

def on_b_pressed():
    package1 = sprites.create_projectile_from_sprite(img("""
            . . . . . . . . . . . . . . . .
            . . . . . . . e e e e e e e . .
            . . . . . . e d d d d d e e . .
            . . . . . e d d d d d d e e . .
            . . . . e d d d d d d e d e . .
            . . . . e e e e e e e d d e . .
            . . . . e d d d d d e d d e . .
            . . . . e d d d d d e d d e . .
            . . . . e d d d d d e d d e . .
            . . . . e d d d d d e d e e . .
            . . . . e d d d d d e e e . . .
            . . . . e e e e e e e e . . . .
            . . . . . . . . . . . . . . . .
            . . . . . . . . . . . . . . . .
            . . . . . . . . . . . . . . . .
            . . . . . . . . . . . . . . . .
            """),
      car,
      0,
      50)
controller.B.on_event(ControllerButtonEvent.PRESSED, on_b_pressed)

# Deliver packages up (A) or down (B)

def on_a_pressed():
    package2 = sprites.create_projectile_from_sprite(img("""
            . . . . . . . . . . . . . . . .
            . . . . . . . e e e e e e e . .
            . . . . . . e d d d d d e e . .
            . . . . . e d d d d d d e e . .
            . . . . e d d d d d d e d e . .
            . . . . e e e e e e e d d e . .
            . . . . e d d d d d e d d e . .
            . . . . e d d d d d e d d e . .
            . . . . e d d d d d e d d e . .
            . . . . e d d d d d e d e e . .
            . . . . e d d d d d e e e . . .
            . . . . e e e e e e e e . . . .
            . . . . . . . . . . . . . . . .
            . . . . . . . . . . . . . . . .
            . . . . . . . . . . . . . . . .
            . . . . . . . . . . . . . . . .
            """),
      car,
      0,
      -50)
controller.A.on_event(ControllerButtonEvent.PRESSED, on_a_pressed)

def on_left_pressed():
    car.set_image(img("""
      . . . . . . . . . . . . . . . .
      . . . . . . 3 3 3 3 3 3 3 3 . .
      . . . . . 3 c 3 3 3 3 3 3 d 3 .
      . . . . 3 c c 3 3 3 3 3 3 d c 3
      . . d 3 d c c 3 d d d d d d c c
      . d 3 3 d c b a a a a a a a 3 c
      . 3 3 3 d b a a b b b a b b a 3
      . 3 3 3 3 3 a b b b b a b b b a
      . 3 3 3 3 a 3 3 3 3 3 a 3 3 3 a
      . 3 d d 3 a f a a a f a a a a a
      . d d 3 a a a f a a f a a a a a
      . a a a a a a a f f f a a a a a
      . a a a a f f f a a a a f f f f
      . . . a f f f f f a a f f f f f
      . . . . f f f f . . . . f f f .
      . . . . . . . . . . . . . . . .
      """))
controller.left.on_event(ControllerButtonEvent.PRESSED, on_left_pressed)

def on_right_pressed():
    car.set_image(img("""
      . . . . . . . . . . . . . . . .
      . . . . 3 3 3 3 3 3 3 3 . . . .
      . . . 3 d 3 3 3 3 3 3 c 3 . . .
      . . 3 c d 3 3 3 3 3 3 c c 3 . .
      . 3 c c d d d d d d 3 c c d 3 d
      . 3 c 3 a a a a a a a b c d 3 3
      . 3 3 a b b a b b b a a b d 3 3
      . 3 a b b b a b b b b a 3 3 3 3
      . a a 3 3 3 a 3 3 3 3 3 a 3 3 3
      . a a a a a a f a a a f a 3 d d
      . a a a a a a f a a f a a a 3 d
      . a a a a a a f f f a a a a a a
      . a f f f f a a a a f f f a a a
      . . f f f f f a a f f f f f a .
      . . . f f f . . . . f f f f . .
      . . . . . . . . . . . . . . . .
      """))
controller.right.on_event(ControllerButtonEvent.PRESSED, on_right_pressed)

# Change the car image based on the direction it's
# driving

def on_down_pressed():
    car.set_image(img("""
      . . . . . . a a c c a a . . . .
      . . . . . a 3 3 3 3 3 3 a . . .
      . . . . 3 c 3 3 3 3 3 3 c 3 . .
      . . . a 3 c d 3 3 3 3 3 c 3 a .
      . . . f 3 3 d 3 3 3 3 3 c 3 f .
      . . . f 3 3 d 3 3 3 3 3 3 3 f .
      . . . f 3 3 d 3 3 3 3 3 3 3 f .
      . . . f 3 c 3 d d 3 3 3 c 3 f .
      . . . a 3 c a c c c c a c 3 a .
      . . . a 3 a c b b b b c a 3 a .
      . . . a 3 a b b b b b b a 3 a .
      . . . a a a a a a a a a a a a .
      . . . f a d a a a a a a d a f .
      . . . f a 3 d a a a a d 3 a f .
      . . . f f a a a a a a a a f f .
      . . . . f f . . . . . . f f . .
      """))
controller.down.on_event(ControllerButtonEvent.PRESSED, on_down_pressed)

# Score a point for delivering packages to houses

def on_on_overlap(sprite2, otherSprite):
    music.magic_wand.play()
    sprite2.destroy(effects.confetti, 500)
    info.change_score_by(1)
sprites.on_overlap(SpriteKind.projectile, SpriteKind.Object, on_on_overlap)

# Lose a point for driving into a house

def on_on_overlap2(sprite3, otherSprite2):
    music.play_tone(147, music.beat(BeatFraction.QUARTER))
    music.play_tone(139, music.beat(BeatFraction.QUARTER))
    music.play_tone(131, music.beat(BeatFraction.QUARTER))
    scene.camera_shake(2, 200)
    info.change_score_by(-1)
sprites.on_overlap(SpriteKind.player, SpriteKind.Object, on_on_overlap2)

scene.set_background_color(7)
tiles.set_tilemap(tilemap("""
    level
    """))
car = sprites.create(img("""
      . . . . . . . . . . . . . . . .
      . . . . 3 3 3 3 3 3 3 3 . . . .
      . . . 3 d 3 3 3 3 3 3 c 3 . . .
      . . 3 c d 3 3 3 3 3 3 c c 3 . .
      . 3 c c d d d d d d 3 c c d 3 d
      . 3 c 3 a a a a a a a b c d 3 3
      . 3 3 a b b a b b b a a b d 3 3
      . 3 a b b b a b b b b a 3 3 3 3
      . a a 3 3 3 a 3 3 3 3 3 a 3 3 3
      . a a a a a a f a a a f a 3 d d
      . a a a a a a f a a f a a a 3 d
      . a a a a a a f f f a a a a a a
      . a f f f f a a a a f f f a a a
      . . f f f f f a a f f f f f a .
      . . . f f f . . . . f f f f . .
      . . . . . . . . . . . . . . . .
      """),
    SpriteKind.player)
tiles.place_on_random_tile(car, myTiles.tile4)
controller.move_sprite(car)
scene.camera_follow_sprite(car)
for value in tiles.get_tiles_by_type(myTiles.tile1):
    myPurpleHouse = sprites.create(img("""
            ....................8a8aa8a8....................
            .................aaa888aa8a8aaa.................
            ..............aaa8aa8a8aa888aa8aaa..............
            ...........8aa8aa8888a8aa8a8888aa8aa8...........
            ........8888aa8aa8aa8a8aa8a8aa8aa8aa8888........
            .....aaa8aa8aa8888aa8a8aa8a8aa8888aa8aa8aaa.....
            ...aa8888aa8aa8aa8aa888aa888aa8aa8aa8aa8888aa...
            dccaa8aa8aa8888aa8aa8a8aa8a8aa8aa8888aa8aa8aaccd
            bcb888aa8aa8aa8aa8aa8a8aa8a8aa8aa8aa8aa8aa888bcb
            dbbaa8aa8888aa8aa8888a8aa8a8888aa8aa8888aa8aabbd
            dbbaa8aa8aa8aa8888aa8a8aa8a8aa8888aa8aa8aa8aabbd
            dccaa8888aa8aa8aa8aa888aa888aa8aa8aa8aa8888aaccd
            bcbaa8aa8aa8888aa8aa8a8aa8a8aa8aa8888aa8aa8aabcb
            dbb888aa8aa8aa8aa8aa8a8aa8a8aa8aa8aa8aa8aa888bbd
            dbbaa8aa8888aa8aa8aa8a8aa8a8aa8aa8aa8888aa8aabbd
            dccaa8aa8aa8aa8aa8888a8aa8a8888aa8aa8aa8aa8aaccd
            bcbaa8888aa8aa8888aa888aa888aa8888aa8aa8888aabcb
            dbbaa8aa8aa8888aa8aa8a8aa8a8aa8aa8888aa8aa8aabbd
            dbb888aa8aa8aa8aa8aa8a8aa8a8aa8aa8aa8aa8aa888bbd
            dccaa8aa8888aa8aa8aa8a8aa8a8aa8aa8aa8888aa8aaccd
            bcbaa8aa8aa8aa8aa8aa888aa888aa8aa8aa8aa8aa8aabcb
            dbbaa8888aa8aa8aa888ccbbbbcc888aa8aa8aa8888aabbd
            dbbaa8aa8aa8aa888ccbbbbbbbbbbcc888aa8aa8aa8aabbd
            dcc888aa8aa888ccbbbbbccccccbbbbbcc888aa8aa888ccd
            bcbaa8aa888ccbbbbbccbddddddbccbbbbbcc888aa8aabcb
            dbbaa8aaccbbbbbccbddddddddddddbccbbbbbccaa8aabbd
            dbbaaccbbbbcccbddddddddddddddddddbcccbbbbccaabbd
            dcccbbbbcccbdddbccbbbbbbbbbbbbccbdddbcccbbbbcccd
            ccccccccbbbbbbbcbddddddddddddddbcbbbbbbbcccccccc
            bddddddddddddbcddddddddddddddddddcbddddddddddddb
            bbcbdddddddddcbd1111111111111111dbcdddddddddbcbb
            bbbcccccccccccd1bbbbbbbbbbbbbbbb1dcccccccccccbbb
            bbbbdddddddddc11beeeeeeeeeeeeeeb11cdddddddddbbbb
            bbb8aaaaaaa8dc1be3b33b33b33b33beb1cd8aaaaaaa8bbb
            bbb888888888dc1be3b33b33b33b33beb1cd888888888bbb
            bbb833333338dcbbf3b3effffffe33bebbcd833333338bbb
            bbb83ff3ff38dcbbf3bffffffffff3bebbcd83ff3ff38bbb
            bbb83cc3cc38dcbbf3effffffffffebebbcd83cc3cc38bbb
            bbb833333338dcbbf3eeeeeeeeeeeebebbcd833333338bbb
            cbb83ff3ff38dcbbe3b33b33b33b33bebbcd83ff3ff38bbc
            cbb83cc3cc38dcbbe3b33b33b33b33bebbcd83cc3cc38bbc
            ccbbbbbbbbbbdcbbe3b33b33b33feeeebbcdbbbbbbbbbbcc
            .cbbdddddddddcbbe3b33b33b33ffffebbcdddddddddbbc.
            ..cbdbbbdbbbdcbbf3b33b33b33f33febbcdbbbdbbbdbc..
            ...cdbbbdbbbdcbbf3b33b33b33bffeebbcdbbbdbbbdc...
            ....bddddddddcbbf3b33b33b33b33bebbcddddddddb....
            .....bdbbbdddcbbf3b33b33b33b33bebbcdddbbbdb.....
            ......bcccbbbcbbe3b33b33b33b33bebbcbbbcccb......
            """),
      SpriteKind.Object)
    tiles.place_on_tile(myPurpleHouse, value)
for value2 in tiles.get_tiles_by_type(myTiles.tile2):
    myRedHouse = sprites.create(img("""
            ......6ccc666c66e4e44e44e44e44ee66c666ccc6......
            .....64eee444c66f4e44e44e44e44ee66c444eee46.....
            ....644444444c66f4e44e44e44e44ee66c444444446....
            ...c4eee4eee4c66f4e44e44e44effee66c4eee4eee4c...
            ..c64eee4eee4c66f4e44e44e44f44fe66c4eee4eee46c..
            .c66444444444c66e4e44e44e44ffffe66c44444444466c.
            cc66666666664c66e4e44e44e44feeee66c46666666666cc
            c66edccdccde4c66e4e44e44e44e44ee66c4edccdccde66c
            c66edffdffde4c66e4e44e44e44e44ee66c4edffdffde66c
            666eddddddde4c66f4eeeeeeeeeeeeee66c4eddddddde666
            666edccdccde4c66f4effffffffffeee66c4edccdccde666
            666edffdffde4c66f4effffffffff4ee66c4edffdffde666
            666eddddddde4c66f4e4effffffe44ee66c4eddddddde666
            666eeeeeeeee4c16e4e44e44e44e44ee61c4eeeeeeeee666
            666e2222222e4c16e4e44e44e44e44ee61c4e2222222e666
            6666444444444c116eeeeeeeeeeeeee611c4444444446666
            666cccccccccccd166666666666666661dccccccccccc666
            66cb444444444cb411111111111111114bc444444444bc66
            64444444444446c444444444444444444c64444444444446
            cccccccc6666666cb44444444444444bc6666666cccccccc
            4ccc6666ccc6444bcc666666666666ccb4446ccc6666ccc4
            46622cc6666ccc64444444444444444446ccc6666cc22664
            46622e22cc66666cc64444444444446cc66666cc22e22664
            6c622e22eeecc66666cc64444446cc66666cceee22e226c6
            4cceee22e22eeecc66666cccccc66666cceee22e22eeecc4
            46622e22e22e22eeecc6666666666cceee22e22e22e22664
            46622eeee22e22e22eeecc6666cceee22e22e22eeee22664
            6c622e22e22e22e22e22eee22eee22e22e22e22e22e226c6
            4cc22e22eeee22e22e22e2e22e2e22e22e22eeee22e22cc4
            466eee22e22e22e22e22e2e22e2e22e22e22e22e22eee664
            46622e22e22eeee22e22e2e22e2e22e22eeee22e22e22664
            6c622eeee22e22eeee22eee22eee22eeee22e22eeee226c6
            4cc22e22e22e22e22eeee2e22e2eeee22e22e22e22e22cc4
            46622e22eeee22e22e22e2e22e2e22e22e22eeee22e22664
            466eee22e22e22e22e22e2e22e2e22e22e22e22e22eee664
            6c622e22e22eeee22e22e2e22e2e22e22eeee22e22e226c6
            4cc22eeee22e22e22e22eee22eee22e22e22e22eeee22cc4
            46622e22e22e22eeee22e2e22e2e22eeee22e22e22e22664
            46622e22eeee22e22eeee2e22e2eeee22e22eeee22e22664
            6c6eee22e22e22e22e22e2e22e2e22e22e22e22e22eee6c6
            4cc22e22e22eeee22e22e2e22e2e22e22eeee22e22e22cc4
            ...22eeee22e22e22e22eee22eee22e22e22e22eeee22...
            .....222e22e22eeee22e2e22e2e22eeee22e22e222.....
            ........eeee22e22e22e2e22e2e22e22e22eeee........
            ...........e22e22eeee2e22e2eeee22e22e...........
            ..............222e22e2e22eee22e222..............
            .................222eee22e2e222.................
            ....................e2e22e2e....................
            """),
      SpriteKind.Object)
    tiles.place_on_tile(myRedHouse, value2)

驴友花雕 发表于 2025-9-25 09:21:55

【花雕动手做】基于 Kitronik 游戏机开发板之分头送货

这是一个快递送货模拟游戏,玩家控制一辆送货小车在社区中行驶,将包裹投递到正确的房屋,同时要避免撞到房屋。代码结构分析

1. 精灵种类定义
python
class SpriteKind:

    Object = SpriteKind.create()# 房屋对象

2. 核心游戏机制
胜利条件
python
def on_overlap_tile(sprite, location):

    game.over(True, effects.confetti)# 到达特定瓦片游戏胜利

scene.on_overlap_tile(SpriteKind.player, myTiles.tile3, on_overlap_tile)
包裹投递系统
游戏提供两种投递方式:
A键:向上投递包裹
B键:向下投递包裹

python
def on_a_pressed():

    package2 = sprites.create_projectile_from_sprite(包裹图片, car, 0, -50)# 向上投递



def on_b_pressed():

    package1 = sprites.create_projectile_from_sprite(包裹图片, car, 0, 50)   # 向下投递

3. 车辆控制系统
方向感应动画
游戏的一个特色是根据行驶方向改变车辆图像:

python
def on_up_pressed():

    car.set_image(向上行驶的车辆图片)# 车辆正面视角



def on_down_pressed():

    car.set_image(向下行驶的车辆图片)# 车辆背面视角



def on_left_pressed():

    car.set_image(向左行驶的车辆图片)# 车辆左侧视角



def on_right_pressed():

    car.set_image(向右行驶的车辆图片)# 车辆右侧视角
车辆控制
python
controller.move_sprite(car)# 启用方向键控制移动

scene.camera_follow_sprite(car)# 相机跟随车辆

4. 得分系统
成功投递 (+1分)
python
def on_on_overlap(sprite2, otherSprite):

    music.magic_wand.play()# 成功音效

    sprite2.destroy(effects.confetti, 500)# 包裹消失效果

    info.change_score_by(1)# 得分

sprites.on_overlap(SpriteKind.projectile, SpriteKind.Object, on_on_overlap)
碰撞房屋 (-1分)
python
def on_on_overlap2(sprite3, otherSprite2):

    # 播放降调音效序列

    music.play_tone(147, music.beat(BeatFraction.QUARTER))

    music.play_tone(139, music.beat(BeatFraction.QUARTER))

    music.play_tone(131, music.beat(BeatFraction.QUARTER))

    scene.camera_shake(2, 200)# 相机震动效果

    info.change_score_by(-1)# 扣分

sprites.on_overlap(SpriteKind.player, SpriteKind.Object, on_on_overlap2)

5. 地图和环境设置
地图加载
python
scene.set_background_color(7)# 设置背景颜色

tiles.set_tilemap(tilemap("level"))# 加载关卡地图
房屋生成系统
游戏生成两种颜色的房屋:
紫色房屋(对应特定瓦片类型):

python
for value in tiles.get_tiles_by_type(myTiles.tile1):

    myPurpleHouse = sprites.create(紫色房屋图片, SpriteKind.Object)

    tiles.place_on_tile(myPurpleHouse, value)
红色房屋(对应另一种瓦片类型):

python
for value2 in tiles.get_tiles_by_type(myTiles.tile2):

    myRedHouse = sprites.create(红色房屋图片, SpriteKind.Object)

    tiles.place_on_tile(myRedHouse, value2)
车辆初始位置
python
car = sprites.create(初始车辆图片, SpriteKind.player)

tiles.place_on_random_tile(car, myTiles.tile4)# 在特定瓦片上随机位置生成

驴友花雕 发表于 2025-9-25 09:24:21

【花雕动手做】基于 Kitronik 游戏机开发板之分头送货

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



实验场景记录





页: [1]
查看完整版本: 【花雕动手做】基于 Kitronik 游戏机开发板之分头送货