📄 拿matlab的gui来扫个雷.txt
字号:
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 + -