186浏览
查看: 186|回复: 5

[项目] 【花雕动手做】基于Kitronik可编程开发板之箭雨之战游戏

[复制链接]
【花雕动手做】基于Kitronik可编程开发板之箭雨之战游戏图3

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

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

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


【花雕动手做】基于Kitronik可编程开发板之箭雨之战游戏图1

【花雕动手做】基于Kitronik可编程开发板之箭雨之战游戏图2

驴友花雕  中级技神
 楼主|

发表于 2025-9-19 07:38:31

【花雕动手做】基于Kitronik可编程开发板之箭雨之战游戏

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

MicroPython实验代码

  1. @namespace
  2. class SpriteKind:
  3.     Arrow = SpriteKind.create()
  4. def on_player3_connected():
  5.     scene.set_background_image(assets.image("""
  6.         3pbg
  7.         """))
  8.     set_players(3)
  9. controller.player3.on_event(ControllerEvent.CONNECTED, on_player3_connected)
  10. def on_button_multiplayer_left_pressed(player2):
  11.     mp.get_player_sprite(player2).set_image(assets.image("""
  12.         1
  13.         """))
  14.     if arrow.image.equals(assets.image("""
  15.         1
  16.         """)):
  17.         mp.change_player_state_by(player2, MultiplayerState.score, 1)
  18. mp.on_button_event(mp.MultiplayerButton.LEFT,
  19.     ControllerButtonEvent.PRESSED,
  20.     on_button_multiplayer_left_pressed)
  21. def on_button_multiplayer_down_pressed(player22):
  22.     mp.get_player_sprite(player22).set_image(assets.image("""
  23.         3
  24.         """))
  25.     if arrow.image.equals(assets.image("""
  26.         3
  27.         """)):
  28.         mp.change_player_state_by(player22, MultiplayerState.score, 1)
  29. mp.on_button_event(mp.MultiplayerButton.DOWN,
  30.     ControllerButtonEvent.PRESSED,
  31.     on_button_multiplayer_down_pressed)
  32. def on_player4_connected():
  33.     scene.set_background_image(assets.image("""
  34.         4pbg
  35.         """))
  36.     set_players(4)
  37. controller.player4.on_event(ControllerEvent.CONNECTED, on_player4_connected)
  38. def on_button_multiplayer_right_pressed(player23):
  39.     mp.get_player_sprite(player23).set_image(assets.image("""
  40.         2
  41.         """))
  42.     if arrow.image.equals(assets.image("""
  43.         2
  44.         """)):
  45.         mp.change_player_state_by(player23, MultiplayerState.score, 1)
  46. mp.on_button_event(mp.MultiplayerButton.RIGHT,
  47.     ControllerButtonEvent.PRESSED,
  48.     on_button_multiplayer_right_pressed)
  49. def set_players(num: number):
  50.     sprites.destroy_all_sprites_of_kind(SpriteKind.player)
  51.     index = 0
  52.     while index <= num - 1:
  53.         mp.set_player_sprite(mp.index_to_player(index),
  54.             sprites.create(assets.image("""
  55.                 0
  56.                 """), SpriteKind.player))
  57.         mp.get_player_sprite(mp.index_to_player(index)).change_scale(0.75, ScaleAnchor.MIDDLE)
  58.         mp.get_player_sprite(mp.index_to_player(index)).set_position(80 / num * index + 80 / num * (index + 1), 90)
  59.         index += 1
  60. def on_button_multiplayer_up_pressed(player24):
  61.     mp.get_player_sprite(player24).set_image(assets.image("""
  62.         0
  63.         """))
  64.     if arrow.image.equals(assets.image("""
  65.         0
  66.         """)):
  67.         mp.change_player_state_by(player24, MultiplayerState.score, 1)
  68. mp.on_button_event(mp.MultiplayerButton.UP,
  69.     ControllerButtonEvent.PRESSED,
  70.     on_button_multiplayer_up_pressed)
  71. arrow: Sprite = None
  72. scene.set_background_image(assets.image("""
  73.     2pbg
  74.     """))
  75. arrow_list = [assets.image("""
  76.         0
  77.         """),
  78.     assets.image("""
  79.         1
  80.         """),
  81.     assets.image("""
  82.         2
  83.         """),
  84.     assets.image("""
  85.         3
  86.         """)]
  87. arrow = sprites.create(img("""
  88.         . . . . . . . . . . . . . . . .
  89.         . . . . . . . . . . . . . . . .
  90.         . . . . . . . . . . . . . . . .
  91.         . . . . . . . . . . . . . . . .
  92.         . . . . . . . . . . . . . . . .
  93.         . . . . . . . . . . . . . . . .
  94.         . . . . . . . . . . . . . . . .
  95.         . . . . . . . . . . . . . . . .
  96.         . . . . . . . . . . . . . . . .
  97.         . . . . . . . . . . . . . . . .
  98.         . . . . . . . . . . . . . . . .
  99.         . . . . . . . . . . . . . . . .
  100.         . . . . . . . . . . . . . . . .
  101.         . . . . . . . . . . . . . . . .
  102.         . . . . . . . . . . . . . . . .
  103.         . . . . . . . . . . . . . . . .
  104.         """),
  105.     SpriteKind.Arrow)
  106. arrow.set_position(80, 30)
  107. set_players(2)
  108. game.splash("Be the quickest to match", "arrow directions to win!")
  109. carnival.start_countdown_game(15, carnival.WinTypes.MULTI)
  110. music.play_sound_effect(music.create_sound_effect(WaveShape.TRIANGLE,
  111.         4750,
  112.         4783,
  113.         255,
  114.         0,
  115.         449,
  116.         SoundExpressionEffect.NONE,
  117.         InterpolationCurve.CURVE),
  118.     SoundExpressionPlayMode.UNTIL_DONE)
  119. def on_update_interval():
  120.     arrow.set_image(arrow_list._pick_random())
  121. game.on_update_interval(500, on_update_interval)
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2025-9-19 07:45:54

