Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

ПРИЛОЖЕНИЕ 1. Исходный код программы

Цель разработки | Обоснование выбора среды программирования | Описание схемы данных | Описание программы | Процесс отладки программы |


Читайте также:
  1. amp;&&Приложение 17
  2. Windows-приложение OGView
  3. Географическое приложение.
  4. Заявку установленного образца (приложение 1) ;
  5. Многомерные шкалы и их приложение в рекламе
  6. На участие в конкурсе необходимо подать заявку от образовательного учреждения (см.приложение).
  7. Отчет оформляется титульным листом (смотрите приложение 1) и подписывается студентом и мастером производственного обучения.

Исходный код программы

unit MainUnit;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, ExtCtrls, StdCtrls, Buttons, Menus, Gauges, ComCtrls, XPMan,

MMSystem, Registry;

type

TFormMain = class(TForm)

StatusGroupBox: TGroupBox;

StatusLabel: TLabel;

MissShape: TShape;

TargetShape: TShape;

MissLabel: TLabel;

TargetLabel: TLabel;

RotateButton: TSpeedButton;

DelButton: TSpeedButton;

DeleteShipPopupMenu: TPopupMenu;

N1: TMenuItem;

N2: TMenuItem;

PlayButton: TSpeedButton;

KillShape: TShape;

KillLabel: TLabel;

Bevel1: TBevel;

N11: TMenuItem;

N21: TMenuItem;

N31: TMenuItem;

N41: TMenuItem;

MainMenu1: TMainMenu;

N3: TMenuItem;

N4: TMenuItem;

N5: TMenuItem;

N8: TMenuItem;

N9: TMenuItem;

N6: TMenuItem;

N7: TMenuItem;

N10: TMenuItem;

N12: TMenuItem;

N13: TMenuItem;

N14: TMenuItem;

procedure FormShow(Sender: TObject);

procedure Shape1MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure FormCreate(Sender: TObject);

procedure Shape65MouseMove(Sender: TObject; Shift: TShiftState; X,

Y: Integer);

procedure Shape65MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure N2Click(Sender: TObject);

procedure PlayButtonClick(Sender: TObject);

procedure N9Click(Sender: TObject);

procedure ReDrawAll;

procedure SetShip(StartTag:integer; FinishTag:integer; BoP:char);

procedure ReDraw(BoP:char);

procedure NewGame;

procedure Play;

function WriteCount:string;

procedure Zero(BoP:char);

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure KillShapeMouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

private

public

path:string;

{ чтоб схемы сохранять можно было }

e_s, m_s:array[1..4, 1..4] of integer; //матрицы с координ. каждого корабля

{ для html }

e_sh, m_sh:array[1..8, 1..8] of integer; //матриксы с инфой об игровом поле

alph:string[8]; // -= смерть от напалма =-

{ для конфа }

game:integer; //0-не играемся, 1-играемся, 2-наигралися

end;

var

FormMain: TFormMain;

set_ships:array[1..4] of bool; //трю - кор. стоит

cnt:array[0..1] of integer; //запись счета

paluba:integer; //сколькипалубный кор. ставим сейчас

e_k_ships, m_k_ships:integer; //кол-во убитых кораблей

rotate, zalez:bool;

implementation

uses FunctionsUnit, ConfUnit, MBoxUnit, HistoryUnit, SaveShemeUnit,

LoadDelShemeUnit, HTMLUnit, NapalmUnit, CleanerUnit;

{$R *.dfm}

{ все что на форме помечено "+++" - пишется программно }

//дает заключительный таг корабля

function GetFinishTag(StartTag:integer; PalubaCount:integer;

Rot:bool):integer;

var temp, tag_f:integer; str:string[2]; a,b:char;

begin

if Rot then

begin

a:= 'c';

b:= 'r';

end else

begin

a:= 'r';

b:= 'c';

end;

temp:= GetNum(StartTag, a);

tag_f:= GetNum(StartTag, b) + (PalubaCount - 1);

//если за край залез кораблиг

if tag_f > 8 then begin

tag_f:= 8;

zalez:= true;

end;

if Rot then str:= IntToStr(tag_f) + IntToStr(temp)

else str:= IntToStr(temp) + IntToStr(tag_f);

GetFinishTag:= StrToInt(str);

end;

//свой месадж бокс написал:(

