侵权投诉

Kitronik ARCADE游戏手柄实现连连看

电子森林 2021-09-08 11:47 次阅读

连连看相信大家都玩过,但这个用Kitronik AR CADE游戏手柄来玩连连看的项目你相信是一个高一学生做的吗?没错,这位来自重庆一所中学的高一学生经过他哥哥的推荐来参加我们的Funpack10期活动,并且他和他哥哥一人设计了一个游戏,属于自己的小游戏。下面就来看看连连看这款小游戏如何设计的吧。

项目链接:https://www.eetree.cn/project/detail/474 ,代码已开源在电子森林。

实现功能

本次FunPack活动可大致分为两个任务

移植或者设计一款游戏

设计一款摩斯密码练习器

在确定参加这期活动之后一直在纠结是按键游戏还是设计摩斯密码练习器,如果按键游戏又在游戏主题上摇摆不定,摩斯密码练习器又感觉是一个很麻烦的任务。恰巧在网络上乱翻时看到了连连看的算法思路,就选定了在Kitronik ARCADE上实现一款连连看游戏。

实现思路及代码介绍

连连看是一种很受大家欢迎的小游戏。下面四张图给出了最基本的消除规则:

f0fceb7e-0fe6-11ec-8fb8-12bb97331649.png

图 A 中出现在同一直线上无障碍的圈圈可以消除;图 B 中两个圈圈可以通过一次转弯消除;图 C 和图 D 中,两个圈圈可以通过两次转弯消除。

由于Kitronik ARCADE的屏幕一次只能完整显示10*7个图块,所以将地图设计为10*7大小。在游戏中使用数组的方式表示地图信息,使用不同的值表示不同的图块,0表示此位置为空,作为一个平面游戏,使用二维数组来保存地图信息最好理解,但由于makecode中函数接口只提供了一维数组。所以只能使用一维数组表示二维信息。创建一个大小为70的一维数组,对于数组中的数据,索引值index/10就是图块行Y的值,index%10即为图块列X的值。

图形显示以及选择实现

对于连连看这款游戏,大家多多少少都知道怎么玩,所以这里不介绍玩法。

一、地图创建以及显示

连连看游戏由不同的图块组成,上面介绍到地图信息确定为大小70的一维数组表示,且不同X、Y坐标位置的数值索引值都已经确定,则这里就会想到通过不同的值表示不同的图块,在游戏中一共使用了7个不同的图块,需要在设置图块地图时添加进入。

1、地图的创建

通过函数InitLevelOneImage,InitLeveTwoImage。。。初始化数组的方式初始化不同关卡地图信息。

2、地图的显示

遍历地图数组

通过索引位置确定图块位置信息

通过数组值将不同的图块放到确定的位置上

二、选择框的移动、消除、更新

1、选择框的创建

创建一个SelectBox对象用于表示选择框,将选择框与左上角第一个图块重叠(图块的大小为16*16,然后地图行列的间隔都是16,所以(8,8)为第一个图块位置)

2、选择框的移动

1)上

判断SelectBox对象是否在第一行(posY = 8),若在第一行则将图块移动到最后一行(第7行,posY = 104),若不在最上一行则直接往上移动一行(将posY减16)

2)下

与向上移动同理,判断SelectBox对象是否在最后一行(第七行,posY = 104),若在最后一行则将图块移动到第一行(posY = 8),若不在第七行则直接往下移动一行(将posY加16)

3)左

判断SelectBox对象是否在第一列(posX= 8),若在第一列则将图块移动到最右一列(第10列,posX = 152),若不在第一列则直接往左移动一列(将posX减16)

4)右

与左移同理,判断SelectBox对象是否在最后一列(第10列,posX= 152),若在最后一列则将图块移动到第一列(posX = 8),若不在最后一列则直接右移一列(将posX加16)

三、选定、取消、消除条件、消除完成判断、关卡更新

游戏中通过A按键选定图块,与选择框类似,只需要A按下时若当前位置不为空,且不为Choice精灵,则在当前选择框的位置创建Choice精灵即可,由于需要选择两个图块,所以A键按下时需要判断是否已经存在了一个Choice精灵(创建ChoiceBoxNums变量表示Choice精灵的数量),若存在则创建第二个Choice精灵,同时运行函数判断是否能被消除。

