【matlab】拆雷的程序

news/2024/7/3 5:35:15

前言

法术的仙意,无法遮盖你千年的痴迷。——《仙逆》

在这里插入图片描述


         \;\\\;\\\;

目录

    • 前言
    • 拆雷

拆雷

function Bomb(n,mm)
clear;
close;
if nargin ~= 2
    n = [22,18];
    mm = 65;
end
if mm + 1 > n(1) * n(2)
    error('Setting error');
end

f1 = figure('Name','Bombs','NumberTitle','off','Color',[1,1,1],...
    'Position',[100,50,900,600],'WindowButtonDownFcn',@BDF,...
    'WindowButtonMotionFcn',@BMF,'WindowButtonUpFcn',@BUF);
ax = axes(f1,'XTick',0.5:(n(1)+0.5),'YTick',0.5:(n(2)+0.5),'XColor',...
    [0.5,0.5,0.5],'YColor',[0.5,0.5,0.5],'Color',[1,1,1],'Parent',f1,...
    'Position',[0,0,13/14,0.98],'XTickLabel',[],'YTickLabel',[],...
    'XGrid','on','YGrid','on','XLim',[0,n(1)+1],'YLim',[0,n(2)+1],...
    'DataAspectRatio',[1,1,1]);
T = uicontrol(f1,'Style','text','BackgroundColor',[1,1,1],'String',...
    num2str(mm),'Units','normalized','Position',[13/14,0.80,1/14,0.1],...
    'FontSize',18,'FontWeight','bold');
hold on

for i = n(1):-1:1
    for j = n(2):-1:1
        M(i,j) = patch(ax,[i,i+1,i+1,i]-0.5,[j,j,j+1,j+1]-0.5,...
            [0.8,0.8,0.8],'EdgeColor',[0.7,0.7,0.7]);
        F(i,j) = image(ax,[i-0.4,i+0.4],[j-0.4,j+0.4],[]);
    end
end

xd = 1;
yd = 1;
xm = 1;
ym = 1;
xu = 1;
yu = 1;
PC = [0.8,0.8,0.8]; % last color
CD = uint8([0,0,225;2,129,2;253,7,7;20,20,158;...
    128,1,1;0,128,128;10,10,10;128,128,128]); % CData of Number
MT = "";
btn_exit = "";

FLAG = zeros(9,9,3,'uint8'); % Draw Flag
FLAG(:,:,1) = [204 204 204 204 204 204 204 204 204;
    204 0 0 0 0 0 0 0 204;
    204 204 0 0 0 0 0 204 204;
    204 204 204 204 0 204 204 204 204;
    204 204 204 204 255 204 204 204 204;
    204 204 255 255 255 204 204 204 204;
    204 204 204 255 255 204 204 204 204;
    204 204 204 204 255 204 204 204 204;
    204 204 204 204 204 204 204 204 204];
FLAG(:,:,2) = [204 204 204 204 204 204 204 204 204;
    204 0 0 0 0 0 0 0 204;
    204 204 0 0 0 0 0 204 204;
    204 204 204 204 0 204 204 204 204;
    204 204 204 204 0 204 204 204 204;
    204 204 0 0 0 204 204 204 204;
    204 204 204 0 0 204 204 204 204;
    204 204 204 204 0 204 204 204 204;
    204 204 204 204 204 204 204 204 204];
FLAG(:,:,3) = [204 204 204 204 204 204 204 204 204;
    204 0 0 0 0 0 0 0 204;
    204 204 0 0 0 0 0 204 204;
    204 204 204 204 0 204 204 204 204;
    204 204 204 204 0 204 204 204 204;
    204 204 0 0 0 204 204 204 204;
    204 204 204 0 0 204 204 204 204;
    204 204 204 204 0 204 204 204 204;
    204 204 204 204 204 204 204 204 204];

BOMB = zeros(15,15,3,'uint8'); % draw the Bomb
BOMB(:,:,1) = [
    255 255 255 255 255 255 255 255 255 255 255 255 255 255 255;
    255 255 255 255 255 255 255 0 255 255 255 255 255 255 255;
    255 255 255 255 255 255 255 0 255 255 255 255 255 255 255;
    255 255 255 0 255 0 0 0 0 0 255 0 255 255 255;
    255 255 255 255 0 0 0 0 0 0 0 255 255 255 255;
    255 255 255 0 0 0 0 0 0 0 0 0 255 255 255;
    255 255 255 0 0 0 0 0 0 0 0 0 255 255 255;
    255 0 0 0 0 0 0 0 0 0 0 0 0 0 255;
    255 255 255 0 0 255 255 0 0 0 0 0 255 255 255;
    255 255 255 0 0 255 255 0 0 0 0 0 255 255 255;
    255 255 255 255 0 0 0 0 0 0 0 255 255 255 255;
    255 255 255 0 255 0 0 0 0 0 255 0 255 255 255;
    255 255 255 255 255 255 255 0 255 255 255 255 255 255 255;
    255 255 255 255 255 255 255 0 255 255 255 255 255 255 255;
    255 255 255 255 255 255 255 255 255 255 255 255 255 255 255];
