⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mydata.pas

📁 delphi俄罗斯方块delphi俄罗斯方块
💻 PAS
字号:
// tyysoft
// Author: tuyanyi

unit myData;

interface
uses
  Graphics,Windows,Dialogs,SysUtils;
type
  TMatrix=array [0..3,0..1]of integer;      // 用来存放一个完整的砖块
  TMatrixData=record
    aMatrix:TMatrix;
    xIndex,yIndex:integer;
    flag:byte;
    tag:byte;
  end;
var

//静态数据,用来保存不同形状的砖块
MatrixData:array[0..18]of TMatrix=
    (((1,0),(2,0),(1,1),(2,1)),
    ((0,1),(1,1),(2,1),(3,1)),((2,0),(2,1),(2,2),(2,3)),
    ((1,0),(1,1),(2,1),(2,2)),((1,2),(2,1),(2,2),(3,1)),
    ((1,1),(1,2),(2,0),(2,1)),((0,1),(1,1),(1,2),(2,2)),
    ((0,1),(1,0),(1,1),(2,1)),((0,1),(1,0),(1,1),(1,2)),
    ((0,1),(1,1),(1,2),(2,1)),((1,0),(1,1),(1,2),(2,1)),
    ((1,0),(1,1),(1,2),(2,2)),((0,2),(1,2),(2,1),(2,2)),
    ((1,0),(2,0),(2,1),(2,2)),((1,1),(1,2),(2,1),(3,1)),
    ((1,2),(2,0),(2,1),(2,2)),((0,1),(1,1),(2,1),(2,2)),
    ((1,0),(1,1),(1,2),(2,0)),((1,1),(1,2),(2,2),(3,2)));

//用来存放面板上的每个格子的状态(是否有填充)
CellState:array[0..19,0..13]of byte;

//The function that operate the
procedure SetMatrix(var DMatrixData:TMatrixData;const aflag:byte=0;x:integer=6;y:integer=0);
function StepBottom(var DMatrixData:TMatrixData):boolean;
procedure StepLeft(var DMatrixData:TMatrixData);
procedure StepRight(var DMatrixData:TMatrixData);
procedure DrawMatrix(Canvas:TCanvas;const aMatrixData:TMatrixData);
procedure DrawNextMatrix(Canvas:TCanvas;const aMatrixData:TMatrixData);
function OutLeftRange(const aMatrixData:TMatrixData):boolean;
function OutRightRange(const aMatrixData:TMatrixData):boolean;
function OutBottomRange(const aMatrixData:TMatrixData):boolean;
procedure SetMatrix2(var DMatrixData:TMatrixData;const index:byte=0;x:integer=6;y:integer=0);
function OutLeft(const aMatrixData:TMatrixData):boolean;
function OutRight(const aMatrixData:TMatrixData):boolean;
function OutBottom(const aMatrixData:TMatrixData):boolean;
implementation
uses
  gm;

//本函数用来检查砖块是否已经下落到底
function OutBottomRange(const aMatrixData:TMatrixData):boolean;
var
  i,t:integer;
begin
  result:=false;
  for i:=0 to 3 do
  begin
    if ((aMatrixData.aMatrix[i][1]+aMatrixData.yIndex)>=19)or
    (CellState[aMatrixData.aMatrix[i][1]+aMatrixData.yIndex+1][aMatrixData.aMatrix[i][0]+aMatrixData.xIndex]>=1) then
    begin
      result:=true;
      exit;
    end;
  end;
end;

//检查砖块石油已经移动到最右边
function OutRightRange(const aMatrixData:TMatrixData):boolean;
var
  i,j:integer;
begin
  result:=false;
  for i:=0 to 3 do
  begin
    if ((aMatrixData.aMatrix[i][0]+aMatrixData.xIndex)>=13)or
    (CellState[aMatrixData.aMatrix[i][1]+aMatrixData.yIndex][aMatrixData.aMatrix[i][0]+aMatrixData.xIndex+1]>=1) then
    begin
      result:=true;
      exit;
    end;
  end;
end;

//检查砖块是否已经移动到最左边
function OutLeftRange(const aMatrixData:TMatrixData):boolean;
var
  i,j:integer;
begin
  result:=false;
  for i:=0 to 3 do
  begin
    if ((aMatrixData.aMatrix[i][0]+aMatrixData.xIndex)<=0)or
    (CellState[aMatrixData.aMatrix[i][1]+aMatrixData.yIndex][aMatrixData.aMatrix[i][0]+aMatrixData.xIndex-1]>=1) then
    begin
      result:=true;
      exit;
    end;
  end;
end;

//画动态下落的砖块
procedure DrawMatrix(Canvas:TCanvas;const aMatrixData:TMatrixData);
var
  x,y,i:integer;
  aRect:TRect;
