Advertisement
EvenGuy

UCross.pas

Jan 6th, 2017
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 3.79 KB | None | 0 0
  1. // Модуль работы с самим кроссвордом
  2. unit UCross;
  3.  
  4. interface
  5.  
  6. uses
  7.   UTypes;
  8.  
  9. procedure GenCross;
  10. procedure DelCross;
  11.  
  12. function GetFirstCell : TCrossCellPtr;
  13. function GetCrossSize(Ornt : Integer) : Integer;
  14.  
  15. implementation
  16.  
  17. uses
  18.   UMain, UWord, UDebug, UCell, System.SysUtils;
  19.  
  20. // Генерирование кроссворда
  21. procedure GenCross;
  22. var
  23.   FreeWrd, CrossWrd : TWrdList;
  24.  
  25. begin
  26.   DBG_ShowMsg('GenCross ->');
  27.   FMain.StatusBar1.Panels[0].Text := 'Кроссворд создается...';
  28.  
  29.   if Cross <> nil then
  30.     begin
  31.       DBG_ShowMsg('GenCross -> Уже существует');
  32.  
  33.       DelCross;
  34.       GenCross;
  35.       Exit;
  36.     end;
  37.  
  38.   while True do
  39.     begin
  40.       // Поиск свободного слова и пары для него
  41.       CrossWrd := GetAvalWord(FreeWrd);
  42.  
  43.       // Если все слова добавлены в кроссворд
  44.       if (FreeWrd = nil) and (CrossWrd = nil) then
  45.         Break
  46.       // Если кроссворд уже создан(в нем есть слова) и есть слово, для которого
  47.       // нельзя подобрать пару
  48.       else if (Cross <> nil) and ((FreeWrd <> nil) and (CrossWrd = nil)) then
  49.         begin
  50.           DBG_ShowMsg('GenCross -> Есть свободное слово, для которого нет пары');
  51.           FMain.StatusBar1.Panels[0].Text := 'Ошибка при создании кроссворда!';
  52.  
  53.           DelCross;
  54.           Exit;
  55.         end;
  56.  
  57.       if not AddWordToCross(FreeWrd,CrossWrd) then
  58.         begin
  59.           DBG_ShowMsg('GenCross -> Не удалось добавить слово в кроссворд');
  60.           FMain.StatusBar1.Panels[0].Text := 'Ошибка при создании кроссворда!';
  61.  
  62.           DelCross;
  63.           Exit;
  64.         end;
  65.     end;
  66.  
  67.     DBG_ShowMsg('GenCross -> Кроссворд сгенерирован');
  68.     FMain.StatusBar1.Panels[0].Text := 'Кроссворд готов!';
  69. end;
  70.  
  71. // (-) Удаление кроссворда из памяти
  72. procedure DelCross;
  73. begin
  74.   Cross := nil;
  75. end;
  76.  
  77. // Нахождение крайней левой-верхней ячейки матрицы
  78. function GetFirstCell:TCrossCellPtr;
  79. var
  80.   CellPtr : TCrossCellPtr;
  81. begin
  82.   DBG_ShowMsg('GetFirstCell ->');
  83.  
  84.   // Матрица не создана
  85.   if Cross = nil then
  86.     begin
  87.       DBG_ShowMsg('GetFirstCell -> Матрица не создана');
  88.       Result := nil;
  89.       Exit;
  90.     end;
  91.  
  92.   CellPtr := Cross;
  93.  
  94.   // Поиск ячейки
  95.   repeat
  96.     if CellPtr.Up <> nil then
  97.       CellPtr := CellPtr.Up;
  98.  
  99.     if CellPtr.Left <> nil then
  100.       CellPtr := CellPtr.Left;
  101.   until (CellPtr.Up = nil) and (CellPtr.Left = nil);
  102.  
  103.   Result := CellPtr;
  104. end;
  105.  
  106. // Вычисление ширины матрицы ячеек
  107. function GetCrossSize(Ornt : Integer) : Integer;
  108. var
  109.   Cnt : Integer;
  110.   CellPtr : TCrossCellPtr;
  111. begin
  112.   DBG_ShowMsg('GetCrossSize -> ['+ReturnOrntVal(Ornt)+']');
  113.  
  114.   if not (Ornt in [ORNT_VERT,ORNT_HORZ]) then
  115.     begin
  116.       DBG_ShowMsg('GetCrossSize -> Заданы не верные параметры');
  117.       Result := 0;
  118.       Exit;
  119.     end;
  120.  
  121.   CellPtr := GetFirstCell;
  122.   if CellPtr = nil then
  123.     begin
  124.       DBG_ShowMsg('GetCrossSize -> Не удалось получить начальную ячейку');
  125.       Result := 0;
  126.       Exit;
  127.     end;
  128.  
  129.   // Вычисление
  130.   Cnt := 0;
  131.   while CellPtr <> nil do
  132.     begin
  133.       Inc(Cnt);
  134.  
  135.       if Ornt = ORNT_VERT then
  136.         CellPtr := CellPtr.Down
  137.       else
  138.         CellPtr := CellPtr.Right;
  139.     end;
  140.  
  141.   DBG_ShowMsg('GetCrossSize -> Размер составляет ['+IntToStr(Cnt)+'] ячеек');
  142.   Result := Cnt;
  143. end;
  144.  
  145. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement