服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - 教你用Matlab制作黄金矿工小游戏

教你用Matlab制作黄金矿工小游戏

2022-10-11 15:16slandarer C/C++

黄金矿工作为经典的单机小游戏,一直深受大家的喜爱。本文将用Matlab制作这一款经典的游戏,文中的实现步骤讲解详细,感兴趣的可以了解一下

效果

教你用Matlab制作黄金矿工小游戏

教你用Matlab制作黄金矿工小游戏

 

步骤

图片准备

本文所使用图片在这

背景构建

function goldMiner
Mainfig=figure('units','pixels','position',[50 100 750 500],...
                     'Numbertitle','off','menubar','none','resize','off',...
                     'name','goldMiner');
axes('parent',Mainfig,'position',[0 0 1 1],...
 'XLim', [0 750],...
 'YLim', [0 500],...
 'NextPlot','add',...
 'layer','bottom',...
 'Visible','on',...
 'YDir','reverse',...
 'XTick',[], ...
 'YTick',[]);

bkgPic=imread('.\pic\bkg.png');
image([0,750],[0,500],bkgPic)

[manPic,~,manAlp]=imread('.\pic\man.png');
image([400-60,400+60],[49.5-45,49.5+45],manPic,'AlphaData',manAlp)

教你用Matlab制作黄金矿工小游戏

绘制爪子

由于爪子要不断调整角度因此用surface格式绘制,我们需要将爪子图片矩阵范围调整至[0,1],并将透明处数值调成nan

[clawPic,~,clawAlp]=imread('.\Pic\claw.png');
clawPic=double(clawPic)./255;
clawPicR=clawPic(:,:,1);
clawPicG=clawPic(:,:,2);
clawPicB=clawPic(:,:,3);
clawPicR(clawAlp<1)=nan;
clawPicG(clawAlp<1)=nan;
clawPicB(clawAlp<1)=nan;
clawPic(:,:,1)=clawPicR;
clawPic(:,:,2)=clawPicG;
clawPic(:,:,3)=clawPicB;

clawPos=[380,75];
ropePos=[380,75];

[xgrid,ygrid]=meshgrid((1:size(clawAlp,2))./2,(1:size(clawAlp,1))./2);
xgrid=xgrid-size(clawAlp,2)/4;

thetaList=linspace(-2*pi/5,2*pi/5,50);
thetaIndex=1;
theta=thetaList(thetaIndex);%当前爪子转动角度
v=0;%爪子下移速度
dir=1;%1或-1爪子转动方向
grabbing=false;%是否正在抓取石块

cost=cos(theta);
sint=sin(theta);
rotateX=cost.*xgrid+sint.*ygrid;
rotateY=cost.*ygrid-sint.*xgrid;

drawClawHdl=surface(rotateX+clawPos(1),rotateY+clawPos(2),...
          zeros(size(clawAlp)),clawPic,...
          'EdgeColor','none');
drawLineHdl=plot([clawPos(1),ropePos(1)],[clawPos(2),ropePos(2)],'k','LineWidth',2);

让爪子转起来

爪子旋转就是单纯的使用旋转矩阵:

教你用Matlab制作黄金矿工小游戏

fps=20;
game=timer('ExecutionMode', 'FixedRate', 'Period',1/fps, 'TimerFcn', @minergame);
start(game)

  function minergame(~,~)
      if ~grabbing
          switch 1
              case thetaIndex==1,dir=1;
              case thetaIndex==50,dir=-1;
          end
          thetaIndex=thetaIndex+dir;
          theta=thetaList(thetaIndex);
          cost=cos(theta);
          sint=sin(theta);
          rotateX=cost.*xgrid+sint.*ygrid;
          rotateY=cost.*ygrid-sint.*xgrid;
      else
      end
  end

教你用Matlab制作黄金矿工小游戏

绘制石块