function MesBox(Text:string; Caption:string):bool;

begin

FormMBox.Label1.Caption:= Text;

FormMBox.Caption:= Caption;

 

FormMBox.ShowModal;

MesBox:= FormMBox.a;

end;

//трю - если есть соседи около корабля

function CheckNeig(StartTag:integer; FinishTag:integer; BoP:char):boolean;

var str:string; i, m:integer;

begin

CheckNeig:= false; //чтоб не клюкавила

//берем соседей

str:= GetNeigNums(StartTag, FinishTag);

m:= Length(str) div 2;

if BoP = 'b' then

for i:= 1 to m do

if FormMain.e_sh[GetNum(GetTagFromStr(str, i), 'r'),

GetNum(GetTagFromStr(str, i), 'c')] = 1 then

begin

CheckNeig:= true;

Exit;

end;

if BoP = 'p' then

for i:= 1 to m do

if FormMain.m_sh[GetNum(GetTagFromStr(str, i), 'r'),

GetNum(GetTagFromStr(str, i), 'c')] = 1 then

begin

CheckNeig:= true;

Exit;

end;

end;

//проверяет, убит кор. или нет

function CheckKillShip(PalubaCount:integer; BoP:char):boolean;

var i, r, c, tmp:integer;

begin

for i:= 1 to PalubaCount do begin

if BoP = 'b' then begin //координаты берем

r:= GetNum(FormMain.e_s[PalubaCount, i], 'r');

c:= GetNum(FormMain.e_s[PalubaCount, i], 'c');

end

else begin

r:= GetNum(FormMain.m_s[PalubaCount, i], 'r');

c:= GetNum(FormMain.m_s[PalubaCount, i], 'c');

end;

//валим в темп значение по этому адресу

if BoP = 'b' then tmp:= FormMain.e_sh[r,c] else tmp:= FormMain.m_sh[r,c];

//если туда не попали - выходим

if (tmp <> 3) then begin

Result:= false;

Exit;

end;

end;

//инкриментим кол-во убитых кораблей

if BoP = 'b' then inc(e_k_ships) else inc(m_k_ships);

Result:= true;

end;

//сканит set_ships и говорит, какой кораблик еще не установлен

function GetPaluba:integer;

var i:integer;

begin

for i:= 1 to 4 do

if set_ships[i] = false then begin

GetPaluba:= i; //берем n-палубный не установ. корабль

FormMain.StatusLabel.Caption:= 'Сейчас ставим:';

FormMain.ManKillLabel.Caption:= IntToStr(i) + ' - палубный';

Exit;

end;

GetPaluba:= 0; //значит все на месте

end;

//пишет на форме лабелы с инфой об игре (тока для мена)

procedure WriteInfo(Kill, Lost:integer);

begin

with FormMain do begin

if Kill <> -1 then

ManKillLabel.Caption:= ManKillLabel.Caption + ' ' + IntToStr(Kill);

if Lost <> -1 then

ManLostLabel.Caption:= ManLostLabel.Caption + ' ' + IntToStr(Lost);

end;

end;

//ищит подбитые таги с стренге

function GetRedTag(StrWithTags:string):integer;

var i, l, r, c, tg:integer;

begin

l:= Length(StrWithTags) div 2;

for i:= 1 to l do begin

tg:= GetTagFromStr(StrWithTags, i); //берем i-ый таг

r:= GetNum(tg, 'r');

c:= GetNum(tg, 'c');

if FormMain.m_sh[r,c] = 3 then begin //если попадание

Result:= tg; //отдаем его

Exit; //и уходим (больше одного не нужно, потому что)

end;

end;

Result:= -1; //ни че не нашли

end;

//убирает таги, в которые уже стреляли

function FilterTargetTags(Str:string):string;

var i, r, c, l:integer; res, tmp:string[8];

begin

res:= '';

l:= Length(Str) div 2;

for i:= 1 to l do begin

tmp:= IntToStr(GetTagFromStr(Str, i));

r:= StrToInt(tmp[1]);

c:= StrToInt(tmp[2]);

if (FormMain.m_sh[r,c] = 0) or (FormMain.m_sh[r,c] = 1) then

res:= res + tmp;

end;

Result:= res;

end;

//бот выбирает таг корабля

function BotFireTag:integer;

var cross, tg:string[8]; i, j, k, r:integer; ran:boolean; stat:char;

