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

📄 clearmine.m

📁 使用matlab写的类似windows的扫雷游戏
💻 M
📖 第 1 页 / 共 4 页
字号:
end

GameIsBegin = getappdata( handles.NewClearMine, 'GameIsBegin' ) ;

if isempty( GameIsBegin )
    GameIsBegin = 0 ;    
end

if GameIsBegin == 0
    setappdata( handles.NewClearMine, 'GameOver', 0 ) ;    
    InitMineSetting( h, RowNumber, ColNumber, TotalMineNumber, ButtonIndex ) ;
else
    GameOver = getappdata( handles.NewClearMine, 'GameOver' ) ;
    if isempty(GameOver) | GameOver == 1
        return ;
    end 
end

MineNumberArray = getappdata( handles.NewClearMine, 'MineNumberArray' ) ;
SolveArray = getappdata( handles.NewClearMine, 'SolveArray' ) ;

MineNumber = MineNumberArray(ButtonIndex) ;

CData = get( handles.MainPatch, 'FaceVertexCData' ) ;
if  isnan( MineNumber ) 
    UsefulIndex = getappdata( handles.NewClearMine, 'UsefulIndex' ) ;
    for num = 1: length(UsefulIndex)
        TempIndex = UsefulIndex(num) ;
        XIndex = ceil(TempIndex/RowNumber)-1 ;
        YIndex = mod((TempIndex-1), RowNumber)+1 ;
        TextXPos = (XIndex + 0.5) * ButtonWidth + XPos ;
        TextYPos = YPos - (YIndex + 0.5) * ButtonWidth + ButtonWidth ;
        text( TextXPos, TextYPos, '●',  'Parent', handles.MainAxes, 'HorizontalAlignment', 'center', 'FontSize',13  ) ;
    end    
    
    if ~isempty(TextHandle)
        delete(TextHandle) ;
        setappdata( handles.NewClearMine, 'TextHandle', [] ) ;
    end
    Matrix = com_GetFaceImage( 'Cry' ) ;
    set( handles.Face, 'CData', Matrix/255 ) ;

    setappdata( handles.NewClearMine, 'GameOver', 1 ) ;    
elseif MineNumber == 0    
    SafeIndex = getappdata( handles.NewClearMine, 'SafeIndex' ) ;   
    UnionIndex = getappdata( handles.NewClearMine, 'UnionIndex' ) ;
    
    Index = find(SafeIndex == ButtonIndex ) ;
    UnionID = UnionIndex(Index) ;
    
    TempUnionIndex = find(UnionIndex == UnionID) ;
    ClearIndex = SafeIndex(TempUnionIndex) ;
    
%     ButtonHandles = getappdata( handles.NewClearMine, 'ButtonHandles' ) ;
%     set( ButtonHandles(ClearIndex), 'String', '', 'Style', 'text', 'BackgroundColor', [0.85 0.85 0.85]) ;
    CData(ClearIndex,:) = repmat([0.85 0.85 0.85], length(ClearIndex), 1) ;
%     set( handles.MainPatch, 'FaceVertexCData', CData  ) ;
    
    SolveArray = setdiff(SolveArray, ClearIndex) ;
    
    GameInfo = getappdata( handles.NewClearMine, '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 = [0 0 1;0 1 0;1 0 0;0 1 1;1 0 1;1 1 0;0 0 0;0 0 1;1 1 0] ;
    for num = 1: max(max(MineNumber))
        TempIndex = find(MineNumber == num) ;
        if ~isempty(TempIndex)  
            CData(AroundArray(TempIndex),:) = repmat([0.85 0.85 0.85],length(TempIndex),1) ;
        end
    end
    set( handles.MainPatch, 'FaceVertexCData', CData  ) ;    
    for num = 1: numel(MineNumber)
        TempMineNumber = MineNumber(num) ;        
        if TempMineNumber~=0
            TempIndex = AroundArray(num) ;
            XIndex = ceil(TempIndex/RowNumber)-1 ;
            YIndex = mod((TempIndex-1), RowNumber)+1 ;
            TextXPos = (XIndex + 0.5) * ButtonWidth + XPos ;
            TextYPos = YPos - (YIndex + 0.5) * ButtonWidth + ButtonWidth ;
            text( TextXPos, TextYPos, num2str(TempMineNumber), 'Color', ColorArray(TempMineNumber,:),...
                'Parent', handles.MainAxes, 'HorizontalAlignment', 'center', 'FontSize',13 ) ;
        end
    end
    
    SolveArray = setdiff(SolveArray, AroundArray) ;
    
    if isempty(SolveArray)
        setappdata( handles.NewClearMine, 'GameOver', 1 ) ;
        helpdlg('完成了,恭喜!') ;
    else
        setappdata( handles.NewClearMine, 'SolveArray', SolveArray ) ;
    end
else 
    ColorArray = [0 0 1;0 1 0;1 0 0;0 1 1;1 0 1;1 1 0;0 0 0;0 0 1;1 1 0] ;
    CData(ButtonIndex,:) = [0.85 0.85 0.85] ;
    set( handles.MainPatch, 'FaceVertexCData', CData  ) ;
    TextXPos = (XIndex + 0.5) * ButtonWidth + XPos ;
    TextYPos = YPos - (YIndex + 0.5) * ButtonWidth + ButtonWidth ;
    text( TextXPos, TextYPos, num2str(MineNumber), 'Color', ColorArray(MineNumber,:),...
        'Parent', handles.MainAxes, 'HorizontalAlignment', 'center', 'FontSize',13  ) ;
    SolveArray(SolveArray == ButtonIndex) = [] ;
    if isempty(SolveArray)
        setappdata( handles.NewClearMine, 'GameOver', 1 ) ;
        helpdlg('完成了,恭喜!') ;
    else
        setappdata( handles.NewClearMine, 'SolveArray', SolveArray ) ;
    end
end

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


% --------------------------------------------------------------------
function RightButtonDown_Callback( h, ButtonIndex, XPos, YPos, XIndex, YIndex, ButtonWidth ) ;

handles = guidata( h ) ;

if strcmp( get(handles.NewClearMine, 'SelectionType' ), 'alt' )
    GameIsBegin = getappdata( handles.NewClearMine, 'GameIsBegin' ) ;
    GameOver = getappdata( handles.NewClearMine, 'GameOver' ) ;
    if isempty(GameIsBegin) | GameIsBegin == 0
        return ;
    end
    if isempty(GameOver) | GameOver == 1
        return ;
    end    
    
    CData = get( handles.MainPatch, 'FaceVertexCData' ) ;
    if ~isequal( CData(ButtonIndex,:),[0.75, 0.75, 0.75])
        return;
    end
    
    MineNumber = str2num( get( handles.MineNumber, 'String' ) ) ;    
    if isempty( MineNumber) | MineNumber <= 0 
        return ;
    end  
    
    TextXPos = (XIndex + 0.5) * ButtonWidth + XPos ;
    TextYPos = YPos - (YIndex + 0.5) * ButtonWidth + ButtonWidth ;
        
    TextHandle = getappdata( handles.NewClearMine, 'TextHandle' ) ;    
    Index = [] ;  
    if ~isempty(TextHandle)
        TextIndex = get( TextHandle, 'UserData' ) ;
        if iscell(TextIndex)
            TextIndex = [TextIndex{:}] ;
        end
        Index = find(TextIndex == ButtonIndex) ;
    end
    if isempty(Index)
        set( handles.MineNumber, 'String', num2str(MineNumber-1) ) ;
        
        NewTextHandle = text( TextXPos, TextYPos, '▲', 'Color', 'r','UserData', ButtonIndex,...
            'Parent', handles.MainAxes, 'HorizontalAlignment', 'center', 'FontSize',13, 'Hittest', 'off'  ) ;
        setappdata( handles.NewClearMine, 'TextHandle', [TextHandle; NewTextHandle] ) ;
    else
        set( handles.MineNumber, 'String', num2str(MineNumber+1) ) ;
        delete(TextHandle(Index)) ;
        TextHandle(Index) = [] ;
        setappdata( handles.NewClearMine, 'TextHandle', TextHandle ) ;
    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.NewClearMine, '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.NewClearMine, '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) ;

⌨️ 快捷键说明

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