begin
  for i:=0 to 3 do
  begin
    x:=(aMatrixData.aMatrix[i][0]+aMatrixData.xIndex)*20;
    y:=(aMatrixData.aMatrix[i][1]+aMatrixData.yIndex)*20;
    aRect.Left:=x;
    aRect.Top:=y;
    aRect.Right:=x+20;
    aRect.Bottom:=y+20;
    Canvas.StretchDraw(aRect,gmForm.picBrick);
  end;
end;

//画下一个砖块,右上角的提示砖块
procedure DrawNextMatrix(Canvas:TCanvas;const aMatrixData:TMatrixData);
var
  x,y,i:integer;
  aRect:TRect;
begin
  for i:=0 to 3 do
  begin
    x:=(aMatrixData.aMatrix[i][0])*10;
    y:=(aMatrixData.aMatrix[i][1])*10;
    aRect.Left:=x+280;
    aRect.Top:=y;
    aRect.Right:=x+10+280;
    aRect.Bottom:=y+10;
    Canvas.StretchDraw(aRect,gmForm.picBrick);
  end;
end;

procedure SetMatrix(var DMatrixData:TMatrixData;const aflag:byte=0;x:integer=6;y:integer=0);
var
  i:integer;
begin
  for i:=0 to 3 do
    begin
      DMatrixData.aMatrix[i][0]:=MatrixData[aflag][i][0];
      DMatrixData.aMatrix[i][1]:=MatrixData[aflag][i][1];
    end;
  DMatrixData.xIndex:=x;
  DMatrixData.yIndex:=y;
  DMatrixData.flag:=aflag;
  DMatrixData.tag:=0;
end;
procedure SetMatrix2(var DMatrixData:TMatrixData;const index:byte=0;x:integer=6;y:integer=0);
var
  i:integer;
begin
  for i:=0 to 3 do
    begin
      DMatrixData.aMatrix[i][0]:=MatrixData[index][i][0];
      DMatrixData.aMatrix[i][1]:=MatrixData[index][i][1];
    end;
  DMatrixData.xIndex:=x;
  DMatrixData.yIndex:=y;
end;

//向下移动
function StepBottom(var DMatrixData:TMatrixData):boolean;
var
  i:integer;
begin
  result:=true;
  if not OutBottomRange(DMatrixData) then
  begin
//    DMatrixData.aMatrix[i][1]:=DMatrixData.aMatrix[i][1]+1;
    DMatrixData.yIndex:=DMatrixData.yIndex+1;
//    gmForm.Caption:=inttostr(dmatrixData.yIndex);
  end
  else
    result:=false;
end;

//向左移动
procedure StepLeft(var DMatrixData:TMatrixData);
var
  i:integer;
begin
  if not OutLeftRange(DMatrixData) then
  begin
    DMatrixData.xIndex:=DMatrixData.xIndex-1;
  end;
end;

//向右移动
procedure StepRight(var DMatrixData:TMatrixData);
var
  i:integer;
begin
  if not OutRightRange(DMatrixData) then
  begin
    DMatrixData.xIndex:=DMatrixData.xIndex+1;
  end;
end;

function OutLeft(const aMatrixData:TMatrixData):boolean;
var
  i,j:integer;
begin
  result:=false;
  for i:=0 to 3 do
  begin
    if ((aMatrixData.aMatrix[i][0]+aMatrixData.xIndex)<0)or
    (CellState[aMatrixData.aMatrix[i][1]+aMatrixData.yIndex][aMatrixData.aMatrix[i][0]+aMatrixData.xIndex]>=1) then
    begin
      result:=true;
      exit;
    end;
  end;
end;
function OutRight(const aMatrixData:TMatrixData):boolean;
var
  i,j:integer;
begin
  result:=false;
  for i:=0 to 3 do
  begin
    if ((aMatrixData.aMatrix[i][0]+aMatrixData.xIndex)>13)or
    (CellState[aMatrixData.aMatrix[i][1]+aMatrixData.yIndex][aMatrixData.aMatrix[i][0]+aMatrixData.xIndex]>=1) then
    begin
      result:=true;
      exit;
    end;
  end;
end;
function OutBottom(const aMatrixData:TMatrixData):boolean;
var
  i,t:integer;
begin
  result:=false;
  for i:=0 to 3 do
  begin
    if ((aMatrixData.aMatrix[i][1]+aMatrixData.yIndex)>19)or
    (CellState[aMatrixData.aMatrix[i][1]+aMatrixData.yIndex][aMatrixData.aMatrix[i][0]+aMatrixData.xIndex]>=1) then
    begin
      result:=true;
      exit;
    end;
  end;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -