11浏览
查看: 11|回复: 3

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

[复制链接]
【花雕动手做】基于 Kitronik 游戏机开发板之分头送货图1

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


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

驴友花雕  中级技神
 楼主|

发表于 3 小时前

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

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

MicroPython实验代码

  1. @namespace
  2. class SpriteKind:
  3.     Object = SpriteKind.create()
  4. # Game over when you reach the end of the
  5. # neighborhood
  6. def on_overlap_tile(sprite, location):
  7.     game.over(True, effects.confetti)
  8. scene.on_overlap_tile(SpriteKind.player, myTiles.tile3, on_overlap_tile)
  9. def on_up_pressed():
  10.     car.set_image(img("""
  11.         . . . . . . . . . . . . . . . .
  12.         . . . . . . 3 3 3 3 3 3 . . . .
  13.         . . . . . 3 3 d d 3 3 3 3 . . .
  14.         . . . . . c d 3 3 3 3 3 c . . .
  15.         . . . . 3 c d 3 3 3 3 3 c 3 . .
  16.         . . . a 3 c d 3 3 3 3 3 c 3 a .
  17.         . . . f 3 c d 3 3 3 3 3 c 3 f .
  18.         . . . f a c 3 3 3 3 3 3 c a f .
  19.         . . . f 3 c 3 b b b b 3 c 3 f .
  20.         . . . a 3 3 b c c c c b 3 3 a .
  21.         . . . a a b c c c c c c b a a .
  22.         . . . f a d d d d d d d d a f .
  23.         . . . f a d 3 3 3 3 3 3 d a f .
  24.         . . . . 3 d d 3 3 3 3 d d 3 f .
  25.         . . . . f 3 d 3 3 3 3 d 3 f . .
  26.         . . . . . a 3 3 3 3 3 3 a . . .
  27.         """))
  28. controller.up.on_event(ControllerButtonEvent.PRESSED, on_up_pressed)
  29. def on_b_pressed():
  30.     package1 = sprites.create_projectile_from_sprite(img("""
  31.             . . . . . . . . . . . . . . . .
  32.             . . . . . . . e e e e e e e . .
  33.             . . . . . . e d d d d d e e . .
  34.             . . . . . e d d d d d d e e . .
  35.             . . . . e d d d d d d e d e . .
  36.             . . . . e e e e e e e d d e . .
  37.             . . . . e d d d d d e d d e . .
  38.             . . . . e d d d d d e d d e . .
  39.             . . . . e d d d d d e d d e . .
  40.             . . . . e d d d d d e d e e . .
  41.             . . . . e d d d d d e e e . . .
  42.             . . . . e e e e e e e e . . . .
  43.             . . . . . . . . . . . . . . . .
  44.             . . . . . . . . . . . . . . . .
  45.             . . . . . . . . . . . . . . . .
  46.             . . . . . . . . . . . . . . . .
  47.             """),
  48.         car,
  49.         0,
  50.         50)
  51. controller.B.on_event(ControllerButtonEvent.PRESSED, on_b_pressed)
  52. # Deliver packages up (A) or down (B)
  53. def on_a_pressed():
  54.     package2 = sprites.create_projectile_from_sprite(img("""
  55.             . . . . . . . . . . . . . . . .
  56.             . . . . . . . e e e e e e e . .
  57.             . . . . . . e d d d d d e e . .
  58.             . . . . . e d d d d d d e e . .
  59.             . . . . e d d d d d d e d e . .
  60.             . . . . e e e e e e e d d e . .
  61.             . . . . e d d d d d e d d e . .
  62.             . . . . e d d d d d e d d e . .
  63.             . . . . e d d d d d e d d e . .
  64.             . . . . e d d d d d e d e e . .
  65.             . . . . e d d d d d e e e . . .
  66.             . . . . e e e e e e e e . . . .
  67.             . . . . . . . . . . . . . . . .
  68.             . . . . . . . . . . . . . . . .
  69.             . . . . . . . . . . . . . . . .
  70.             . . . . . . . . . . . . . . . .
  71.             """),
  72.         car,
  73.         0,
  74.         -50)
  75. controller.A.on_event(ControllerButtonEvent.PRESSED, on_a_pressed)
  76. def on_left_pressed():
  77.     car.set_image(img("""
  78.         . . . . . . . . . . . . . . . .
  79.         . . . . . . 3 3 3 3 3 3 3 3 . .
  80.         . . . . . 3 c 3 3 3 3 3 3 d 3 .
  81.         . . . . 3 c c 3 3 3 3 3 3 d c 3
  82.         . . d 3 d c c 3 d d d d d d c c
  83.         . d 3 3 d c b a a a a a a a 3 c
  84.         . 3 3 3 d b a a b b b a b b a 3
  85.         . 3 3 3 3 3 a b b b b a b b b a
  86.         . 3 3 3 3 a 3 3 3 3 3 a 3 3 3 a
  87.         . 3 d d 3 a f a a a f a a a a a
  88.         . d d 3 a a a f a a f a a a a a
  89.         . a a a a a a a f f f a a a a a
  90.         . a a a a f f f a a a a f f f f
  91.         . . . a f f f f f a a f f f f f
  92.         . . . . f f f f . . . . f f f .
  93.         . . . . . . . . . . . . . . . .
  94.         """))
  95. controller.left.on_event(ControllerButtonEvent.PRESSED, on_left_pressed)
  96. def on_right_pressed():
  97.     car.set_image(img("""
  98.         . . . . . . . . . . . . . . . .
  99.         . . . . 3 3 3 3 3 3 3 3 . . . .
  100.         . . . 3 d 3 3 3 3 3 3 c 3 . . .
  101.         . . 3 c d 3 3 3 3 3 3 c c 3 . .
  102.         . 3 c c d d d d d d 3 c c d 3 d
  103.         . 3 c 3 a a a a a a a b c d 3 3
  104.         . 3 3 a b b a b b b a a b d 3 3
  105.         . 3 a b b b a b b b b a 3 3 3 3
  106.         . a a 3 3 3 a 3 3 3 3 3 a 3 3 3
  107.         . a a a a a a f a a a f a 3 d d
  108.         . a a a a a a f a a f a a a 3 d
  109.         . a a a a a a f f f a a a a a a
  110.         . a f f f f a a a a f f f a a a
  111.         . . f f f f f a a f f f f f a .
  112.         . . . f f f . . . . f f f f . .
  113.         . . . . . . . . . . . . . . . .
  114.         """))
  115. controller.right.on_event(ControllerButtonEvent.PRESSED, on_right_pressed)
  116. # Change the car image based on the direction it's
  117. # driving
  118. def on_down_pressed():
  119.     car.set_image(img("""
  120.         . . . . . . a a c c a a . . . .
  121.         . . . . . a 3 3 3 3 3 3 a . . .
  122.         . . . . 3 c 3 3 3 3 3 3 c 3 . .
  123.         . . . a 3 c d 3 3 3 3 3 c 3 a .
  124.         . . . f 3 3 d 3 3 3 3 3 c 3 f .
  125.         . . . f 3 3 d 3 3 3 3 3 3 3 f .
  126.         . . . f 3 3 d 3 3 3 3 3 3 3 f .
  127.         . . . f 3 c 3 d d 3 3 3 c 3 f .
  128.         . . . a 3 c a c c c c a c 3 a .
  129.         . . . a 3 a c b b b b c a 3 a .
  130.         . . . a 3 a b b b b b b a 3 a .
  131.         . . . a a a a a a a a a a a a .
  132.         . . . f a d a a a a a a d a f .
  133.         . . . f a 3 d a a a a d 3 a f .
  134.         . . . f f a a a a a a a a f f .
  135.         . . . . f f . . . . . . f f . .
  136.         """))
  137. controller.down.on_event(ControllerButtonEvent.PRESSED, on_down_pressed)
  138. # Score a point for delivering packages to houses
  139. def on_on_overlap(sprite2, otherSprite):
  140.     music.magic_wand.play()
  141.     sprite2.destroy(effects.confetti, 500)
  142.     info.change_score_by(1)
  143. sprites.on_overlap(SpriteKind.projectile, SpriteKind.Object, on_on_overlap)
  144. # Lose a point for driving into a house
  145. def on_on_overlap2(sprite3, otherSprite2):
  146.     music.play_tone(147, music.beat(BeatFraction.QUARTER))
  147.     music.play_tone(139, music.beat(BeatFraction.QUARTER))
  148.     music.play_tone(131, music.beat(BeatFraction.QUARTER))
  149.     scene.camera_shake(2, 200)
  150.     info.change_score_by(-1)
  151. sprites.on_overlap(SpriteKind.player, SpriteKind.Object, on_on_overlap2)
  152. scene.set_background_color(7)
  153. tiles.set_tilemap(tilemap("""
  154.     level
  155.     """))
  156. car = sprites.create(img("""
  157.         . . . . . . . . . . . . . . . .
  158.         . . . . 3 3 3 3 3 3 3 3 . . . .
  159.         . . . 3 d 3 3 3 3 3 3 c 3 . . .
  160.         . . 3 c d 3 3 3 3 3 3 c c 3 . .
  161.         . 3 c c d d d d d d 3 c c d 3 d
  162.         . 3 c 3 a a a a a a a b c d 3 3
  163.         . 3 3 a b b a b b b a a b d 3 3
  164.         . 3 a b b b a b b b b a 3 3 3 3
  165.         . a a 3 3 3 a 3 3 3 3 3 a 3 3 3
  166.         . a a a a a a f a a a f a 3 d d
  167.         . a a a a a a f a a f a a a 3 d
  168.         . a a a a a a f f f a a a a a a
  169.         . a f f f f a a a a f f f a a a
  170.         . . f f f f f a a f f f f f a .
  171.         . . . f f f . . . . f f f f . .
  172.         . . . . . . . . . . . . . . . .
  173.         """),
  174.     SpriteKind.player)
  175. tiles.place_on_random_tile(car, myTiles.tile4)
  176. controller.move_sprite(car)
  177. scene.camera_follow_sprite(car)
  178. for value in tiles.get_tiles_by_type(myTiles.tile1):
  179.     myPurpleHouse = sprites.create(img("""
  180.             ....................8a8aa8a8....................
  181.             .................aaa888aa8a8aaa.................
  182.             ..............aaa8aa8a8aa888aa8aaa..............
  183.             ...........8aa8aa8888a8aa8a8888aa8aa8...........
  184.             ........8888aa8aa8aa8a8aa8a8aa8aa8aa8888........
  185.             .....aaa8aa8aa8888aa8a8aa8a8aa8888aa8aa8aaa.....
  186.             ...aa8888aa8aa8aa8aa888aa888aa8aa8aa8aa8888aa...
  187.             dccaa8aa8aa8888aa8aa8a8aa8a8aa8aa8888aa8aa8aaccd
  188.             bcb888aa8aa8aa8aa8aa8a8aa8a8aa8aa8aa8aa8aa888bcb
  189.             dbbaa8aa8888aa8aa8888a8aa8a8888aa8aa8888aa8aabbd
  190.             dbbaa8aa8aa8aa8888aa8a8aa8a8aa8888aa8aa8aa8aabbd
  191.             dccaa8888aa8aa8aa8aa888aa888aa8aa8aa8aa8888aaccd
  192.             bcbaa8aa8aa8888aa8aa8a8aa8a8aa8aa8888aa8aa8aabcb
  193.             dbb888aa8aa8aa8aa8aa8a8aa8a8aa8aa8aa8aa8aa888bbd
  194.             dbbaa8aa8888aa8aa8aa8a8aa8a8aa8aa8aa8888aa8aabbd
  195.             dccaa8aa8aa8aa8aa8888a8aa8a8888aa8aa8aa8aa8aaccd
  196.             bcbaa8888aa8aa8888aa888aa888aa8888aa8aa8888aabcb
  197.             dbbaa8aa8aa8888aa8aa8a8aa8a8aa8aa8888aa8aa8aabbd
  198.             dbb888aa8aa8aa8aa8aa8a8aa8a8aa8aa8aa8aa8aa888bbd
  199.             dccaa8aa8888aa8aa8aa8a8aa8a8aa8aa8aa8888aa8aaccd
  200.             bcbaa8aa8aa8aa8aa8aa888aa888aa8aa8aa8aa8aa8aabcb
  201.             dbbaa8888aa8aa8aa888ccbbbbcc888aa8aa8aa8888aabbd
  202.             dbbaa8aa8aa8aa888ccbbbbbbbbbbcc888aa8aa8aa8aabbd
  203.             dcc888aa8aa888ccbbbbbccccccbbbbbcc888aa8aa888ccd
  204.             bcbaa8aa888ccbbbbbccbddddddbccbbbbbcc888aa8aabcb
  205.             dbbaa8aaccbbbbbccbddddddddddddbccbbbbbccaa8aabbd
  206.             dbbaaccbbbbcccbddddddddddddddddddbcccbbbbccaabbd
  207.             dcccbbbbcccbdddbccbbbbbbbbbbbbccbdddbcccbbbbcccd
  208.             ccccccccbbbbbbbcbddddddddddddddbcbbbbbbbcccccccc
  209.             bddddddddddddbcddddddddddddddddddcbddddddddddddb
  210.             bbcbdddddddddcbd1111111111111111dbcdddddddddbcbb
  211.             bbbcccccccccccd1bbbbbbbbbbbbbbbb1dcccccccccccbbb
  212.             bbbbdddddddddc11beeeeeeeeeeeeeeb11cdddddddddbbbb
  213.             bbb8aaaaaaa8dc1be3b33b33b33b33beb1cd8aaaaaaa8bbb
  214.             bbb888888888dc1be3b33b33b33b33beb1cd888888888bbb
  215.             bbb833333338dcbbf3b3effffffe33bebbcd833333338bbb
  216.             bbb83ff3ff38dcbbf3bffffffffff3bebbcd83ff3ff38bbb
  217.             bbb83cc3cc38dcbbf3effffffffffebebbcd83cc3cc38bbb
  218.             bbb833333338dcbbf3eeeeeeeeeeeebebbcd833333338bbb
  219.             cbb83ff3ff38dcbbe3b33b33b33b33bebbcd83ff3ff38bbc
  220.             cbb83cc3cc38dcbbe3b33b33b33b33bebbcd83cc3cc38bbc
  221.             ccbbbbbbbbbbdcbbe3b33b33b33feeeebbcdbbbbbbbbbbcc
  222.             .cbbdddddddddcbbe3b33b33b33ffffebbcdddddddddbbc.
  223.             ..cbdbbbdbbbdcbbf3b33b33b33f33febbcdbbbdbbbdbc..
  224.             ...cdbbbdbbbdcbbf3b33b33b33bffeebbcdbbbdbbbdc...
  225.             ....bddddddddcbbf3b33b33b33b33bebbcddddddddb....
  226.             .....bdbbbdddcbbf3b33b33b33b33bebbcdddbbbdb.....
  227.             ......bcccbbbcbbe3b33b33b33b33bebbcbbbcccb......
  228.             """),
  229.         SpriteKind.Object)
  230.     tiles.place_on_tile(myPurpleHouse, value)
  231. for value2 in tiles.get_tiles_by_type(myTiles.tile2):
  232.     myRedHouse = sprites.create(img("""
  233.             ......6ccc666c66e4e44e44e44e44ee66c666ccc6......
  234.             .....64eee444c66f4e44e44e44e44ee66c444eee46.....
  235.             ....644444444c66f4e44e44e44e44ee66c444444446....
  236.             ...c4eee4eee4c66f4e44e44e44effee66c4eee4eee4c...
  237.             ..c64eee4eee4c66f4e44e44e44f44fe66c4eee4eee46c..
  238.             .c66444444444c66e4e44e44e44ffffe66c44444444466c.
  239.             cc66666666664c66e4e44e44e44feeee66c46666666666cc
  240.             c66edccdccde4c66e4e44e44e44e44ee66c4edccdccde66c
  241.             c66edffdffde4c66e4e44e44e44e44ee66c4edffdffde66c
  242.             666eddddddde4c66f4eeeeeeeeeeeeee66c4eddddddde666
  243.             666edccdccde4c66f4effffffffffeee66c4edccdccde666
  244.             666edffdffde4c66f4effffffffff4ee66c4edffdffde666
  245.             666eddddddde4c66f4e4effffffe44ee66c4eddddddde666
  246.             666eeeeeeeee4c16e4e44e44e44e44ee61c4eeeeeeeee666
  247.             666e2222222e4c16e4e44e44e44e44ee61c4e2222222e666
  248.             6666444444444c116eeeeeeeeeeeeee611c4444444446666
  249.             666cccccccccccd166666666666666661dccccccccccc666
  250.             66cb444444444cb411111111111111114bc444444444bc66
  251.             64444444444446c444444444444444444c64444444444446
  252.             cccccccc6666666cb44444444444444bc6666666cccccccc
  253.             4ccc6666ccc6444bcc666666666666ccb4446ccc6666ccc4
  254.             46622cc6666ccc64444444444444444446ccc6666cc22664
  255.             46622e22cc66666cc64444444444446cc66666cc22e22664
  256.             6c622e22eeecc66666cc64444446cc66666cceee22e226c6
  257.             4cceee22e22eeecc66666cccccc66666cceee22e22eeecc4
  258.             46622e22e22e22eeecc6666666666cceee22e22e22e22664
  259.             46622eeee22e22e22eeecc6666cceee22e22e22eeee22664
  260.             6c622e22e22e22e22e22eee22eee22e22e22e22e22e226c6
  261.             4cc22e22eeee22e22e22e2e22e2e22e22e22eeee22e22cc4
  262.             466eee22e22e22e22e22e2e22e2e22e22e22e22e22eee664
  263.             46622e22e22eeee22e22e2e22e2e22e22eeee22e22e22664
  264.             6c622eeee22e22eeee22eee22eee22eeee22e22eeee226c6
  265.             4cc22e22e22e22e22eeee2e22e2eeee22e22e22e22e22cc4
  266.             46622e22eeee22e22e22e2e22e2e22e22e22eeee22e22664
  267.             466eee22e22e22e22e22e2e22e2e22e22e22e22e22eee664
  268.             6c622e22e22eeee22e22e2e22e2e22e22eeee22e22e226c6
  269.             4cc22eeee22e22e22e22eee22eee22e22e22e22eeee22cc4
  270.             46622e22e22e22eeee22e2e22e2e22eeee22e22e22e22664
  271.             46622e22eeee22e22eeee2e22e2eeee22e22eeee22e22664
  272.             6c6eee22e22e22e22e22e2e22e2e22e22e22e22e22eee6c6
  273.             4cc22e22e22eeee22e22e2e22e2e22e22eeee22e22e22cc4
  274.             ...22eeee22e22e22e22eee22eee22e22e22e22eeee22...
  275.             .....222e22e22eeee22e2e22e2e22eeee22e22e222.....
  276.             ........eeee22e22e22e2e22e2e22e22e22eeee........
  277.             ...........e22e22eeee2e22e2eeee22e22e...........
  278.             ..............222e22e2e22eee22e222..............
  279.             .................222eee22e2e222.................
  280.             ....................e2e22e2e....................
  281.             """),
  282.         SpriteKind.Object)
  283.     tiles.place_on_tile(myRedHouse, value2)
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 3 小时前

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

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

