关注

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

在这里插入图片描述
《Arduino 手册(思路与案例)》栏目介绍:
在电子制作与智能控制的应用领域,本栏目涵盖了丰富的内容,包括但不限于以下主题:Arduino BLDC、Arduino CNC、Arduino E-Ink、Arduino ESP32 SPP、Arduino FreeRTOS、Arduino FOC、Arduino GRBL、Arduino HTTP、Arduino HUB75、Arduino IoT Cloud、Arduino JSON、Arduino LCD、Arduino OLED、Arduino LVGL、Arduino PID、Arduino TFT,以及Arduino智能家居、智慧交通、月球基地、智慧校园和智慧农业等多个方面与领域。不仅探讨了这些技术的基础知识和应用领域,还提供了众多具体的参考案例,帮助读者更好地理解和运用Arduino平台进行创新项目。目前,本栏目已有近4000篇相关博客,旨在为广大电子爱好者和开发者提供全面的学习资源与实践指导。通过这些丰富的案例和思路,读者可以获取灵感,推动自己的创作与开发进程。
https://blog.csdn.net/weixin_41659040/category_12422453.html

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

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

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

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

主要特征:
Kitronik ARCADE 是一款功能丰富的手持游戏手柄开发板,可与 Microsoft Arcade 编辑器一起使用。
编写您自己的游戏来玩或从 MakeCode Arcade 网站免费下载游戏。
使用丰富的教育材料从头开始创建游戏,或调整现有代码并学习开源方式。
它配备了全彩液晶广视角屏幕。
它有一个用于音频反馈的压电发声器。
利用振动电机进行触觉反馈。
它还具有;6 个玩家输入按钮、一个菜单按钮、一个重置按钮和一个开/关开关。
还有一个软件音量控制、一个 USB 编程端口和 2 个扩展端口,供专家级用户使用。
ARCADE 可以由 3xAA 电池或微型 USB 连接器供电。

在这里插入图片描述

