Funpack第十期用Kitronik ARCADE网游戏——莫斯电码训练器
Funpack第十期 Kitronik ARCADE 莫斯电码 图形化编程 javascript
标签
测试
显示
happy
更新2021-08-26
589

   硬件介绍:Kitronik ARCADE是一款功能丰富的可编程游戏手柄,搭配微软MakeCode Arcade编辑器一起使用。硬件上: 一个全彩的LCD屏幕(用来显示)、 一个压电蜂鸣器(用来播放音乐)、 一个振动马达、 六个输入按钮。整体就是一个手持游戏机造型。

    任务:这里选择的是任务二,设计一个摩斯密码练习器,完成了LCD屏上随机出现一个字符,敲出对应的组合(3-5个字符即可),正确时,蜂鸣器响;错误时,振动电机发出振动 的任务。

    实现过程
    这次的任务非常有趣。拿到了板子后,上网一搜才发现,这个微软基于图形化编程项目还挺火的,很多教育资源都在抢这个蛋糕。使用图形化编程,基于单片机,面向儿童、青少年的编程课。看了一些课程,这个图形化编程,基本都是围绕角色扮演类的游戏开发的。回到任务,要实现摩斯码的练习,角色扮演似乎不是个好的框架。
    结合直播课的讲解,和在群里的学习,使用童工事件驱动的方式来实现本次任务。Fg8a8z1zBSMfh849uqG6r2Hv0BTa

        Foa-a-Ad3Bn8EGd0-JhpYZzWYfDF程序开始,先展示一段游戏操作说明,按A键开始。在游戏中添加一个精灵,用他来说出待输入的字母(数字)。待输入的字母(数字)用一个数组来保存,数组的下标从0到36,然后使用一个随机数,随机选择一个字符,由精灵通过说话的方式输出到屏幕。
    接下来就由键盘来触发各类事件了。当左键被按下时:给字符串增加一个“.”,然后在屏幕上显示一个“.”然后用蜂鸣器发出一声“滴”。当右键按下时:给字符串增加一个“-”,在屏幕上显示“-”,并发出“哒”的声音。这里屏幕上显示,点和横都是是在屏幕上绘制一个小方块,所不同的是小方块的宽度不同。当输错时,允许回退修改。按上键即为消除上一个输入,在屏幕上将上一个点或横的字符消除掉。这里的消除也是通过绘制小方块来实现的,就是绘制一个与背景颜色相同的横的方块。

function drawmos (x: number, valtype: number) {
    if (valtype == 0) {
        picture.fillRect((posx * 8 + 3) % 160, 50 + posy * 10, 2, 2, 13)
    } else if (valtype == 1) {
        picture.fillRect(posx * 8 % 160, 50 + posy * 10, 6, 2, 13)
    } else if (valtype == 2) {
        picture.fillRect(posx * 8 % 160, 50 + posy * 10, 6, 2, 8)
    }
}

    FjSmhzkz7Y_FH173GM6b9wgcycL_按键A被按下:这里是逻辑判断最多的一个处理了。1: 要判断是否有摩斯码输入。如果没有任何输入,则不作响应。2:有输入,但是输入的是不认识的摩斯码,生命值减一,电机长抖动(500毫秒),响失败音乐。3:有输入,但是根据输入识别出的字母不是要求的字母,生命值减一,电机短抖动(200毫秒)。4:有输入,且翻译后是要求的字母。播放魔棒音乐,记录成功次数。5:判断完输入后,如果生命值(3条)用完,则失败,结束游戏。6:若成功次达到5次,则成功,游戏结束。7:若生命值也没用完,成功次数也没到5次,则继续随机生成一个字母,继续游戏。
   

function translation (instr: string) {
    if (instr == ".-") {
        echostr = "A"
    } else if (instr == "-...") {
        echostr = "B"
    } else if (instr == "-.-.") {
        echostr = "C"
    } else if (instr == "-..") {
        echostr = "D"
    } else if (instr == ".") {
        echostr = "E"
    } else if (instr == "..-.") {
        echostr = "F"
    } else if (instr == "--.") {
        echostr = "G"
    } else if (instr == "....") {
        echostr = "H"
    } else if (instr == "..") {
        echostr = "I"
    } else if (instr == ".---") {
        echostr = "J"
    } else if (instr == "-.-") {
        echostr = "K"
    } else if (instr == ".-..") {
        echostr = "L"
    } else if (instr == "--") {
        echostr = "M"
    } else if (instr == "-.") {
        echostr = "N"
    } else if (instr == "---") {
        echostr = "O"
    } else if (instr == ".--.") {
        echostr = "P"
    } else if (instr == "--.-") {
        echostr = "Q"
    } else if (instr == ".-.") {
        echostr = "R"
    } else if (instr == "...") {
        echostr = "S"
    } else if (instr == "-") {
        echostr = "T"
    } else if (instr == "..-") {
        echostr = "U"
    } else if (instr == "...-") {
        echostr = "V"
    } else if (instr == ".--") {
        echostr = "W"
    } else if (instr == "-..-") {
        echostr = "X"
    } else if (instr == "-.--") {
        echostr = "Y"
    } else if (instr == "--..") {
        echostr = "Z"
    } else if (instr == "-----") {
        echostr = "0"
    } else if (instr == ".----") {
        echostr = "1"
    } else if (instr == "..---") {
        echostr = "2"
    } else if (instr == "...--") {
        echostr = "3"
    } else if (instr == "....-") {
        echostr = "4"
    } else if (instr == ".....") {
        echostr = "5"
    } else if (instr == "-....") {
        echostr = "6"
    } else if (instr == "--...") {
        echostr = "7"
    } else if (instr == "---..") {
        echostr = "8"
    } else if (instr == "----.") {
        echostr = "9"
    }
    return echostr
}

    这个函数是用来翻译摩斯码的函数,将由点横组成的字符串作为入口参数,通过匹配,寻找到对应的字母(数字),并返回。这里对摩斯码还不够熟悉,看各种介绍,应该可以通过二叉树的方式进行摩斯码识别,这样搜索步数会变少,复杂度能降到Log2n,效率会更好。现在的复杂度应该是n/2,但是这里只有36个字母,使用什么方法,都不会有太大影响。就使用全局搜索啦!
    在功能实现后,发现一个问题。待输入的字母(数字)是使用精灵说这个动作的,可以设定时长。但是时长不好控制。太短了,待输入字符很快就消失了。有时需要去查摩斯电码,时间不好控,所以增加一个事件,设置显示待输入字符为3秒,小时后,如果按下B键,则显示待输入的字符。完美解决这个问题。
    完整的程序:摩斯码练习
Fm2IgvlgUR1XhRUVrQ8eadPrqdWgFlKKoEqqnwUVIrS4OUTYNkI4DXEK

    遇到的问题:1 电机振动的问题。当游戏失败时,游戏结束,电机会振动,但是会一直振动,需要复位,或者按A键重新开始才能停,不知怎么解决。2 访问微软的编程网站,是没有电机振动这个插件的,就算将电机振动的代码拷贝过来也没用。所以本项目是直接修改直播课中提供的那个吃电池的游戏,这样才能使用振动。3 遇到了用usb烧写游戏后,启动游戏,游戏画面抖动、翻动、自动变色。拔掉usb线,用电池供电就正常。不知是不是个案。

    心得体会:非常开心参与这次活动。这个游戏手柄超好玩,绝对的亲子利器。可以借学习之名大胆玩游戏啦!哈哈!

附件下载
arcade-摩斯码练习.uf2
团队介绍
团队成员
happy
aramy
单片机业余爱好者,瞎捣鼓小能手。
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号