Advertisement
THOMAS_SHELBY_18

backup battle units

Apr 13th, 2024
14
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 22.82 KB | None | 0 0
  1. unit BattleDescribeUnit;
  2.  
  3. interface
  4. uses
  5. FieldGeneratorUnit;
  6. type
  7. TCellsArray = array [0..99] of Byte;
  8.  
  9. var
  10. UserShipsCountArray: TShipsCountArray;
  11. IsBotPlaneActive: Boolean;
  12.  
  13. procedure InitializeBot(Field: TField);
  14. procedure ChangeFieldAroundShootPlace(var ShootField: TField; var DisplayedField: TField; Col, Row: ShortInt);
  15. procedure ChangeFieldForDestroyedShip(var ShootField: TField; var DisplayedShip: TField; Ship: TShip; Col, Row: ShortInt; IsHorizontal: Boolean);
  16. function IsShipDestroyed(ShootField: TField; Ship: TShip; Col, Row: ShortInt; IsHorizontal: Boolean): Boolean;
  17. procedure MakeShoot(var DisplayedUserField: TField; var WasHit: Boolean);
  18. implementation
  19. uses
  20. BattleUnit, ListUnit;
  21. var
  22. FreeCellsCount: ShortInt;
  23. CellsIndex, FreeCells: TCellsArray;
  24. PriorityCellsListHeader: PListElem;
  25. ShootUserField, UserField: TField;
  26. WasPlaneUsed: Boolean;
  27.  
  28. function CellsArrayInitialize(): TCellsArray;
  29. var
  30. I, J, Temp: Byte;
  31. FreeCells: TCellsArray;
  32. begin
  33. for I := 0 to 9 do
  34. for J := 0 to 9 do
  35. begin
  36. Temp := I + 9 * I + J;
  37. FreeCells[Temp] := Temp;
  38. end;
  39.  
  40. CellsArrayInitialize := FreeCells;
  41. end;
  42.  
  43. procedure EditFreeCells(ShootField: TField; Col, Row: ShortInt);
  44. var
  45. LastFreeCellsValue, Coord: Byte;
  46. begin
  47. if (ShootField[Col, Row] <> stImpossible) then
  48. begin
  49. Coord := 10 * Col + Row;
  50. LastFreeCellsValue := FreeCells[FreeCellsCount-1];
  51. FreeCells[CellsIndex[Coord]] := LastFreeCellsValue;
  52. CellsIndex[LastFreeCellsValue] := CellsIndex[Coord];
  53. Dec(FreeCellsCount);
  54. end;
  55. end;
  56.  
  57. procedure ChangeFieldAroundShootPlace(var ShootField: TField; var DisplayedField: TField; Col, Row: ShortInt);
  58. var
  59. I, J: ShortInt;
  60. begin
  61. I := -1;
  62. while I < 2 do
  63. begin
  64. J := -1;
  65. while J < 2 do
  66. begin
  67. ShootField[Col+I, Row+J] := stImpossible;
  68. DisplayedField[Col+I, Row+J] := stImpossible;
  69. Inc(J, 2);
  70. end;
  71. Inc(I, 2);
  72. end;
  73. end;
  74.  
  75. procedure EditCellsAroundShootPlaceInArray(ShootField: TField; Col, Row: ShortInt);
  76. var
  77. I, J: ShortInt;
  78. begin
  79. I := -1;
  80. while I < 2 do
  81. begin
  82. J := -1;
  83. while J < 2 do
  84. begin
  85. EditFreeCells(ShootField, Col+I, Row+J);
  86. Inc(J, 2);
  87. end;
  88. Inc(I, 2);
  89. end;
  90. end;
  91.  
  92. procedure ChangeFieldForDestroyedShip(var ShootField: TField; var DisplayedShip: TField; Ship: TShip; Col, Row: ShortInt; IsHorizontal: Boolean);
  93. var
  94. FirstSideCol, FirstSideRow, SecondSideCol, SecondSideRow, I: ShortInt;
  95. begin
  96. if Ship = tShortShip then
  97. begin
  98. I := -1;
  99. while I < 2 do
  100. begin
  101. ShootField[Col+I, Row] := stImpossible;
  102. ShootField[Col, Row+I] := stImpossible;
  103. DisplayedShip[Col+I, Row] := stImpossible;
  104. DisplayedShip[Col, Row+I] := stImpossible;
  105. Inc(I, 2);
  106. end;
  107. end
  108. else
  109. begin
  110. FindSideOfShip(ShootField, Ship, Col, Row, FirstSideCol, FirstSideRow, IsHorizontal, -1);
  111. FindSideOfShip(ShootField, Ship, Col, Row, SecondSideCol, SecondSideRow, IsHorizontal, 1);
  112.  
  113. ShootField[FirstSideCol, FirstSideRow] := stImpossible;
  114. ShootField[SecondSideCol, SecondSideRow] := stImpossible;
  115. DisplayedShip[FirstSideCol, FirstSideRow] := stImpossible;
  116. DisplayedShip[SecondSideCol, SecondSideRow] := stImpossible;
  117. end;
  118. end;
  119.  
  120. procedure EditCellsForDestroyedShipInArray(ShootField: TField; Ship: TShip; Col, Row: ShortInt; IsHorizontal: Boolean);
  121. var
  122. FirstSideCol, FirstSideRow, SecondSideCol, SecondSideRow, I: ShortInt;
  123. begin
  124. if Ship = tShortShip then
  125. begin
  126. I := -1;
  127. while I < 2 do
  128. begin
  129. EditFreeCells(ShootField, Col+I, Row);
  130. EditFreeCells(ShootField, Col, Row+I);
  131. Inc(I, 2);
  132. end;
  133. end
  134. else
  135. begin
  136. FindSideOfShip(ShootField, Ship, Col, Row, FirstSideCol, FirstSideRow, IsHorizontal, -1);
  137. FindSideOfShip(ShootField, Ship, Col, Row, SecondSideCol, SecondSideRow, IsHorizontal, 1);
  138.  
  139. EditFreeCells(ShootField, FirstSideCol, FirstSideRow);
  140. EditFreeCells(ShootField, SecondSideCol, SecondSideRow);
  141. end;
  142. end;
  143.  
  144. function IsShipDestroyed(ShootField: TField; Ship: TShip; Col, Row: ShortInt; IsHorizontal: Boolean): Boolean;
  145. var
  146. I, DamagedDecksCount: ShortInt;
  147. IsDestroyed, HasPartOfShip: Boolean;
  148. CompareFieldCellAndShipsDeck: TCompareFunction;
  149. begin
  150. if IsHorizontal then
  151. CompareFieldCellAndShipsDeck := CompareCellsHorizontally
  152. else
  153. CompareFieldCellAndShipsDeck := CompareCellsVertically;
  154.  
  155. DamagedDecksCount := 0;
  156. I := 0;
  157. Repeat
  158. HasPartOfShip := CompareFieldCellAndShipsDeck(ShootField, Ship, Col, Row, -I);
  159. if HasPartOfShip then
  160. Inc(DamagedDecksCount);
  161. Inc(I);
  162. Until (I = Ord(Ship)) or not HasPartOfShip;
  163. IsDestroyed := DamagedDecksCount = Ord(Ship);
  164.  
  165. if not IsDestroyed then
  166. begin
  167. I := 1;
  168. Repeat
  169. HasPartOfShip := CompareFieldCellAndShipsDeck(ShootField, Ship, Col, Row, I);
  170. if HasPartOfShip then
  171. Inc(DamagedDecksCount);
  172. Inc(I);
  173. Until (I = Ord(Ship)) or not HasPartOfShip;
  174. IsDestroyed := DamagedDecksCount = Ord(Ship);
  175. end;
  176.  
  177. IsShipDestroyed := IsDestroyed;
  178. end;
  179.  
  180. function IsFieldCellFree(ShootField: TField; Col, Row: ShortInt): Boolean;
  181. begin
  182. IsFieldCellFree := ShootField [Col, Row] = stFree;
  183. end;
  184.  
  185. procedure AddPriorityCellsToList (ListHeader: PListElem; ShootField: TField; Col, Row: ShortInt);
  186. var
  187. I: ShortInt;
  188. begin
  189. I := -1;
  190. while I < 2 do
  191. begin
  192. if IsFieldCellFree(ShootField, Col+I, Row) then
  193. AddListElem(ListHeader, 10 * (Col+I) + Row);
  194. if IsFieldCellFree(ShootField, Col, Row+I) then
  195. AddListElem(ListHeader, 10 * Col + (Row+I));
  196.  
  197. Inc(I, 2);
  198. end;
  199. end;
  200.  
  201. Function ReturnFreeCellCoord(): ShortInt;
  202. Var
  203. Col, Row, Coord, I: ShortInt;
  204. ListElem: PListElem;
  205. Begin
  206. //если в списке приоритетных ячеек ничего нет - выбираем случайную необстрелянную ячейку
  207. If (PriorityCellsListHeader^.Next = Nil) Then
  208. Begin
  209. //выбирается случайное число от 0 до количества необстрелянных ячеек
  210. I := Random(FreeCellsCount);
  211.  
  212. //координатой будет I-тое значение из массива FreeCells
  213. Coord := FreeCells[I];
  214.  
  215. //в массив FreeCells на место "обстрелянной" координаты помещаем значение последней из FreeCells
  216. FreeCells[I] := FreeCells[FreeCellsCount-1];
  217.  
  218. //для перемещенной координаты меняем ее индекс на I
  219. CellsIndex[FreeCellsCount-1] := I;
  220.  
  221. //уменьшаем количество необстрелянных ячеек
  222. Dec(FreeCellsCount);
  223.  
  224. {когда придется удалять из массива свободных ячеек элемент с конкретной координатой (после попадания или вычеркивания ячеек в результате уничтожения корабля),
  225. вместо осуществления линейного поиска, найти этот элемент с помощью массива CellsIndex можно будет со сложностью O(1).
  226. }
  227.  
  228. End
  229. Else
  230. Begin
  231. Repeat
  232. //из списка приоритетных ячеек извлекается одна координата
  233. ListElem := ExtractElem(PriorityCellsListHeader);
  234. Coord := ListElem^.Coord;
  235. Col := Coord div 10;
  236. Row := Coord mod 10;
  237.  
  238. //если ячейка еще в массиве необстрелянных - она будет удалена из массива
  239. EditFreeCells(ShootUserField, Col, Row);
  240.  
  241. //если список приоритетных ячеек закончился или данная ячейка еще не обстреляна
  242. Until(PriorityCellsListHeader^.Next = Nil) Or (ShootUserField[Col, Row] = stFree);
  243. End;
  244.  
  245. ReturnFreeCellCoord := Coord;
  246. End;
  247.  
  248. Procedure ShootUserFieldOnCoord(Var DisplayedUserField: TField; Var WasHit: Boolean; Col, Row: ShortInt);
  249. Var
  250. State: TFieldCellState;
  251. Ship: TShip;
  252. IsHorizontal: Boolean;
  253. begin
  254. // в переменной State сохраняется значение поля игрока в этой ячейке
  255. State := UserField[Col, Row];
  256. Case State Of
  257. stFree, stImpossible:
  258. Begin
  259. // попадания не было - на отображающемся поле игрока и на поле, которое обстреливает бот помечаем ячейку как stImpossible
  260. ShootUserField[Col, Row] := stImpossible;
  261. DisplayedUserField[Col, Row] := stImpossible;
  262.  
  263. //попадания от бота не было
  264. WasHit := False;
  265. End;
  266. Else
  267. Begin
  268. //попадание было
  269. WasHit := True;
  270.  
  271. //конвертируется состояние поля в этой ячейке в тип корабля
  272. Ship := ConvertFieldStateToShip(State);
  273.  
  274. //выполняются соответствующие преобразования полей
  275. ShootUserField[Col, Row] := State;
  276. DisplayedUserField[Col, Row] := stDamaged;
  277.  
  278. //4 клетки по диагоналям вокруг попадания удаляются из массива необстрелянных ячеек
  279. EditCellsAroundShootPlaceInArray(ShootUserField, Col, Row);
  280.  
  281. //изменяется поле, обстреливаемое ботом, и отображаемое поле игрока
  282. ChangeFieldAroundShootPlace(ShootUserField, DisplayedUserField, Col, Row);
  283.  
  284. //если попадание по кораблю, у которого больше 1 палубы, 4 ячейки, окружающие его, помещаются в список приоритетных
  285. If Ship <> tShortShip Then
  286. AddPriorityCellsToList(PriorityCellsListHeader, ShootUserField, Col, Row);
  287.  
  288. IsHorizontal := IsShipInFieldHorizontal(UserField, Ship, Col, Row);
  289.  
  290. //если корабль уничтожен полностью
  291. If IsShipDestroyed(ShootUserField, Ship, Col, Row, IsHorizontal) Then
  292. Begin
  293. //клетки поля, оставшиеся свободными вокруг корабля, удаляются из массива необстрелянных ячеек
  294. EditCellsForDestroyedShipInArray(ShootUserField, Ship, Col, Row, IsHorizontal);
  295.  
  296. //клетки поля, оставшиеся свободными вокруг корабля, помечаются на полях обстрелянными
  297. ChangeFieldForDestroyedShip(ShootUserField, DisplayedUserField, Ship, Col, Row, IsHorizontal);
  298.  
  299. //удаление всех приоритетных ячеек
  300. DisposeList(PriorityCellsListHeader);
  301.  
  302. //считать корабль уничтоженным
  303. Dec(UserShipsCountArray[Ship]);
  304. End;
  305. End;
  306. End;
  307. End;
  308.  
  309. procedure MakeShoot(var DisplayedUserField: TField; var WasHit: Boolean);
  310. var
  311. Coord, Col, Row, I, J: ShortInt;
  312.  
  313. begin
  314. Coord := ReturnFreeCellCoord();
  315. Col := Coord div 10;
  316. Row := Coord mod 10;
  317.  
  318. IsBotPlaneActive := False;
  319. if not WasPlaneUsed then
  320. IsBotPlaneActive := Random(15) = 1;
  321.  
  322. if IsBotPlaneActive then
  323. begin
  324. for I := Col-1 to Col+1 do
  325. for J := Row-1 to Row+1 do
  326. begin
  327. //if (I <> Col) and (J <> Col) then
  328. //EditFreeCells(ShootUserField, I, J);
  329. ShootUserFieldOnCoord (DisplayedUserField, WasHit, I, J);
  330. end;
  331. WasPlaneUsed := True;
  332. WasHit := False;
  333. end
  334. else
  335. ShootUserFieldOnCoord(DisplayedUserField, WasHit, Col, Row);
  336. end;
  337.  
  338. Procedure InitializeBot(Field: TField);
  339. Begin
  340. //инициализация массива необстреляных ячеек
  341. FreeCells := CellsArrayInitialize();
  342.  
  343. //инициализация массива индексов необстрелянных ячеек
  344. CellsIndex := CellsArrayInitialize();
  345.  
  346. //полем пользователя в модуле считать преданное поле из BattleUnit
  347. UserField := Field;
  348.  
  349. //количество необстреляных ячеек вначале игры
  350. FreeCellsCount := 100;
  351.  
  352. //создаётся пустое поле пользователя для обстрела
  353. ShootUserField := CreateField();
  354.  
  355. //инициализация списка приоритетных для обстрела ячеек
  356. PriorityCellsListHeader := InitializeList();
  357.  
  358. //инициализация массива оставшихся кораблей пользователя
  359. UserShipsCountArray := IinializeShipsCountArray();
  360.  
  361. //флаг, принимающий значение True, когда ботом был использован "авиаудар"
  362. WasPlaneUsed := False;
  363. End;
  364.  
  365. end.
  366.  
  367.  
  368.  
  369.  
  370.  
  371.  
  372.  
  373.  
  374.  
  375. unit BattleUnit;
  376.  
  377. interface
  378.  
  379. uses
  380. Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  381. Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Menus, Vcl.ExtCtrls, BattleDescribeUnit;
  382.  
  383. type
  384. TBattleForm = class(TForm)
  385. ExitLabel: TLabel;
  386. MainMenu: TMainMenu;
  387. ManualMenuItem: TMenuItem;
  388. AboutDeveloperMenuItem: TMenuItem;
  389. UserFieldImage: TImage;
  390. BotFieldImage: TImage;
  391. PointerLabel: TLabel;
  392. YourFieldLabel: TLabel;
  393. BotFieldLabel: TLabel;
  394. BotTimer: TTimer;
  395. WinnerInfoLabel: TLabel;
  396. PlaneImage: TImage;
  397. ActiveTimer: TTimer;
  398. InformationLabel: TLabel;
  399. procedure ExitLabelMouseEnter(Sender: TObject);
  400. procedure ExitLabelMouseLeave(Sender: TObject);
  401. procedure ExitLabelClick(Sender: TObject);
  402. procedure FormShow(Sender: TObject);
  403. procedure BotFieldImageMouseDown(Sender: TObject; Button: TMouseButton;
  404. Shift: TShiftState; X, Y: Integer);
  405. procedure BotFieldImageMouseUp(Sender: TObject; Button: TMouseButton;
  406. Shift: TShiftState; X, Y: Integer);
  407. procedure BotTimerTimer(Sender: TObject);
  408. procedure PlaneImageClick(Sender: TObject);
  409. procedure ActiveTimerTimer(Sender: TObject);
  410. procedure ManualMenuItemClick(Sender: TObject);
  411. procedure AboutDeveloperMenuItemClick(Sender: TObject);
  412. procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  413. private
  414. { Private declarations }
  415. public
  416. { Public declarations }
  417. end;
  418.  
  419. var
  420. BattleForm: TBattleForm;
  421.  
  422. implementation
  423. uses
  424. GridUnit, FieldGeneratorUnit, ConstructorUnit, ListUnit, AboutDeveloperUnit, ManualUnit;
  425.  
  426. const
  427. CELL_WIDTH = 30;
  428.  
  429. var
  430. UserField, DisplayedUserField, BotField, DisplayedBotField: TField;
  431. ImpossibleCellsMatrix: TImpossibleCellsMatrix;
  432. WasCorrectShoot, WasHit, IsUserPlaneActive: Boolean;
  433. BotShipsCountArray: TShipsCountArray;
  434.  
  435. {$R *.dfm}
  436.  
  437. procedure ShootBotField (Col, Row: ShortInt);
  438. var
  439. Ship: TShip;
  440. IsHorizontal: Boolean;
  441. begin
  442. case BotField[Col, Row] of
  443. stImpossible, stFree :
  444. begin
  445. DisplayedBotField[Col, Row] := stImpossible;
  446. WasHit := False;
  447. end
  448. else
  449. DisplayedBotField[Col, Row] := BotField[Col, Row];
  450. WasHit := True;
  451. ChangeFieldAroundShootPlace(BotField, DisplayedBotField, Col, Row);
  452. Ship := ConvertFieldStateToShip (BotField[Col, Row]);
  453. IsHorizontal := IsShipInFieldHorizontal(BotField, Ship, Col, Row);
  454. if IsShipDestroyed(DisplayedBotField, Ship, Col, Row, IsHorizontal) then
  455. begin
  456. ChangeFieldForDestroyedShip(BotField, DisplayedBotField, Ship, Col, Row, IsHorizontal);
  457. Dec(BotShipsCountArray[Ship]);
  458. if IsShipsCountArrayEmpty(BotShipsCountArray) then
  459. begin
  460. BattleForm.WinnerInfoLabel.Caption := 'Это победа!!!';
  461. BattleForm.WinnerInfoLabel.Visible := True;
  462. BattleForm.BotFieldImage.Enabled := False;
  463. end;
  464. end;
  465. end;
  466. end;
  467.  
  468. procedure TBattleForm.AboutDeveloperMenuItemClick(Sender: TObject);
  469. begin
  470. AboutDeveloperForm.ShowModal;
  471. end;
  472.  
  473. procedure TBattleForm.ActiveTimerTimer(Sender: TObject);
  474. begin
  475. if PlaneImage.Visible = True then
  476. PlaneImage.Visible := False
  477. else
  478. PlaneImage.Visible := True;
  479. end;
  480.  
  481. procedure TBattleForm.BotFieldImageMouseDown(Sender: TObject;
  482. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  483. var
  484. Col, Row: ShortInt;
  485. I, J: ShortInt;
  486. begin
  487. Col := X div CELL_WIDTH;
  488. Row := Y div CELL_WIDTH;
  489.  
  490. if IsBotPlaneActive or IsUserPlaneActive then
  491. InformationLabel.Visible := False;
  492.  
  493. if DisplayedBotField[Col, Row] = stFree then
  494. begin
  495. if IsUserPlaneActive then
  496. begin
  497. for I := Col-1 to Col+1 do
  498. for J := Row-1 to Row+1 do
  499. ShootBotField (I, J);
  500.  
  501. DrawField(BotFieldImage, DisplayedBotField);
  502. IsUserPlaneActive := False;
  503. ActiveTimer.Enabled := False;
  504. PlaneImage.Visible := False;
  505. WasHit := False;
  506. end
  507. else
  508. begin
  509. ShootBotField (Col, Row);
  510. DrawField(BotFieldImage, DisplayedBotField);
  511. end;
  512. WasCorrectShoot := True;
  513. end;
  514. end;
  515.  
  516. Procedure TBattleForm.BotTimerTimer(Sender: TObject);
  517. Begin
  518. //процедура из модуля BattleDescribeUnit, изменяющая отображаемое поле пользователя и возвращающая информацию, было ли попадание
  519. MakeShoot(DisplayedUserField, WasHit);
  520.  
  521. //если текущим ходом бот использовал "авиаудар" - вывести информацию
  522. If IsBotPlaneActive Then
  523. Begin
  524. InformationLabel.Caption := 'Авиаудар!!!';
  525. InformationLabel.Visible := True;
  526. End;
  527.  
  528. DrawField(UserFieldImage, DisplayedUserField);
  529.  
  530. //если попадания не было - передача хода игроку
  531. If Not WasHit Then
  532. Begin
  533. BotTimer.Enabled := False;
  534. BotFieldImage.Enabled := True;
  535. PointerLabel.Caption := '>>';
  536. End;
  537.  
  538. //если кораблей пользователя не осталось - вывести информацию о поражении
  539. If IsShipsCountArrayEmpty(UserShipsCountArray) Then
  540. Begin
  541. WinnerInfoLabel.Caption := 'Поражение... :(';
  542. WinnerInfoLabel.Visible := True;
  543. BotFieldImage.Enabled := False;
  544. BotTimer.Enabled := False;
  545. End;
  546. End;
  547.  
  548. procedure TBattleForm.BotFieldImageMouseUp(Sender: TObject;
  549. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  550. begin
  551. if WasCorrectShoot and not WasHit then
  552. begin
  553. BotFieldImage.Enabled := False;
  554. BotTimer.Enabled := True;
  555. PointerLabel.Caption := '<<';
  556. WasCorrectShoot := False;
  557. end;
  558. end;
  559.  
  560. procedure TBattleForm.ExitLabelClick(Sender: TObject);
  561. begin
  562. BattleForm.Close;
  563. end;
  564.  
  565. procedure TBattleForm.ExitLabelMouseEnter(Sender: TObject);
  566. begin
  567. with Sender as TLabel do
  568. begin
  569. Font.Color := clBlack;
  570. end;
  571. end;
  572.  
  573. procedure TBattleForm.ExitLabelMouseLeave(Sender: TObject);
  574. begin
  575. with Sender as TLabel do
  576. begin
  577. Font.Color := clGrayText;
  578. end;
  579. end;
  580.  
  581. function CreateOnlyShipsField(Field: TField): TField;
  582. var
  583. I, J: ShortInt;
  584. OnlyShipsField: TField;
  585. begin
  586. for I := Low(Field) to High(Field) do
  587. for J := Low(Field) to High(Field) do
  588. begin
  589. if Field[J, I] = stImpossible then
  590. OnlyShipsField[J, I] := stFree
  591. else
  592. OnlyShipsField[J, I] := Field[J, I];
  593. end;
  594. CreateOnlyShipsField := OnlyShipsField;
  595. end;
  596.  
  597. procedure TBattleForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  598. begin
  599. CanClose := MessageBox(Handle, 'Вы действительно хотите выйти?', 'Вы уверены?', MB_YESNO Or MB_ICONQUESTION) = IDYES;
  600. end;
  601.  
  602. Procedure TBattleForm.FormShow(Sender: TObject);
  603. Begin
  604. //в данном модуле в качестве поля пользователя считать Field из модуля-конструктора
  605. UserField := ConstructorUnit.Field;
  606.  
  607. //создается пустая характерная для поля матрица
  608. ImpossibleCellsMatrix := CreateImpossibleCellsMatrix();
  609.  
  610. //генерируется поле бота
  611. BotField := GenerateField(ImpossibleCellsMatrix);
  612.  
  613. //создается пустое "отображаемое" поле бота
  614. DisplayedBotField := CreateField();
  615.  
  616. //создаётся "отображаемое" поле игрока, состоящее только из кораблей
  617. DisplayedUserField := CreateOnlyShipsField(UserField);
  618.  
  619. //инициализируется массив с количеством неутопленных кораблей бота
  620. BotShipsCountArray := IinializeShipsCountArray();
  621.  
  622. //инициализация бота в BattleDescribeUnit
  623. InitializeBot(UserField);
  624.  
  625. //инициализация флагов и свойств компонентов формы
  626. IsUserPlaneActive := False;
  627. ActiveTimer.Enabled := False;
  628. InformationLabel.Visible := False;
  629.  
  630. WinnerInfoLabel.Visible := False;
  631. BotFieldImage.Enabled := True;
  632. PlaneImage.Visible := True;
  633.  
  634. DrawField(UserFieldImage, DisplayedUserField);
  635. DrawField(BotFieldImage, DisplayedBotField);
  636. End;
  637.  
  638. procedure TBattleForm.ManualMenuItemClick(Sender: TObject);
  639. begin
  640. ManualForm.ShowModal;
  641. end;
  642.  
  643. procedure TBattleForm.PlaneImageClick(Sender: TObject);
  644. begin
  645. IsUserPlaneActive := not IsUserPlaneActive;
  646. ActiveTimer.Enabled := not ActiveTimer.Enabled;
  647. InformationLabel.Caption := 'Приготовьтесь к авиаудару...';
  648. InformationLabel.Visible := not InformationLabel.Visible;
  649. end;
  650.  
  651.  
  652.  
  653. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement