Hallo Leute,
ich probiere gerade ein Tutorial für die Programmierung von "Snake" aus. Diese Tutorial ist zwar für Delphi geschrieben, aber mein Problem liegt nicht an einer falschen Übersetzung.
folgender Code:
unit Unit1;
interface
uses Messages, Variants, Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls;
type TSnake = class(TObject) private // private Deklarationen rTeile : array [0..40*30-1] of TPoint; rAnzahlTeile : Word; rCanvas : TCanvas; rRichtung: Byte;
function LiesTeil ( Index : Word) : TPoint; procedure AendereRichtung ( NeueRichtung : byte);
public // öffentliche Deklarationen property Teile [Index : Word] : Tpoint read LiesTeil; property AnzahlTeile : Word read rAnzahlTeile; property Canvas : TCanvas read rCanvas write rCanvas; property Richtung : byte read rRichtung write AendereRichtung;
procedure Init(); procedure Render(); procedure Update(); end;
{ TForm1 }
TForm1 = class(TForm) Timer1: TTimer; procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var CloseAction: TCloseAction); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure Timer1Timer(Sender: TObject); private { private declarations } Schlange : TSnake; public { public declarations } end;
var Form1: TForm1;
implementation
{$mode objfpc}{$H+}
{ TForm1 }
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction); begin Schlange.Free; end;
procedure TForm1.FormCreate(Sender: TObject); begin Schlange := TSnake.Create; Schlange.Canvas := Self.Canvas; Schlange.Init();
Self.DoubleBuffered := true; end;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState ); begin if Key = VK_UP then Schlange.Richtung := 0; if Key = VK_DOWN then Schlange.Richtung := 1; if Key = VK_LEFT then Schlange.Richtung := 2; if Key = VK_RIGHT then Schlange.Richtung := 3; end;
procedure TForm1.Timer1Timer(Sender: TObject); begin self.Canvas.Pen.color := clWhite; self.Canvas.Brush.Color := clWhite;
self.Canvas.Rectangle ( 0, 0, clientwidth, clientheight); Schlange.Update(); Schlange.Render(); end;
{$R *.lfm}
{ –- Snake Bereich –- } function TSnake.LiesTeil ( Index : Word ) : TPoint; begin result := rTeile[ Index ]; end;
procedure TSnake.Init(); begin rAnzahlTeile := 2;
rTeile [0] := Point ( 2, 0 ); rTeile [1] := Point ( 1, 0 ); rTeile [2] := Point ( 0, 0 );
rRichtung := 3; end;
procedure TSnake.Render(); var Index : Word; StartX, StartY : Integer; EndeX, EndeY : Integer; begin rCanvas.Pen.Color := clGreen; rCanvas.Brush.Color := clGreen;
For Index := 0 to rAnzahlTeile do begin StartX := rTeile[Index].X * 16; EndeX := rTeile[Index].X * 16 + 16; StartY := rTeile[Index].Y * 16; EndeY := rTeile[Index].Y * 16 + 16;
rCanvas.Ellipse( StartX, StartY, EndeX, EndeY ); end; end;
procedure TSnake.Update (); var Index : Word; begin for Index := rAnzahlTeile downto 1 do begin rTeile[Index ] := rTeile[Index-1]; end;
case rRichtung of 0: begin // Hoch rTeile[0].Y := rTeile[0].Y - 1; end; 1: begin // Runter rTeile[0].Y := rTeile[0].Y + 1 ; end; 2: begin // Links rTeile[0].X := rTeile[0].X - 1; end; 3: begin // Rechts rTeile[0].X := rTeile[0].X + 1; end; end; end;
procedure TSnake.AendereRichtung ( NeueRichtung : Byte); begin case rRichtung of 0, 1: begin if NeueRichtung = 0 then exit; if NeueRichtung = 1 then exit; end;
2, 3: begin if NeueRichtung = 2 then exit; if NeueRichtung = 3 then exit; end; end;
rRichtung := NeueRichtung; end;
{ –- Fenster Bereich –- }
end.
_
Das Problem sind die markierten Stellen, die laut Nachrichtenfenster unbekannt sind. Als Windows-Version funktionert dieser Code, unter Ubuntu nicht.
Hat jemand eine Idee.