1. 精灵种类定义
python
  1. class SpriteKind:
  2.     Object = SpriteKind.create()  # 房屋对象
复制代码


2. 核心游戏机制
胜利条件
python
  1. def on_overlap_tile(sprite, location):
  2.     game.over(True, effects.confetti)  # 到达特定瓦片游戏胜利
  3. scene.on_overlap_tile(SpriteKind.player, myTiles.tile3, on_overlap_tile)
复制代码

包裹投递系统
游戏提供两种投递方式:
A键:向上投递包裹
B键:向下投递包裹

python
  1. def on_a_pressed():
  2.     package2 = sprites.create_projectile_from_sprite(包裹图片, car, 0, -50)  # 向上投递
  3. def on_b_pressed():
  4.     package1 = sprites.create_projectile_from_sprite(包裹图片, car, 0, 50)   # 向下投递
复制代码


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

python
  1. def on_up_pressed():
  2.     car.set_image(向上行驶的车辆图片)  # 车辆正面视角
  3. def on_down_pressed():
  4.     car.set_image(向下行驶的车辆图片)  # 车辆背面视角
  5. def on_left_pressed():
  6.     car.set_image(向左行驶的车辆图片)  # 车辆左侧视角
  7. def on_right_pressed():
  8.     car.set_image(向右行驶的车辆图片)  # 车辆右侧视角
