基于Matlab制作一款简单的龙舟小游戏

效果图:

没找到合适的背景就自己画了个,大家如果有更好看的可以换一下。。。

步骤

1 创建Axes及图片导入

窗口创建:

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

图片导入:

[bkg_C,~,~]=imread('river.png');
[boat_C,~,boat_Alp]=imread('boat.png');
[stone_C,~,stone_Alp]=imread('stone.png');

图片素材可以从这里拿哟

2 创建timer函数移动背景

DrawBkgHdl=image([0 760],[0 400],bkg_C);

t=0;
tempBkg_C=[bkg_C,bkg_C];
fps = 20;
game = timer('ExecutionMode', 'FixedRate', 'Period',1/fps, 'TimerFcn', @dragongame);
start(game)

	function dragongame(~,~)
        t=t+6;
        modt=mod(t,720);

        newBkg_C=tempBkg_C(:,1+modt:684+modt,:);
        set(DrawBkgHdl,'CData',newBkg_C)
    end

3 绘制石块并移动

其实是5个石块来回变位置,当一个石块位置减小到负数就把数值增加并重新绘制

stonePos=[600;870;1140;1410];
stonePos=[stonePos,randi([90,330],[4,1])];
for i=1:size(stonePos,1)
    drawStoneHdl(i)=image([stonePos(i,1)-39 stonePos(i,1)+39],[stonePos(i,2)-20 stonePos(i,2)+20],stone_C,'AlphaData',stone_Alp);
end

	function dragongame(~,~)

		%这里是之前写的背景部分代码
		%。。。。。。。。。。。
		%。。。。。。。。。。。

        stonePos(:,1)=stonePos(:,1)-20/3;
        stonePos(stonePos(:,1)<0,2)=randi([90,330],[1,1]);
        stonePos(stonePos(:,1)<0,1)=stonePos(stonePos(:,1)<0,1)+1080;
        for ii=1:size(stonePos,1)
            set(drawStoneHdl(ii),'XData',[stonePos(ii,1)-39 stonePos(ii,1)+39],...
                'YData',[stonePos(ii,2)-20 stonePos(ii,2)+20]);
        end
    end

4 绘制船并创建鼠标回调

boatPos=[380,200];
DrawBoatHdl=image([boatPos(1)-75 boatPos(1)+75],[boatPos(2)-50 boatPos(2)+50],boat_C,'AlphaData',boat_Alp);

set(gcf,'WindowButtonMotionFcn',@moveBoat,'tag','mov')

	function moveBoat(~,~)
        xy=get(gca,'CurrentPoint');
        temp_y=xy(1,2);
        temp_y(temp_y<100)=90;
        temp_y(temp_y>340)=330;
        boatPos=[380,temp_y];
        set(DrawBoatHdl,'YData',[temp_y-50 temp_y+50]);
    end

5 碰撞判断函数

    function flag=judge(Bpos,Spos)
        flag1=abs(Bpos(1)-Spos(:,1))<80;
        flag2=abs((Bpos(2)+35)-Spos(:,2))<30;
        flag3=flag1&flag2;
        flag=any(flag3);
    end

dragongame函数做如下改写

    function dragongame(~,~)

		%这里是之前一大堆代码
		%。。。。。。。。。。
		%。。。。。。。。。。
		%。。。。。。。。。。

        if judge(boatPos,stonePos)
            stop(game)
            set(gcf,'WindowButtonMotionFcn',[]);
            text(50,200,'游戏结束','FontSize',54,'Color','w','tag','txt')
        end
    end

6 完整代码

function dragonBoat

Mainfig=figure('units','pixels','position',[50 100 760 400],...
                       'Numbertitle','off','menubar','none','resize','off',...
                       'name','dragonBoat');
axes('parent',Mainfig,'position',[0 0 1 1],...
   'XLim', [0 760],...
   'YLim', [0 400],...
   'NextPlot','add',...
   'layer','bottom',...
   'Visible','on',...
   'YDir','reverse',...
   'XTick',[], ...
   'YTick',[]);