begin

{ ламер - мочит на шару

перец - не учитывает положение подбитых кораблей

матер - boom bye yeah!!! }

Result:= -1; //чтоб компилятер не ругался

ran:= false; //пока ранений нету

r:= -1;

//сложность

if FormMain.DiffComboBox.ItemIndex = 0 then i:= 9

else i:= 1;

//ищим попадание

while (i <= 8) do begin

for j:= 1 to 8 do

if FormMain.m_sh[i,j] = 3 then begin //нашел подбитый кораблик

ran:= true; //а вот и ранение

cross:= GetCoDTags(i, j, true);

if FormMain.DiffComboBox.ItemIndex = 2 then

r:= GetRedTag(cross); //смотрим на ранения

if r <> -1 then begin

tg:= IntToStr(i) + IntToStr(j); //берем текущий таг

//определяем положение корабля

if GetNum(StrToInt(tg), 'r') = GetNum(r, 'r') then stat:= 'r'

else stat:= 'c';

cross:= FilterRedLineTags(cross, GetNum(r, stat), stat);

end;

//выкидываем подбитые таги

cross:= FilterTargetTags(cross);

//если есть хоть один таг, то палим

if cross <> '' then begin

Randomize; //ни хера не помогает:)

k:= Random(Length(cross) div 2);

inc(k);

//результат - таг для функции Fire

Result:= GetTagFromStr(cross, k);

Exit;

end;

end;

inc(i);

end;

//не нашел ни одного раненого бойца и палит на шару

if ran = false then Result:= GetRandomTag;

end;

//пишет мему с ходами

procedure WriteStepsMemo(Row, Col, Kill:integer; BoP:char);

var n, w, r, s:string; t:integer;

begin

if BoP = 'b' then w:= 'Бот: ' else w:= 'Игрок: ';

case Kill of

-1: r:= 'промазал';

0: r:= 'подбил';

else begin

r:= 'убил';

s:= ' (' + IntToStr(Kill) + ')';

end

end;

with FormMain.StepsMemo.Lines do begin

t:= Count + 1;

if t < 10 then

n:= '00' + IntToStr (t) + ') '

else

n:= '0' + IntToStr (t) + ') ';

Add(n + w + FormMain.alph[Row] + IntToStr(Col) + ' - ' + r + s);

end;

end;

//пишет одно заданное число во все заданные элементы матрицы

procedure WriteNumsInBigMatrix(StrWithTags:string; Number:integer;

BoP:char);

var i, l, r, c:integer;

begin

l:= Length(StrWithTags) div 2;

for i:= 1 to l do begin

r:= GetNum(GetTagFromStr(StrWithTags, i), 'r');

c:= GetNum(GetTagFromStr(StrWithTags, i), 'c');

if BoP = 'b' then FormMain.e_sh[r,c]:= Number

else FormMain.m_sh[r,c]:= Number;

end;

end;

//помечает в матрице убитый корабль (результ - кол-во палуб убитого корабля)

function MarkKillShip(BoP:char):integer;

var i, s, f:integer;

begin

Result:= 0;

for i:= 1 to 4 do begin

if CheckKillShip(i, BoP) = true then begin

if BoP = 'b' then begin

s:= FormMain.e_s[i, 1];

f:= FormMain.e_s[i, i];

end

else begin

s:= FormMain.m_s[i, 1];

f:= FormMain.m_s[i, i];

end;

if BoP = 'b' then WriteInfo(i, -1)

else WriteInfo(-1, i);

//чтоб избежать кривого отображения, сначала помечаем его соседей

WriteNumsInBigMatrix(GetNeigNums(s, f), 2, BoP);

//помечаем в матрице грохнутые корабли

WriteNumsInBigMatrix(GetShipTags(s, f), 4, BoP);

Randomize;

if (BoP = 'b') and (FormConf.KillCheckBox.Checked) then

case Random(5) of

0: sndPlaySound('sounds\KillShip1.wav', SND_ASYNC);

1: sndPlaySound('sounds\KillShip2.wav', SND_ASYNC);

2: sndPlaySound('sounds\KillShip3.wav', SND_ASYNC);

3: sndPlaySound('sounds\KillShip4.wav', SND_ASYNC);

4: sndPlaySound('sounds\KillShip5.wav', SND_ASYNC);

end;

Result:= i;

end;