Kitronik ARCADE 是一款专为与 MakeCode Arcade 编辑器一起使用而设计的掌上游戏平台,既可以编写自己的游戏并在 ARCADE 上运行它们,也可以下载现有游戏并享受功能齐全的掌上游戏体验。(网页版:https://arcade.makecode.com/)

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

在这里插入图片描述

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

MicroPython实验代码

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

def on_player3_connected():
    scene.set_background_image(assets.image("""
        3pbg
        """))
    set_players(3)
controller.player3.on_event(ControllerEvent.CONNECTED, on_player3_connected)

def on_button_multiplayer_left_pressed(player2):
    mp.get_player_sprite(player2).set_image(assets.image("""
        1
        """))
    if arrow.image.equals(assets.image("""
        1
        """)):
        mp.change_player_state_by(player2, MultiplayerState.score, 1)
mp.on_button_event(mp.MultiplayerButton.LEFT,
    ControllerButtonEvent.PRESSED,
    on_button_multiplayer_left_pressed)

def on_button_multiplayer_down_pressed(player22):
    mp.get_player_sprite(player22).set_image(assets.image("""
        3
        """))
    if arrow.image.equals(assets.image("""
        3
        """)):
        mp.change_player_state_by(player22, MultiplayerState.score, 1)
mp.on_button_event(mp.MultiplayerButton.DOWN,
    ControllerButtonEvent.PRESSED,
    on_button_multiplayer_down_pressed)

def on_player4_connected():
    scene.set_background_image(assets.image("""
        4pbg
        """))
    set_players(4)
controller.player4.on_event(ControllerEvent.CONNECTED, on_player4_connected)

def on_button_multiplayer_right_pressed(player23):
    mp.get_player_sprite(player23).set_image(assets.image("""
        2
        """))
    if arrow.image.equals(assets.image("""
        2
        """)):
        mp.change_player_state_by(player23, MultiplayerState.score, 1)
mp.on_button_event(mp.MultiplayerButton.RIGHT,
    ControllerButtonEvent.PRESSED,
    on_button_multiplayer_right_pressed)

def set_players(num: number):
    sprites.destroy_all_sprites_of_kind(SpriteKind.player)
    index = 0
    while index <= num - 1:
        mp.set_player_sprite(mp.index_to_player(index),
            sprites.create(assets.image("""
                0
                """), SpriteKind.player))
        mp.get_player_sprite(mp.index_to_player(index)).change_scale(0.75, ScaleAnchor.MIDDLE)
        mp.get_player_sprite(mp.index_to_player(index)).set_position(80 / num * index + 80 / num * (index + 1), 90)
        index += 1

def on_button_multiplayer_up_pressed(player24):
    mp.get_player_sprite(player24).set_image(assets.image("""
        0
        """))
    if arrow.image.equals(assets.image("""
        0
        """)):
        mp.change_player_state_by(player24, MultiplayerState.score, 1)
mp.on_button_event(mp.MultiplayerButton.UP,
    ControllerButtonEvent.PRESSED,
    on_button_multiplayer_up_pressed)

arrow: Sprite = None
scene.set_background_image(assets.image("""
    2pbg
    """))
arrow_list = [assets.image("""
        0
        """),
    assets.image("""
        1
        """),
    assets.image("""
        2
        """),
    assets.image("""
        3
        """)]
arrow = sprites.create(img("""
        . . . . . . . . . . . . . . . .
        . . . . . . . . . . . . . . . .
        . . . . . . . . . . . . . . . .
        . . . . . . . . . . . . . . . .
        . . . . . . . . . . . . . . . .
        . . . . . . . . . . . . . . . .
        . . . . . . . . . . . . . . . .
        . . . . . . . . . . . . . . . .
        . . . . . . . . . . . . . . . .
        . . . . . . . . . . . . . . . .
        . . . . . . . . . . . . . . . .
        . . . . . . . . . . . . . . . .
        . . . . . . . . . . . . . . . .
        . . . . . . . . . . . . . . . .
        . . . . . . . . . . . . . . . .
        . . . . . . . . . . . . . . . .
        """),
    SpriteKind.Arrow)
arrow.set_position(80, 30)
set_players(2)
game.splash("Be the quickest to match", "arrow directions to win!")
carnival.start_countdown_game(15, carnival.WinTypes.MULTI)
music.play_sound_effect(music.create_sound_effect(WaveShape.TRIANGLE,
        4750,
        4783,
        255,
        0,
        449,
        SoundExpressionEffect.NONE,
        InterpolationCurve.CURVE),
    SoundExpressionPlayMode.UNTIL_DONE)

def on_update_interval():
    arrow.set_image(arrow_list._pick_random())
game.on_update_interval(500, on_update_interval)

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

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

核心模块解读
1、SpriteKind.Arrow 定义箭头类型
python
@namespace
class SpriteKind:
Arrow = SpriteKind.create()
创建一个新的精灵类型 Arrow,用于区分箭头精灵和玩家精灵

2、玩家连接事件:设置背景和人数
python
def on_player3_connected():
scene.set_background_image(assets.image(“3pbg”))
set_players(3)
玩家3连接时,切换背景图为 3pbg,并设置为3人模式
同理,玩家4连接时切换为 4pbg,设置4人模式

3、玩家按键事件:图像匹配 + 加分逻辑
python
def on_button_multiplayer_left_pressed(player2):
mp.get_player_sprite(player2).set_image(assets.image(“1”))
if arrow.image.equals(assets.image(“1”)):
mp.change_player_state_by(player2, MultiplayerState.score, 1)
玩家按下左键时,角色图像变为“左箭头”
如果当前箭头图像也是“左箭头”,则加分
同理,UP/DOWN/RIGHT 都有对应逻辑

4、set_players(num):初始化玩家精灵
python
sprites.destroy_all_sprites_of_kind(SpriteKind.player)

mp.set_player_sprite(mp.index_to_player(index), sprites.create(…))
清除旧玩家精灵
创建新的玩家精灵并设置位置、缩放
自动根据人数平均分布在屏幕底部

5、箭头精灵初始化
python
arrow = sprites.create(img(…), SpriteKind.Arrow)
arrow.set_position(80, 30)
创建一个空白箭头精灵,放在屏幕中央
后续会不断更新图像为随机箭头

6、游戏开始提示 + 倒计时挑战
python
game.splash(“Be the quickest to match”, “arrow directions to win!”)
carnival.start_countdown_game(15, carnival.WinTypes.MULTI)
显示游戏提示
启动15秒倒计时挑战,胜者为得分最高者

7、音效启动
python
music.play_sound_effect(music.create_sound_effect(…))
播放启动音效,增强氛围感

8、箭头图像随机更新
python
def on_update_interval():
arrow.set_image(arrow_list._pick_random())
game.on_update_interval(500, on_update_interval)
每 500 毫秒更新一次箭头图像
从 arrow_list 中随机选一个方向图像
玩家必须快速反应,按下对应方向键

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

显示提示 → 倒计时开始

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

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

图形编程参考实验程序

在这里插入图片描述

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

在这里插入图片描述

实验场景记录

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

转载自CSDN-专业IT技术社区

版权声明:本文为博主原创文章,遵循 CC 4.0 BY 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/weixin_41659040/article/details/151838738

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--