[bkg_C,~,~]=imread('river.png');
[boat_C,~,boat_Alp]=imread('boat.png');
[stone_C,~,stone_Alp]=imread('stone.png');

DrawBkgHdl=image([0 760],[0 400],bkg_C);

stonePos=[600;870;1140;1410];
stonePos=[stonePos,randi([90,330],[4,1])];
for i=1:size(stonePos,1)
    drawStoneHdl(i)=image([stonePos(i,1)-39 stonePos(i,1)+39],[stonePos(i,2)-20 stonePos(i,2)+20],stone_C,'AlphaData',stone_Alp);
end

boatPos=[380,200];
DrawBoatHdl=image([boatPos(1)-75 boatPos(1)+75],[boatPos(2)-50 boatPos(2)+50],boat_C,'AlphaData',boat_Alp);

t=0;
tempBkg_C=[bkg_C,bkg_C];
fps = 20;
game = timer('ExecutionMode', 'FixedRate', 'Period',1/fps, 'TimerFcn', @dragongame);
start(game)

text(10,20,['已前进',num2str(t),'米'],'FontSize',14,'Color','w','tag','txt');

set(gcf,'WindowButtonMotionFcn',@moveBoat,'tag','mov')

    function dragongame(~,~)
        t=t+6;
        modt=mod(t,720);

        newBkg_C=tempBkg_C(:,1+modt:684+modt,:);
        set(DrawBkgHdl,'CData',newBkg_C) 

        stonePos(:,1)=stonePos(:,1)-20/3;
        stonePos(stonePos(:,1)<0,2)=randi([90,330],[1,1]);
        stonePos(stonePos(:,1)<0,1)=stonePos(stonePos(:,1)<0,1)+1080;
        for ii=1:size(stonePos,1)
            set(drawStoneHdl(ii),'XData',[stonePos(ii,1)-39 stonePos(ii,1)+39],...
                'YData',[stonePos(ii,2)-20 stonePos(ii,2)+20]);
        end
        set(findobj('tag','txt'),'String',['已前进',num2str(t),'米']);

        if judge(boatPos,stonePos)
            stop(game)
            set(gcf,'WindowButtonMotionFcn',[]);
            text(50,200,'游戏结束','FontSize',54,'Color','w','tag','txt')
        end
    end

    function moveBoat(~,~)
        xy=get(gca,'CurrentPoint');
        temp_y=xy(1,2);
        temp_y(temp_y<100)=90;
        temp_y(temp_y>340)=330;
        boatPos=[380,temp_y];
        set(DrawBoatHdl,'YData',[temp_y-50 temp_y+50]);
    end

    function flag=judge(Bpos,Spos)
        flag1=abs(Bpos(1)-Spos(:,1))<80;
        flag2=abs((Bpos(2)+35)-Spos(:,2))<30;
        flag3=flag1&flag2;
        flag=any(flag3);
    end
end