end;

end;

//3абивает матрицу данными - попал / промазал

//1 - палить дальше низя (промах, карочи)

function Fire(ShapeTag:integer; BoP:char):integer;

var r, c, temp:integer; //BoP - кто стреляет

begin

Result:= 0;

r:= GetNum(ShapeTag, 'r');

c:= GetNum(ShapeTag, 'c');

if BoP = 'b' then temp:= FormMain.m_sh[r,c]

else temp:= FormMain.e_sh[r,c];

//уже стрелял туда

if (temp = 2) or (temp = 3) or (temp = 4) then Exit;

{ -- принцип записи ходов --

если промах - пишем в мему промах,

если попал - определяем убитый корабль (если есть), то пишем его,

если нет убитого - пишем просто попадание }

if temp = 0 then WriteStepsMemo(r, c, -1, BoP);

case temp of

0: begin

temp:= 2; //не попал

if (BoP = 'p') and (FormConf.MissCheckBox.Checked) then

sndPlaySound('sounds\Miss.wav', SND_ASYNC);

Result:= 1;

end;

1: begin

temp:= 3; //попал

if (BoP = 'p') and (FormConf.TargetCheckBox.Checked) then

sndPlaySound('sounds\Target.wav', SND_ASYNC);

end;

end;

if BoP = 'b' then begin

FormMain.m_sh[r,c]:= temp;

if temp = 3 then WriteStepsMemo(r, c, MarkKillShip('p'), BoP);

FormMain.ReDraw('p');

end

else begin

FormMain.e_sh[r,c]:= temp;

if temp = 3 then WriteStepsMemo(r, c, MarkKillShip('b'), BoP);

FormMain.ReDraw('b');

end;

if temp = 2 then Exit;

// --- ниже код не прет, если промах ---

if m_k_ships = 4 then begin

if FormConf.EndGameCheckBox.Checked then

sndPlaySound('sounds\Looser.wav', SND_ASYNC);

inc(cnt[0]);

ShowMessage('Учись играть!');

end

else

if e_k_ships = 4 then begin

if FormConf.EndGameCheckBox.Checked then

sndPlaySound('sounds\Winner.wav', SND_ASYNC);

inc(cnt[1]);

ShowMessage('Ты надрал бота!');

end;

//если уже есть лузер, то ни че не делаем

if (m_k_ships = 4) or (e_k_ships = 4) then begin

FormMain.game:= 2; //закончили играть

FormMain.ReDraw('b'); //покажем проигравшему игроку кораблики бота

//пишем счет

FormMain.CountLabel.Caption:= FormMain.WriteCount;

Exit;

end;

end;

//изменяет содержимое попы

procedure ChangePopUpMenu;

var i:integer;

begin

//элем. попы присваиваем значение элем. сет_шыпа

for i:= 1 to 4 do

FormMain.DeleteShipPopupMenu.Items[i+1].Enabled:= set_ships[i];

end;

//раздаем таги всем всем всем шейпам (как-то по-пи@ерски 3вучит)

procedure SetTags;

var i, t, j, p:integer; temp:string[2];

begin

for p:= 0 to 1 do begin

t:= 1; j:= 1;

for i:= 0 to 127 do

if Application.MainForm.Components[i] is TShape then

with Application.MainForm.Components[i] as TShape do

if Tag = t then

begin

temp:= IntToStr(t) + IntToStr(j);

Tag:= StrToInt(temp);

inc(j);

if j = 9 then

begin

inc(t);

j:= 1;

end;

end;

end;

end;

//пишет маленькую матрицу

procedure WriteSmallMatrix(StartTag:integer; FinishTag:integer;

PalubaCount:integer; BoP:char);

var str:string[8]; i:integer;

begin

str:= GetShipTags(StartTag, FinishTag); //берем все таги корабля

//пишем таги в маленькую матрицу

for i:= 1 to PalubaCount do

if BoP = 'b' then

FormMain.e_s[PalubaCount, i]:= GetTagFromStr(str, i)

else FormMain.m_s[PalubaCount, i]:= GetTagFromStr(str, i);

//перепис. данные в большую

WriteNumsInBigMatrix(str, 1, BoP);

end;

//из матрицы перерисовывает кораблики на поле

procedure TFormMain.ReDraw(BoP:char);

var i, start, finish, temp:integer;

begin