A按下(选定)

1)判断是否为空

2)若不为空且ChoiceBoxNums == 0时在当前位置创建ChoiceOne精灵,ChoiceBoxNums置1

3)若不为空且ChoiceBoxNums == 1且当前位置不为ChoiceOne位置,则创建ChoiceTwo精灵

消除条件

当ChoiceBoxNums == 2时,表示已经选定了两个图块,此时调用消除函数进行判断与消除。

消除完成判断及关卡更新

当地图数组全为0时表示消除完成,在每次进行判断消除之后进行一次判断是否消除完成,使用遍历数组然后相加的求和的方式得到和,若为0,则表示消除完。若消除完则根据关卡信息决定是进入下一关还是结束游戏。

地图初始化(关卡更新)

更新关卡只需要修改地图数组,然后更改一些特定的值即可完成新地图的载入,Levels表示当前关卡

消除算法

算法参考链接:https://blog.csdn.net/qq_41551359/article/details/82983513,并进行了简单的移植和更改。

设计函数isBlocked 表示x,y位置是否有图块(有无障碍),实现思路为查找数组Y*10+X索引处的值是否为0,若为0则表示此处为空,否则有障碍。

1、水平检测

水平检测用来判断两个点的纵坐标是否相等,同时判断两点间有没有障碍物。

定义函数horizon直接检测两点间是否有障碍物。

先判断A、B是否为同一个点

判断是否为水平关系

确定前后关系

使用循环遍历A、B中间的位格,若有一个为有图块则不能水平消除

2、垂直检测

垂直检测用来判断两个点的横坐标是否相等,同时判断两点间有没有障碍物。

与水平检测原理一致,定义函数vertical直接检测两点之间是否有障碍物

先判断A、B是否为同一个点

判断是否为垂直关系

确定上下关系

使用循环遍历A、B中间的位格,若有一个为有图块则不能水平消除

3、一个拐角检测

一个拐角检测可分解为水平检测和垂直检测,当两个同时满足时,便两点可通过一个拐角相连。即:

一个拐角检测 = 水平检测 && 垂直检测

A 点至 B 点能否连接可转化为满足任意一点:

A 点至 C 点的垂直检测,以及 C 点至 B 点的水平检测;

A 点至 D 点的水平检测,以及 D 点至 B 点的垂直检测。

定义函数 turn_once 用于一个拐角检测

判断A、B两点是否为同一点

判断C(X1,Y2)点是否为空

C、B水平检测&&A、C垂直检测,都满足则返回1

判断D(X2,Y1)是否为空

A、D水平检测&&B、D垂直检测,都满足则返回1

都不满足则返回0,表示不能一个拐点消除

4、两个拐角检测

两个拐角检测可分解为一个拐角检测和水平检测或垂直检测。即:

两个拐角检测 = 一个拐角检测 && (水平检测 || 垂直检测)

水平、垂直分别穿过 A B 共有四条直线,扫描直线上所有不包含 A B 的点,看是否存在一点 C ,满足以下任意一项:

A 点至 C 点通过水平或垂直检测,C 点至 B 点可通过一个拐角连接。(图中用 C 表示)

A 点至 C 点可通过一个拐角连接,C 点至 B 点通过水平或垂直连接。(图中用 C 下划线表示)

创建函数turn_twice用于两个拐角检测:

判断A、B两点是否为同一点

对地图数组进行遍历(temp_x 0-9,temp_y 0-6)

如果C点跟A、B两点都不为水平或者垂直关系,则跳过

若C点坐标为A或者B点,跳过

判断C点是否为空,若为空则跳过

A点与C点做一个拐角检测,C点与B点做水平检测或垂直检测,A、B两点关系都满足则返回1表示C点条件满足

B点与C点做一个拐角检测,C点与A点做水平检测或垂直检测,A、B两点关系都满足则返回1表示C点条件满足

否则返回0

