All pastes #804328 Raw Edit

Miscellany

public text v1 · immutable
·published 2007-12-03 11:10 UTC
rendered paste body
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Image2: TImage;
    RadioGroup1: TRadioGroup;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    RefreshBtn: TButton;
    StartBtn: TButton;
    StopBtn: TButton;
    Memo1: TMemo;
    Label2: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure StartBtnClick(Sender: TObject);
    procedure StopBtnClick(Sender: TObject);
    procedure RefreshBtnClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Image2MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure BotInit;
    procedure XodBot;
    procedure FormPaint(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

type btfld = record
       isSuccess: 0..2;
       o4ku : -1..2;
     end;

var playerfield, botfield, planalys : array [1..8, 1..8] of Boolean;
    btanalys : array [0..9, 0..9] of btfld;
    c4, c3, c2, c1, pc4et, bc4et :Integer; botWin :Boolean;
    seltype : 0..4; //0 - тип корабля не выбран, 1..4 - количество труб

procedure TForm1.BotInit;
label WHILE_1,WHILE_2,WHILE_3;
var x, y, st, i, c :Integer;
begin
  Memo1.Lines.Append(DateToStr(Date)+' '+TimeToStr(Time)+': Бот начал расстановку.');
  Randomize;
    st :=random(1);
    if st=1 then
    begin
      x := Random(8);
      y := Random(5);
      for i:=0 to 3 do botfield[x,y+i] := True;
    end else
    begin
      x := Random(5);
      y := Random(8);
      for i:=0 to 3 do botfield[x+i,y] := True;
    end;
  c := 1;
  while c<=2 do
  begin
    WHILE_1:
    st :=random(1);
    if st=1 then
    begin
      x := Random(8);
      y := Random(6);
      for i:=0 to 2 do if botfield[x,y+i] then goto WHILE_1;
      for i:=0 to 2 do botfield[x,y+i] := True;
    end else
    begin
      x := Random(6);
      y := Random(8);
      for i:=0 to 2 do if botfield[x+i,y] then goto WHILE_1;
      for i:=0 to 2 do botfield[x+i,y] := True;
    end;
    c := c+1;
  end;
    c := 1;
  while c<=3 do
  begin
    WHILE_2:
    st :=random(1);
    if st=1 then
    begin
      x := Random(8);
      y := Random(7);
      for i:=0 to 1 do if botfield[x,y+i] then goto WHILE_2;
      for i:=0 to 1 do botfield[x,y+i] := True;
    end else
    begin
      x := Random(7);
      y := Random(8);
      for i:=0 to 1 do if botfield[x+i,y] then goto WHILE_2;
      for i:=0 to 1 do botfield[x+i,y] := True;
    end;
    c := c+1;
  end;
  c := 1;
  while c<=4 do
  begin
    WHILE_3:
    x := Random(8);
    y := Random(8);
    if botfield[x,y] then goto WHILE_3;
    botfield[x,y] := True;
    c := c+1;
  end;
  Memo1.Lines.Append(DateToStr(Date)+' '+TimeToStr(Time)+': Бот закончил расстановку.');
end;

function SetIndexes :TPoint;
label RETURN;
var i, j, cmax, k :Integer; max : -1..2;
begin
  Randomize;
  max := 0;
  for i:=1 to 8 do for j:=1 to 8 do
    if btanalys[i,j].isSuccess <> 0 then btanalys[i,j].o4ku := -1
    else begin
      btanalys[i,j].o4ku := 0;
      if (btanalys[i+1,j].isSuccess=2)or(btanalys[i-1,j].isSuccess=2)or(btanalys[i,j+1].isSuccess=2)or(btanalys[i,j-1].isSuccess=2) then btanalys[i,j].o4ku := 1;
      if (btanalys[i+1,j].isSuccess=2)and(btanalys[i-1,j].isSuccess=2) or (btanalys[i,j+1].isSuccess=2)and(btanalys[i,j-1].isSuccess=2) then btanalys[i,j].o4ku := 2;
      if btanalys[i,j].o4ku > max then max := btanalys[i,j].o4ku;
    end;
  cmax := 0;
  for i:=1 to 8 do for j:=1 to 8 do if btanalys[i,j].o4ku = max then cmax := cmax+1;
  k := Random(cmax)+1;
  for i:=1 to 8 do for j:=1 to 8 do
  begin
    if btanalys[i,j].o4ku=max then k:=k-1;
    if k=0 then goto RETURN;
  end;
  RETURN:
  Result.Y := i; Result.X := j;
end;

procedure TForm1.XodBot;
var CField :TPoint;
begin
  if botWin then exit;
  repeat
    CField := SetIndexes;
    if playerfield[CField.X, CField.Y] then
    begin
      btanalys[CField.Y, CField.X].isSuccess := 2;
      with Image1.Canvas do
      begin
        Pen.Color := clRed;
        Pen.Width := 5;
        Ellipse(CField.X*40-25, CField.Y*40-25, CField.X*40+3, CField.Y*40+3);
        Memo1.Lines.Append(DateToStr(Date)+' '+TimeToStr(Time)+': Ходит бот...');
        Memo1.Lines.Append(DateToStr(Date)+' '+TimeToStr(Time)+': '+IntToStr(CField.X)+','+IntToStr(CField.Y)+' Попал!');
        bc4et := bc4et+1;
        if bc4et = 20 then
        begin
          ShowMessage('YOU LOSE!!!');
          Memo1.Lines.Append(DateToStr(Date)+' '+TimeToStr(Time)+': Игрок проиграл.');
          pc4et := -20;
          botWin := True;
          exit;
        end;
      end;
    end else
    begin
      btanalys[CField.Y, CField.X].isSuccess := 1;
      with Image1.Canvas do
      begin
        Pen.Color := clGray;
        Pen.Width := 5;
        MoveTo(CField.X*40-27, CField.Y*40-27);
        LineTo(CField.X*40+5, CField.Y*40+5);
        MoveTo(CField.X*40+5, CField.Y*40-27);
        LineTo(CField.X*40-27, CField.Y*40+5);
        Memo1.Lines.Append(DateToStr(Date)+' '+TimeToStr(Time)+': Ходит бот...');
        Memo1.Lines.Append(DateToStr(Date)+' '+TimeToStr(Time)+': '+IntToStr(CField.X)+','+IntToStr(CField.Y)+' Мимо!');
        exit;
      end;
    end;
  until not playerfield[CField.X, CField.Y];
end;

procedure TForm1.FormCreate(Sender: TObject);
var i,j :Integer; frect :TRect;
begin
  frect.Left := 0; frect.Top := 0;
  c4 := 1; c3 := 2; c2 := 3; c1 := 4; pc4et := 0; bc4et := 0; botWin := False;
  seltype := 0;
  Button1.Enabled := True;
  Button2.Enabled := True;
  Button3.Enabled := True;
  Button4.Enabled := True;
  for i:=0 to 9 do for j:=0 to 9 do btanalys[i, j].isSuccess := 0;
  for i := 0 to 7 do for j := 0 to 7 do
  begin
    playerfield[i,j] := False; botfield[i,j] := False;
    planalys[i, j] := False;
  end;
  with Image1.Canvas do
  begin
    frect.Right := Image1.Width; frect.Bottom := Image1.Height;
    FillRect(frect);
    MoveTo(0, 0);
    Pen.Color := clBlue;
    Pen.Width := 10;
    Rectangle(5, 5, Image1.Width-4, Image1.Height-4);
    Pen.Width := 1;
    for i:=1 to 8 do
    begin
      MoveTo(9+i*40, 0);
      LineTo(9+i*40, Image1.Height);
      MoveTo(0, 9+i*40);
      LineTo(Image1.Width, 9+i*40);
    end;
  end;
  with Image2.Canvas do
  begin
    frect.Right := Image2.Width; frect.Bottom := Image2.Height;
    FillRect(frect);
    MoveTo(0, 0);
    Pen.Color := clBlue;
    Pen.Width := 10;
    Rectangle(5, 5, Image1.Width-4, Image1.Height-4);
    Pen.Width := 1;
    for i:=1 to 8 do
    begin
      MoveTo(9+i*40, 0);
      LineTo(9+i*40, Image1.Height);
      MoveTo(0, 9+i*40);
      LineTo(Image1.Width, 9+i*40);
    end;
  end;
end;

function XodPlayer(X, Y :Integer) :Boolean;
begin
  if botfield[x, y] then Result := True else Result := False;
  planalys[x, y] := True;
end;

procedure TForm1.StartBtnClick(Sender: TObject);
begin
  if (c1<>0)or(c2<>0)or(c3<>0)or(c4<>0) then
  begin
    ShowMessage('Следует расставить все корабли.');
    exit;
  end;
  Label2.Visible := True;
  BotInit;
  RadioGroup1.Enabled := False;
  Button1.Enabled := False;
  Button2.Enabled := False;
  Button3.Enabled := False;
  Button4.Enabled := False;
  RefreshBtn.Enabled := False;
  Image1.Enabled := False;
  Image2.Visible := True;
  StartBtn.Visible := False;
  StopBtn.Visible := True;
  Memo1.Lines.Append(DateToStr(Date)+' '+TimeToStr(Time)+': Старт игры.');
end;

procedure TForm1.StopBtnClick(Sender: TObject);
begin
  RadioGroup1.Enabled := True;
  Button1.Enabled := True;
  Button2.Enabled := True;
  Button3.Enabled := True;
  Button4.Enabled := True;
  RefreshBtn.Enabled := True;
  Image1.Enabled := True;
  Image2.Visible := False;
  StopBtn.Visible := False;
  StartBtn.Visible:=True;
  FormCreate(Form1);
  Memo1.Lines.Append(DateToStr(Date)+' '+TimeToStr(Time)+': Игра прервана пользователем.');
end;

procedure TForm1.RefreshBtnClick(Sender: TObject);
begin
    Memo1.Lines.Append(DateToStr(Date)+' '+TimeToStr(Time)+': Сброс расстановки пользователя.');
  FormCreate(Form1);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if seltype <> 0 then exit;
  seltype := 4;
  c4 := c4-1;
  Memo1.Lines.Append(DateToStr(Date)+' '+TimeToStr(Time)+': Выбран тип корабля: 4х трубный.');
  if c4=0 then
  begin
    Button1.Enabled:=False;
    Memo1.Lines.Append(DateToStr(Date)+' '+TimeToStr(Time)+': Лимит 4х трубников исчерпан.');
    exit;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if seltype <> 0 then exit;
  seltype := 3;
  c3 := c3-1;
  Memo1.Lines.Append(DateToStr(Date)+' '+TimeToStr(Time)+': Выбран тип корабля: 3х трубный.');
  if c3=0 then
  begin
    Button2.Enabled:=False;
    Memo1.Lines.Append(DateToStr(Date)+' '+TimeToStr(Time)+': Лимит 3х трубников исчерпан.');
    exit;
  end;

end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  if seltype <> 0 then exit;
  seltype := 2;
  c2 := c2-1;
  Memo1.Lines.Append(DateToStr(Date)+' '+TimeToStr(Time)+': Выбран тип корабля: 2х трубный.');
  if c2=0 then
  begin
    Button3.Enabled:=False;
    Memo1.Lines.Append(DateToStr(Date)+' '+TimeToStr(Time)+': Лимит 2х трубников исчерпан.');
    exit;
  end;

end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  if seltype <> 0 then exit;
  seltype := 1;
  c1 := c1-1;
  Memo1.Lines.Append(DateToStr(Date)+' '+TimeToStr(Time)+': Выбран тип корабля: 1но трубный.');
  if c1=0 then
  begin
    Button4.Enabled:=False;
    Memo1.Lines.Append(DateToStr(Date)+' '+TimeToStr(Time)+': Лимит 1но трубников исчерпан.');
    exit;
  end;

end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var Field :TPoint; i :Integer;
begin
  if seltype = 0 then exit;
  Field.X := (X-10) div 40; Field.Y := (Y-10) div 40;
  if (Field.X<0)or(Field.X>7)or(Field.Y<0)or(Field.Y>7) then exit;
  Image1.Canvas.Pen.Width := 36;
  Image1.Canvas.Pen.Color := clBlack;
  Image1.Canvas.MoveTo((Field.X)*40+28, (Field.Y)*40+28);
  if RadioGroup1.ItemIndex = 0 then
  begin
    for i:=1 to seltype do
      if playerfield[Field.X+i, Field.Y+1] or (Field.X+i>8) then
      begin
        Memo1.Lines.Append(DateToStr(Date)+' '+TimeToStr(Time)+': Ошибка: корабль не может быть установлен в указанном месте.');
        exit;
      end;
    Image1.Canvas.LineTo((Field.X+seltype-1)*40+29, (Field.Y)*40+29);
    for i:=1 to seltype do playerfield[Field.X+i, Field.Y+1] := True;
    Memo1.Lines.Append(DateToStr(Date)+' '+TimeToStr(Time)+': Пользователем установлен '+IntToStr(seltype)+'-трубник в поля '+IntToStr(Field.X+1)+'..'+IntToStr(Field.X+seltype)+'; '+IntToStr(Field.Y+1));
  end else
  begin
    for i:=1 to seltype do
      if playerfield[Field.X+1, Field.Y+i+1] or (Field.Y+i>8) then exit;
    Image1.Canvas.LineTo((Field.X)*40+29, (Field.Y+seltype-1)*40+29);
    for i:=1 to seltype do playerfield[Field.X+1, Field.Y+i] := True;
    Memo1.Lines.Append(DateToStr(Date)+' '+TimeToStr(Time)+': Пользователем установлен '+IntToStr(seltype)+'-трубник в поля '+IntToStr(Field.X+1)+'; '+IntToStr(Field.Y+1)+'..'+IntToStr(Field.Y+seltype));
  end;
  seltype := 0;
end;

procedure TForm1.Image2MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  X := (X-10) div 40; Y := (Y-10) div 40;
  if planalys[X, Y] then exit;
  if not botWin then Memo1.Lines.Append(DateToStr(Date)+' '+TimeToStr(Time)+': Ходит игрок...');
  if XodPlayer(X, Y) then with Image2.Canvas do
  begin
    Pen.Color := clRed;
    Pen.Width := 5;
    Ellipse((X+1)*40-27, (Y+1)*40-27, (X+1)*40+5, (Y+1)*40+5);
    pc4et := pc4et+1;
    if not botWin then Memo1.Lines.Append(DateToStr(Date)+' '+TimeToStr(Time)+': '+IntToStr(X+1)+','+IntToStr(Y+1)+' Попал!');
    if pc4et = 20 then
    begin
      ShowMessage('YOU WIN!!!');
      if not botWin then Memo1.Lines.Append(DateToStr(Date)+' '+TimeToStr(Time)+': Победил игрок.');
      botWin := True;
    end;
  end else with Image2.Canvas do
  begin
    Pen.Color := clGray;
    Pen.Width := 5;
    MoveTo((X+1)*40-27, (Y+1)*40-27);
    LineTo((X+1)*40+5, (Y+1)*40+5);
    MoveTo((X+1)*40+5, (Y+1)*40-27);
    LineTo((X+1)*40-27, (Y+1)*40+5);
    if not botWin then Memo1.Lines.Append(DateToStr(Date)+' '+TimeToStr(Time)+': '+IntToStr(X+1)+','+IntToStr(Y+1)+' Мимо!');
    XodBot;
  end;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
  Label2.Caption := 'Счёт '+IntToStr(pc4et)+':'+IntToStr(bc4et);
end;

end.