ubuntuusers.de

Lazarus Programmierung "Snake"

Status: Gelöst | Ubuntu-Version: Ubuntu 13.10 (Saucy Salamander)
Antworten |

MOEXX

Anmeldungsdatum:
26. April 2013

Beiträge: Zähle...

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.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17621

Wohnort: Berlin

Und so sähe es, formatiert als pascal, aus:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
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.

Wömöglich führte die Markierung zu Fehlern. Bitte "Hilfe zur Syntax" in der Editbox anklicken, besuchen und lesen.

MOEXX

(Themenstarter)

Anmeldungsdatum:
26. April 2013

Beiträge: 27

Hallo Leute,

ich habe mal in den Code-Browser bei den LCL-Types und LCLStrConts reingeschaut. Dort waren die VK-Konstanten aufgeführt. Bei mir funktionierten die LCL-Types. Habe also einfach anstatt VK_UP die entsprechende Zahl (38) eingetragen und siehe da, es funktioniert.

Vielen Dank für deine Hilf user unknown

MFG

MOEXX

Antworten |