Товарищи, помогите, пожалуйста найти ошибку в программе! Для автоматического открытия ячеек используется рекурсивная процедура OpenCells, но открывается почему-то всё поле. Чесно скажу, в программе использованы алгоритмы из других исходников, поэтому мне не удаётся разобраться в этой куче. (Исходный текст прилагаю)
Для автоматического открытия ячеек используется рекурсивная процедура OpenCells, но открывается почему-то всё поле.
Потому, что надо останавливать рекурсию, как только была отрисована ячейка с NumOfNearMines, отличным от 0. Для этого немного переделываем программу - процедуру DrawOpenedCells делаем функцией, и возвращаем результат:
function matrix.DrawOpenedCells(i,j: integer): boolean; var NM:string; NumofNearMines,a,b: integer; begin a:=xInit+CellWidth*(i-1); b:=yInit+CellWidth*(j-1); SetFillStyle(1,14); Bar3D(a,b,a+CellWidth,b+CellWidth,0,FALSE); NumofNearMines:=DetectMines(a,b);
if NumofNearMines>0 then begin Str(NumofNearMines,NM); OutTextXY(a+CellWidth div 3,b+CellWidth div 3,NM); end; if mines[i][j]=TRUE then begin SetFillStyle(1,0); FillEllipse(a+CellWidth div 2,b+CellWidth div 2,3,3); end; end;
, а ту самую рекурсивную процедуру OpenCells меняем вот таким образом:
procedure matrix.OpenCells(i,j:integer); var a,b,t:integer; begin a:=xInit+CellWidth*(i-1); b:=yInit+CellWidth*(j-1); t := 0; if (i < 1) or (j < 1) then t := 1; if (i = n+1) or (j = n+1) then t := 1; if t = 0 then begin if (marked[i][j] = FALSE) then begin if mines[i][j]=TRUE then exit; marked[i][j] := TRUE;
{*** Добавлено ***} if DrawOpenedCells(i,j) then begin {***} if mines[i][j] = FALSE then begin OpenCells(i+1,j); OpenCells(i-1,j); OpenCells(i,j-1); OpenCells(i,j+1); OpenCells(i-1,j-1); OpenCells(i+1,j-1); OpenCells(i-1,j+1); OpenCells(i+1,j+1); end; {*** Добавлено ***} end; {***} end; end; end;
, то есть продолжаем рекурсию только тогда, когда только что отрисованная ячейка не содержала цифры... Не забудь поменять и определение метода DrawOpenedCells в описании объекта...