千家信息网

怎么用Matlab制作黄金矿工小游戏

发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,本文小编为大家详细介绍"怎么用Matlab制作黄金矿工小游戏",内容详细,步骤清晰,细节处理妥当,希望这篇"怎么用Matlab制作黄金矿工小游戏"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一
千家信息网最后更新 2025年11月07日怎么用Matlab制作黄金矿工小游戏

本文小编为大家详细介绍"怎么用Matlab制作黄金矿工小游戏",内容详细,步骤清晰,细节处理妥当,希望这篇"怎么用Matlab制作黄金矿工小游戏"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

    效果

    步骤

    图片准备

    本文所使用图片在这

    背景构建

    function goldMinerMainfig=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)

    绘制爪子

    由于爪子要不断调整角度因此用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);

    让爪子转起来

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

    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

    绘制石块

    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;endstoneV=[-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

    点击下箭头移动爪子

    set(gcf, 'KeyPressFcn', @key)        function key(~,event)        switch event.Key            case 'downarrow'                grabbing=true;v=4;        end    endfunction 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

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

    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

    完整代码

    function goldMinerMainfig=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;endstoneV=[-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)      endholdOnType=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    endend

    读到这里,这篇"怎么用Matlab制作黄金矿工小游戏"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。

    爪子 小游戏 矿工 黄金 制作 图片 文章 石块 代码 内容 步骤 矩阵 石头 角度 速度 移动 调整 妥当 就是 思路 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 英特尔服务器芯片 网络系统管理比赛服务器配置 数据库查询优化的艺术 标准的软件开发流程 软件开发简历填什么技能 中国网安网络安全负责人 常州多功能软件开发使用方法 太原香蕉网络技术有限公司 交规网络安全教育照片审核 软件开发新员工转正申请 中国电信的服务器集中 保障网络安全和数据安全的作文 广西海游互联网科技 计算机二级数据库模拟 无线传感网络技术的应用领域 网络安全教育的认识和感悟 数据库管理系统和接口的原理图 域服务器管理ip 中央网络安全山西中心许明 南京软件开发怎么进国企 数据库找到字段并显示红色 小学生网络安全教学过程 战地1服务器管理 上海智能化软件开发哪个好 安徽数据库日志审计原理 stm32 数据库下载 web应用服务器的特点 淘宝网络技术服务中心 数据库引擎的配置 计算机网络技术需要考取的证书
    0