if BoP = 'b' then

begin

start:= 0; finish:= 63;

end

else begin

start:= 64; finish:= 127;

end;

//нашел кораболь - не рабей

//перерисуй его скорей!

for i:= start to finish do

if Application.MainForm.Components[i] is TShape then

with Application.MainForm.Components[i] as TShape do begin

if BoP = 'b' then temp:= e_sh[GetNum(Tag, 'r'), GetNum(Tag, 'c')]

else temp:= m_sh[GetNum(Tag, 'r'), GetNum(Tag, 'c')];

//цвета посмотрим

case temp of

//пусто

0: Brush.Color:= FormConf.GetColor(FormConf.GridComboBox.Text);

//есть кораблик (не рысуется для бота в процессе игры)

1: if BoP = 'p' then

Brush.Color:= FormConf.GetColor(FormConf.ShipComboBox.Text)

else if (game = 2) or (FormNapalm.cht) then

Brush.Color:= FormConf.GetColor(FormConf.ShipComboBox.Text);

//промах

2: Brush.Color:= FormConf.GetColor(FormConf.MissComboBox.Text);

//подбил!

3: Brush.Color:= FormConf.GetColor(FormConf.TargetComboBox.Text);

//total destroy

4: Brush.Color:= FormConf.GetColor(FormConf.KillComboBox.Text);

end;

end;

end;

procedure TFormMain.ReDrawAll;

begin

ReDraw('b');

ReDraw('p');

//меняем "хелп" на форме

with FormMain do begin

MissShape.Brush.Color:= FormConf.GetColor(FormConf.MissComboBox.Text);

TargetShape.Brush.Color:= FormConf.GetColor(FormConf.TargetComboBox.Text);

KillShape.Brush.Color:= FormConf.GetColor(FormConf.KillComboBox.Text);

end;

end;

//рисуем n-палубный корабль

procedure DrawShip(StartTag:integer; FinishTag:integer; Rot:bool);

var i:integer; din, stat:char; color:TColor;

begin

if paluba = 0 then exit; //если без этого - глюки будуть!

//rc - row или col который мы не изменяем

if Rot = false then

begin

stat:= 'r';

din:= 'c';

end else

begin

stat:= 'c';

din:= 'r';

end;

color:= FormConf.GetColor(FormConf.ShipComboBox.Text);

//чекаем соседок и "залезность"

if CheckNeig(StartTag, FinishTag, 'p') or zalez

then color:= clRed;

//красим этот диапазон

for i:= 64 to 127 do

if Application.MainForm.Components[i] is TShape then

with Application.MainForm.Components[i] as TShape do

//если координата влезает в диапазон... хорошо значит

if GetNum(Tag, stat) = GetNum(StartTag, stat) then

if (GetNum(Tag, din) >= GetNum(StartTag, din)) and

(GetNum(Tag, din) <= GetNum(FinishTag, din))

then Brush.Color:= color;

zalez:= false;

end;

//удаляет корабель

procedure DelShip(PalubaCount:integer);

var str:string[8]; i:integer;

begin

FormMain.PlayButton.Enabled:= false; //хоть один кор. удалил - не играемся

//берем все таги этого корабля

str:= '';

for i:= 1 to PalubaCount do

str:= str + IntToStr(FormMain.m_s[PalubaCount, i]);

//пишем в эти адреса нули

WriteNumsInBigMatrix(str, 0, 'p');

//"убираем" этот корабль

set_ships[PalubaCount]:= false;

paluba:= GetPaluba;

ChangePopUpMenu;

FormMain.ReDraw('p');

end;

//пишет нули во все элементы большой матрицы

procedure TFormMain.Zero(BoP:char);

var i, j:integer;

begin

for i:= 1 to 8 do

for j:= 1 to 8 do

if BoP = 'b' then FormMain.e_sh[i,j]:= 0

else FormMain.m_sh[i,j]:= 0;

end;

//чистим конкретное игровое поле

procedure Clear(BoP:char);

begin

FormMain.Zero(BoP);

FormMain.ReDraw(BoP);

end;

//чистим игровые поля

procedure ClearAll;

begin

Clear('b');

Clear('p');

FormMain.ReDrawAll;

end;

function TFormMain.WriteCount:string;

var temp:integer;

begin

temp:= cnt[0] + cnt[1];

