Matlab - 通过按钮循环(=迷宫中的瓷砖)

时间:2015-12-06 00:25:39

标签: matlab for-loop uicontrol

我在Matlab中构建了一个5×5的迷宫,由按钮构成(每个按钮都是迷宫中的一块瓷砖)。开始的瓷砖是绿色的;最终的瓷砖是黄色的。打开的瓷砖是白色的,封闭的瓷砖(墙壁)是蓝色的。通过5乘5矩阵(A)预先分配颜色,白色= 0,蓝色= 1,黄色= 2,绿色= 3。 我的主要功能设置一个5乘5的矩阵A,然后调用一个函数" create_maze":

A = [0 3 0 1 0 ; 0 0 0 0 1 ; 1 0 0 0 1; 1 1 0 0 1; 1 0 2 0 0];
create_maze(A)

该功能也只能看到一些瓷砖,绿色瓷砖周围的瓷砖。

到目前为止一切顺利。现在我想点击白色瓷砖并出现相邻的瓷砖。 我想建立一个循环遍历所有按钮/磁贴的回调函数(所以我只需要编写一个函数)。 我已将所有按钮放在矩阵L中并设法为其设置回调函数。 该程序运行没有错误(所以回调有点工作)但是......没有任何反应!我不明白为什么。如果你能看一眼,我会非常感激!

这是我的函数create_maze:

function create_maze(A, varargin)

我设置了屏幕:

scr = get(0, 'screensize');
f1 = figure(1);
set(f1, 'menubar', 'none');
set(f1, 'position', [scr(1) scr(2) scr(3) scr(4)]);

创建25个按钮(对不起......)

h1 = uicontrol('Style', 'pushbutton',...
    'BackgroundColor', [0.91 0.91 0.91],...
    'String', '',...
    'Position', [200 200 100 100]);      
h2 = uicontrol('Style', 'pushbutton',...
    'BackgroundColor', [0.91 0.91 0.91],...
    'Position', [300 200 100 100]);
h3 = uicontrol('Style', 'pushbutton',...
    'BackgroundColor', [0.91 0.91 0.91],...
    'Position', [400 200 100 100]);
h4 = uicontrol('Style', 'pushbutton',...
    'BackgroundColor', [0.91 0.91 0.91],...
    'Position', [500 200 100 100]);
h5 = uicontrol('Style', 'pushbutton',...
    'BackgroundColor', [0.91 0.91 0.91],...
    'Position', [600 200 100 100]);
h6 = uicontrol('Style', 'pushbutton',...
    'BackgroundColor', [0.91 0.91 0.91],...
    'Position', [200 300 100 100]);
h7 = uicontrol('Style', 'pushbutton',...
    'BackgroundColor', [0.91 0.91 0.91],...
    'Position', [300 300 100 100]);
h8 = uicontrol('Style', 'pushbutton',...
    'BackgroundColor', [0.91 0.91 0.91],...
    'Position', [400 300 100 100]);
h9 = uicontrol('Style', 'pushbutton',...
    'BackgroundColor', [0.91 0.91 0.91],...
    'Position', [500 300 100 100]);
h10 = uicontrol('Style', 'pushbutton',...
    'BackgroundColor', [0.91 0.91 0.91],...
    'Position', [600 300 100 100]);
h11 = uicontrol('Style', 'pushbutton',...
    'BackgroundColor', [0.91 0.91 0.91],...
    'Position', [200 400 100 100]);
h12 = uicontrol('Style', 'pushbutton',...
    'BackgroundColor', [0.91 0.91 0.91],...
    'Position', [300 400 100 100]);
h13 = uicontrol('Style', 'pushbutton',...
    'BackgroundColor', [0.91 0.91 0.91],...
    'Position', [400 400 100 100]);
h14 = uicontrol('Style', 'pushbutton',...
    'BackgroundColor', [0.91 0.91 0.91],...
    'Position', [500 400 100 100]);
h15 = uicontrol('Style', 'pushbutton',...
    'BackgroundColor', [0.91 0.91 0.91],...
    'Position', [600 400 100 100]);
h16 = uicontrol('Style', 'pushbutton',...
    'BackgroundColor', [0.91 0.91 0.91],...
    'Position', [200 500 100 100]);
h17 = uicontrol('Style', 'pushbutton',...
    'BackgroundColor', [0.91 0.91 0.91],...
    'Position', [300 500 100 100]);
h18 = uicontrol('Style', 'pushbutton',...
    'BackgroundColor', [0.91 0.91 0.91],...
    'Position', [400 500 100 100]);
h19 = uicontrol('Style', 'pushbutton',...
    'BackgroundColor', [0.91 0.91 0.91],...
    'Position', [500 500 100 100]);
h20 = uicontrol('Style', 'pushbutton',...
    'BackgroundColor', [0.91 0.91 0.91],...
    'Position', [600 500 100 100]);
h21 = uicontrol('Style', 'pushbutton',...
    'BackgroundColor', [0.91 0.91 0.91],...
    'Position', [200 600 100 100]);
h22 = uicontrol('Style', 'pushbutton',...
    'BackgroundColor', [0.91 0.91 0.91],...
    'Position', [300 600 100 100]);
h23 = uicontrol('Style', 'pushbutton',...
    'BackgroundColor', [0.91 0.91 0.91],...
    'Position', [400 600 100 100]);
h24 = uicontrol('Style', 'pushbutton',...
    'BackgroundColor', [0.91 0.91 0.91],...
    'Position', [500 600 100 100]);
h25 = uicontrol('Style', 'pushbutton',...
    'BackgroundColor', [0.91 0.91 0.91],...
    'Position', [600 600 100 100]);

将按钮放在矩阵L

    L = [h1 h2 h3 h4 h5; h6 h7 h8 h9 h10;h11 h12 h13 h14 h15;...
    h16 h17 h18 h19 h20; h21 h22 h23 h24 h25];

设置按钮的颜色和......

for i = 1: size(A,1) % rows
    for j = 1: size(A,2) % columns
        if A(i,j) == 0
            set(L(i,j),'BackgroundColor', 'w')
            set(L(i,j), 'visible', 'off')
        elseif A(i,j) == 1
            set(L(i,j),'BackgroundColor','b')
            set(L(i,j), 'visible', 'off')
        elseif A(i,j) == 2
            set(L(i,j),'BackgroundColor','y')
            set(L(i,j),'String','GOAL')
            set(L(i,j), 'visible', 'on')
        elseif A(i,j) == 3
            set(L(i,j),'BackgroundColor','g')
        end
    end

...只显示一些按钮(绿色周围的按钮):

    for i = 1: size(A,1) % rows
        for j = 1: size(A,2) % columns
            if (1 < i) && A(i-1,j) == 3 ||...
                    (1 < j) && A(i,j-1) == 3                        
                set(L(i,j), 'visible', 'on')
            elseif (i < length(A)) && A(i+1,j) == 3 ||...
                    (j < length(A)) && A(i,j+1) == 3
                set(L(i,j), 'visible', 'on')
            end
        end
    end
end

将回调设置为矩阵L

 set(L(i,j),'callback',{@my_funct,L,A});

设置回调函数

 function [] = my_funct(source, callbackdata,L,A)

以下是完整的循环,应该使我点击的瓷砖旁边的瓷砖可见,但没有任何反应(我也没有得到任何错误)。

 for i = 1: size(A,1) % rows
        for j = 1: size(A,2) % columns
            if (1 < i) && A(i,j) == 0 ||...
                    (1 < j) && A(i,j) == 0                        
                set(L(i,j-1), 'visible', 'on')
            elseif (1 < i) && A(i,j) == 0 ||...
                    (1 < j) && A(i,j) == 0                        
                set(L(i-1,j), 'visible', 'on')
            elseif (i < length(A)) && A(i,j) == 0 ||...
                    (j < length(A)) && A(i,j) == 0
                set(L(i+1,j), 'visible', 'on')
            elseif (i < length(A)) && A(i,j) == 0 ||...
                    (j < length(A)) && A(i,j) == 0
                set(L(i,j+1), 'visible', 'on')
            end
        end
end  
end  
end

0 个答案:

没有答案