手把手教你用MATLAB制作一款 [狗头翻牌子] 小游戏(点灯游戏)
0 游戏效果
就是点击一个牌子时,该牌子和周围四个牌子也会相应发生变化,想办法让所有牌子都在同一面即为游戏胜利。
1 fig界面和背景板
这一段比较简单,主要是对界面和背景板的属性设置,我们采用编程的方式调用app designer控件:
ddooggFig=uifigure('units','pixels',...'position',[320 120 360 400],...'Numbertitle','off',...'menubar','none',...'resize','off',...'name','ddoogg',...'color',[0.98 0.98 0.98]);bkgLabel=uilabel(ddooggFig);
bkgLabel.Position=[10 10 340 340];
bkgLabel.Text='';
bkgLabel.BackgroundColor=[193 214 232]./255;
2 狗狗牌子与胜利标志
2.1 狗狗牌子绘制
我们用1代表一种狗狗,2代表另一种狗狗,dogMat一开始全为1表示所有牌子上都是第一种狗狗,imgSource代表两种狗狗图片位置,bkgColor代表狗狗卡牌的背景颜色
dogMat=ones(5,5); %数据矩阵
imgSource={'images\doga.png','images\dogb.png'}; %狗狗图片链接
bkgColor=[[252 251 238]./255;[222 248 252]./255];%狗狗图背景颜色
图片自取:
doga.png
dogb.png
使用两层for循环算好位置构造控件:
%绘制5x5个uiimage控件
for i=1:5for j=1:5dogMatHdl(i,j)=uiimage(ddooggFig);dogMatHdl(i,j).Position=[20+65*(j-1),280-65*(i-1),60,60];dogMatHdl(i,j).ImageSource=imgSource{1};dogMatHdl(i,j).BackgroundColor=bkgColor(1,:);dogMatHdl(i,j).UserData=[i,j];end
end
注意我们为每个图片设置一个UserData属性,这可以表示图片的位置,方便我们之后识别点击的是哪个图片。
2.2 游戏胜利标签
绘制一个标签显示游戏胜利:
%获胜标签
win=false; %是否完成游戏
winLabel=uilabel(ddooggFig);
winLabel.Position=[15 150 330 60];
winLabel.Text='恭喜你解出谜题,请点击重新开始';
winLabel.BackgroundColor=[238 236 225]./255;
winLabel.FontSize=19;
winLabel.FontWeight='bold';
winLabel.HorizontalAlignment='center';
winLabel.FontColor=[113 106 63]./255;
游戏一开始标签式是隐藏的赢了之后才会显示出来,因此我们先将标签隐藏:
winLabel.Visible='off';
2.3 鼠标点击牌子回调
%创建uiimage回调
set(dogMatHdl,'ImageClickedFcn',@clickDog)function clickDog(~,event)if ~win %游戏赢了不做任何操作objNum=event.Source.UserData;%点击事件的来源图片的UserData属性,与图片位置相关crossList=[-1 0;0 1;1 0;0 -1;0 0];%点击位置上下左右和自身for ii=1:5changePos=crossList(ii,:)+objNum;%要改变的牌子的位置 if all(changePos>=1&changePos<=5)%如果该位置在范围内,改变图片显示和数据矩阵dogMat(changePos(1),changePos(2))=mod(dogMat(changePos(1),changePos(2)),2)+1;dogMatHdl(changePos(1),changePos(2)).ImageSource=imgSource{dogMat(changePos(1),changePos(2))};dogMatHdl(changePos(1),changePos(2)).BackgroundColor=bkgColor(dogMat(changePos(1),changePos(2)),:);endend%如果所有卡牌都一样,游戏结束if all(all(dogMat==1))||all(all(dogMat==2))win=true;winLabel.Visible='on';endendend
3 游戏难度按钮组
3.1 按钮绘制
绘制三个按钮,初始 [初级] 按钮为被选中状态,即难度等级为一级,我们将gameLevel设置为1,并将 [初级] 按钮颜色和其他按钮做区分,表示被选中状态:
gameLevel=1; %游戏难度级别
%初级难度按钮属性
levelBtn(1)=uibutton(ddooggFig);
levelBtn(1).Position=[10,360,75,30];
levelBtn(1).Text='初级';
levelBtn(1).FontWeight='bold';
levelBtn(1).FontSize=14;
levelBtn(1).BackgroundColor=[13 141 209]./255;
levelBtn(1).FontColor=[1 1 1];
levelBtn(1).UserData=1;
%中级难度按钮属性
levelBtn(2)=uibutton(ddooggFig);
levelBtn(2).Position=[95,360,75,30];
levelBtn(2).Text='中级';
levelBtn(2).FontWeight='bold';
levelBtn(2).FontSize=14;
levelBtn(2).BackgroundColor=[2 164 173]./255;
levelBtn(2).FontColor=[1 1 1];
levelBtn(2).UserData=2;
%高级难度按钮属性
levelBtn(3)=uibutton(ddooggFig);
levelBtn(3).Position=[180,360,75,30];
levelBtn(3).Text='高级';
levelBtn(3).FontWeight='bold';
levelBtn(3).FontSize=14;
levelBtn(3).BackgroundColor=[2 164 173]./255;
levelBtn(3).FontColor=[1 1 1];
levelBtn(3).UserData=3;
3.2 难度选择回调
改变gameLevel的数值,然后改变按钮颜色
%设置难度选择回调
set(levelBtn,'ButtonPushedFcn',@changeLevel)function changeLevel(~,event)levelBtn(gameLevel).BackgroundColor=[2 164 173]./255;objNum=event.Source.UserData;gameLevel=objNum;levelBtn(gameLevel).BackgroundColor=[13 141 209]./255; end
4 游戏刷新模块
4.1 刷新游戏按钮绘制
restartBtn=uibutton(ddooggFig);
restartBtn.Position=[265,360,85,30];
restartBtn.Text='重新开始';
restartBtn.FontWeight='bold';
restartBtn.FontSize=14;
restartBtn.BackgroundColor=[2 164 173]./255;
restartBtn.FontColor=[1 1 1];
4.2 模拟鼠标点击
我们游戏一开始和点击重新开始要生成未被完成的游戏局面,最简单的生成方式就是模拟鼠标点击随机一定数量的卡牌,点击次数越多难度越大,我们之前已经有鼠标点击的回调函数了:
function clickDog(~,event)
我们发现我们需要模拟的主要是第二个参数event,同时我们发现我们需要用到的只有event的Source属性下的UserData信息,也就是卡牌位置信息:
objNum=event.Source.UserData;
我们便可以构造一个含有UserData信息的结构体,例如:
simEvent.Source.UserData=[1,2];
再通过如下方式调用clickDog函数:
clickDog([],simEvent)
就能模拟点击第一行第二列的牌子,模拟点击其他牌子操作类似。
4.2 刷新游戏回调
在程序最后需要调用一次刷新游戏回调,以保证一点开始就产生谜题。
set(restartBtn,'ButtonPushedFcn',@restart)function restart(~,~)%相关参数设置:%是否获胜改为否%胜利标签隐藏%数据矩阵全为1win=false;winLabel.Visible='off';dogMat=ones(5,5);%将狗狗牌子恢复至初始状态for ii=1:5for jj=1:5dogMatHdl(ii,jj).ImageSource=imgSource{1};dogMatHdl(ii,jj).BackgroundColor=bkgColor(1,:);endend%依据游戏难度不同选择不同模拟点击次数switch gameLevelcase 1,changeTimes=3;case 2,changeTimes=5;case 3,changeTimes=11;end%模拟点击for ii=1:changeTimeschangePos=randi([1,5],[1,2]);simEvent.Source.UserData=changePos;clickDog([],simEvent)endend
restart()
5 完整代码
function ddoogg
ddooggFig=uifigure('units','pixels',...'position',[320 120 360 400],...'Numbertitle','off',...'menubar','none',...'resize','off',...'name','ddoogg',...'color',[0.98 0.98 0.98]);bkgLabel=uilabel(ddooggFig);
bkgLabel.Position=[10 10 340 340];
bkgLabel.Text='';
bkgLabel.BackgroundColor=[193 214 232]./255;%绘制狗狗和获胜标签========================================================
dogMat=ones(5,5); %数据矩阵
imgSource={'images\doga.png','images\dogb.png'}; %狗狗图片链接
bkgColor=[[252 251 238]./255;[222 248 252]./255];%狗狗图背景颜色%绘制5x5个uiimage控件
for i=1:5for j=1:5dogMatHdl(i,j)=uiimage(ddooggFig);dogMatHdl(i,j).Position=[20+65*(j-1),280-65*(i-1),60,60];dogMatHdl(i,j).ImageSource=imgSource{1};dogMatHdl(i,j).BackgroundColor=bkgColor(1,:);dogMatHdl(i,j).UserData=[i,j];end
end%获胜标签
win=false; %是否完成游戏
winLabel=uilabel(ddooggFig);
winLabel.Position=[15 150 330 60];
winLabel.Text='恭喜你解出谜题,请点击重新开始';
winLabel.BackgroundColor=[238 236 225]./255;
winLabel.FontSize=19;
winLabel.FontWeight='bold';
winLabel.HorizontalAlignment='center';
winLabel.FontColor=[113 106 63]./255;
winLabel.Visible='off';%创建uiimage回调
set(dogMatHdl,'ImageClickedFcn',@clickDog)function clickDog(~,event)if ~winobjNum=event.Source.UserData;crossList=[-1 0;0 1;1 0;0 -1;0 0];for ii=1:5changePos=crossList(ii,:)+objNum;if all(changePos>=1&changePos<=5)dogMat(changePos(1),changePos(2))=mod(dogMat(changePos(1),changePos(2)),2)+1;dogMatHdl(changePos(1),changePos(2)).ImageSource=imgSource{dogMat(changePos(1),changePos(2))};dogMatHdl(changePos(1),changePos(2)).BackgroundColor=bkgColor(dogMat(changePos(1),changePos(2)),:);endendif all(all(dogMat==1))||all(all(dogMat==2))win=true;winLabel.Visible='on';endendend%游戏等级按钮==============================================================
gameLevel=1; %游戏难度级别
%初级难度按钮属性
levelBtn(1)=uibutton(ddooggFig);
levelBtn(1).Position=[10,360,75,30];
levelBtn(1).Text='初级';
levelBtn(1).FontWeight='bold';
levelBtn(1).FontSize=14;
levelBtn(1).BackgroundColor=[13 141 209]./255;
levelBtn(1).FontColor=[1 1 1];
levelBtn(1).UserData=1;
%中级难度按钮属性
levelBtn(2)=uibutton(ddooggFig);
levelBtn(2).Position=[95,360,75,30];
levelBtn(2).Text='中级';
levelBtn(2).FontWeight='bold';
levelBtn(2).FontSize=14;
levelBtn(2).BackgroundColor=[2 164 173]./255;
levelBtn(2).FontColor=[1 1 1];
levelBtn(2).UserData=2;
%高级难度按钮属性
levelBtn(3)=uibutton(ddooggFig);
levelBtn(3).Position=[180,360,75,30];
levelBtn(3).Text='高级';
levelBtn(3).FontWeight='bold';
levelBtn(3).FontSize=14;
levelBtn(3).BackgroundColor=[2 164 173]./255;
levelBtn(3).FontColor=[1 1 1];
levelBtn(3).UserData=3;
%设置难度选择回调
set(levelBtn,'ButtonPushedFcn',@changeLevel)function changeLevel(~,event)levelBtn(gameLevel).BackgroundColor=[2 164 173]./255;objNum=event.Source.UserData;gameLevel=objNum;levelBtn(gameLevel).BackgroundColor=[13 141 209]./255; end%刷新游戏按钮==============================================================
restartBtn=uibutton(ddooggFig);
restartBtn.Position=[265,360,85,30];
restartBtn.Text='重新开始';
restartBtn.FontWeight='bold';
restartBtn.FontSize=14;
restartBtn.BackgroundColor=[2 164 173]./255;
restartBtn.FontColor=[1 1 1];
%设置刷新游戏回调
set(restartBtn,'ButtonPushedFcn',@restart)function restart(~,~)win=false;winLabel.Visible='off';dogMat=ones(5,5);for ii=1:5for jj=1:5dogMatHdl(ii,jj).ImageSource=imgSource{1};dogMatHdl(ii,jj).BackgroundColor=bkgColor(1,:);endendswitch gameLevelcase 1,changeTimes=3;case 2,changeTimes=5;case 3,changeTimes=11;endfor ii=1:changeTimeschangePos=randi([1,5],[1,2]);simEvent.Source.UserData=changePos;clickDog([],simEvent)endend
restart()
end
另:
需要MATLAB版本至少在R2019a及以后,若是以前版本可以尝试用uiaxes和image进行改写。
总代码长度140行左右,快来试试呀,完整代码及图片包:
链接:https://pan.baidu.com/s/1QpN9hWCYZMrJm5tGBp3Vzw
提取码:5xok
手把手教你用MATLAB制作一款 [狗头翻牌子] 小游戏(点灯游戏)相关推荐
- 教你使用MATLAB制作一款 图形验证码 生成器(app designer)
突然发现cla函数也可以应用到app designer控件上,因而对部分内容做出更改,将绘制隐藏像素刷新的方式改为用cla 原 hold(acAxes,'off'); image(acAxes,[-1 ...
- 教你用matlab制作一款黄金矿工小游戏
效果 步骤 0 图片准备 本文所使用图片在这: 网盘链接:https://pan.baidu.com/s/1CWL1R-rbTMFEy_G_P2JfgQ 提取码:kl17 1 背景构建 functio ...
- keyshot渲染图文教程_keyshot基础图文教程,手把手教你用keyshot制作动画效果
keyshot基础图文教程,手把手教你用keyshot制作动画效果 你知道么?keyshot除了用来渲染产品,其实还可以制作动画效果的,它里面内置了好几种运动方式,利用keyshot的旋转,平移,缩小 ...
- 【手把手教你用Matlab做双目摄像头标定】Ubuntu环境
[手把手教你用Matlab做双目摄像头标定] Ubuntu20.04环境 准备工作 你需要一个标定板 你需要一个双目摄像头 获取双目摄像头的设备号 跑起来看看 分割图像并完成拍照 使用Matlab进行 ...
- 怎么用python自制计算公式_手把手教你用python制作简易计算器,能够记录你使用的情况...
话不多说,首先先看效果图,它能够记录你在使用过程中的历史,方便你查看是否有错: 接下来就仔细分析一下是如何制作的: 简易计算器 第一步:导入资源库 在过程中使用到了tkinter这个资源库,win+R ...
- 手把手教你使用VS制作winform安装包
手把手教你使用VS制作winform安装包 使用VS 自带的打包工具,制作winform安装项目 开发环境:VS 2008 Access 操作系统:Windows XP 开发语言:C# 项目名称:** ...
- iir matlab 系数,手把手教你用matlab生成STM32官方IIR滤波器的系数
手把手教你用matlab生成IIR数字滤波器系数,然后用STM32实现数字滤波.非常实用有价值的资料. 手把手教你用 matlab 生成 STM32 官方 IIR 滤波器的系数(一) 本文采用的 ma ...
- python图形设计编程_少儿编程分享:手把手教你用Python制作艺术图片
原标题:少儿编程分享:手把手教你用Python制作艺术图片 在前面的几篇文章中,我们分享了一些用PyGame制作小游戏的教程.我们今天的分享使用的仍然是PyGame,只不过这次不是写游戏啦-我们要用P ...
- 手把手教你搭建美团饿了么电影票外卖cps小程序 附源码
手把手教你搭建美团饿了么电影票外卖cps小程序 附源码 外卖红包项目的优势 1.刚需:吃饭是每日刚需,尤其是城市白领,上班族,宅男宅女,等群体点外卖的需求,需求更是高频率(每天). 2.门槛低:平台门 ...
最新文章
- VMware安装Centos7桌面版超详细图文过程
- 超时时间已到。在操作完成之前超时时间已过或服务器未响应
- 7 项目人力资源管理
- python获取电脑硬件信息_Python实现的读取电脑硬件信息功能示例
- LiveVideoStack线上分享第五季(三):新一代直播传输协议SRT
- 人民的名义中,为什么蔡成功的贷款这么难?
- 什么是k-NN算法?怎样实现?终于有人讲明白了
- Dubbo(RPC原理、Dubbo架构负载均衡配置方式)(1)
- vue打包运行并解决404问题
- vs2010创建动态库(亲测可行)
- sxe增加服务器,sXe Injected服务端使用说明
- 吴恩达机器学习和深度学习视频和笔记
- 人资(人事)送命连环问,51个问题。
- 苹果真伪查询_二手MacBook Pro Air等苹果笔记本验货 鉴定 基本方法 流程
- 查询水果价格c语言程序框图,浙大版《C语言程序设计(第3版)》题目集 练习3-8 查询水果价格 (15 分)...
- jQuery获取元素上一个、下一个、父元素、子元素
- 什么是范数,及其对应的 “曼哈顿距离“、“欧式距离“、“闵氏距离“、“切比雪夫距离“
- 2020计算机专业保研夏令营面经:北航计算机
- 基于ArduPilot的旋翼式无人机飞行器开发系列(四,四轴无人机的各个组件详解及其焊接,组装)---正在更新中
- java毕业设计铝塑门窗的研制和生产管理源码+lw文档+mybatis+系统+mysql数据库+调试