到此这篇关于基于Matlab制作一款简单的龙舟小游戏的文章就介绍到这了,更多相关Matlab龙舟游戏内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

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

    目录 效果 步骤 图片准备 背景构建 绘制爪子 让爪子转起来 绘制石块 点击下箭头移动爪子 爪子与石头和边缘碰触判断 抓取石块和显示金钱 完整代码 效果 步骤 图片准备 本文所使用图片在这 背景构建 function goldMiner Mainfig=figure('units','pixels','position',[50 100 750 500],... 'Numbertitle','off','menubar','none','resize','off',... 'name','gol

  • 利用Matlab制作一款狗头翻牌子小游戏

    目录 0游戏效果 1fig界面和背景板 2狗狗牌子与胜利标志 2.1狗狗牌子绘制 2.2游戏胜利标签 2.3鼠标点击牌子回调 3游戏难度按钮组 3.1按钮绘制 3.2难度选择回调 4游戏刷新模块 4.1刷新游戏按钮绘制 4.2模拟鼠标点击 4.3刷新游戏回调 5完整代码 0 游戏效果 就是点击一个牌子时,该牌子和周围四个牌子也会相应发生变化,想办法让所有牌子都在同一面即为游戏胜利. 1 fig界面和背景板 这一段比较简单,主要是对界面和背景板的属性设置,我们采用编程的方式调用app design

  • 利用Matlab制作一款3D版2048小游戏

    其实逻辑和2维版本完全一样,就不进行详细解说了,直接看效果: 效果: 目前界面还不咋好看,期待大家的优化 还是键盘↑↓←→操作嗷 完整代码: function game20483D global squaremap global colorlist global fontsizelist global baseX baseY baseZ global barHdl textHdl global txtBest txtScore global best fig=figure('units','pi

  • 如何利用Matlab制作一款真正的拼图小游戏

    效果: 简单原理介绍: 1构造0,1矩阵作为每片拼图的透明度,可以构造出不规则形状的拼图(image函数有alphaData属性可以设置) jigsawMask=zeros(101*5,101*5); jigsawMask(102:404,102:404)=1; [xMesh,yMesh]=meshgrid(1:101*5,1:101*5); dis1=sqrt((xMesh-51).^2+(yMesh-253).^2); dis2=sqrt((xMesh-505+50).^2+(yMesh-2

  • 使用Matlab制作简易版八分音符酱游戏

    目录 效果 游戏方式 说明 工具箱主要部分代码 完整代码 效果 游戏方式 给电脑插上耳机后叫喊叭 ! 说明 1)使用此代码应首先安装: Audio Toolbox工具箱,博主使用的版本为: Audio Toolbox 版本 3.0 (R2021a) 2)为保证游戏加载完所有素材后再开始,故设置了加载完成界面后停滞3秒再开始运行游戏 若一进入界面就挂了,应是资源加载太久,请关掉窗口后尝试重新运行 工具箱主要部分代码 1)基础设置 这里懒得改了直接照抄的语音命令识别的截断数据,大家可以依据自己需要进

  • MATLAB实现五子棋游戏(双人对战、可悔棋)

    本文实例为大家分享了MATLAB实现五子棋游戏的具体代码,供大家参考,具体内容如下 程序介绍: 1.此游戏只可用于双人对战. 2.棋盘颜色.棋盘格数.棋子颜色等参数均可自由设置 3.鼠标点击非棋盘区域可悔棋. 一.游戏界面 二.主程序及函数 1.主程序 %Author:LeiZhen %Date:2018-03-12 %此程序只下五子棋,并判断胜负关系 clear all; clc %定义颜色 Color_QiPanBack=[135,206,255]; Color_ChessLine=[100

  • 使用Matlab制作大富翁小游戏的过程详解

    目录 1.自定义头像及名称 2.买地.收费.破产 3.部分代码展示 gui_init.m self_init.m 4.修改记录 5.下载地址 大富翁大家都玩过,走到建筑的位置可以买地,第二圈走到买过的地可以升级,别人经过后需要付过路费,每次经过起点都会获得一定资金,玩到最后还没破产的就是胜者,这里我用MATLAB制作了一款MATLAB版的大富翁小游戏: 1.自定义头像及名称 点击方框内加号可换头像,点击文本区域可改昵称: 当然即使不换头像点击开始后,也会自动分配头像和名称: 2.买地.收费.破产

  • 基于Matlab制作一款简单的龙舟小游戏

    效果图: 没找到合适的背景就自己画了个,大家如果有更好看的可以换一下... 步骤 1 创建Axes及图片导入 窗口创建: Mainfig=figure('units','pixels','position',[50 100 760 400],... 'Numbertitle','off','menubar','none','resize','off',... 'name','dragonBoat'); axes('parent',Mainfig,'position',[0 0 1 1],...

  • 基于Matlab制作伪3D第一视角迷宫小游戏

    目录 游戏效果 游戏原理说明 第一代程序计算交点方法 第二代程序计算交点方法 距离转换为线段长度 完整代码 游戏效果 使用键盘上方向键↑向前移动 使用键盘左右方向键调整← →朝向 游戏原理说明 原理很简单,如效果图所示,主要就是以角色视角方向发射大量的直线模拟视线,并计算直线与墙壁交点,获取每一条视线方向下,角色到墙壁的距离,然后根据近大远小的原理绘制不同长度的竖向直线模拟墙壁. 第一代程序计算交点方法 第一代程序是使用的polyshape对象(二维多边形对象)制作墙壁,polyshape对象重

  • 基于Python制作一款屏幕颜色提取器

    目录 1.使用效果 2.所需python包 3.python小技巧 3.1控件数组 3.2将控件作为属性 3.3怎样重设控件颜色 3.4一些用到的字符串操作 3.5鼠标位置像素颜色 3.6窗口始终置顶 3.7文本框不允许编辑但允许复制 4.完整代码 1.使用效果 如下面动图所示,点击取色按钮后,将鼠标移动到想要取色的位置,等待两秒即可取色: 点击save color按钮可以将颜色存储到color library区域,同时如图所示, ! ! ! !红框内所有的方形元件其实都是按钮,点击后能获得颜色

  • 基于Matlab制作一个数独求解器

    目录 1.完整效果 2.数独求解(错误示范) 3.数独求解(升维) 4.数字识别 5.GUI / APP 讲解一个完整的小项目,顺便说明如何使用整数规划求解数独. 1.完整效果 2.数独求解(错误示范) 首先我们先尝试如果只满足行.列.3x3块加和均为45的等式约束是否有效.即约束为: 每行和为45: 每列和为45: 每个3x3块和为45: 其中对此编写如下代码: sudokuMat=[1 0 5 0 2 0 0 0 0 0 0 0 7 4 3 0 0 5 3 0 7 0 0 0 0 0 9 0

  • 基于Matlab制作一个不良图片检测系统

    目录 不良图片检测部分 part.0 图片导入 part.1 检查是否为肤色 part.2 皮肤区域标记 part.3 通过皮肤区域特点判定是否为不良图片 完整代码 批量处理部分 不良图片检测部分 看到博主码猴小明用python PIL库制作了一个不良图片识别系统,手痒,想用MATLAB也试试,毕竟矩阵运算也算是MATLAB的强项了,使用MATLAB写可比用python写简洁太多了,总体流程如下: 检查各个像素是否为肤色 将相邻的肤色像素归为一个皮肤区域,得到若干个皮肤区域,并剔除像素数量极少的

  • 利用Matlab制作一款刮刮乐抽奖特效

    目录 1.效果展示 2.程序原理说明 2.1奖项设置 2.2随机抽取 2.3绘制图层 2.4滑动鼠标刮奖 3.完整代码 1.效果展示 程序运行效果如下: 如图所示,按住鼠标不松开并滑动鼠标,即可刮开图层: 2.程序原理说明 2.1 奖项设置 奖项设置写在一个cell元胞数组中,第一列为文本信息,第二列为抽到的概率: strSet={'520元红包一个',15/100; '1314元红包一个',5/100; '黑丝水手服',20/100; '黑丝女仆装',20/100; '抱抱×50次',20/1

  • 基于Python制作三款起床闹钟的示例代码

    目录 导语 一.Turtle绘制时钟 1)代码展示 2)效果展示 二.Turtle实现模拟时钟 1)代码展示 2)效果展示 三.简易时钟 1)代码展示 2)效果展示 导语 叮叮叮,我们要按时长大 我是你们的木子同学!当当当当——隆重出场,撒花撒花~ 嗨!大家有没有生物钟不准时的时候,是不是每到休息日或者长假就会经常要倒时差? 每天上班最痛苦的事情就是早起早起早起!这是大部分上班族的痛苦,但是不上班又是不可能的啦,因为都是为了搞钱 今天小编就用代码示例化,给大家展示一下不同的时钟,希望大家按时上班

随机推荐