5、算法整合

目前为止,连连看的基本算法都已经实现,整合创建一个remove函数判断相同图块的两点是否能通过以上四种算法消除。

判断两个点是否为同一图块

判断是否能水平消除,若能则将两个位置的数组内容置为0,表示空。

否则判断是否能垂直消除,若能则将两个位置的数组的内容置0

否则判断是否能一个拐点消除,若能则将两个位置的数组值置为0

否则判断两点能否两个拐点消除,若能则将两个位置的数组值置为0

不管是否消除两个图块,销毁两个选择框精灵,将选择框数量变量值置为0

演示说明

游戏开始,游戏地图初始化,开始倒计时。

按下A键选中方块,红框表示方框已选中,然后找到一个与此方块相同的方块,再次选中即可消除。

成功消除第一关全部方块后,自动开始下一关。

在规定时间内消除所有方块即可获胜

如果没有按时消除所有方块就会失败

心得体会

这是我第一次参加Funpack活动,这次活动使我感触很深,青少年可以低成本地通过Funpack的活动认识到游戏编译的乐趣,很有教育意义。

编辑:jq

原文标题:Kitronik ARCADE游戏手柄实现连连看 - Funpack10项目分享二

文章出处:【微信号:xiaojiaoyafpga,微信公众号:电子森林】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
分享:

评论

相关推荐

华为开发者HarmonyOS零基础入门:完善功能逻辑

华为开发者HarmonyOS零基础入门:逻辑代码相应调试,导入系统能力包,引用UI资源,调用系统能力....
的头像 lhl545545 发表于 10-23 10:38 140次 阅读
华为开发者HarmonyOS零基础入门:完善功能逻辑

HDC华为开发者大会2021:harmony OS提供全力技术支持

HDC华为开发者大会2021:鸿蒙零基础入门满足harmonyOS开发者各类学习需求,逐步丰富的示例....
的头像 lhl545545 发表于 10-23 09:35 137次 阅读
HDC华为开发者大会2021:harmony OS提供全力技术支持

荣获双奖|亮风台获“2021中国VR50强”企业和“VR/AR创新金奖”

10月19日,由工信部与江西省政府主办的2021年世界VR产业大会云峰会在江西南昌盛大开幕。2021....
的头像 亮风台 发表于 10-22 18:46 18次 阅读
荣获双奖|亮风台获“2021中国VR50强”企业和“VR/AR创新金奖”

横店圆明园 X 亮风台,用AR还原“火烧圆明园”震撼场景!

圆明园要不要重建?这个问题总是被大家提及。它不仅是一个皇家园林,更是告诫国人勿忘国耻的特殊“符号”。....
的头像 亮风台 发表于 10-22 18:44 12次 阅读
横店圆明园 X 亮风台,用AR还原“火烧圆明园”震撼场景!

微软官方开发的VS Code扩展介绍

【导语】:CodeTour(代码之旅)是微软官方开发的 VS Code 扩展,允许记录和回放代码的演....
的头像 数据分析与开发 发表于 10-22 17:13 221次 阅读

2021华为开发者大会:鸿蒙智联设备开发效率倍增

2021华为开发者大会:分布式应用服务开发环境,以用户为中心的自然智慧交互,突破跨端开发调试困难,丰....
的头像 lhl545545 发表于 10-22 15:57 301次 阅读
2021华为开发者大会:鸿蒙智联设备开发效率倍增

科技感拉满!皓丽成都教育装备展明天开展

参展企业1300余家 展出面积20万平方米 全国100强展会之一 第80届中国教育装备展示会 将于1....
发表于 10-22 14:21 19次 阅读
科技感拉满!皓丽成都教育装备展明天开展

DIY三通道程控直流电源

一、缘起  前段时间桌面上一直用着的IT6322突然坏了,于是一直缺多通道的直流电源用,本来想直接再....
发表于 10-22 13:50 8次 阅读
DIY三通道程控直流电源

怎样用printf 函数和getchar 函数去简化STM32串口数据的传输呢

printf 函数和getchar 函数有何功能? 怎样用printf 函数和getchar 函数去简化STM32串口数据的传输呢? ...
发表于 10-22 07:49 0次 阅读

怎样去设计一种基于单片机的智能窗帘呢

怎样去设计一种基于单片机的智能窗帘呢?怎样去编写其主函数代码呢?...
发表于 10-22 07:29 0次 阅读

STM32F103C8T6的串口配置步骤有哪些

STM32F103C8T6有哪几个串口? STM32F103C8T6的串口配置步骤有哪些?怎样去编写代码呢? ...
发表于 10-22 06:35 0次 阅读

虹科案例 | 新突破!虹科AR眼镜助力美国首例全膝关节置换手术

点击上面蓝字•关注我们访问www.hongarvr.com•了解更多案例介绍美国纽约特种外科医院(H....
的头像 宋子衿 发表于 10-21 17:38 14次 阅读
虹科案例 | 新突破!虹科AR眼镜助力美国首例全膝关节置换手术

C语言堆栈程序内存的分配

    程序内存的分配       一个由C/C++编译的程序占用的内存分为以下几个部分: 栈区(s....
的头像 嵌入式ARM 发表于 10-21 14:51 86次 阅读

ML规模复杂的相关基础架构

  Waze 是世界上最大的基于社区的交通和导航应用。该应用借助实时数据来帮助用户避开路上的障碍,享....
的头像 TensorFlow 发表于 10-21 14:07 142次 阅读

从存储器哪一个位置开始读取代码呢

代码是从哪里开始运行的? 从存储器哪一个位置开始读取代码呢?...
发表于 10-21 09:11 0次 阅读

串口通信的相关代码学习

怎样去编写一种简单的串口通信代码呢? 什么是SBUF? ...
发表于 10-21 09:10 0次 阅读

如何对STM32H747 / STM32H745进行测试

STM32H747/757系列产品有哪些性能? 如何对STM32H747 / STM32H745进行测试? ...
发表于 10-21 08:24 0次 阅读

怎样用最新版的MDK530去编译原来的代码呢

怎样用最新版的MDK530去编译原来的代码呢? MDK530编译为什么会出现ARM版本不符的问题? ...
发表于 10-21 07:26 0次 阅读

探究IntelliJ IDEA 中JAVA代码的任务标记

【任务标记是以注释的方式定义】 一、作用:1、可以大大的提高开发效率。代码量非常大的项目,在某一行中....
的头像 Android编程精选 发表于 10-20 17:10 240次 阅读
探究IntelliJ IDEA 中JAVA代码的任务标记

详细介绍go语言中的闭包的实现

什么是闭包? 什么场景下会用闭包 ? 本文对 go 语言中的闭包做了详细介绍。 闭包是由函数及其相关....
的头像 马哥Linux运维 发表于 10-20 16:18 242次 阅读

简述Python加速运行小窍门

Python 是一种脚本语言,相比 C/C++ 这样的编译语言,在效率和性能方面存在一些不足。但是,....
的头像 Linux爱好者 发表于 10-20 15:28 714次 阅读

简述ElasticSearch的实现

1.近实时搜索 1.1 实时与近实时 实时搜索(Real-time Search)很好理解,对于一个....
的头像 马哥Linux运维 发表于 10-20 14:45 253次 阅读

Python协程与JavaScript协程的对比及经验技巧

前言以前没怎么接触前端,对 JavaScript 的异步操作不了解,现在有了点了解。一查发现 Pyt....
的头像 马哥Linux运维 发表于 10-20 14:30 192次 阅读

设置I帧的QP的示例代码

  介绍 在有些应用中,发现I帧不够大。MPSoC VCU CtrlSW可以设置每一帧的QP大小。因....
的头像 FPGA开发圈 发表于 10-20 11:35 245次 阅读

国外嵌入式开源网站

转载于http://blog.chinaunix.net/uid-10696433-id-29358....
发表于 10-20 11:21 10次 阅读
国外嵌入式开源网站

IAP编程page0返回失败的问题总结

最近在支持客户的时候遇到这样一个问题:客户在做自己的二级boot loader,并且在使用LPC54....
的头像 恩智浦MCU加油站 发表于 10-20 10:59 221次 阅读
IAP编程page0返回失败的问题总结

pyBGAPI蓝牙代码库的软件结构

新的Python代码库-pyBGAPI可帮助开发人员通过Silicon Labs(亦称“芯科科技”)....
的头像 SiliconLabs 发表于 10-20 09:57 164次 阅读

无接口驱动程序基于ATEasy代码功能

作为一款新型的自动化测试软件,ATEasy 驱动程序为 ATEasy 应用程序提供了一种与设备或仪器....
的头像 广州虹科电子科技有限公司 发表于 10-20 09:29 142次 阅读

怎样去操作基于STM32F407 HAL库的Flash编程呢

怎样去操作基于STM32F407 HAL库的Flash编程呢? flash的写入操作是怎样的? ...
发表于 10-20 06:05 0次 阅读

如何去实现一种基于51最小系统的跑马灯设计

如何去实现一种基于51最小系统的跑马灯设计?...
发表于 10-20 06:01 0次 阅读

简述图像梯度的基本原理

当用均值滤波器降低图像噪声的时候,会带来图像模糊的副作用。我们当然希望看到的是清晰图像。那么,清晰图....
的头像 新机器视觉 发表于 10-19 16:22 165次 阅读
简述图像梯度的基本原理

深入探讨 Hilt的工作原理

所涉主题      多种 Hilt 注解协同工作并生成代码的方式。 当 Hilt 配合 Gradle....
的头像 谷歌开发者 发表于 10-19 15:11 201次 阅读
深入探讨 Hilt的工作原理

一文了解Cortex-M中断向量表对齐原则

来源 | 痞子衡嵌入式 一、Cortex-M中断向量表对齐原则   中断向量表就是一个集中保存系统全....
的头像 strongerHuang 发表于 10-19 11:06 234次 阅读
一文了解Cortex-M中断向量表对齐原则

艾迈斯欧司朗推出VCSEL 3D手势识别新品,使AR/VR交互体验更上一层楼

四个不同版本的Bidos P2433 Q产品支持先进的3D ToF系统,可用于AR/VR眼镜手势识别....
发表于 10-19 10:50 1019次 阅读
艾迈斯欧司朗推出VCSEL 3D手势识别新品,使AR/VR交互体验更上一层楼

中断优先级配置的函数有哪几种

中断优先级配置的函数有哪几种? 怎样去比较抢占优先级与响应优先级呢? ...
发表于 10-19 08:02 0次 阅读

AR眼镜进入军事没那么容易,微软200万亿美元订单延期交付

AR技术将真实世界信息和虚拟世界信息进行“无缝”集成,并通过AR眼镜等终端设备给消费者带来沉浸式体验....
的头像 Monika观察 发表于 10-17 10:31 990次 阅读
AR眼镜进入军事没那么容易,微软200万亿美元订单延期交付

Facebook最新开发出了更智能的机器人和AR 眼镜

Facebook为了让未来成为现实。 Facebook 的首席研究科学家克里斯汀·格劳曼 (Kris....
的头像 鲸准科技 发表于 10-15 17:48 199次 阅读
Facebook最新开发出了更智能的机器人和AR 眼镜

关于Python18个你不知道的高效编程技巧

初识Python语言,觉得python满足了我上学时候对编程语言的所有要求。python语言的高效编....
的头像 马哥Linux运维 发表于 10-15 11:23 278次 阅读

PCB的设计、打板和焊接

最近MicroPython在嵌入式系统领域受到大家的喜爱,攻城狮们都纷纷研究起来,就连我们Funpa....
的头像 电子森林 发表于 10-15 10:04 236次 阅读

能快速找到代码运行最慢部分的编程神器

天下武功,唯快不破。 编程也不例外,你的代码跑的快,你能快速找出代码慢的原因,你的码功就高。 今天分....
的头像 Linux爱好者 发表于 10-13 16:40 148次 阅读

动态内存分配的注意事项及本质是什么

C语言中比较重要的就是指针,它可以用来链表操作,谈到链表,很多时候为此分配内存采用动态分配而不是静态....
的头像 C语言编程学习基地 发表于 10-13 15:37 282次 阅读
动态内存分配的注意事项及本质是什么

ACL2021的跨视觉语言模态论文之跨视觉语言模态任务与方法

来自:复旦DISC 引言 本次分享我们将介绍三篇来自ACL2021的跨视觉语言模态的论文。这三篇文章....
的头像 深度学习自然语言处理 发表于 10-13 10:48 255次 阅读
ACL2021的跨视觉语言模态论文之跨视觉语言模态任务与方法

浅析机器人认路的技术SLAM

SLAM (simultaneous localization and mapping),也称为CM....
的头像 新机器视觉 发表于 10-13 10:38 259次 阅读

一文详解虚函数及其相关知识点

本期是C++基础语法分享的第七节,今天给大家来分享一下: (1)虚析构函数; (2)纯虚函数; (3....
的头像 C语言编程学习基地 发表于 10-13 10:14 242次 阅读

用Python实现3D地图教程

前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题....
的头像 马哥Linux运维 发表于 10-13 10:09 207次 阅读
用Python实现3D地图教程

关于Python对交通路口的红绿灯进行颜色检测

转自 |   Python联盟 1.视频读取 首先把视频读取进来,因为我测试的视频是4k的所以我用r....
的头像 新机器视觉 发表于 10-13 09:32 272次 阅读
关于Python对交通路口的红绿灯进行颜色检测

spring中声明式事务实现原理猜想

  @Transactional注解简介 @Transactional 是spring中声明式事务管....
的头像 Android编程精选 发表于 10-13 09:20 221次 阅读

xv6的文件系统是如何实现的

文件系统 本文继续来看 的文件系统部分, 将文件系统的设计分为 7 层: ,磁盘、缓存区、日志三个部....
的头像 Linux阅码场 发表于 10-12 18:00 164次 阅读
 xv6的文件系统是如何实现的

Linux中匿名页的访问分析

Linux 中 有后备文件支持的页称为文件页,如属于进程的代码段、数据段的页,内存回收的时候这些页面....
的头像 Linux阅码场 发表于 10-12 17:52 188次 阅读

处理器中异常和中断解决

异常是能够引起程序流偏离正常流程的事件,当异常发生时,正在执行的程序就会被挂起,处理器转而执行一块与....
的头像 单片机匠人 发表于 10-12 17:14 307次 阅读

三星W22折叠屏新机即将发布

三星公司与中国电信联手推出W系列新机三星W22智能新旗舰将于明日(10月13日)正式推出,三星W22....
的头像 lhl545545 发表于 10-12 16:53 649次 阅读

RUST的真实驱动案例

我们无法确定RUST在内核的最终趋势,有多少人愿意迁移,但是至少Linus愿意试水。 Wedson ....
的头像 Linux阅码场 发表于 10-12 15:59 126次 阅读
RUST的真实驱动案例

那些有着巨大影响力的代码盘点

2009 年,Facebook 推出了一份改变世界的代码——点「赞」按钮。「赞」是包括 Leah P....
的头像 strongerHuang 发表于 10-12 15:46 216次 阅读
那些有着巨大影响力的代码盘点

AR眼镜中的光学技术揭秘

之前我们在谈智能眼镜单、双目的时候(点此访问),简单提到了光波导等光学显示系统相关的问题,今天这篇文....
的头像 广州虹科电子科技有限公司 发表于 10-12 15:12 1672次 阅读
AR眼镜中的光学技术揭秘

那些书本上都没有提到的C语言volatile用法

许多程序员都无法正确理解C语言关键字volatile,这并不奇怪。因为大多数C语言书籍通常都是一两句....
的头像 STM32嵌入式开发 发表于 10-12 14:47 1127次 阅读
那些书本上都没有提到的C语言volatile用法

什么是MicroPython 它能做什么有什么局限

随着Python成为主流的编程语言,MicroPython在嵌入式系统领域也越来越热门起来,尤其是大....
的头像 电子森林 发表于 10-12 11:44 282次 阅读