⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 拿matlab的gui来扫个雷.txt

📁 用matlab 实现的扫雷程序
💻 TXT
📖 第 1 页 / 共 4 页
字号:
MineNumber = MineNumberArray(ButtonIndex) ;

if  isnan( MineNumber )    
    ButtonHandles = getappdata( handles.ClearMine, 'ButtonHandles' ) ;
    set( ButtonHandles, 'Enable', 'inactive' ) ;
    
    UsefulIndex = getappdata( handles.ClearMine, 'UsefulIndex' ) ;
    Matrix = com_GetMineImage ;
    set( ButtonHandles(UsefulIndex), 'CData', Matrix ) ;
    
    Matrix = com_GetFaceImage( 'Cry' ) ;
    set( handles.Face, 'CData', Matrix/255 ) ;

    setappdata( handles.ClearMine, 'GameOver', 1 ) ;    
elseif MineNumber == 0
    if ~isempty(get(h, 'CData' ))
        return ;
    end
    SafeIndex = getappdata( handles.ClearMine, 'SafeIndex' ) ;   
    UnionIndex = getappdata( handles.ClearMine, 'UnionIndex' ) ;
    
    Index = find(SafeIndex == ButtonIndex ) ;
    UnionID = UnionIndex(Index) ;
    
    TempUnionIndex = find(UnionIndex == UnionID) ;
    ClearIndex = SafeIndex(TempUnionIndex) ;
    
    ButtonHandles = getappdata( handles.ClearMine, 'ButtonHandles' ) ;
    set( ButtonHandles(ClearIndex), 'String', '', 'Style', 'text', 'BackgroundColor', [0.85 0.85 0.85]) ;
    
    SolveArray = setdiff(SolveArray, ClearIndex) ;
    
    GameInfo = getappdata( handles.ClearMine, 'GameInfo' ) ;
    RowNumber = GameInfo.RowNumber ;
    ColNumber = GameInfo.ColNumber ;
    AroundArray = zeros(length(ClearIndex)*8,1) ;
    for num = 1: length(ClearIndex)
        TempIndex = ClearIndex(num) ;
        if mod( TempIndex, RowNumber) == 1
            AroundIndex = TempIndex + [1 -RowNumber -RowNumber+1 RowNumber RowNumber+1] ;
        elseif mod( TempIndex, RowNumber) == 0
            AroundIndex = TempIndex + [-1 -RowNumber -RowNumber-1 RowNumber RowNumber-1] ;
        else
            AroundIndex = TempIndex + [-1 1 -RowNumber -RowNumber-1 -RowNumber+1 RowNumber-1 RowNumber RowNumber+1] ;
        end
        AroundIndex(AroundIndex<=0|AroundIndex>RowNumber*ColNumber) = [] ;
        AroundArray((num-1)*8+1:(num-1)*8+length(AroundIndex)) = AroundIndex ;
    end
    AroundArray(AroundArray==0) = [] ;
    AroundArray = unique(AroundArray) ;
    
    MineNumber = MineNumberArray(AroundArray) ;
    ColorArray = 'bgrcmykbg' ;
    for num = 1: max(max(MineNumber))
        TempIndex = find(MineNumber == num) ;
        if ~isempty(TempIndex)            
            set( ButtonHandles(AroundArray(TempIndex)), 'String', num2str(num), 'Style', 'text',...
                'ForeGroundColor', ColorArray(num), 'BackgroundColor', [0.85 0.85 0.85] ) ;
        end
    end
    
    SolveArray = setdiff(SolveArray, AroundArray) ;
    
    if isempty(SolveArray)
        setappdata( handles.ClearMine, 'GameOver', 1 ) ;
        helpdlg('完成了,恭喜!') ;
    else
        setappdata( handles.ClearMine, 'SolveArray', SolveArray ) ;
    end
else    
    if ~isempty(get(h, 'CData' ))
        return ;
    end
    ColorArray = 'bgrcmykbg' ;
    set( h, 'String', num2str(MineNumber), 'Style', 'text', 'ForeGroundColor', ColorArray(MineNumber), 'BackgroundColor', [0.85 0.85 0.85] ) ;
    SolveArray(SolveArray == ButtonIndex) = [] ;
    if isempty(SolveArray)
        setappdata( handles.ClearMine, 'GameOver', 1 ) ;
        helpdlg('完成了,恭喜!') ;
    else
        setappdata( handles.ClearMine, 'SolveArray', SolveArray ) ;
    end
