www.pudn.com > 200589952618.rar > MAIN.PAS


unit main; 
 
interface 
 
uses 
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 
  ExtCtrls, StdCtrls, Menus, CustObj, IdBaseComponent, IdComponent, 
  IdUDPBase, IdUDPServer, mytype, IdTCPServer, IdTCPConnection, 
  IdTCPClient, IdAntiFreezeBase, IdAntiFreeze; 
 
type 
 
  TfrmMain = class(TForm) 
    Timer1: TTimer; 
    Panel1: TPanel; 
    PaintBox1: TPaintBox; 
    MainMenu1: TMainMenu; 
    File1: TMenuItem; 
    mnuStart: TMenuItem; 
    mnuPause: TMenuItem; 
    mnuCancel: TMenuItem; 
    Panel2: TPanel; 
    ScrNext: TPaintBox; 
    stScore: TStaticText; 
    stLines: TStaticText; 
    stSpeed: TStaticText; 
    stDuring: TStaticText; 
    lblStatus: TLabel; 
    IdTCPClient1: TIdTCPClient; 
    IdAntiFreeze1: TIdAntiFreeze; 
    GBEnemy: TGroupBox; 
    Panel3: TPanel; 
    PaintBox2: TPaintBox; 
    N2: TMenuItem; 
    Timer2: TTimer; 
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); 
    procedure FormCreate(Sender: TObject); 
    procedure ScrDraw; 
    procedure NextDraw; 
    procedure Timer1Timer(Sender: TObject); 
    procedure FormPaint(Sender: TObject); 
    procedure mnuStartClick(Sender: TObject); 
    procedure mnuPauseClick(Sender: TObject); 
    procedure mnuExitClick; 
    procedure mnuCancelClick(Sender: TObject); 
    procedure Init; 
    procedure Timer2Timer(Sender: TObject); 
  private 
    { Private declarations } 
  public 
    playerme: Ruserdata; 
    playerenemy: Ruserdata; 
    EBG: Drawbox; 
    EFG: Drawbox; 
    function PlayerConnect(var userdata: Ruserdata): boolean; 
    procedure enemystart(var userdata: Ruserdata); 
    procedure enemyplay; 
    procedure win; 
    procedure EnemyInit; 
    procedure EnemyDraw; 
    procedure SendDraw; 
    { Public declarations } 
  end; 
 
var 
  frmMain: TfrmMain; 
  BG: Drawbox; 
  FG: Drawbox; 
  mCanvas: Tbitmap; 
  mECanvas: Tbitmap; 
  BOX: array[0..7] of Tbitmap; 
  EBOX: array[0..7] of Tbitmap; 
  Obj: TCustObj; 
  sNext: Byte; 
  sObj: Byte; 
  STime: Tdatetime; 
  Score, lines, Speed: integer; 
implementation 
 