Result:= 'Счет: ' + IntToStr(cnt[0]) + ' - ' + IntToStr(cnt[1]) +

' (' + IntToStr(temp) + ')';

end;

//ставит корабли рандомом

procedure RandomSetShips(BoP:char);

var r, c, i, j, k, t_s, t_f:integer; str_tmp:string[2]; n, rot:bool;

begin

j:= 0;

Clear(BoP);

for i:= 1 to 4 do begin

while (j < 1) do begin

Randomize;

zalez:= false;

r:= Random(8);

c:= Random(8);

inc(r); inc(c);

//опред. направление

k:= Random(2);

if k = 0 then rot:= false else rot:= true;

str_tmp:= IntToStr(r) + IntToStr(c); //первый таг

t_s:= StrToInt(str_tmp);

t_f:= GetFinishTag(t_s, i, rot); //послед. таг

n:= CheckNeig(t_s, t_f, BoP); //соседи

//если соседей нету и кораблик не залез за поле

if (n = false) and (zalez = false) then begin

WriteSmallMatrix(t_s, t_f, i, BoP);

j:= 2;

end;

end;

j:= 0;

end;

//легче так сделать, чтоб не исп. ПАЛУБУ

if BoP = 'p' then begin

for i:= 1 to 4 do set_ships[i]:= true; //все стоить

paluba:= 0;

ChangePopUpMenu;

FormMain.PlayButton.Enabled:= true; //можно играть

if FormConf.PlayCheckBox.Checked then FormMain.Play;

end;

end;

//дождались...

procedure TFormMain.Play;

begin

game:= 1;

with FormMain do begin

StatusGroupBox.Caption:= ' Статус: игра ';

StatusLabel.Caption:= 'Игрок';

ManKillLabel.Caption:= 'Убил:';

ManLostLabel.Caption:= 'Потерял:';

//нажать уже низя

RanSetShipsButton.Enabled:= false;

RotateButton.Enabled:= false;

DelButton.Enabled:= false;

PlayButton.Enabled:= false;

DiffComboBox.Enabled:= false;

end;

RandomSetShips('b'); //теперь бот корабли ставит

 

if (FormNapalm.cht) then FormMain.ReDraw('b');

end;

procedure TFormMain.SetShip(StartTag:integer; FinishTag:integer; BoP:char);

begin

if FormConf.SetCheckBox.Checked then

sndPlaySound('sounds\SetShip.wav', SND_ASYNC);

WriteSmallMatrix(StartTag, FinishTag, paluba, BoP);

set_ships[paluba]:= true;

paluba:= GetPaluba;

ChangePopUpMenu;

if (FormConf.PlayCheckBox.Checked) and (paluba = 0) then Play

else

if paluba = 0 then FormMain.PlayButton.Enabled:= true; //можно играть

end;

procedure TFormMain.NewGame;

var i:integer;

begin

ClearAll;

with FormMain do begin

StatusGroupBox.Caption:= ' Статус: расстановка ';

StatusLabel.Caption:= 'Сейчас ставим:';

ManKillLabel.Caption:= '1 - палубный';

ManLostLabel.Caption:= '';

PlayButton.Enabled:= false;

RotateButton.Enabled:= true;

DelButton.Enabled:= true;

RanSetShipsButton.Enabled:= true;

DiffComboBox.Enabled:= true;

FormNapalm.cht:= false; //чит

StepsMemo.Clear;

end;

game:= 0; //ставим корабли (играть низя)

paluba:= 1;

zalez:= false;

e_k_ships:= 0;

m_k_ships:= 0;

for i:= 1 to 4 do set_ships[i]:= false;

ChangePopUpMenu;

end;

procedure ClearCount;

begin

cnt[0]:= 0; cnt[1]:= 0; //счет 0-0

FormMain.CountLabel.Caption:= 'Счет: 0 - 0 (0)';

end;

procedure TFormMain.FormShow(Sender: TObject);

begin

SetTags; //раздаем таги всем шейпам

NewGame; //дефултовые параметры

end;

procedure TFormMain.FormCreate(Sender: TObject);

var Reg:TRegistry;

begin

path:= ExtractFilePath(Application.ExeName);

Caption:= Application.Title;

Reg:= TRegistry.Create;

Reg.RootKey:= HKEY_CURRENT_USER;

if Reg.KeyExists('sf') = false then begin

