matlab 2048小游戏

界面使用gui制作,各个组件的颜色由之前RGB颜色提取程序提取的原版。
游戏效果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
游戏改进:
1.该程序增添了快速截取游戏分数的功能,以及记录游戏最高分的功能。

2.更加美观的界面

完整代码:

function guigame2048
clc;clear;
%设置全局变量
global GUI;
global score;
global best;
global gameover;
global squaremap;
global colorlist;
global fontsizelist;

global drawBkgHdl;
global drawSquareBkgHdl;
global drawSquareHdl;
global GameOver1Hdl;
global GameOver2Hdl;
global GameOver3Hdl;
global GameOver4Hdl;
global GameOver5Hdl;
global GameOver6Hdl;
global Restart1Hdl;
global Text1Hdl;
global Text2048Hdl;

global textScore1Hdl;
global textBest1Hdl;

global Score1Hdl;
global Best1Hdl;
%==========================================================================
init()
    %按键函数,通过moveevent调整矩阵
    function key(~,event)
        temp_map=squaremap;
        switch event.Key
            case 'uparrow'
                temp_map=moveevent(temp_map(:,4:-1:1));
                temp_map=temp_map(:,4:-1:1);
            case 'downarrow'
                temp_map=moveevent(temp_map);
            case 'rightarrow'
                temp_map=temp_map';
                temp_map=moveevent(temp_map(:,4:-1:1));
                temp_map=temp_map(:,4:-1:1);
                temp_map=temp_map';
                
            case 'leftarrow'
                temp_map=moveevent(temp_map');
                temp_map=temp_map';
        end
        
        %若新矩阵与原矩阵不同,则重新绘制方块
        if any(any(squaremap~=temp_map))
            squaremap=temp_map;
            createNewNum()
            drawSquare()
        end
    end

    %主函数
    function temp_matrix=moveevent(temp_matrix)
        for i = 1: 4
            temp_array=temp_matrix(i,:);
            temp_array(temp_array==0)=[];

            for j = 1: (length(temp_array)-1)
                if temp_array(j)==temp_array(j+1)
                    temp_array(j)=temp_array(j)+temp_array(j+1);
                    temp_array(j+1)=0;
                end
            end

            temp_array(temp_array==0)=[];
            temp_array((length(temp_array)+1):4)=0;
            temp_matrix(i,:)=temp_array;
        end
    end

    %在矩阵空白处创建新的数字24
    function createNewNum(~,~)
        zerospos=find(squaremap==0);
        temp_pos=zerospos(randi(length(zerospos)));
        temp_num=randi(2)*2;
        squaremap(temp_pos)=temp_num;
    end

    %重新绘制方块
    function drawSquare(~,~)
        judge()
        score=sum(sum(squaremap));
        set(textScore1Hdl,'string',num2str(score));
        for i=1:4
            for j=1:4
                temp_num=log(squaremap(i,j))/log(2);
                temp_num(temp_num<0)=0;
                set(drawSquareHdl(i,j),'backgroundcolor',colorlist(temp_num+1,:)); 
                %不同数值的方框不同颜色与数字大小:
                switch 1
                    case squaremap(i,j)==0,set(drawSquareHdl(i,j),'string','');   
                    case squaremap(i,j)<=4&&squaremap(i,j)>0,set(drawSquareHdl(i,j),...
                                                            'string',num2str(squaremap(i,j)),...
                                                            'fontsize',fontsizelist(temp_num+1),...
                                                            'foregroundcolor',[0.4667 0.4314 0.3961]);  
                    case squaremap(i,j)>4,set(drawSquareHdl(i,j),...
                                          'string',num2str(squaremap(i,j)),...
                                          'fontsize',fontsizelist(temp_num+1),...
                                          'foregroundcolor','w');  
                end
            end
        end
    end
%==========================================================================
    %判断游戏结束函数
    function judge(~,~)
        temp_judge_zeros=sum(sum(squaremap==0));
        temp_judge_row=any(any(squaremap(1:3,:)==squaremap(2:4,:)));
        temp_judge_col=any(any(squaremap(:,1:3)==squaremap(:,2:4)));
        if temp_judge_row+temp_judge_col+temp_judge_zeros==0
            gameover=1;
            gameOver()
        end
    end

    %绘制游戏结束界面
    function gameOver(~,~)
        best=max([best,score]);
        save best.mat best -append
        set(GameOver1Hdl,'visible','on');
        set(GameOver2Hdl,'visible','on');
        set(GameOver3Hdl,'visible','on');
        set(GameOver4Hdl,'visible','on');
        set(GameOver5Hdl,'visible','on');
        set(GameOver6Hdl,'visible','on');
        set(GameOver4Hdl,'string',{['Best : ',num2str(best)];['Score : ',num2str(score)]});
    end

    %存储图像函数
    function savepic(~,~)
        [filename, pathname] = uiputfile({'*.jpg;*.png','All Image Files';...
            '*.jpg','JPG';'*.png','PNG' });
        saveas(gcf,[pathname,filename])
    end

    %重新开始函数
    function restart(~,~)
        best=max([best,score]);
        %最高分存储
        save best.mat best -append  
        close all;
        clc;clear;init()
    end
%==========================================================================
%初始化函数
    function init(~,~)
        GUI.fig=figure('units','pixels',...
            'position',[560 50 320+80 460+115],...
            'Color',[0.9804 0.9725 0.9373],...
            'tag','fig',...
            'Numbertitle','off',...
            'menubar','none',...
            'name','2048Game',...
            'resize','off');
        drawBkgHdl=uicontrol('parent',GUI.fig,...
            'style','text',...
            'string','',...
            'position',[0 0 320+80 460+115],...
            'backgroundcolor',[0.9804 0.9725 0.9373]);
        drawSquareBkgHdl=uicontrol('parent',GUI.fig,...
            'style','text',...
            'string','',...
            'position',[20 20 320+80-40 320+80-40],...
            'backgroundcolor',[0.7333 0.6784 0.6275]);
        for i=1:4
            for j=1:4
                drawSquareHdl(i,j)=uicontrol('parent',GUI.fig,...
                        'style','edit',...
                        'string','',...
                        'horizontalalign','center',...
                        'Enable','inactive',...
                        'FontWeight','bold',...
                        'position',[30+(i-1)*(350/4) 30+(j-1)*(350/4) 350/4-10 350/4-10],...
                        'backgroundcolor',[0.8039 0.7569 0.7059]);
            end
        end
        Restart1Hdl=uicontrol('parent',GUI.fig,...
            'style','pushbutton',...
            'string','New Game',...
            'FontWeight','bold',...
            'horizontalalign','center',...
            'position',[320+80-20-140,320+80-20+25,140,50],...
            'backgroundcolor',[0.5608 0.4784 0.4000],...
            'foregroundcolor','w',...
            'fontsize',16,...
            'callback',@restart);
        Text1Hdl=uicontrol('parent',GUI.fig,...
            'style','text',...
            'string',{' join the numbers to get';' higher score'},...
            'horizontalalign','left',...
            'position',[20 320+80-20+25 200 50],...
            'backgroundcolor',[0.9804 0.9725 0.9373],...
            'foregroundcolor',[0.4667 0.4314 0.3961],...
            'fontsize',14);
        Text2048Hdl=uicontrol('parent',GUI.fig,...
            'style','text',...
            'string','2048',...
            'horizontalalign','left',...
            'position',[22 480 200 50],...
            'backgroundcolor',[0.9804 0.9725 0.9373],...
            'foregroundcolor',[0.4667 0.4314 0.3961],...
            'FontWeight','bold',...
            'fontsize',27);
        Score1Hdl=uicontrol('parent',GUI.fig,...
            'style','text',...
            'string','SCORE',...
            'horizontalalign','center',...
            'position',[380-170 320+80-20+25+70 80 70],...
            'backgroundcolor',[0.7333 0.6784 0.6275],...
            'foregroundcolor',[0.9333 0.8941 0.8549],...
            'FontWeight','bold',...
            'fontsize',15);
        Best1Hdl=uicontrol('parent',GUI.fig,...
            'style','text',...
            'string','BEST',...
            'horizontalalign','center',...
            'position',[380-80 320+80-20+25+70 80 70],...
            'backgroundcolor',[0.7333 0.6784 0.6275],...
            'foregroundcolor',[0.9333 0.8941 0.8549],...
            'FontWeight','bold',...
            'fontsize',15);
        textScore1Hdl=uicontrol('parent',GUI.fig,...
            'style','text',...
            'string','0',...
            'horizontalalign','center',...
            'position',[380-170 320+80-20+25+70 80 40],...
            'backgroundcolor',[0.7333 0.6784 0.6275],...
            'foregroundcolor','w',...
            'FontWeight','bold',...
            'fontsize',14);
        textBest1Hdl=uicontrol('parent',GUI.fig,...
            'style','text',...
            'string','0',...
            'horizontalalign','center',...
            'position',[380-80 320+80-20+25+70 80 40],...
            'backgroundcolor',[0.7333 0.6784 0.6275],...
            'foregroundcolor','w',...
            'FontWeight','bold',...
            'fontsize',14);
        
        
        
        GameOver1Hdl=uicontrol('parent',GUI.fig,...
            'style','text',...
            'string','',...
            'horizontalalign','center',...
            'position',[0 200 320+80 200-20],...
            'backgroundcolor',[0.7765 0.7647 0.7412],...
            'foregroundcolor','w',...
            'FontWeight','bold',...
            'visible','off',...
            'fontsize',14);
        GameOver2Hdl=uicontrol('parent',GUI.fig,...
            'style','text',...
            'string','',...
            'horizontalalign','center',...
            'position',[0 203 320+80 200-6-20],...
            'backgroundcolor',[0.9804 0.9725 0.9333],...
            'foregroundcolor','w',...
            'FontWeight','bold',...
            'visible','off',...
            'fontsize',14);
        GameOver3Hdl=uicontrol('parent',GUI.fig,...
            'style','text',...
            'string','Game Over',...
            'horizontalalign','center',...
            'position',[0 203 320+80 200-6-20],...
            'backgroundcolor',[0.9804 0.9725 0.9333],...
            'foregroundcolor',[0.9686 0.3686 0.2431],...%[0.4667 0.4314 0.3961],...
            'FontWeight','bold',...
            'visible','off',...
            'fontsize',20);
        GameOver4Hdl=uicontrol('parent',GUI.fig,...
            'style','text',...
            'string','100',...
            'horizontalalign','center',...
            'position',[0 203 320+80 150-20],...
            'backgroundcolor',[0.9804 0.9725 0.9333],...
            'foregroundcolor',[0.4667 0.4314 0.3961],...
            'FontWeight','bold',...
            'visible','off',...
            'fontsize',14);
        GameOver5Hdl=uicontrol('parent',GUI.fig,...
            'style','pushbutton',...
            'string','restart',...
            'horizontalalign','center',...
            'position',[320+80-80-100 203+30 100 30],...
            'backgroundcolor',[0.7333 0.6784 0.6275],...
            'foregroundcolor','w',...
            'FontWeight','bold',...
            'visible','off',...
            'callback',@restart,...
            'fontsize',10);
        GameOver6Hdl=uicontrol('parent',GUI.fig,...
            'style','pushbutton',...
            'string','save picture',...
            'horizontalalign','center',...
            'position',[80 203+30 100 30],...
            'backgroundcolor',[0.7333 0.6784 0.6275],...
            'foregroundcolor','w',...
            'FontWeight','bold',...
            'visible','off',...
            'callback',@savepic,...
            'fontsize',10);
        
        %若没有游戏记录则最高分为0
        if ~exist('best.mat')
            best=0;
            save best.mat best;
        end
        data=load('best.mat');
        best=data.best;
        
        %方块颜色表
        colorlist=[ 0.8039    0.7569    0.7059
                    0.9333    0.8941    0.8549
                    0.9373    0.8784    0.8039
                    0.9608    0.6863    0.4824
                    0.9529    0.5922    0.4078
                    0.9529    0.4902    0.3725
                    0.9686    0.3686    0.2431
                    0.9255    0.8118    0.4510
                    0.9373    0.7882    0.3922
                    0.9333    0.7804    0.3216
                    0.9216    0.7686    0.2627
                    0.9255    0.7608    0.1804
                    0.9412    0.4078    0.4157
                    0.9216    0.3137    0.3451
                    0.9451    0.2549    0.2627
                    0.4392    0.7020    0.8157
                    0.3765    0.6353    0.8745
                    0.0902    0.5098    0.7843];
        %数字大小表
        fontsizelist=[12 24 24 24 24 24 24 24 24 24 22 22 22 22 20 20 20 16];
        
        set(textBest1Hdl,'string',num2str(best));
        squaremap=zeros(4,4);
        score=0;   
        gameover=0;
        createNewNum()
        createNewNum()
        drawSquare()
        set(gcf, 'KeyPressFcn', @key); 
    end
end

另m,mlapp,fig,mlappinstall格式文件获取地址:
https://download.csdn.net/download/slandarer/13973638

  • 21
    点赞
  • 122
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 17
    评论
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

slandarer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值