stoneName={'gold','gold','stone1','stone2','diamond'};
stonePic{length(stoneName)}=[];
stoneAlp{length(stoneName)}=[];
for i=1:length(stoneName)
  [C,~,Alp]=imread(['.\pic\',stoneName{i},'.png']);
  stonePic{i}=C;
  stoneAlp{i}=Alp;
end
stoneV=[-2,-3,-3,-3,-5];%拿起石头后爪子移动速度
stonePrice=[800,500,200,100,1000];
stoneSize=[50,50;30,30;24,20;15,12;8,8];


stonePos=[200,300;400,350;500,200;50,240;50,300;
        700,420;170,180];
stoneType=[1,2,3,4,5,1,2];
stoneTag=1:length(stoneType);
stoneXrange=[stonePos(:,1)-stoneSize(stoneType',1),stonePos(:,1)+stoneSize(stoneType',1)];
stoneYrange=[stonePos(:,2)-stoneSize(stoneType',2),stonePos(:,2)+stoneSize(stoneType',2)];

for i=1:length(stoneTag)
  drawStone(stonePos(i,:),stoneType(i),stoneTag(i))   
end

  function drawStone(pos,i,j)
      image([-stoneSize(i,1),stoneSize(i,1)]+pos(1),...
            [-stoneSize(i,2),stoneSize(i,2)]+pos(2),...
            stonePic{i},...
            'AlphaData',stoneAlp{i},...
            'UserData',j)  
  end

教你用Matlab制作黄金矿工小游戏

点击下箭头移动爪子

set(gcf, 'KeyPressFcn', @key)

	function key(~,event)
      switch event.Key
          case 'downarrow'
              grabbing=true;v=4;
      end
  end

function minergame(~,~)
      if ~grabbing
          %这里是让爪子转动的一堆代码
          %。。。。。。。。。。。。。
          %。。。。。。。。。。。。。
      else
          cost=cos(theta);
          sint=sin(theta);
          clawPos=clawPos+[sint,cost].*v;
      end
      set(drawClawHdl,'XData',rotateX+clawPos(1),'YData',rotateY+clawPos(2));
      set(drawLineHdl,'XData',[clawPos(1),ropePos(1)],'YData',[clawPos(2),ropePos(2)]);
  end

教你用Matlab制作黄金矿工小游戏

爪子与石头和边缘碰触判断

function n=touchThing(clawPos)
      n=0;
      if clawPos(1)<20||clawPos(1)>730||clawPos(2)>480
          n=-1;     
      end
      flagX=clawPos(1)>=stoneXrange(:,1)&clawPos(1)<=stoneXrange(:,2);
      flagY=clawPos(2)>=stoneYrange(:,1)&clawPos(2)<=stoneYrange(:,2);
      flagXY=flagX&flagY;
      if any(flagXY)
          n=find(flagXY);
      end
  end

抓取石块和显示金钱

holdOnType=0;
drawHoldOnHdl=image([0,1],[0,1],ones(1,1),'AlphaData',zeros(1,1));

text(10,40,'Money:','FontSize',20,'Color',[1 1 1],'FontName','Cambria','FontWeight','bold')
money=0;
moneyStrHdl=text(110,40,'$0','FontSize',20,'Color',[0.5137 0.7882 0.2157],'FontName','Cambria','FontWeight','bold');    

	function minergame(~,~)
      if ~grabbing
          switch 1
              case thetaIndex==1,dir=1;
              case thetaIndex==50,dir=-1;
          end
          thetaIndex=thetaIndex+dir;
          theta=thetaList(thetaIndex);
          cost=cos(theta);
          sint=sin(theta);
          rotateX=cost.*xgrid+sint.*ygrid;
          rotateY=cost.*ygrid-sint.*xgrid;
      else
          cost=cos(theta);
          sint=sin(theta);
          clawPos=clawPos+[sint,cost].*v;
          
          n=touchThing(clawPos+5.*[sint,cost]);
          if n==-1
              v=-abs(v);
          elseif n>0
              delete(findobj('UserData',stoneTag(n)));
              v=stoneV(stoneType(n));
              holdOnType=stoneType(n);
              stonePos(n,:)=[];
              stoneType(n)=[];
              stoneTag(n)=[];
              stoneXrange(n,:)=[];
              stoneYrange(n,:)=[];
              set(drawHoldOnHdl,...
                  'XData',[-stoneSize(holdOnType,1),stoneSize(holdOnType,1)]+clawPos(1)+norm(stoneSize(holdOnType,:))*sint,...
                  'YData',[-stoneSize(holdOnType,2),stoneSize(holdOnType,2)]+clawPos(2)+norm(stoneSize(holdOnType,:))*cost,...
                  'CData',stonePic{holdOnType},'AlphaData',stoneAlp{holdOnType});
          end  
          
          if clawPos(2)<=ropePos(2)
              clawPos=ropePos;
              grabbing=false;
              if holdOnType>0
                  money=money+stonePrice(holdOnType);
                  set(moneyStrHdl,'String',['$',num2str(money)])
              end
              holdOnType=0;
              set(drawHoldOnHdl,'XData',[0,1],...
                                'YData',[0,1],...
                                'CData',ones(1,1),...
                                'AlphaData',zeros(1,1));                  
          end
          if holdOnType~=0
              set(drawHoldOnHdl,...
                  'XData',[-stoneSize(holdOnType,1),stoneSize(holdOnType,1)]+clawPos(1)+norm(stoneSize(holdOnType,:))*sint,...
                  'YData',[-stoneSize(holdOnType,2),stoneSize(holdOnType,2)]+clawPos(2)+norm(stoneSize(holdOnType,:))*cost);
          end
      end
      
      
      set(drawClawHdl,'XData',rotateX+clawPos(1),'YData',rotateY+clawPos(2));
      set(drawLineHdl,'XData',[clawPos(1),ropePos(1)],'YData',[clawPos(2),ropePos(2)]);
  end

教你用Matlab制作黄金矿工小游戏

 

完整代码

function goldMiner
Mainfig=figure('units','pixels','position',[50 100 750 500],...
                     'Numbertitle','off','menubar','none','resize','off',...
                     'name','goldMiner');
axes('parent',Mainfig,'position',[0 0 1 1],...
 'XLim', [0 750],...
 'YLim', [0 500],...
 'NextPlot','add',...
 'layer','bottom',...
 'Visible','on',...
 'YDir','reverse',...
 'XTick',[], ...
 'YTick',[]);

bkgPic=imread('.\pic\bkg.png');
image([0,750],[0,500],bkgPic)

[manPic,~,manAlp]=imread('.\pic\man.png');
image([400-60,400+60],[49.5-45,49.5+45],manPic,'AlphaData',manAlp)

[clawPic,~,clawAlp]=imread('.\Pic\claw.png');
clawPic=double(clawPic)./255;
clawPicR=clawPic(:,:,1);
clawPicG=clawPic(:,:,2);
clawPicB=clawPic(:,:,3);
clawPicR(clawAlp<1)=nan;
clawPicG(clawAlp<1)=nan;
clawPicB(clawAlp<1)=nan;
clawPic(:,:,1)=clawPicR;
clawPic(:,:,2)=clawPicG;
clawPic(:,:,3)=clawPicB;

clawPos=[380,75];
ropePos=[380,75];

[xgrid,ygrid]=meshgrid((1:size(clawAlp,2))./2,(1:size(clawAlp,1))./2);
xgrid=xgrid-size(clawAlp,2)/4;

thetaList=linspace(-2*pi/5,2*pi/5,50);
thetaIndex=1;
theta=thetaList(thetaIndex);v=0;
dir=1;grabbing=false;

cost=cos(theta);
sint=sin(theta);
rotateX=cost.*xgrid+sint.*ygrid;
rotateY=cost.*ygrid-sint.*xgrid;

drawClawHdl=surface(rotateX+clawPos(1),rotateY+clawPos(2),...
          zeros(size(clawAlp)),clawPic,...
          'EdgeColor','none');
drawLineHdl=plot([clawPos(1),ropePos(1)],[clawPos(2),ropePos(2)],'k','LineWidth',2);
%stone part======================================================
stoneName={'gold','gold','stone1','stone2','diamond'};
stonePic{length(stoneName)}=[];
stoneAlp{length(stoneName)}=[];
for i=1:length(stoneName)
  [C,~,Alp]=imread(['.\pic\',stoneName{i},'.png']);
  stonePic{i}=C;
  stoneAlp{i}=Alp;
end
stoneV=[-2,-3,-3,-3,-5];
stonePrice=[800,500,200,100,1000];
stoneSize=[50,50;30,30;24,20;15,12;8,8];


stonePos=[200,300;400,350;500,200;50,240;50,300;
        700,420;170,180];
stoneType=[1,2,3,4,5,1,2];
stoneTag=1:length(stoneType);
stoneXrange=[stonePos(:,1)-stoneSize(stoneType',1),stonePos(:,1)+stoneSize(stoneType',1)];
stoneYrange=[stonePos(:,2)-stoneSize(stoneType',2),stonePos(:,2)+stoneSize(stoneType',2)];

for i=1:length(stoneTag)
  drawStone(stonePos(i,:),stoneType(i),stoneTag(i))   
end

  function drawStone(pos,i,j)
      image([-stoneSize(i,1),stoneSize(i,1)]+pos(1),...
            [-stoneSize(i,2),stoneSize(i,2)]+pos(2),...
            stonePic{i},...
            'AlphaData',stoneAlp{i},...
            'UserData',j)  
  end

holdOnType=0;
drawHoldOnHdl=image([0,1],[0,1],ones(1,1),'AlphaData',zeros(1,1));

text(10,40,'Money:','FontSize',20,'Color',[1 1 1],'FontName','Cambria','FontWeight','bold')
money=0;
moneyStrHdl=text(110,40,'$0','FontSize',20,'Color',[0.5137 0.7882 0.2157],'FontName','Cambria','FontWeight','bold');

%==========================================================================    
set(gcf, 'KeyPressFcn', @key)
fps=20;
game=timer('ExecutionMode', 'FixedRate', 'Period',1/fps, 'TimerFcn', @minergame);
start(game)

  function minergame(~,~)
      if ~grabbing
          switch 1
              case thetaIndex==1,dir=1;
              case thetaIndex==50,dir=-1;
          end
          thetaIndex=thetaIndex+dir;
          theta=thetaList(thetaIndex);
          cost=cos(theta);
          sint=sin(theta);
          rotateX=cost.*xgrid+sint.*ygrid;
          rotateY=cost.*ygrid-sint.*xgrid;
      else
          cost=cos(theta);
          sint=sin(theta);
          clawPos=clawPos+[sint,cost].*v;
          
          n=touchThing(clawPos+5.*[sint,cost]);
          if n==-1
              v=-abs(v);
          elseif n>0
              delete(findobj('UserData',stoneTag(n)));
              v=stoneV(stoneType(n));
              holdOnType=stoneType(n);
              stonePos(n,:)=[];
              stoneType(n)=[];
              stoneTag(n)=[];
              stoneXrange(n,:)=[];
              stoneYrange(n,:)=[];
              set(drawHoldOnHdl,...
                  'XData',[-stoneSize(holdOnType,1),stoneSize(holdOnType,1)]+clawPos(1)+norm(stoneSize(holdOnType,:))*sint,...
                  'YData',[-stoneSize(holdOnType,2),stoneSize(holdOnType,2)]+clawPos(2)+norm(stoneSize(holdOnType,:))*cost,...
                  'CData',stonePic{holdOnType},'AlphaData',stoneAlp{holdOnType});
          end  
          
          if clawPos(2)<=ropePos(2)
              clawPos=ropePos;
              grabbing=false;
              if holdOnType>0
                  money=money+stonePrice(holdOnType);
                  set(moneyStrHdl,'String',['$',num2str(money)])
              end
              holdOnType=0;
              set(drawHoldOnHdl,'XData',[0,1],...
                                'YData',[0,1],...
                                'CData',ones(1,1),...
                                'AlphaData',zeros(1,1));                  
          end
          if holdOnType~=0
              set(drawHoldOnHdl,...
                  'XData',[-stoneSize(holdOnType,1),stoneSize(holdOnType,1)]+clawPos(1)+norm(stoneSize(holdOnType,:))*sint,...
                  'YData',[-stoneSize(holdOnType,2),stoneSize(holdOnType,2)]+clawPos(2)+norm(stoneSize(holdOnType,:))*cost);
          end
      end
      
      
      set(drawClawHdl,'XData',rotateX+clawPos(1),'YData',rotateY+clawPos(2));
      set(drawLineHdl,'XData',[clawPos(1),ropePos(1)],'YData',[clawPos(2),ropePos(2)]);
  end

  function n=touchThing(clawPos)
      n=0;
      if clawPos(1)<20||clawPos(1)>730||clawPos(2)>480
          n=-1;     
      end
      flagX=clawPos(1)>=stoneXrange(:,1)&clawPos(1)<=stoneXrange(:,2);
      flagY=clawPos(2)>=stoneYrange(:,1)&clawPos(2)<=stoneYrange(:,2);
      flagXY=flagX&flagY;
      if any(flagXY)
          n=find(flagXY);
      end
  end

  function key(~,event)
      switch event.Key
          case 'downarrow'
              grabbing=true;v=4;
      end
  end
end

以上就是教你用Matlab制作黄金矿工小游戏的详细内容,更多关于Matlab黄金矿工游戏的资料请关注服务器之家其它相关文章!

原文链接:https://blog.csdn.net/slandarer/article/details/117961715

延伸 · 阅读

精彩推荐
  • C/C++OpenCV计算图像的水平和垂直积分投影

    OpenCV计算图像的水平和垂直积分投影

    这篇文章主要为大家详细介绍了OpenCV计算图像的水平和垂直积分投影,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    长相忆兮长相忆4832021-07-16
  • C/C++C语言关于文件的操作方法总结

    C语言关于文件的操作方法总结

    在任何程序的开发中,对于文件的操作都是绕不开的一个知识点,因为总是要用到存储读取的功能,今天我们来详细了解C语言中是怎么操作文件的...

    Ersansui9732022-02-28
  • C/C++基于重启后消失的注册表键值的详细介绍

    基于重启后消失的注册表键值的详细介绍

    本篇文章是对重启后消失的注册表键值进行了详细的分析介绍,需要的朋友参考下...

    C语言教程网2622020-12-02
  • C/C++C/C++指针与内存管理图文详解

    C/C++指针与内存管理图文详解

    这篇文章主要为大家详细介绍了C/C++指针与内存管理,使用文图并叙的方式,文中图片介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考...

    知来者逆10132022-09-14
  • C/C++显示任何进程加载的DLL文件的代码

    显示任何进程加载的DLL文件的代码

    c语言实现的显示任何进程加载的DLL,方便开发软件的朋友...

    C语言教程网4802020-12-07
  • C/C++OpenGL实现鼠标移动方块

    OpenGL实现鼠标移动方块

    这篇文章主要为大家详细介绍了OpenGL实现鼠标移动方块,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    lang_dye11942021-09-24
  • C/C++C语言编程C++编辑器及调试工具操作命令详解

    C语言编程C++编辑器及调试工具操作命令详解

    这篇文章主要介绍了C语言编程C++编辑调试工具操作命令详解,本文章对C++调试工具的命令操作进行了详细的讲解,有需要的朋友可以借鉴参考下...

    未綄待續ξ12352022-01-17
  • C/C++解析C++多文件编程问题

    解析C++多文件编程问题

    在某些场景中,考虑到编译效率和可移植性,#pragma once 和 #ifndef 经常被结合使用来避免头文件被 重复引入,这里介绍用 _Pragma 操作符避免头文件重复引入...

    人生有迹11862022-02-16