您当前的位置: 首页 >  游戏

matlab 扫雷小游戏

发布时间:2019-02-28 14:32:07 ,浏览量:6

借鉴了很多人扫雷的版本 这个扫雷程序第一步不会碰到雷,而且掀开方块的速度比较快 在这里插入图片描述 程序

function XPBOMBS2
clear 
row=15;col=20;mines=45;
total=mines;times=1;
remine=row*col;
flags=0;
hf=figure('NumberTitle','off','Name','扫雷','menubar','none','position',[370,130,600,500]);
uh1=uimenu('label','帮助');
uimenu(uh1,'label','游戏规则','callback',['msgbox(''和windows自带的扫雷一个样,嗯哒'')'])
colormap([1 0 0;0 0 0;.65 .65 .65;1 1 1]);
axis off
   hold on;
C=uicontrol(gcf,'style','text','unit','normalized',...
    'position',[0.45,0.86,0.09,0.078],'fontsize',17,...
    'BackgroundColor',0.85*[1 1 1],...
    'string','o');
H=uicontrol(gcf,'style','text','unit','normalized',...
    'position',[0.58,0.86,0.3,0.078],'fontsize',12,...
    'BackgroundColor',0.85*[1 1 1],...
   'string',['total:' num2str(total)]);
F=uicontrol(gcf,'style','text','unit','normalized',...
    'position',[0.1,0.86,0.3,0.078],'fontsize',12,...
    'BackgroundColor',0.85*[1 1 1],...
   'string',['flag:' num2str(flags)]);
for m=1:row 
    for n=1:col
        h(m,n)=uicontrol(gcf,'style','push',...
            'foregroundColor',0.7*[1 1 1],...
            'BackgroundColor',0.7*[1 1 1],...
            'fontsize',15,'fontname','time new roman',...
            'Unit','normalized','position',[0.013+0.045*n,0.86-0.054*m,0.043,0.052],...
            'Visible','on',...
            'callback',@pushcallback,'ButtonDownFcn',@buttoncallback);  
    end
end
    function first_time(place)
        mine=rand(row,col);
        A=ones(row,col);
        [x,y]=find(A==1);
        postions=[x,y];
        places=[place;place+[1,0];place+[-1,0];place+[1,1];place+[0,1];
            place+[-1,1];place+[1,-1];place+[0,-1];place+[-1,-1]];
        places=intersect(postions,places,'rows');
        pos=places(:,1)+(places(:,2)-1).*row;
        mine(pos)=1;
        [~,index]=sort(mine(:));
        mine=(mine<=mine(index(mines)));
        Y=zeros(row+2,col+2);
        x=2:row+1;y=2:col+1;
        Y(x,y)=mine;
        Y(x,y)=Y(x-1,y-1)+Y(x-1,y)+Y(x-1,y+1)+Y(x,y-1)+Y(x,y+1)+Y(x+1,y-1)+Y(x+1,y)+Y(x+1,y+1);
        around=Y(x,y);
    end
