📄 mydata.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 + -