用App Designer 制作2048小游戏

用App Designer 制作2048小游戏用 AppDesigner 制作 2048 小游戏用 AppDesigner 制作的 2048 MATLAB 版本是 2020b 记录下创作思路 以免日后忘记 APP 界面设计 APP 界面如下 为了好玩 还加入了游戏进行时播放音乐的功能 下面是游戏结束界面 除了按钮和开关部分 其余都可用标签控件制作 游戏结束界面在制作时将其 Visible 属性设为 Off 确保在主界面上层 当判定游戏结束时再将 Visible 属性修改为 On 即可 app gameOverLabe Visible

用App Designer 制作2048小游戏

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

APP界面设计

APP界面如下,为了好玩,还加入了游戏进行时播放音乐的功能。用App Designer 制作2048小游戏
下面是游戏结束界面:
用App Designer 制作2048小游戏
除了按钮和开关部分,其余都可用标签控件制作。游戏结束界面在制作时将其Visible属性设为Off(确保在主界面上层),当判定游戏结束时再将Visible属性修改为On即可。


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

用App Designer 制作2048小游戏

规则设计

 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; 
 zeroIndex = find(app.theMatrix == 0); 

后端到前端

要把矩阵映射到游戏主界面,有两个需求:一是对应位置的数字显示,其中“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(); end end 
 f = fopen(app.dataPath,'r'); if f>0 app.bestScore = fread(f,'int32'); fclose(f); end 

运行方式

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

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


关于批量创建控件

 Num matlab.ui.control.Label 

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

 function createNum(app) for i=1:4 for j=1:4 app.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 = ''; end end end 

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


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/232150.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • BufferedWriter导出数据excel文件

    BufferedWriter导出数据excel文件BufferedWriter导出数据BufferedWriter将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了js页面//导出数据functionexportData(){vardata={};…

    2022年5月24日
    26
  • REdis主从复制之repl_backlog

    REdis主从复制之repl_backlog

    2021年7月8日
    126
  • C++的三种单例模式—–深度解析

    C++的三种单例模式—–深度解析简介因为在设计或开发中,肯定会有这么一种情况,一个类只能有一个对象被创建,如果有多个对象的话,可能会导致状态的混乱和不一致。这种情况下,单例模式是最恰当的解决办法。它有很多种实现方式,各自的特性不相同,使用的情…

    2022年5月27日
    39
  • opencv使用教程_opencv使用教程

    opencv使用教程_opencv使用教程OpenCV(OpenSourceComputerVisionLibrary)是一个开源的计算机视觉库,它提供了很多函数,这些函数非常高效地实现了计算机视觉算法(最基本的滤波到高级的物体检测皆有涵盖)。OpenCV使用C/C++开发,同时也提供了Python、Java、MATLAB等其他语言的接口。OpenCV是跨平台的,可以在Windows、Linux、MacOS、Android、iOS等操作系统上运行。OpenCV的应用领域非常广泛,包括图像拼接、图像降噪、产品质检、..

    2022年10月3日
    3
  • R语言-提取字符长度nchar函数与length函数「建议收藏」

    R语言-提取字符长度nchar函数与length函数「建议收藏」R语言中nchar函数:主要使用来返回字符长度而length函数:则是用来返回字符数量#Gettingthelengthofastringx=”John”y=c(“Jim”,”Tony”,”kavry”)nchar(x)#returnthenumberofcharactersinthestringnchar(y)#ifavector,return

    2022年5月29日
    39
  • #WPF#Dirkster.AvalonDock教程

    #WPF#Dirkster.AvalonDock教程https://blog.csdn.net/youyomei/article/details/103107304教程还不错,但是存在一个错误xmlns:avalon=”http://schemas.xceed.com/wpf/xaml/avalondock”改成如下xmlns:avalon=”https://github.com/Dirkster99/AvalonDock”

    2022年7月20日
    13

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号