IPB
ЛогинПароль:

 
 Ответить  Открыть новую тему 
> Игра "Сапёр" на Паскале
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 1
Пол: Женский

Репутация: -  0  +


Товарищи, помогите, пожалуйста найти ошибку в программе! Для автоматического открытия ячеек
используется рекурсивная процедура OpenCells, но открывается почему-то всё поле. Чесно скажу, в программе использованы алгоритмы из других исходников, поэтому мне не удаётся разобраться в этой куче. (Исходный текст прилагаю)


Прикрепленные файлы
Прикрепленный файл  CURSGAME.PAS ( 8.66 килобайт ) Кол-во скачиваний: 656
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 в описании объекта...
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 14.04.2025 15:39
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name