end

if GameIsBegin == 0
    GameIsBegin = 1 ;
    setappdata( handles.ClearMine, 'GameIsBegin', GameIsBegin ) ;
    BeginCalculate_Callback( h ) ;
end


% --------------------------------------------------------------------
function ButtonDownFcn( h ) 

handles = guidata( h ) ;

if strcmp( get(handles.ClearMine, 'SelectionType' ), 'alt' )
    GameIsBegin = getappdata( handles.ClearMine, 'GameIsBegin' ) ;
    GameOver = getappdata( handles.ClearMine, 'GameOver' ) ;
    if isempty(GameIsBegin) | GameIsBegin == 0
        return ;
    end
    if isempty(GameOver) | GameOver == 1
        return ;
    end    
    CurrentHandle = gco ;
    if ~strcmp(get(CurrentHandle, 'Style'), 'pushbutton' )
        return ;
    end
    Matrix = get( CurrentHandle, 'CData' ) ;
    MineNumber = str2num( get( handles.MineNumber, 'String' ) ) ;
    
    if isempty( MineNumber) | MineNumber <= 0 
        return ;
    end
    
    if isempty(Matrix)
        Matrix = com_GetFlagImage ;
        set( CurrentHandle, 'CData', Matrix ) ;
        set( handles.MineNumber, 'String', num2str(MineNumber-1) ) ;
        set( CurrentHandle, 'Enable', 'inactive' ) ;
    else
        set( CurrentHandle, 'CData', [] ) ;
        set( handles.MineNumber, 'String', num2str(MineNumber+1) ) ;
        set( CurrentHandle, 'Enable', 'on' ) ;
    end
end


% ------------------------------------------------------------------------
function InitMineSetting( h, RowNumber, ColNumber, TotalMineNumber, ButtonIndex )

handles = guidata( h ) ;

% 随机取格子布雷
RandIndex = randperm( RowNumber*ColNumber ) ;
UsefulIndex = RandIndex(1:TotalMineNumber) ;

if  any( UsefulIndex == ButtonIndex ) % 比ismember( ButtonIndex, UsefulIndex )效率高一点 
    % 选的第一个格子不能有雷
    UsefulIndex = RandIndex(1: TotalMineNumber+1) ;
    UsefulIndex(UsefulIndex == ButtonIndex) = [] ;
end
setappdata( handles.ClearMine, 'UsefulIndex', UsefulIndex ) ;

% 定义保存雷数目的向量
MineNumberArray = zeros(RowNumber,ColNumber) ;
% 布了雷的格子的雷数值设为nan或inf
MineNumberArray(UsefulIndex) = nan ;

% 对雷格四周的格子雷数值各+1
for num = 1: TotalMineNumber    
    TempIndex = UsefulIndex(num) ;
    % 周围格子的序号,可以包括自身,因为nan+1 = nan
    if mod(TempIndex, RowNumber) == 0
        AroundIndex = [-1 -1 -1; 0 0 0] + repmat( [-1:1]*RowNumber+TempIndex, 2, 1) ;
    elseif mod(TempIndex, RowNumber) == 1
        AroundIndex = [0 0 0; 1 1 1] + repmat( [-1:1]*RowNumber+TempIndex, 2, 1) ;
    else
        AroundIndex = [-1 -1 -1; 0 0 0; 1 1 1] + repmat( [-1:1]*RowNumber+TempIndex, 3, 1) ;
    end
    AroundIndex(AroundIndex<=0 | AroundIndex>RowNumber*ColNumber) = [] ;
    MineNumberArray(AroundIndex) = MineNumberArray(AroundIndex) + 1 ;
end
setappdata( handles.ClearMine, 'MineNumberArray', MineNumberArray ) ;

MineNumberArray = MineNumberArray(:) ;
% 对周围无雷(即值还是0)的点进行分组
SafeIndex = find(MineNumberArray == 0) ;
UnionIndex = ones( size(MineNumberArray) ) * inf;
UnionIndex(SafeIndex) = 0 ;
NotSureNumber = 0 ;
TempMaxUnion = 0 ;
NextNotSureIndex = 0 ;