function pushcallback(hobject,~)
            a = get(hobject,'position');
            hang=double((a(2)-0.86)/(-0.054))-0.0001;
            lie=double((a(1)-0.013)/0.045)-0.0001;
            place=ceil([hang,lie]);
            if times==1
                first_time(place)
                times=0;
            end
            if mine(place(1),place(2))==1&&~strcmp(get(hobject,'string'),'!')
                [p,q]=find(mine==1);
                bombs=p+row*(q-1);
                set(h(bombs),'style','text','string','x','ForegroundColor','k','backgroundcolor',0.85*[1,1,1]);
                set(hobject,'style','text','string','X','ForegroundColor',[0.8 0 0],'backgroundcolor',0.85*[1,1,1]);
                buttonName2=questdlg('It is a pity that you lose','Game over','close','restart','close');
                if isempty(buttonName2)
                    buttonName2='end';
                end
                if strcmp(buttonName2,'restart')
                        clf;close;
                        XPBOMBS2();
                else if strcmp(buttonName2,'close')
                            close;
                    end
                end
            end
            if (mine(place(1),place(2))==0)&&(around(place(1),place(2))~=0)&&~strcmp(get(hobject,'string'),'!')
                drawnum(hobject,place)
            end
            if (mine(place(1),place(2))==0)&&(around(place(1),place(2))==0)&&~strcmp(get(hobject,'string'),'!')
                begins=place;
                [whitea,whiteb]=find(around==0);
                white=[whitea,whiteb];
                next=[begins;begins+[1,0];begins+[-1,0];begins+[0,1];begins+[0,-1]];
                while ~isempty(intersect(white,next,'rows'))
                    [a,b,~]=intersect(white,next,'rows');
                    begins=[a;begins];white(b,:)=[];
                    ad=length(sum(begins,2));
                    next=[begins;begins+ones(ad,1)*[1,0];begins+ones(ad,1)*[-1,0];begins+ones(ad,1)*[0,1];begins+ones(ad,1)*[0,-1]];
                end
                drawbegins=begins(:,1)+row*(begins(:,2)-ones(ad,1));
                set(h(drawbegins),'style','text','string','','backgroundcolor',0.85*[1,1,1]);
                control(drawbegins)=0;
                colors=[begins;begins+ones(ad,1)*[1,0];begins+ones(ad,1)*[-1,0];begins+ones(ad,1)*[0,1];begins+ones(ad,1)*[0,-1];
                    begins+ones(ad,1)*[1,1];begins+ones(ad,1)*[1,-1];begins+ones(ad,1)*[-1,1];begins+ones(ad,1)*[-1,-1]];
                colors=unique(colors,'rows');
                [txa,txb]=find(around~=0);
                tx=[txa,txb];
                txcolors=intersect(tx,colors,'rows');
                for i=1:length(sum(txcolors,2))
                    drawnum(h(txcolors(i,1),txcolors(i,2)),txcolors(i,1:2))
                end
            end
    end
function buttoncallback(hobject,~)
        if strcmp(get(gcf,'SelectionType'),'alt')
            if ~strcmp(get(hobject,'style'),'text')
                if ~strcmp(get(hobject,'string'),'!')
                    set(hobject,'string','!','ForegroundColor',[0.9,0,0])
                    flags=flags+1;set(F,'string',['flag:' num2str(flags)]);
                else 
                    set(hobject,'string',' ')
                    flags=flags-1;set(F,'string',['flag:' num2str(flags)])
                end
            end
        end
    end
    function drawnum(hobject,place)
        if around(place(1),place(2))==1,set(hobject,'style','text','string',1,'ForegroundColor','b','backgroundcolor',0.85*[1,1,1]);end
        if around(place(1),place(2))==2,set(hobject,'style','text','string',2,'ForegroundColor',[0,0.7,0],'backgroundcolor',0.85*[1,1,1]);end
        if around(place(1),place(2))==3,set(hobject,'style','text','string',3,'ForegroundColor',[0.8,0,0],'backgroundcolor',0.85*[1,1,1]);end
        if around(place(1),place(2))==4,set(hobject,'style','text','string',4,'ForegroundColor',[0,0,0.6],'backgroundcolor',0.85*[1,1,1]);end
        if around(place(1),place(2))==5,set(hobject,'style','text','string',5,'ForegroundColor',[0.5,0,0],'backgroundcolor',0.85*[1,1,1]);end
        if around(place(1),place(2))==6,set(hobject,'style','text','string',6,'ForegroundColor',[0,0.6,0],'backgroundcolor',0.85*[1,1,1]);end
        if around(place(1),place(2))==7,set(hobject,'style','text','string',7,'ForegroundColor',[0.75,0,0],'backgroundcolor',0.85*[1,1,1]);end
        if around(place(1),place(2))==8,set(hobject,'style','text','string',8,'ForegroundColor',[0.4,0,0],'backgroundcolor',0.85*[1,1,1]);end
        control(place(1),place(2))=0;
        if control==mine
            [p,q]=find(mine==1);
                bombs=p+row*(q-1);
                set(h(bombs),'string','!','ForegroundColor',[0.9,0,0]);
            buttonName1=questdlg('you win. What do you mean to do?','Congratulations','close','restart','close');
                if isempty(buttonName1)
                    buttonName1='end';
                end
                if strcmp(buttonName1,'restart')
                        clf;close;
                        XPBOMBS2();
                else if strcmp(buttonName1,'close')
                            close;
                    end
                end
        end
    end
mine=zeros(row,col);
control=ones(row,col);
around=zeros(row,col);
end

将这几段代码复制到同一个m文件即可

关注
打赏
1688896170
查看更多评论

暂无认证

  • 6浏览

    0关注

    115984博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.0487s