BOMB([9,10],[6,7],[2,3]) = 255;

MDATA = zeros(n,'logical'); % If this position was open
BF = zeros(n,'logical'); % Bombs found
NClick = true; % First protect
BDATA = zeros(n); % locate of Bomb
Ndata = zeros(n); % Map information
aa = 1;
bb = 1;
cc = false;

    function BDF(~,~)
        m = get(ax,'CurrentPoint');
        xd = round(m(1,1));
        yd = round(m(1,2));
        MT = get(f1,'SelectionType');
        if xd>=1 && xd<=n(1) && yd>=1 && yd<=n(2) && MDATA(xd,yd) &&...
                Ndata(xd,yd) > 0 && (MT == "normal" || MT == "alt")
            [a,b] = specialgrid(xd,yd);
            C = zeros(n,'logical');
            C(a,b) = true;
            [aa,bb] = find(C & ~MDATA & ~BF);
            for ii = [aa,bb].'
                M(ii(1),ii(2)).FaceColor = [0.6,0.6,0.6];
            end
            cc = true;
        end
        if NClick
            Bset = randperm(n(1) * n(2) - 1,mm) + 1;
            Npoint = (yd - 1) * n(1) + xd;
            if ismember(Npoint,Bset)
                Bset(Bset <= Npoint) = Bset(Bset <= Npoint) - 1;
            end
            BDATA(Bset) = 1;
            Ndata = conv2(BDATA,[1,1,1;1,0,1;1,1,1],'same');
            Ndata(BDATA == 1) = -1;
            NClick = false;
        end
    end

    function BMF(~,~)
        M(xm,ym).FaceColor = PC;
        M(xm,ym).FaceAlpha = 1;
        m = get(ax,'CurrentPoint');
        x = sort([1,round(m(1,1)),n(1)]);
        y = sort([1,round(m(1,2)),n(2)]);
        xm = x(2);
        ym = y(2);
        PC = M(xm,ym).FaceColor;
        M(xm,ym).FaceColor = [0.8,0.8,0.8];
        M(xm,ym).FaceAlpha = 0.5;
    end

    function BUF(~,~)
        if cc
            for ii = [aa,bb].'
                M(ii(1),ii(2)).FaceColor = [0.8,0.8,0.8];
            end
            cc = false;
        end
        m = get(ax,'CurrentPoint');
        xu = round(m(1,1));
        yu = round(m(1,2));
        if xd==xu && yd==yu && xu>=1 && yu>=1 && xu<=n(1) && yu<=n(2)
            if ~MDATA(xu,yu)
                if MT == "normal"
                    if ~BF(xu,yu)
                        if Ndata(xu,yu) == -1
                            BF(xu,yu) = true;
                            M(xu,yu).FaceColor = [1,0,0];
                            PC = [1,0,0];
                            F(xu,yu).CData = BOMB;
                            if btn_exit ~= "end"
                                ENDq(false)
                            end
                        else
                            MDATA(xu,yu) = true;
                            M(xu,yu).FaceColor = [1,1,1];
                            PC = [1,1,1];
                            if Ndata(xu,yu) == 0
                                swap(xu,yu)
                            else
                                TEXT(xu,yu)
                            end
                        end
                    end
                elseif MT == "alt"
                    if ~BF(xu,yu)
                        BF(xu,yu) = true;
                        F(xu,yu).CData = FLAG;
                        T.String = num2str(str2double(T.String) - 1);
                    elseif btn_exit ~= "end"
                        BF(xu,yu) = false;
                        F(xu,yu).CData = [];
                        T.String = num2str(str2double(T.String) + 1);
                    end
                end
            elseif Ndata(xu,yu) > 0
                [a,b] = specialgrid(xu,yu);
                if sum(BF(a,b),'all') == Ndata(xu,yu) &&...
                        sum(BF(a,b),'all') < sum(~MDATA(a,b),'all')
                    C = zeros(n,'logical');
                    C(a,b) = true;
                    [a,b] = find(C & ~MDATA & ~BF);
                    for ii = [a,b].'
                        MDATA(ii(1),ii(2)) = true;
                        if Ndata(ii(1),ii(2)) == -1
                            BF(ii(1),ii(2)) = true;
                            MDATA(ii(1),ii(2)) = false;
                            M(ii(1),ii(2)).FaceColor = [1,0,0];
                            F(ii(1),ii(2)).CData = BOMB;
                            if btn_exit ~= "end"
                                ENDq(false)
                            end
                        else
                            M(ii(1),ii(2)).FaceColor = [1,1,1];
                            PC = [1,1,1];
                            if Ndata(ii(1),ii(2)) == 0
                                swap(ii(1),ii(2))
                            else
                                TEXT(ii(1),ii(2))
                            end
                        end
                    end
                end
            end
        end
        if (all(BDATA == ~MDATA,'all') ||...
                all(BDATA == BF,'all')) && btn_exit ~= "end"
            ENDq(true)
        end
    end

    function swap(x,y)
        C = zeros(n(1),n(2),'logical');
        C_ = C;
        C(x,y) = true;
        while ~all(C == C_,'all')
            C_ = C;
            [x,y] = find((~Ndata | BF) & C);
            for ii = [x,y].'
                if Ndata(ii(1),ii(2)) == 0
                    [a,b] = specialgrid(ii(1),ii(2));
                    C(a,b) = ~BF(a,b);
                end
            end
        end
        [x,y] = find(C);
        for ii = [x,y].'
            MDATA(ii(1),ii(2)) = true;
            M(ii(1),ii(2)).FaceColor = [1,1,1];
            if Ndata(ii(1),ii(2)) ~= 0
                TEXT(ii(1),ii(2))
            end
        end
    end

    function [a,b] = specialgrid(x,y)
        if x == 1
            a = [1,2];
        elseif x == n(1)
            a = [n(1)-1,n(1)];
        else
            a = x-1:x+1;
        end
        if y == 1
            b = [1,2];
        elseif y == n(2)
            b = [n(2)-1,n(2)];
        else
            b = y-1:y+1;
        end
    end

    function TEXT(x,y)
        text(x-0.2,y,num2str(Ndata(x,y)),'FontSize',15,'FontWeight',...
            'bold','Color',CD(Ndata(x,y),:));
    end

    function ENDq(a)
        if a
            btn_exit = questdlg('You Win !','YouWin',...
                'restart','close','restart');
            if isempty(btn_exit)
                btn_exit = "end";
            end
            if strcmp(btn_exit,'restart')
                Bomb;
            elseif strcmp(btn_exit,'close')
                close; clear;
            end
        else
            btn_exit = questdlg('You Lose.',...
                'YouLose','restart','close','restart');
            if isempty(btn_exit)
                btn_exit = 'end';
            end
            if strcmp(btn_exit,'restart')
                Bomb;
            elseif strcmp(btn_exit,'close')
                close; clear;
            end
        end
    end
end

         \;\\\;\\\;


http://lihuaxi.xjx100.cn/news/1886172.html

相关文章

d2l绘图不显示的问题

之前试了各种方法都不行 在pycharm中还是不行&#xff0c;但是在anaconda中的命令行是可以的 anaconda prompt conda activaye py39 #进入f盘 F: #运行文件 python F:\python_code\softmax.py

网络通信之网卡配置ip

今天突然想到&#xff0c;一个网卡可以配置几个ip&#xff1f; 可以肯定的是在windows操作平台下一个网卡可以配置多个ip&#xff0c;在windows下通过图像界面找到高级选项既可以添加ip。那么在linux如何对一个网卡配置不同网段的ip呢&#xff1f;命令如下&#xff1a; sudo …

Ubuntu(WSL)卸载与安装指定版本的 openssl

卸载 openssl 1&#xff09;查找并删除 openssl 关联的目录与文件 whereis opensslwhich opensslrm -rf /a/b/c/ // 使用 rm 命令删除所有 openssl 相关目录 2&#xff09;删除软件安装包 apt-get purge openssl 3&#xff09;删除配置文件 rm -rf /etc/ssl 安装 ope…

flutter ‘Gradle Libs‘ was added by build file ‘app/build.gradle‘

相关问题解释文章 How to prefer settings.gradle repositories over build.gradle repositoriesMode 解释 问题描述 此问题是&#xff0c;直接创建的flutter项目&#xff0c;需要配置其他的maven仓库地址&#xff0c;和第三方module&#xff0c;结果始终都是无法成功 错误…

学习pytorch20 pytorch完整的模型验证套路

pytorch完整的模型验证套路 使用非数据集的测试数据&#xff0c;测试训练好模型的效果代码预测结果解决报错 B站小土堆pytorch学习视频 https://www.bilibili.com/video/BV1hE411t7RN/?p32&spm_id_frompageDriver&vd_source9607a6d9d829b667f8f0ccaaaa142fcb 使用非数…

Python数据科学视频讲解:Python保留字与标识符

2.6 Python保留字与标识符 视频为《Python数据科学应用从入门到精通》张甜 杨维忠 清华大学出版社一书的随书赠送视频讲解2.6节内容。本书已正式出版上市&#xff0c;当当、京东、淘宝等平台热销中&#xff0c;搜索书名即可。内容涵盖数据科学应用的全流程&#xff0c;包括数据…

Web漏洞分析-文件解析及上传(上)

随着互联网的迅速发展&#xff0c;网络安全问题变得日益复杂&#xff0c;而文件解析及上传漏洞成为攻击者们频繁攻击的热点之一。本文将深入研究文件解析及上传漏洞&#xff0c;通过对文件上传、Web容器IIS、命令执行、Nginx文件解析漏洞以及公猫任意文件上传等方面的细致分析&…

lwIP 细节之三:errf 回调函数是何时调用的

使用 lwIP 协议栈进行 TCP 裸机编程&#xff0c;其本质就是编写协议栈指定的各种回调函数。将你的应用逻辑封装成函数&#xff0c;注册到协议栈&#xff0c;在适当的时候&#xff0c;由协议栈自动调用&#xff0c;所以称为回调。 注&#xff1a;除非特别说明&#xff0c;以下内…