uses myconst, mainformpas; 
{$R *.DFM} 
{$R BOX.res} 
procedure TfrmMain.EnemyInit; 
begin 
  FillChar(EBG, 200, #0); 
  FillChar(EFG, 200, #0); 
  EnemyDraw; 
end; 
 
procedure TfrmMain.EnemyDraw; 
var 
  i, j: integer; 
begin 
  mECanvas := Tbitmap.Create; 
  mECanvas.Width := 200; 
  mECanvas.Height := 400; 
 
  with mECanvas.Canvas do 
  begin 
    mECanvas.Canvas.Brush.Bitmap := EBOX[0]; 
    mECanvas.Canvas.FillRect(Rect(0, 0, 170, 340)); 
    for i := 0 to 9 do 
    begin 
      for j := 0 to 19 do 
      begin 
        if (EFG[i, j] <> 0) then 
          mECanvas.Canvas.CopyRect(Rect(i * 17, j * 17, (i + 1) * 17, (j + 1) * 17), EBOX[EFG[i, j]].Canvas, Rect(0, 0, 16, 16)); 
        if (EBG[i, j] <> 0) then 
          mECanvas.Canvas.CopyRect(Rect(i * 17, j * 17, (i + 1) * 17, (j + 1) * 17), EBOX[EBG[i, j]].Canvas, Rect(0, 0, 16, 16)); 
      end; 
    end; 
  end; 
  PaintBox2.Canvas.CopyRect(Rect(0, 0, 170, 340), mECanvas.Canvas, Rect(0, 0, 170, 340)); 
  mECanvas.Free; 
end; 
 
 
procedure TfrmMain.win; 
begin 
  Timer1.Enabled := False; 
  Timer2.Enabled := False; 
  showmessage('You Win Congratulations!'); 
  EnemyInit; 
  Init; 
  mnuStart.Enabled := True; 
  mnuPause.Enabled := False; 
  mnuCancel.Enabled := False; 
end; 
procedure TfrmMain.enemyplay; 
begin 
  EnemyDraw; 
end; 
 
procedure TfrmMain.enemystart(var userdata: Ruserdata); 
begin 
  GBEnemy.Caption := userdata.username; 
  self.Width := 487; 
  EnemyInit; 
end; 
 
function TfrmMain.PlayerConnect(var userdata: Ruserdata): boolean; 
var 
  mess: string; 
begin 
  mess := 'Do you want to play with "' + userdata.username + '"'; 
  if Application.MessageBox(pchar(mess), 'Question', MB_ICONQUESTION + MB_YESNO) = IDYES then 
  begin 
    enemystart(userdata); 
    result := True; 
  end 
  else 
    result := False; 
end; 
procedure TfrmMain.FormKeyDown(Sender: TObject; var Key: Word; 
  Shift: TShiftState); 
begin 
  try 
    if Timer1.Enabled then 
    begin 
      case Key of 
        37: begin 
            Obj.Move(-1); 
          end; 
        39: begin 
            Obj.Move(1); 
          end; 
        38: begin 
            Obj.Rotate; 
          end; 
        40: begin 
            Obj.Drop; 
          end; 
        32: begin 
            while Obj.Drop do 
            begin 
              ScrDraw; 
              if self.Width = 487 then 
                SendDraw; 
            end; 
          end; 
        27: if mnuCancel.Enabled then mnuCancelClick(self); 
      end; 
      ScrDraw; 
      if self.Width = 487 then 
        SendDraw; 
    end; 
  except 
    on e: exception do 
    begin 
      showmessage('无法连接' + playerenemy.username + ',请稍后重试!'); 
      self.Width := 280; 
      Init; 
      EnemyInit; 
      Timer1.Enabled := False; 
      Timer2.Enabled := False; 
      mnuStart.Enabled := True; 
      mnuPause.Enabled := False; 
      mnuCancel.Enabled := False; 
      exit; 
    end; 
  end; 
end; 
 
procedure TfrmMain.FormCreate(Sender: TObject); 
var 
  i: integer; 
begin 
  self.Width := 280; 
  Randomize; 
  for i := 0 to 7 do 
  begin 
    BOX[i] := Tbitmap.Create; 
    EBOX[i] := Tbitmap.Create; 
  end; 
  BOX[0].LoadFromResourceName(HInstance, 'BLACK'); 
  BOX[1].LoadFromResourceName(HInstance, 'GREEN'); 
  BOX[2].LoadFromResourceName(HInstance, 'PURPLE'); 
  BOX[3].LoadFromResourceName(HInstance, 'RED'); 
  BOX[4].LoadFromResourceName(HInstance, 'AQUA'); 
  BOX[5].LoadFromResourceName(HInstance, 'BLUE'); 
  BOX[6].LoadFromResourceName(HInstance, 'ORANGE'); 
  BOX[7].LoadFromResourceName(HInstance, 'YELLOW'); 
  EBOX[0].LoadFromResourceName(HInstance, 'BLACK'); 
  EBOX[1].LoadFromResourceName(HInstance, 'GREEN'); 
  EBOX[2].LoadFromResourceName(HInstance, 'PURPLE'); 
  EBOX[3].LoadFromResourceName(HInstance, 'RED'); 
  EBOX[4].LoadFromResourceName(HInstance, 'AQUA'); 
  EBOX[5].LoadFromResourceName(HInstance, 'BLUE'); 
  EBOX[6].LoadFromResourceName(HInstance, 'ORANGE'); 
  EBOX[7].LoadFromResourceName(HInstance, 'YELLOW'); 
  FillChar(BG, 200, #0); 
  FillChar(FG, 200, #0); 
  FillChar(EBG, 200, #0); 
  FillChar(EFG, 200, #0); 
  sNext := Random(7); 
  sObj := Random(7); 
  Obj := TCustObj.Create(sObj); 
  frmMain.Caption := 'TETRIS ' + playerme.username; 
  Timer1.Enabled := False; 
  Timer2.Enabled := False; 
  self.DoubleBuffered := True; 
  Init; 
  EnemyInit; 
end; 
 
procedure TfrmMain.NextDraw; 
  procedure Drawbox(x, y: integer); overload; 
  begin 
    ScrNext.Canvas.CopyRect(Rect((x - 1) * 17 + 10, (y - 1) * 17 + 10, x * 17 + 10, y * 17 + 10), BOX[sNext + 1].Canvas, Rect(0, 0, 16, 16)); 
  end; 
  procedure Drawbox(sx, sy, x, y: integer); overload; 
  begin 
    ScrNext.Canvas.CopyRect(Rect((x - 1) * 17 + sx, (y - 1) * 17 + sy, x * 17 + sx, y * 17 + sy), BOX[sNext + 1].Canvas, Rect(0, 0, 16, 16)); 
  end; 
begin 
  ScrNext.Canvas.Brush.Bitmap := BOX[0]; 
  ScrNext.Canvas.FillRect(Rect(0, 0, 170, 340)); 
  if not Timer1.Enabled then exit; 
  case sNext of 
    0: begin 
        Drawbox(1, 18, 1, 1); 
        Drawbox(1, 18, 2, 1); 
        Drawbox(1, 18, 3, 1); 
        Drawbox(1, 18, 4, 1); 
      end; 
    1: begin 
        Drawbox(18, 10, 1, 1); 
        Drawbox(18, 10, 2, 1); 
        Drawbox(18, 10, 1, 2); 
        Drawbox(18, 10, 2, 2); 
      end; 
    2: begin 
        Drawbox(2, 1); 
        Drawbox(1, 2); 
        Drawbox(2, 2); 
        Drawbox(3, 2); 
      end; 
    3: begin 
        Drawbox(1, 1); 
        Drawbox(1, 2); 
        Drawbox(2, 1); 
        Drawbox(3, 1); 
      end; 
    4: begin 
        Drawbox(1, 1); 
        Drawbox(2, 1); 
        Drawbox(3, 1); 
        Drawbox(3, 2); 
      end; 
    5: begin 
        Drawbox(1, 1); 
        Drawbox(2, 1); 
        Drawbox(2, 2); 
        Drawbox(3, 2); 
      end; 
    6: begin 
        Drawbox(1, 2); 
        Drawbox(2, 2); 
        Drawbox(2, 1); 
        Drawbox(3, 1); 
      end; 
  end; 
end; 
 
procedure TfrmMain.ScrDraw; 
var 
  i, j: integer; 
begin 
  mCanvas := Tbitmap.Create; 
  mCanvas.Width := 200; 
  mCanvas.Height := 400; 
  with mCanvas.Canvas do 
  begin 
    mCanvas.Canvas.Brush.Bitmap := BOX[0]; 
    mCanvas.Canvas.FillRect(Rect(0, 0, 170, 340)); 
    for i := 0 to 9 do 
    begin 
      for j := 0 to 19 do 
      begin 
        if (FG[i, j] <> 0) then 
          mCanvas.Canvas.CopyRect(Rect(i * 17, j * 17, (i + 1) * 17, (j + 1) * 17), BOX[FG[i, j]].Canvas, Rect(0, 0, 16, 16)); 
        if (BG[i, j] <> 0) then 
          mCanvas.Canvas.CopyRect(Rect(i * 17, j * 17, (i + 1) * 17, (j + 1) * 17), BOX[BG[i, j]].Canvas, Rect(0, 0, 16, 16)); 
      end; 
    end; 
  end; 
  PaintBox1.Canvas.CopyRect(Rect(0, 0, 170, 340), mCanvas.Canvas, Rect(0, 0, 170, 340)); 
  mCanvas.Free; 
end; 
 
procedure TfrmMain.SendDraw; 
var 
  ctext: Rcommandtext; 
begin 
  try 
  playerenemy.Rbg := BG; 
  playerenemy.Rfg := FG; 
  ctext.command := Cdraw; 
  IdTCPClient1.WriteBuffer(ctext, sizeof(ctext)); 
  IdTCPClient1.WriteBuffer(self.playerenemy, sizeof(self.playerenemy)); 
  except 
    on e: exception do 
    begin 
      showmessage('无法连接' + playerenemy.username + ',请稍后重试!'); 
      self.Width := 280; 
      Init; 
      EnemyInit; 
      Timer1.Enabled := False; 
      Timer2.Enabled := False; 
      mnuStart.Enabled := True; 
      mnuPause.Enabled := False; 
      mnuCancel.Enabled := False; 
      exit; 
    end; 
  end; 
end; 
 
procedure TfrmMain.Timer1Timer(Sender: TObject); 
var 
  i: integer; 
  ctext: Rcommandtext; 
begin 
  try 
    if not Obj.Drop then 
    begin 
      Score := Score + 4; 
      i := Obj.ClearLine; 
      if i > 0 then 
        Score := Score + (i - 1) * 20 + i * 40; 
      lines := lines + i; 
      Speed := lines div 30; 
      Timer1.Interval := 1000 div (Speed + 1); 
      stScore.Caption := IntToStr(Score); 
      stLines.Caption := IntToStr(lines); 
      stSpeed.Caption := IntToStr(Speed); 
      Obj.free; 
      FillChar(FG, 200, #0); 
      Obj := TCustObj.Create(sNext); 
      sObj := sNext; 
      sNext := Random(7); 
      NextDraw; 
      if Obj.IsOver then 
      begin 
        Timer1.Enabled := False; 
        Timer2.Enabled := False; 
        if self.Width = 487 then 
        begin 
          ctext.command := Cover; 
          IdTCPClient1.WriteBuffer(ctext, sizeof(ctext)); 
          IdTCPClient1.WriteBuffer(self.playerenemy, sizeof(self.playerenemy)); 
        end; 
        showmessage('Game Over You Lose!'); 
        EnemyInit; 
        Init;      
        mnuStart.Enabled := True; 
        mnuPause.Enabled := False; 
        mnuCancel.Enabled := False; 
        exit; 
      end; 
    end; 
 
    ScrDraw; 
    if self.Width = 487 then 
      SendDraw; 
    NextDraw; 
 
    stDuring.Caption := TimeToStr(Now - STime); 
  except 
    on e: exception do 
    begin 
      showmessage('无法连接' + playerenemy.username + ',请稍后重试!'); 
      self.Width := 280; 
      Init; 
      EnemyInit; 
      Timer1.Enabled := False; 
      Timer2.Enabled := False; 
      mnuStart.Enabled := True; 
      mnuPause.Enabled := False; 
      mnuCancel.Enabled := False; 
      exit; 
    end; 
  end; 
 
end; 
 
procedure TfrmMain.FormPaint(Sender: TObject); 
begin 
  ScrDraw; 
  NextDraw; 
end; 
 
procedure TfrmMain.mnuStartClick(Sender: TObject); 
var 
  ctext: Rcommandtext; 
begin 
  mnuPause.Enabled := True; 
  mnuCancel.Enabled := True; 
  STime := Now; 
  mnuStart.Enabled := False; 
  Init; 
  if self.Width = 487 then 
  begin 
    try 
      ctext.command := Cenemystart; 
      playerenemy.Rbg := BG; 
      playerenemy.Rfg := FG; 
      IdTCPClient1.WriteBuffer(ctext, sizeof(ctext)); 
      IdTCPClient1.WriteBuffer(self.playerenemy, sizeof(self.playerenemy)); 
    except 
      on e: exception do 
      begin 
        showmessage('无法连接' + playerenemy.username + ',请稍后重试!'); 
        self.Width := 280; 
        Init; 
        EnemyInit; 
        Timer1.Enabled := False; 
        Timer2.Enabled := False; 
        mnuStart.Enabled := True; 
        mnuPause.Enabled := False; 
        mnuCancel.Enabled := False; 
        exit; 
      end; 
    end; 
  end; 
  Timer1.Enabled := True; 
  Timer2.Enabled := True; 
end; 
 
procedure TfrmMain.mnuPauseClick(Sender: TObject); 
begin 
  Timer1.Enabled := not Timer1.Enabled; 
  if not Timer1.Enabled then 
    lblStatus.Caption := 'Paused' 
  else 
    lblStatus.Caption := ''; 
end; 
 
procedure TfrmMain.mnuExitClick; 
var 
  ctext: Rcommandtext; 
begin 
  try 
    if self.Width = 487 then 
    begin 
      ctext.command := Clogout; 
      IdTCPClient1.WriteBuffer(ctext, sizeof(ctext)); 
      IdTCPClient1.WriteBuffer(self.playerenemy, sizeof(self.playerenemy)); 
      self.Width := 280; 
      EnemyInit; 
    end; 
    self.Visible := False; 
    Timer1.Enabled := False; 
    Timer2.Enabled := False; 
    Init; 
    mnuStart.Enabled := True; 
    mnuPause.Enabled := False; 
    mnuCancel.Enabled := False; 
  except 
    on e: exception do 
    begin 
      showmessage('无法连接' + playerenemy.username + ',请稍后重试!'); 
      self.Width := 280; 
      Init; 
      EnemyInit; 
      Timer1.Enabled := False; 
      Timer2.Enabled := False; 
      mnuStart.Enabled := True; 
      mnuPause.Enabled := False; 
      mnuCancel.Enabled := False; 
      exit; 
    end; 
  end; 
end; 
 
procedure TfrmMain.mnuCancelClick(Sender: TObject); 
var 
  ctext: Rcommandtext; 
begin 
  Timer1.Enabled := False; 
  Timer2.Enabled := False; 
  if Application.MessageBox('Do you sure to cancel the current game?', 'Question', MB_ICONQUESTION + MB_YESNO) = IDYES then 
  begin 
    Init; 
    mnuStart.Enabled := True; 
    mnuPause.Enabled := False; 
    mnuCancel.Enabled := False; 
    if self.Width = 487 then 
    begin 
      try 
        EnemyInit; 
        ctext.command := Cmodiwhatdoing; 
        ctext.num := 1; 
        IdTCPClient1.WriteBuffer(ctext, sizeof(ctext)); 
        IdTCPClient1.WriteBuffer(self.playerme, sizeof(self.playerme)); 
        ctext.command := Clogout; 
        IdTCPClient1.WriteBuffer(ctext, sizeof(ctext)); 
        IdTCPClient1.WriteBuffer(self.playerenemy, sizeof(self.playerenemy)); 
        self.Width := 280; 
      except 
        on e: exception do 
        begin 
          showmessage('无法连接' + playerenemy.username + ',请稍后重试!'); 
          self.Width := 280; 
          Init; 
          EnemyInit; 
          Timer1.Enabled := False; 
          Timer2.Enabled := False; 
          mnuStart.Enabled := True; 
          mnuPause.Enabled := False; 
          mnuCancel.Enabled := False; 
          exit; 
        end; 
      end; 
    end; 
  end 
  else 
  begin 
    Timer1.Enabled := True; 
    Timer2.Enabled := True; 
  end; 
end; 
 
procedure TfrmMain.Init; 
begin 
  FillChar(BG, 200, #0); 
  FillChar(FG, 200, #0); 
  ScrDraw; 
  if self.Width = 487 then 
    SendDraw; 
  NextDraw; 
  Score := 0; 
  lines := 0; 
  Speed := 0; 
  lblStatus.Caption := ''; 
  stScore.Caption := '0'; 
  stLines.Caption := '0'; 
  stSpeed.Caption := '0'; 
  stDuring.Caption := '0:00:00'; 
end; 
 
procedure TfrmMain.Timer2Timer(Sender: TObject); 
begin 
  ScrDraw; 
  if self.Width = 487 then 
    SendDraw; 
  NextDraw; 
end; 
 
end.