复制代码

车辆控制
python
  1. controller.move_sprite(car)  # 启用方向键控制移动
  2. scene.camera_follow_sprite(car)  # 相机跟随车辆
复制代码


4. 得分系统
成功投递 (+1分)
python
  1. def on_on_overlap(sprite2, otherSprite):
  2.     music.magic_wand.play()  # 成功音效
  3.     sprite2.destroy(effects.confetti, 500)  # 包裹消失效果
  4.     info.change_score_by(1)  # 得分
  5. sprites.on_overlap(SpriteKind.projectile, SpriteKind.Object, on_on_overlap)
复制代码

碰撞房屋 (-1分)
python
  1. def on_on_overlap2(sprite3, otherSprite2):
  2.     # 播放降调音效序列
  3.     music.play_tone(147, music.beat(BeatFraction.QUARTER))
  4.     music.play_tone(139, music.beat(BeatFraction.QUARTER))
  5.     music.play_tone(131, music.beat(BeatFraction.QUARTER))
  6.     scene.camera_shake(2, 200)  # 相机震动效果
  7.     info.change_score_by(-1)  # 扣分
  8. sprites.on_overlap(SpriteKind.player, SpriteKind.Object, on_on_overlap2)
复制代码


5. 地图和环境设置
地图加载
python
  1. scene.set_background_color(7)  # 设置背景颜色
  2. tiles.set_tilemap(tilemap("level"))  # 加载关卡地图
复制代码

房屋生成系统
游戏生成两种颜色的房屋:
紫色房屋(对应特定瓦片类型):

python
  1. for value in tiles.get_tiles_by_type(myTiles.tile1):
  2.     myPurpleHouse = sprites.create(紫色房屋图片, SpriteKind.Object)
  3.     tiles.place_on_tile(myPurpleHouse, value)
复制代码

红色房屋(对应另一种瓦片类型):

python
  1. for value2 in tiles.get_tiles_by_type(myTiles.tile2):
  2.     myRedHouse = sprites.create(红色房屋图片, SpriteKind.Object)
  3.     tiles.place_on_tile(myRedHouse, value2)
复制代码

车辆初始位置
python
  1. car = sprites.create(初始车辆图片, SpriteKind.player)
  2. tiles.place_on_random_tile(car, myTiles.tile4)  # 在特定瓦片上随机位置生成
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 3 小时前

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

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

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

实验场景记录

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

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

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail