【花雕动手做】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实验参考代码

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

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

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

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

arrow: Sprite = None
arrow_list: List[Image] = []
scene.set_background_image(assets.image("""
    2pbg
    """))

def on_wrap1():
    mp.set_player_sprite(mp.player_selector(mp.PlayerNumber.ONE),
        sprites.create(assets.image("""
            p1
            """), SpriteKind.player))
    mp.get_player_sprite(mp.player_selector(mp.PlayerNumber.ONE)).set_position(40, 90)
bundles.wrap1(on_wrap1)

def on_wrap2():
    mp.set_player_sprite(mp.player_selector(mp.PlayerNumber.TWO),
        sprites.create(assets.image("""
            p2
            """), SpriteKind.player))
    mp.get_player_sprite(mp.player_selector(mp.PlayerNumber.TWO)).set_position(120, 90)
bundles.wrap2(on_wrap2)

def on_wrap3():
    global arrow_list, arrow
    arrow_list = [assets.image("""
            0
            """),
        assets.image("""
            1
            """),
        assets.image("""
            2
            """),
        assets.image("""
            3
            """)]
    arrow = sprites.create(img("""
        .
        """), SpriteKind.player)
    arrow.set_position(80, 30)
bundles.wrap3(on_wrap3)

def on_wrap4():
    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)
bundles.wrap4(on_wrap4)

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

代码解读

  1. 方向按钮事件处理
    上方向键处理
    python
    def on_button_multiplayer_up_pressed(player2):
    mp.get_player_sprite(player2).set_image(assets.image(“0”)) # 设置玩家图像为上箭头
    if arrow.image.equals(assets.image(“0”)): # 如果与当前箭头匹配
    mp.change_player_state_by(player2, MultiplayerState.score, 1) # 得分+1
    右方向键处理
    python
    def on_button_multiplayer_right_pressed(player22):
    mp.get_player_sprite(player22).set_image(assets.image(“2”)) # 设置玩家图像为右箭头
    if arrow.image.equals(assets.image(“2”)): # 如果与当前箭头匹配
    mp.change_player_state_by(player22, MultiplayerState.score, 1) # 得分+1
    左方向键处理
    python
    def on_button_multiplayer_left_pressed(player23):
    mp.get_player_sprite(player23).set_image(assets.image(“1”)) # 设置玩家图像为左箭头
    if arrow.image.equals(assets.image(“1”)): # 如果与当前箭头匹配
    mp.change_player_state_by(player23, MultiplayerState.score, 1) # 得分+1
    下方向键处理
    python
    def on_button_multiplayer_down_pressed(player24):
    mp.get_player_sprite(player24).set_image(assets.image(“3”)) # 设置玩家图像为下箭头
    if arrow.image.equals(assets.image(“3”)): # 如果与当前箭头匹配
    mp.change_player_state_by(player24, MultiplayerState.score, 1) # 得分+1

  2. 游戏初始化
    背景设置
    python
    scene.set_background_image(assets.image(“2pbg”)) # 设置双人游戏背景
    玩家1设置
    python
    def on_wrap1():
    mp.set_player_sprite(mp.player_selector(mp.PlayerNumber.ONE),
    sprites.create(assets.image(“p1”), SpriteKind.player)) # 创建玩家1精灵
    mp.get_player_sprite(mp.player_selector(mp.PlayerNumber.ONE)).set_position(40, 90) # 设置位置
    玩家2设置
    python
    def on_wrap2():
    mp.set_player_sprite(mp.player_selector(mp.PlayerNumber.TWO),
    sprites.create(assets.image(“p2”), SpriteKind.player)) # 创建玩家2精灵
    mp.get_player_sprite(mp.player_selector(mp.PlayerNumber.TWO)).set_position(120, 90) # 设置位置
    箭头系统初始化
    python
    def on_wrap3():
    global arrow_list, arrow
    arrow_list = [assets.image(“0”), # 上箭头
    assets.image(“1”), # 左箭头
    assets.image(“2”), # 右箭头
    assets.image(“3”)] # 下箭头

    arrow = sprites.create(img(“.”), SpriteKind.player) # 创建箭头精灵
    arrow.set_position(80, 30) # 设置在屏幕上方中央
    游戏启动
    python
    def on_wrap4():
    game.splash(“Be the quickest to match”, “arrow directions to win!”) # 显示游戏说明
    carnival.start_countdown_game(15, carnival.WinTypes.MULTI) # 15秒倒计时,多人模式
    music.play_sound_effect(…) # 播放音效

  3. 游戏循环 - 箭头更新
    python
    def on_update_interval():
    arrow.set_image(arrow_list._pick_random()) # 随机选择箭头方向
    game.on_update_interval(500, on_update_interval) # 每500毫秒更新一次

游戏机制总结
反应测试游戏:玩家需要快速响应屏幕上显示的箭头方向
多人竞争:支持两名玩家同时游戏
视觉反馈:
屏幕中央显示随机方向的箭头
玩家按下按钮时,角色图像会变成对应的箭头
得分系统:
只有当玩家按下的方向与屏幕箭头匹配时才得分
使用MultiplayerState.score跟踪玩家分数
时间限制:游戏设置为15秒倒计时模式
音频反馈:游戏开始时播放三角波音效

技术特点
使用bundles模块:通过bundles.wrap1()到bundles.wrap4()组织初始化代码
图像资源管理:使用预定义的图像资源(“0”, “1”, “2”, "3"代表不同方向)
随机化机制:使用_pick_random()方法随机选择箭头方向
多人游戏支持:通过mp(multiplayer)模块处理多玩家交互

图形编程参考实验程序

在这里插入图片描述

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

在这里插入图片描述

实验场景记录

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值