Reg.OpenKey('sf', true);

Reg.WriteInteger('_left', Left);

Reg.WriteInteger('_top', Top);

end

else Reg.OpenKeyReadOnly('sf');

Left:= Reg.ReadInteger('_left');

Top:= Reg.ReadInteger('_top');

Reg.Free;

RanSetShipsButton.Caption:= 'В случайном'#13'порядке';

alph:= 'абвгдежз'; //для записи ходов

ClearCount;

end;

procedure TFormMain.Shape1MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

var j:integer;

begin

if (game = 0) or (game = 2) then Exit;

j:= 0;

if Fire((Sender as TShape).Tag, 'p') = 1 then

while (j < 1) do

if Fire(BotFireTag, 'b') = 1 then j:= 2;

end;

procedure TFormMain.Shape65MouseMove(Sender: TObject; Shift: TShiftState;

X, Y: Integer);

var tag_s, tag_f:integer;

begin

if game <> 0 then exit;

ReDraw('p');

tag_s:= (Sender as TShape).Tag;

tag_f:= GetFinishTag(tag_s, paluba, rotate);

DrawShip(tag_s, tag_f, rotate);

end;

procedure TFormMain.Shape65MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

var s, f:integer;

begin

if paluba = 0 then Exit;

s:= (Sender as TShape).Tag;

f:= GetFinishTag(s, paluba, rotate);

if (Sender as TShape).Brush.Color <> clRed then SetShip(s, f, 'p');

end;

procedure TFormMain.N2Click(Sender: TObject);

var p:integer;

begin

if (Sender as TMenuItem).Tag = -1 then exit; //атменка

p:= StrToInt((Sender as TMenuItem).Caption[1]); //берем "палубность" корабля

if FormConf.DelShipCheckBox.Checked then begin

if MesBox('Вы точно хотите удалить ' + (Sender as TMenuItem).Caption +

' корабль?', 'Удаление корабля') = true

then DelShip(p)

else Exit;

Exit;

end;

DelShip(p);

end;

procedure TFormMain.PlayButtonClick(Sender: TObject);

begin

case (Sender as TSpeedButton).Tag of

0: Play;

1: if rotate then rotate:= false else rotate:= true;

2: DeleteShipPopupMenu.Popup(FormMain.Left + DelButton.Left + 2, FormMain.Top + DelButton.Top + 74);

3: begin //рандом

RandomSetShips('p');

ReDraw('p');

end;

end;

end;

procedure TFormMain.N9Click(Sender: TObject);

begin

case (Sender as TMenuItem).Tag of

11: begin

if FormConf.NewGameCheckBox.Checked then begin

if MesBox('Создать новую игру?', 'Новая игра') = true

then NewGame

else Exit;

Exit;

end;

NewGame;

end;

12: FormConf.ShowModal;

13: begin

if FormConf.ExitCheckBox.Checked then begin

if MesBox('Вы точно хотите выйти?', 'Выход') = true

then Close

else Exit;

Exit;

end;

Close;

end;

14: if game <> 2 then ShowMessage('Текущая игра должна быть закончена')

else FormHTML.ShowModal;

15: begin

FormMain.NewGame;

ClearCount;

end;

21: if paluba = 0 then FormSaveSheme.ShowModal

else ShowMessage('Все корабли должны быть поставлены');

22: FormLoadDelSheme.ShowModal;

23: FormCleaner.ShowModal;

31: FormHistory.ShowModal;

32: ShowMessage('Инфу о найденых ошибках,'#13'лагах, багах,'#13 +

'можете слать сюда:'

+ #13#13 + 'kulbes@mail.ru');

end;

end;

procedure TFormMain.FormClose(Sender: TObject; var Action: TCloseAction);

var Reg:TRegistry;

begin

Reg:= TRegistry.Create;

Reg.RootKey:= HKEY_CURRENT_USER;

Reg.OpenKey('sf', true);

Reg.WriteInteger('_left', Left);

Reg.CloseKey;

Reg.OpenKey('sf', true);

Reg.WriteInteger('_top', Top);

Reg.CloseKey;

end;

procedure TFormMain.KillShapeMouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

FormNapalm.ShowModal;

end;

end.


Дата добавления: 2015-07-16; просмотров: 45 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Инструкция пользователя| Глава первая

mybiblioteka.su - 2015-2024 год. (0.118 сек.)