【花雕动手做】基于Kitronik可编程开发板之箭雨之战游戏

这段代码是一个非常精彩的多人对战小游戏——箭雨之战(Arrow Battle),用 MakeCode Arcade 的 Python 风格编写,融合了多人控制、图像匹配、计分机制、倒计时挑战等元素。

游戏玩法概述
屏幕中央不断出现随机箭头图案(上下左右)
玩家通过按键选择与箭头图案匹配的方向
匹配成功 → 加分
倒计时结束 → 分数最高者获胜
支持 2~4 人联机对战,背景图随人数变化

核心模块解读
1、SpriteKind.Arrow 定义箭头类型
python
  1. @namespace
  2. class SpriteKind:
  3.     Arrow = SpriteKind.create()
复制代码

创建一个新的精灵类型 Arrow,用于区分箭头精灵和玩家精灵

2、玩家连接事件:设置背景和人数
python
  1. def on_player3_connected():
  2.     scene.set_background_image(assets.image("3pbg"))
  3.     set_players(3)
复制代码

玩家3连接时,切换背景图为 3pbg,并设置为3人模式
同理,玩家4连接时切换为 4pbg,设置4人模式

3、玩家按键事件:图像匹配 + 加分逻辑
python
  1. def on_button_multiplayer_left_pressed(player2):
  2.     mp.get_player_sprite(player2).set_image(assets.image("1"))
  3.     if arrow.image.equals(assets.image("1")):
  4.         mp.change_player_state_by(player2, MultiplayerState.score, 1)
复制代码

玩家按下左键时,角色图像变为“左箭头”
如果当前箭头图像也是“左箭头”,则加分
同理,UP/DOWN/RIGHT 都有对应逻辑

4、set_players(num):初始化玩家精灵
python
  1. sprites.destroy_all_sprites_of_kind(SpriteKind.player)
  2. ...
  3. mp.set_player_sprite(mp.index_to_player(index), sprites.create(...))
复制代码

清除旧玩家精灵
创建新的玩家精灵并设置位置、缩放
自动根据人数平均分布在屏幕底部

5、箭头精灵初始化
python
  1. arrow = sprites.create(img(...), SpriteKind.Arrow)
  2. arrow.set_position(80, 30)
复制代码

创建一个空白箭头精灵,放在屏幕中央
后续会不断更新图像为随机箭头

6、游戏开始提示 + 倒计时挑战
python
  1. game.splash("Be the quickest to match", "arrow directions to win!")
  2. carnival.start_countdown_game(15, carnival.WinTypes.MULTI)
复制代码

显示游戏提示
启动15秒倒计时挑战,胜者为得分最高者


7、音效启动
python
  1. music.play_sound_effect(music.create_sound_effect(...))
复制代码

播放启动音效,增强氛围感

8、箭头图像随机更新
python
  1. def on_update_interval():
  2.     arrow.set_image(arrow_list._pick_random())
  3. game.on_update_interval(500, on_update_interval)
复制代码

每 500 毫秒更新一次箭头图像
从 arrow_list 中随机选一个方向图像
玩家必须快速反应,按下对应方向键

总结:游戏逻辑流程图
玩家连接 → 设置人数和背景

显示提示 → 倒计时开始

箭头每0.5秒变换 → 玩家按键匹配

匹配成功加分 → 倒计时结束 → 胜者公布

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2025-9-19 07:48:10

【花雕动手做】基于Kitronik可编程开发板之箭雨之战游戏

图形编程参考实验程序

【花雕动手做】基于Kitronik可编程开发板之箭雨之战游戏图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2025-9-19 07:50:43

【花雕动手做】基于Kitronik可编程开发板之箭雨之战游戏

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

【花雕动手做】基于Kitronik可编程开发板之箭雨之战游戏图4

实验场景记录

【花雕动手做】基于Kitronik可编程开发板之箭雨之战游戏图2

【花雕动手做】基于Kitronik可编程开发板之箭雨之战游戏图1

【花雕动手做】基于Kitronik可编程开发板之箭雨之战游戏图3

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2025-9-19 10:38:19

【花雕动手做】基于Kitronik可编程开发板之箭雨之战游戏

本帖最后由 驴友花雕 于 2025-9-19 13:57 编辑

【花雕动手做】基于Kitronik可编程开发板之箭雨之战游戏图1
回复

使用道具 举报

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

本版积分规则

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

硬件清单

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

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

mail