📄 clearmine.m
字号:
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 + -