while(any(UnionIndex<=0))    
    if NotSureNumber > 0
        if NextNotSureIndex ~= 0
            TempNotSureIndex = NextNotSureIndex ;
            if mod( TempNotSureIndex, RowNumber) == 1
                AroundIndex = TempNotSureIndex + [1 -RowNumber -RowNumber+1 RowNumber RowNumber+1] ;
            elseif mod( TempNotSureIndex, RowNumber) == 0
                AroundIndex = TempNotSureIndex + [-1 -RowNumber -RowNumber-1 RowNumber RowNumber-1] ;
            else
                AroundIndex = TempNotSureIndex + [-1 1 -RowNumber -RowNumber-1 -RowNumber+1 RowNumber-1 RowNumber RowNumber+1] ;
            end           
            AroundIndex(AroundIndex<=0 | AroundIndex>RowNumber*ColNumber) = [] ;
            if ~isempty(AroundIndex)
                RealNotSureIndex = find(UnionIndex(AroundIndex) == 0) ;
                AroundIndex = AroundIndex(RealNotSureIndex) ;
            end
            UnionIndex(TempNotSureIndex) = TempMaxUnion ;
            NotSureNumber = NotSureNumber - 1 ;
            NextNotSureIndex = 0 ;
            if ~isempty(AroundIndex)   
                UnionIndex(AroundIndex) = -1 ;
                NextNotSureIndex = AroundIndex(1) ;
                NotSureNumber = NotSureNumber + length(AroundIndex) ;
            end
        else
            for num = 1: length(SafeIndex)
                TempNotSureIndex = UnionIndex(SafeIndex(num)) ;
                if TempNotSureIndex == -1                    
                    if mod( SafeIndex(num), RowNumber) == 1
                        AroundIndex = SafeIndex(num) + [1 -RowNumber -RowNumber+1 RowNumber RowNumber+1] ;
                    elseif mod( SafeIndex(num), RowNumber) == 0
                        AroundIndex = SafeIndex(num) + [-1 -RowNumber -RowNumber-1 RowNumber RowNumber-1] ;
                    else
                        AroundIndex = SafeIndex(num) + [-1 1 -RowNumber -RowNumber-1 -RowNumber+1 RowNumber-1 RowNumber RowNumber+1] ;
                    end 
                    AroundIndex(AroundIndex<=0 | AroundIndex>RowNumber*ColNumber) = [] ;
                    if ~isempty(AroundIndex)
                        RealNotSureIndex = find(UnionIndex(AroundIndex) == 0) ;
                        AroundIndex = AroundIndex(RealNotSureIndex) ;
                    end
                    UnionIndex(SafeIndex(num)) = TempMaxUnion ;
                    NotSureNumber = NotSureNumber - 1 ;
                    NextNotSureIndex = 0 ;
                    if ~isempty(AroundIndex)                    
                        UnionIndex(AroundIndex) = -1 ;
                        NextNotSureIndex = AroundIndex(1) ;
                        NotSureNumber = NotSureNumber + length(AroundIndex) ;
                    end
                    break;
                end
            end
        end
    else 
        for num = 1: length( SafeIndex )
            TempIndex = SafeIndex(num) ;
            if UnionIndex(TempIndex) == 0
                if mod( TempIndex, RowNumber) == 1
                    AroundIndex = TempIndex + [1 -RowNumber -RowNumber+1 RowNumber RowNumber+1] ;
                elseif mod( TempIndex, RowNumber) == 0
                    AroundIndex = TempIndex + [-1 -RowNumber -RowNumber-1 RowNumber RowNumber-1] ;
                else
                    AroundIndex = TempIndex + [-1 1 -RowNumber -RowNumber-1 -RowNumber+1 RowNumber-1 RowNumber RowNumber+1] ;
                end
                AroundIndex(AroundIndex<=0 | AroundIndex>RowNumber*ColNumber) = [] ;
                if ~isempty(AroundIndex)
                    RealNotSureIndex = find(UnionIndex(AroundIndex) <= 0) ;
                    AroundIndex = AroundIndex(RealNotSureIndex) ;
                end
                TempMaxUnion = TempMaxUnion + 1 ;
                UnionIndex(TempIndex) = TempMaxUnion ;
                NextNotSureIndex = 0 ;
                if  ~isempty(AroundIndex)   
                    UnionIndex(AroundIndex) = -1 ;
                    NextNotSureIndex = AroundIndex(1) ;
                    NotSureNumber = NotSureNumber + length(AroundIndex) ;
                end
                break;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -