用App Designer 制作2048小游戏

用App Designer制作的2048,MATLAB版本是2020b。记录下创作思路,以免日后忘记。

APP界面设计

APP界面如下,为了好玩,还加入了游戏进行时播放音乐的功能。
下面是游戏结束界面:

除了按钮和开关部分,其余都可用标签控件制作。游戏结束界面在制作时将其Visible属性设为Off(确保在主界面上层),当判定游戏结束时再将Visible属性修改为On即可。

               app.gameOverLabel.Visible = 'on';app.gameOverLabel2.Visible = 'on';app.gameOverLabel3.Visible = 'on';

标签和按钮上的文字通过其Text属性修改
按钮上的图案可通过修改其Icon属性改变

规则设计

游戏每一步可以选择“上、下、左、右”中的一项操作,每项操作需关注三点,一是数字格向空白格的转移,二是相同数字格的合并相加,三是移动完成后会随机将一个空白格变为2。

我们不可能直接对方格进行操作,考虑将其与一个4×44\times44×4矩阵对应起来,则数字格向空白格的转移可以这样做:
设有2×32\times32×3矩阵A\bm{A}A
[102345]\left[\begin{array}{l} 1 &0 &2 \\ 3 &4 &5 \end{array}\right][13​04​25​]
现要把第二行“向上推”,即要使数字“4”的位置由(2,2)(2,2)(2,2)变为(1,2)(1,2)(1,2),而(2,2)(2,2)(2,2)在数字“4”被“推走”后变为0,矩阵A\bm{A}A变为A′\bm{A^{'}}A′
[142305]\left[\begin{array}{l} 1 &4 &2 \\ 3 &0 &5 \\ \end{array}\right][13​40​25​]
设有一个1×31\times31×3的临时矩阵T\bm{T}T,A\bm{A}A从第二行取出T\bm{T}T加到第一行得到A′\bm{A^{'}}A′
A′=A−(0T)+(T0)\bm{A^{'}}= \bm{A}- \left(\begin{array}{l}\bm{0} \\ \bm{T}\end{array}\right) + \left(\begin{array}{l}\bm{T} \\ \bm{0}\end{array}\right)A′=A−(0T​)+(T0​)
那么不难得到T=[040]\bm{T}=[0\quad4\quad0]T=[040]
如何计算呢?
只需用A(2,:)\bm{A}(2,:)A(2,:)点乘[010][0\quad1\quad0][010],[010][0\quad1\quad0][010] 就是将A(1,:)\bm{A}(1,:)A(1,:)非零元素变为000,零元素变为111得到的。
T=A(2,:)⊙∼A(1,:)\bm{T} = \bm{A}(2,:)\odot \thicksim\bm{A}(1,:) T=A(2,:)⊙∼A(1,:)

            temp = ~app.theMatrix(4-i,:).*app.theMatrix(5-i,:);app.theMatrix(4-i,:) = app.theMatrix(4-i,:) + temp;app.theMatrix(5-i,:) = app.theMatrix(5-i,:) - temp;

相同数字格的合并相加也有类似的计算方法。
在空白格随机生成数字“2”怎么实现呢?
首先要确定空白格的位置,即矩阵中零元素的位置。在MATLAB中用find()函数来获取目标元素的索引。

         zeroIndex = find(app.theMatrix == 0);

然后用randperm()生成一个随机整数,这个随机整数不能大于矩阵零元素的个数。我们利用这个随机整数来确定一个零元素的位置,然后以“2”替换该零元素。
当矩阵中没有零元素,并且相邻元素也各不相同时,应当判定游戏结束。

后端到前端

要把矩阵映射到游戏主界面,有两个需求:一是对应位置的数字显示,其中“0”不显示;二是不同数字对应着不同的背景颜色。这个只需要对每个方格的Text属性和BackGroundColor属性依次赋值就行,注意Text属性应当用字符串类型赋值,为此可以使用string()函数将数值矩阵转换为字符串矩阵。

            strMatrix = string(app.theMatrix);

特别地,零元素应当转换成空字符串。

            strZeroIndex = strMatrix == "0";strMatrix(strZeroIndex) = "";

每进行一步操作都要将主界面更新一遍,在此更新中分数界面应当一并更新。

按钮回调

按前面所说的方式分别设计向上键、向下键、向左键和向右键的回调函数,包含两部分:一是对矩阵进行修改,二是将修改后的矩阵映射到主界面。点击按钮的任务用键盘也能完成,我们可以添加键盘回调,并在其中关联按钮回调。使用WindowKeyRelease将会按键释放时执行回调。

        function UIFigureWindowKeyRelease(app, event)key = event.Key;switch(key)case {"uparrow","w"}app.buttonUpButtonPushed();case {"downarrow","s"}app.buttonDownButtonPushed(); case {"leftarrow","a"}app.buttonLeftButtonPushed();case {"rightarrow","d"}app.buttonRightButtonPushed(); endend

除了上下左右键,这里还设计了“重新游戏”和“清除”。“重新游戏”将会清零所得分,使游戏主界面恢复到初始状态。游戏中的最高分将会保存到文件中,下次打开APP时,程序会读取文件记录的最高分。使用“重新游戏”并不会清除最高分记录,而使用“清除”将会修改文件记录的最高分为0。
如果使用fread()和fwrite()读写文件,注意读写格式。若使用默认的读写格式,可能会因位数不够而无法读写较大的游戏分数。

            f = fopen(app.dataPath,'r');if f>0app.bestScore = fread(f,'int32');fclose(f);end

运行方式

在我们运行程序后,首先APP界面及我们添加的控件会被加载出来,然后执行startupFcn()函数。在此之后,程序会等待我们触发回调,当回调对应的event发生时,执行回调。
以本项目为例,startupFcn()函数如下

        function startupFcn(app)app.loadMusic(); app.scoreStart();app.nextStep();app.nextStep();end

首先,用loadMusic()函数加载音乐,之后我们可以用开关来控制音乐的暂停和播放。接下来用scoreStart()将得分清零,并从文件中读取最高分。然后使用nextStep()刷新界面,因为游戏初始有两个“2”,而nextStep()只能产生一个,所以使用两次。


关于批量创建控件

App Designer可以使用代码快速创建控件。如本例的16个数字方格,我们可以通过循环的方式快速创建控件并完成配置。
首先在properties中添加控件名,如

        Num                 matlab.ui.control.Label

其中,Num是控件名,后面的 matlab.ui.control.Label 表明了Num是Label控件。之后,我们写一个创建控件的函数。

        function  createNum(app)for i=1:4for j=1:4app.Num(i,j) = uilabel(app.UIFigure);app.Num(i,j).BackgroundColor = [0.902 0.902 0.8];app.Num(i,j).HorizontalAlignment = 'center';app.Num(i,j).FontName = 'Calibri';app.Num(i,j).FontSize = 40;app.Num(i,j).Position = [-60+100*j 440-100*i 90 90];app.Num(i,j).Text = ''; endendend

注意需要在properties中声明Num的类型才能对控件的属性进行点索引。


对应的工程文件包
2048小游戏——基于MATLAB App Designer
因为包含了音乐文件,所以比较大。

用App Designer 制作2048小游戏相关推荐

  1. 使用Pygame制作2048小游戏

    好久没有写文章了,暑假一直没有怎么学习计算机方面的相关知识,不过倒是坚持背了一个多月的单词红宝书,看了汤神的基础课.真的没想到自己居然也能有毅力背了150多页的单词,还写完了一本正反面的字帖这些事以前 ...

  2. Python小游戏——Pygame制作2048小游戏

    pygame之2048小游戏 初学python,发现看网上的python理论太过枯燥. 哎嘿~~干脆直接弄个小游戏叭,一边学习,一边写代码. 备注: 1.很多地方我尽量注解,方便大家观看. 2.完整代 ...

  3. 用jquery制作2048小游戏(超详细)

    先放个效果图吧 首先,先把html结构搭好.新建一个html文件,设置好标题2048,按钮New Game以及score:0,这里按钮是用a标签来将javascript中的newgame函数给传进来, ...

  4. Java Swing制作2048小游戏【完整版】

    技术讨论群:1005611884 可获取各种资料/代码,群内有Java/Python/C++/C#方向大佬,妹子多 /*** 技术 Swing* 实现思路:* 1. 绘制窗口* 2. 初始化游戏界面* ...

  5. java编辑2048小游戏_Java 制作命令行版 2048小游戏

    Java 命令行版 2048小游戏(2020年8月14日) 制作背景 大二即将开学,从头开始学习了一个多月的java,对二维数组的操作稍微熟悉了一些.于是想做一个简单的2048来试一试. 众所周知,2 ...

  6. 我的名片能运行Linux和Python,还能玩2048小游戏,成本只要20元

    晓查 发自 凹非寺  量子位 报道 | 公众号 QbitAI 猜猜它是什么?印着姓名.职位和邮箱,看起来是个名片.可是右下角有芯片,看起来又像是个PCB电路板. 其实它是一台超迷你的ARM计算机,不仅 ...

  7. html css js实现快递单打印_JS与HTML、CSS实现2048小游戏(六)

    在前面的五篇文章中,小编带大家完成了网页版2048小游戏的基本游戏逻辑.但是在游戏结束的gameover()方法中咱们只是简单的通过alert来弹出一些信息,这样的话只能出现下图的效果.这样的游戏,不 ...

  8. ​.NET手撸2048小游戏

    前言 2048是一款益智小游戏,得益于其规则简单,又和 2的倍数有关,因此广为人知,特别是广受程序员的喜爱. 本文将再次使用我自制的"准游戏引擎" FlysEngine,从空白窗口 ...

  9. 2019.8.8 2048小游戏

    本次为2048的小游戏制作,运用了之前的HTML+CSS以及现在的Jascript部分知识 目的是巩固之前所学内容,掌握现在的新知识,以及对面向对象能有进一步的理解 下面为html,css和JS三大页 ...

最新文章

  1. mhd格式三维图像显示_人体面骨三维有限元模型重构及碰撞分析
  2. Linux编写脚本查看mod,Linux shell脚本编写基础
  3. 网络爬虫介绍||为什么学网络爬虫
  4. Spring第三讲:利用注解配置类取代Spring的配置文件
  5. python range从大到小排列_python 十大经典排序算法
  6. [js] 在不支持js的浏览器中如何隐藏JavaScript代码?
  7. Windows 网络服务架构系列课程详解(一) ----DHCP服务器的搭建与配置
  8. Cocos2d-x中常用宏的作用
  9. 训练日志 2019.7.23
  10. 服务器无法拖动文件复制文件,​IT服务器运维:艾锑人为您整理Win10系统下移动、复制、删除文件需要管理员权限的解决方法...
  11. 《Android深入透析》之界面
  12. 修改Chrome默认搜索引擎为Google.com
  13. c语言中cnthe普通变量,不得不说,关于 *(unsigned long *) 和 (unsigned long)
  14. GO语言学习之路23
  15. 献给时尚男女的61句最酷口语(转)
  16. MySQL 开启二进制日志记录
  17. Cocos2d-x3.2 持续动作
  18. html5读delphi数据,Delphi HTML解析器
  19. CLodop start
  20. 4.1.14 Flink-流处理框架-Flink流处理API之数据重分区操作

热门文章

  1. 2021南昌市地区高考成绩排名查询,2021南昌中小学国编成绩排名/分数线
  2. win10忘记密码_Win10系统设置u盘密码的操作过程
  3. 凸优化之共轭函数(二)
  4. 【2021-07-15】JS逆向之网易云音乐(私信、关注、点赞)
  5. 使用C#编写17种Hello World程序(初学者C#测试石)
  6. python 图像拼接_python实现图像拼接功能
  7. 制作简单的视频壁纸程序,C语言可完成
  8. java连接mongo数据库,并执行db.runCommand命令
  9. Mac wifi 卡死
  10. python算法1.5百钱百鸡