利用Matlab编写简易版连连看小游戏

 更新时间:2022年03月04日 10:06:37   作者:slandarer  
连连看作为经典的小游戏,一定是很多人的回忆吧。本文将用Matlab实现这一经典的游戏,文中示例代码具有一定的参考价值,感兴趣的小伙伴们可以参考一下

这是一款MATLAB连连看小游戏,基本实现了连连看的功能,不过目前没有写出死局判定的模块,日后可能会对其进行改进。

游戏截图

游戏组装说明

我们的变量path输入的是图像包的相对路径或绝对路径

这里我们由于文件夹名称就叫“图片”所以直接path='图片’是没啥问题的。

文件夹里就是图片素材啦,其名称没有任何要求,形状最好是方的,不过不是的话问题也不大,程序会自动将其拉伸成方的。。。。。。。。

我们这里要求的是读入jpg格式,想要png,jpg都读的话,。。。。。最简单的就是直接读两次

完整代码

function ConnectingGame
%连连看图片导入============================================================
path='图片';
picInformation=dir(fullfile(path,'*.jpg'));
N=length(picInformation);
for i=1:N
    picList.(['pic',num2str(i)])=...
        imread([path,'\',picInformation(i).name]);
end


%全局变量==================================================================
global selectedPos clickPos
global redLinePnts
global picMat

selectedPos=[];
redLinePnts=[];
%图片矩阵生成==============================================================
    function createMat(~,~)
        tempMat=zeros(8,6);
        while any(any(tempMat==0))
            zeosPos=find(tempMat==0);
            temprand=rand(1,length(zeosPos));
            [~,tempSort]=sort(temprand);
            tempNum=zeosPos(tempSort(1:2));
            tempMat(tempNum)=randi(N);
        end
        picMat=zeros(10,8);
        picMat(2:9,2:7)=tempMat;
    end

createMat()
%主要框架生成==============================================================
MainFig=figure('units','pixels','position',[750 250 (9*100+10*5+20)*0.5 (7*100+8*5+20)*0.5],...
    'Numbertitle','off','menubar','none','resize','off',...
    'name','ConnectingGame | by slandarer');
axes('parent',MainFig,'position',[0 0 1 1],...
    'XLim', [40 10*100+10*5-40],...
    'YLim', [40 8*100+8*5-40],...
    'color',[0.95,0.95,0.95],...
    'NextPlot','add',...
    'layer','bottom',...
    'Visible','on',...
    'YDir','reverse',...
    'XTick',[], ...
    'YTick',[]);
uh1=uimenu('label','帮助');
uimenu(uh1,'label','重新开始','callback',@restartGame)
for i=2:9
    for j=2:7
        drawPicHdl(i,j)=image([(i-1)*100,i*100]+(i-1)*5,[(j-1)*100,j*100]+(j-1)*5,...
            picList.(['pic',num2str(picMat(i,j))]),'tag',[num2str(i),num2str(j)],...
            'ButtonDownFcn',@clickOnPic);
    end
end


%重新开始函数==============================================================
    function restartGame(~,~)
        createMat()
        for ii=2:9
            for jj=2:7
                set(drawPicHdl(ii,jj),'CData',picList.(['pic',num2str(picMat(ii,jj))]))
            end
        end
    end


%主函数====================================================================
    function clickOnPic(object,~)
        redLinePnts=[];
        clickPos=[str2num(object.Tag(1)),str2num(object.Tag(2))];
        if isempty(selectedPos),selectedPos=clickPos;end
        if ~all(selectedPos==clickPos)
            %-------------------------------------------------------------------------------------------------
            condition1=0;condition2=0;
            switch 1
                case any(selectedPos(1)==clickPos(1))
                    condition1=abs(selectedPos(2)-clickPos(2))==1;
                    tempVector1=sort([selectedPos(2),clickPos(2)])+[1 -1];
                    tempSum=sum(picMat(clickPos(1),tempVector1(1):tempVector1(2)));
                    condition2=(tempSum==0)&~isempty(picMat(clickPos(1),tempVector1(1):tempVector1(2)));
                case any(selectedPos(2)==clickPos(2))
                    condition1=abs(selectedPos(1)-clickPos(1))==1;
                    tempVector1=sort([selectedPos(1),clickPos(1)])+[1 -1];
                    tempSum=sum(picMat(tempVector1(1):tempVector1(2),clickPos(2)));
                    condition2=(tempSum==0)&~isempty(picMat(clickPos(1),tempVector1(1):tempVector1(2)));
            end
            if (condition1||condition2)&&picMat(clickPos(1),clickPos(2))==picMat(selectedPos(1),selectedPos(2))
                redLinePnts=[selectedPos;clickPos];
            end
            %-------------------------------------------------------------------------------------------------
            if isempty(redLinePnts)
                tempNode=[selectedPos(1),clickPos(2)];
                tempVector1=[selectedPos(2)+1,clickPos(2)].*(clickPos(2)>selectedPos(2))+...
                    [clickPos(2),selectedPos(2)-1].*(clickPos(2)<=selectedPos(2));
                tempVector2=[selectedPos(1),clickPos(1)-1].*(clickPos(1)>selectedPos(1))+...
                    [clickPos(1)+1,selectedPos(1)].*(clickPos(1)<=selectedPos(1));
                condition1=(sum(picMat(selectedPos(1),tempVector1(1):tempVector1(2)))==0);
                condition2=sum(picMat(tempVector2(1):tempVector2(2),clickPos(2)))==0;
                condition3=picMat(selectedPos(1),selectedPos(2))==picMat(clickPos(1),clickPos(2));
                if all([condition1,condition2,condition3])
                    redLinePnts=[selectedPos;tempNode;clickPos];
                end
            end
            if isempty(redLinePnts)
                tempNode=[clickPos(1),selectedPos(2)];
                tempVector1=[clickPos(2)+1,selectedPos(2)].*(selectedPos(2)>clickPos(2))+...
                    [selectedPos(2),clickPos(2)-1].*(selectedPos(2)<=clickPos(2));
                tempVector2=[clickPos(1),selectedPos(1)-1].*(selectedPos(1)>clickPos(1))+...
                    [selectedPos(1)+1,clickPos(1)].*(selectedPos(1)<=clickPos(1));
                condition1=sum(picMat(clickPos(1),tempVector1(1):tempVector1(2)))==0;
                condition2=sum(picMat(tempVector2(1):tempVector2(2),selectedPos(2)))==0;
                condition3=picMat(selectedPos(1),selectedPos(2))==picMat(clickPos(1),clickPos(2));
                if all([condition1,condition2,condition3])
                    redLinePnts=[selectedPos;tempNode;clickPos];
                end
            end
            %-------------------------------------------------------------------------------------------------
            if isempty(redLinePnts)
                for ii=[selectedPos(1):-1:1,selectedPos(1):10]
                    tempNode1=[ii,selectedPos(2)];
                    tempNode2=[ii,clickPos(2)];
                    tempVector1=[selectedPos(1)+1,ii].*(ii>selectedPos(1))+[ii,selectedPos(1)-1].*(ii<=selectedPos(1));
                    tempVector2=[clickPos(1)+1,ii].*(ii>clickPos(1))+[ii,clickPos(1)-1].*(ii<=clickPos(1));
                    tempVector3=sort([selectedPos(2),clickPos(2)]);
                    condition1=sum(picMat(tempVector1(1):tempVector1(2),selectedPos(2)))==0;
                    condition2=sum(picMat(tempVector2(1):tempVector2(2),clickPos(2)))==0;
                    condition3=sum(picMat(ii,tempVector3(1):tempVector3(2)))==0;
                    condition4=picMat(selectedPos(1),selectedPos(2))==picMat(clickPos(1),clickPos(2));
                    if all([condition1,condition2,condition3,condition4])
                        redLinePnts=[selectedPos;tempNode1;tempNode2;clickPos];
                        break
                    end
                end
            end
            if isempty(redLinePnts)
                for jj=[selectedPos(2):-1:1,selectedPos(2):8]
                    tempNode1=[selectedPos(1),jj];
                    tempNode2=[clickPos(1),jj];
                    tempVector1=[selectedPos(2)+1,jj].*(jj>selectedPos(2))+[jj,selectedPos(2)-1].*(jj<=selectedPos(2));
                    tempVector2=[clickPos(2)+1,jj].*(jj>clickPos(2))+[jj,clickPos(2)-1].*(jj<=clickPos(2));
                    tempVector3=sort([selectedPos(1),clickPos(1)]);
                    condition1=sum(picMat(selectedPos(1),tempVector1(1):tempVector1(2)))==0;
                    condition2=sum(picMat(clickPos(1),tempVector2(1):tempVector2(2)))==0;
                    condition3=sum(picMat(tempVector3(1):tempVector3(2),jj))==0;
                    condition4=picMat(selectedPos(1),selectedPos(2))==picMat(clickPos(1),clickPos(2));
                    if all([condition1,condition2,condition3,condition4])
                        redLinePnts=[selectedPos;tempNode1;tempNode2;clickPos];
                        break
                    end
                end
            end
            %-------------------------------------------------------------------------------------------------
            if ~isempty(redLinePnts)
                redLinePntsX=(redLinePnts(:,1)-1).*100+(redLinePnts(:,1)-1).*5+50;
                redLinePntsY=(redLinePnts(:,2)-1).*100+(redLinePnts(:,2)-1).*5+50;
                RedLine=plot(redLinePntsX,redLinePntsY,'Color',[1 0 0],'LineWidth',2.5);
                pause(0.3)
                delete(RedLine)
                picMat(selectedPos(1),selectedPos(2))=0;
                picMat(clickPos(1),clickPos(2))=0;
                set(drawPicHdl(selectedPos(1),selectedPos(2)),'CData',ones(100,100,3).*0.95);
                set(drawPicHdl(clickPos(1),clickPos(2)),'CData',ones(100,100,3).*0.95);
                selectedPos=[];
            else
                selectedPos=clickPos;
            end    
        end 
    end
end

到此这篇关于利用Matlab编写简易版连连看小游戏的文章就介绍到这了,更多相关Matlab连连看游戏内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++详解哈夫曼树的概念与实现步骤

    C++详解哈夫曼树的概念与实现步骤

    给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近
    2022-04-04
  • C语言链表实现学生管理系统

    C语言链表实现学生管理系统

    这篇文章主要为大家详细介绍了C语言链表实现学生管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06
  • c++多线程之死锁的发生的情况解析(包含两个归纳,6个示例)

    c++多线程之死锁的发生的情况解析(包含两个归纳,6个示例)

    这篇文章主要介绍了c++多线程之死锁的发生的情况解析(包含两个归纳,6个示例),需要的朋友可以参考下
    2018-01-01
  • C语言 超详细顺序表的模拟实现实例建议收藏

    C语言 超详细顺序表的模拟实现实例建议收藏

    程序中经常需要将一组数据元素作为整体管理和使用,需要创建这种元素组,用变量记录它们,传进传出函数等。一组数据中包含的元素个数可能发生变化,顺序表则是将元素顺序地存放在一块连续的存储区里,元素间的顺序关系由它们的存储顺序自然表示
    2022-03-03
  • C++中的RAII机制详解

    C++中的RAII机制详解

    这篇文章主要介绍了C++中的RAII机制详解,RAII是Resource Acquisition Is Initialization的简称,是C++语言的一种管理资源、避免泄漏的惯用法,需要的朋友可以参考下
    2014-09-09
  • C++实现的求解多元一次方程示例

    C++实现的求解多元一次方程示例

    这篇文章主要介绍了C++实现的求解多元一次方程,涉及C++矩阵运算相关操作技巧,需要的朋友可以参考下
    2018-01-01
  • 详细聊聊c语言中的缓冲区问题

    详细聊聊c语言中的缓冲区问题

    缓冲区又称为缓存,它是内存空间的一部分,也就是说在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区,这篇文章主要给大家介绍了关于c语言中缓冲区问题的相关资料,需要的朋友可以参考下
    2021-11-11
  • 一篇文章带你了解C++(STL基础、Vector)

    一篇文章带你了解C++(STL基础、Vector)

    这篇文章主要为大家详细介绍了C++ STL基础,vector向量容器使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能给你带来帮助
    2021-08-08
  • C语言线性表之双链表详解

    C语言线性表之双链表详解

    这篇文章主要为大家详细介绍了C语言线性表之双链表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • C++中vector容器使用详细说明

    C++中vector容器使用详细说明

    在c++中,vector是一个十分有用的容器,下面通过本文给大家介绍C++中vector容器使用详细说明,需要的朋友可以参考下
    2016-10-10

最新评论