![]() |
![]() |
indivisible_int |
![]() ![]()
Сообщение
#1
|
Группа: Пользователи Сообщений: 1 Пол: Женский Репутация: ![]() ![]() ![]() |
Товарищи, помогите, пожалуйста найти ошибку в программе! Для автоматического открытия ячеек
используется рекурсивная процедура OpenCells, но открывается почему-то всё поле. Чесно скажу, в программе использованы алгоритмы из других исходников, поэтому мне не удаётся разобраться в этой куче. (Исходный текст прилагаю) Прикрепленные файлы ![]() |
![]() ![]() |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Цитата Для автоматического открытия ячеек используется рекурсивная процедура 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);
{*** Добавлено ***}
DrawOpenedCells := NumOfNearMines = 0;
{***}
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 в описании объекта... |
![]() ![]() |
![]() |
Текстовая версия | 26.07.2025 9:39 |