我有一份学校作业,需要用Delphi制作像Nokia游戏中的贪吃蛇游戏。我想知道哪种解决方案最好。我想让我的贪吃蛇成为一个类(class),身体是一个点的数组(父类)或点的链表。哪个更好? 数组还是链表?
我有一份学校作业,需要用Delphi制作像Nokia游戏中的贪吃蛇游戏。我想知道哪种解决方案最好。我想让我的贪吃蛇成为一个类(class),身体是一个点的数组(父类)或点的链表。哪个更好? 数组还是链表?
在Delphi中,我会使用Contnrs单元定义的TQueue。您可以将新坐标(蛇头)“push”到其中,当达到最大蛇大小时,只需调用“pop”即可释放蛇尾。
lp := new(PPoint);
lp^.X := x;
lp^.X := y;
Body.Push(lp);
if Body.count > iSnakeLength then
Dispose(Body.Pop); // Free the last TCoord that is pop'ed.
接下来,你需要做的就是绘制TObjectQueue中的内容。要访问TQueue的列表,你需要暴露List属性...为了实现这一点,只需像这样定义你的蛇身类;
TSnakeBody = class(TObjectQueue)
public
property List; //Expose the list
end;
New
的语法是否有效。 - Rob Kennedy我有一个非常老的TurboPascal贪吃蛇程序。它使用一个数组来表示蛇的身体。
const MaxBodyLength = 100;
type
TSnake = record
Dir : (nord,sud,est,oest);
Head : tpoint;
BodyLength : integer;
Body : array[1..MaxBodyLength] of tPoint;
Tail : tpoint;
end;
var
Snake : TSnake;
Fruit : tPoint;
以及移动蛇的代码...
procedure Slither;
var i : integer;
npos,lpos : tPoint;
hasEaten:boolean;
begin
npos:=Snake.Head;
lpos:=Snake.Tail;
case Snake.dir of
East : inc(npos.x);
West : dec(npos.x);
South : inc(npos.y);
North : dec(npos.y);
end;
hasEaten:=(npos.x=fruit.x) and (npos.y=fruit.y);
if hasEaten then
inc(Snake.BodyLength)
else
Snake.Tail:=Snake.Body[Snake.BodyLength];
for i:=Snake.BodyLength downto 2 do
Snake.Body[i]:=Snake.Body[i-1];
Snake.Body[1]:=Snake.Head;
if not hasEaten then
Snake.Head:=npos;
writeP(idHead,Snake.Head);
writeP(idBody,Snake.Body[1]);
if not hasEaten then
begin
writeP(idTail,Snake.Tail);
writeP(idResidual,lPos);
end;
if hasEaten then
NewFruit;
end;