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制作一款 [狗头翻牌子] 小游戏(点灯游戏)相关推荐

  1. 教你使用MATLAB制作一款 图形验证码 生成器(app designer)

    突然发现cla函数也可以应用到app designer控件上,因而对部分内容做出更改,将绘制隐藏像素刷新的方式改为用cla 原 hold(acAxes,'off'); image(acAxes,[-1 ...

  2. 教你用matlab制作一款黄金矿工小游戏

    效果 步骤 0 图片准备 本文所使用图片在这: 网盘链接:https://pan.baidu.com/s/1CWL1R-rbTMFEy_G_P2JfgQ 提取码:kl17 1 背景构建 functio ...

  3. keyshot渲染图文教程_keyshot基础图文教程,手把手教你用keyshot制作动画效果

    keyshot基础图文教程,手把手教你用keyshot制作动画效果 你知道么?keyshot除了用来渲染产品,其实还可以制作动画效果的,它里面内置了好几种运动方式,利用keyshot的旋转,平移,缩小 ...

  4. 【手把手教你用Matlab做双目摄像头标定】Ubuntu环境

    [手把手教你用Matlab做双目摄像头标定] Ubuntu20.04环境 准备工作 你需要一个标定板 你需要一个双目摄像头 获取双目摄像头的设备号 跑起来看看 分割图像并完成拍照 使用Matlab进行 ...

  5. 怎么用python自制计算公式_手把手教你用python制作简易计算器,能够记录你使用的情况...

    话不多说,首先先看效果图,它能够记录你在使用过程中的历史,方便你查看是否有错: 接下来就仔细分析一下是如何制作的: 简易计算器 第一步:导入资源库 在过程中使用到了tkinter这个资源库,win+R ...

  6. 手把手教你使用VS制作winform安装包

    手把手教你使用VS制作winform安装包 使用VS 自带的打包工具,制作winform安装项目 开发环境:VS 2008 Access 操作系统:Windows XP 开发语言:C# 项目名称:** ...

  7. iir matlab 系数,手把手教你用matlab生成STM32官方IIR滤波器的系数

    手把手教你用matlab生成IIR数字滤波器系数,然后用STM32实现数字滤波.非常实用有价值的资料. 手把手教你用 matlab 生成 STM32 官方 IIR 滤波器的系数(一) 本文采用的 ma ...

  8. python图形设计编程_少儿编程分享:手把手教你用Python制作艺术图片

    原标题:少儿编程分享:手把手教你用Python制作艺术图片 在前面的几篇文章中,我们分享了一些用PyGame制作小游戏的教程.我们今天的分享使用的仍然是PyGame,只不过这次不是写游戏啦-我们要用P ...

  9. 手把手教你搭建美团饿了么电影票外卖cps小程序 附源码

    手把手教你搭建美团饿了么电影票外卖cps小程序 附源码 外卖红包项目的优势 1.刚需:吃饭是每日刚需,尤其是城市白领,上班族,宅男宅女,等群体点外卖的需求,需求更是高频率(每天). 2.门槛低:平台门 ...

最新文章

  1. VMware安装Centos7桌面版超详细图文过程
  2. 超时时间已到。在操作完成之前超时时间已过或服务器未响应
  3. 7 项目人力资源管理
  4. python获取电脑硬件信息_Python实现的读取电脑硬件信息功能示例
  5. LiveVideoStack线上分享第五季(三):新一代直播传输协议SRT
  6. 人民的名义中,为什么蔡成功的贷款这么难?
  7. 什么是k-NN算法?怎样实现?终于有人讲明白了
  8. Dubbo(RPC原理、Dubbo架构负载均衡配置方式)(1)
  9. vue打包运行并解决404问题
  10. vs2010创建动态库(亲测可行)
  11. sxe增加服务器,sXe Injected服务端使用说明
  12. 吴恩达机器学习和深度学习视频和笔记
  13. 人资(人事)送命连环问,51个问题。
  14. 苹果真伪查询_二手MacBook Pro Air等苹果笔记本验货 鉴定 基本方法 流程
  15. 查询水果价格c语言程序框图,浙大版《C语言程序设计(第3版)》题目集 练习3-8 查询水果价格 (15 分)...
  16. jQuery获取元素上一个、下一个、父元素、子元素
  17. 什么是范数,及其对应的 “曼哈顿距离“、“欧式距离“、“闵氏距离“、“切比雪夫距离“
  18. 2020计算机专业保研夏令营面经:北航计算机
  19. 基于ArduPilot的旋翼式无人机飞行器开发系列(四,四轴无人机的各个组件详解及其焊接,组装)---正在更新中
  20. java毕业设计铝塑门窗的研制和生产管理源码+lw文档+mybatis+系统+mysql数据库+调试

热门文章

  1. Idea打字变成繁体
  2. VB不能加载MSCOMCTL.OCX所需文件
  3. 实践 基于Arduino 的 平衡车
  4. ubuntu如何用快捷键截图
  5. smbclient访问海康威视H90个人网盘
  6. Echo写入一句话木马+分段写入
  7. 编译工具各种报错(步骤正确,代码正确,配置正确)均可认为无解,除非...
  8. Avro RPC 之 Protocol 定义和代码生成
  9. 问题解决:取消Mac下Karabiner-Elements开机时弹出窗口、用Capslock切换中英文输入法、外接机械键盘 option 和 cmd 互换
  10. python解一元二次方程