Hallo leute,
ich bin leider gerade irgendwie am verzweifeln, wahrscheinlich an einem total blöden Fehler. Achtung schonmal... Es kommt ein relativ großes programm auf euch zu, falls ihr weiterlest.
Erstmal muss ich sagen, dass ich Informatik ziemlich hasse und morgen ein vollständiges Snakeprogramm abliefern muss.
Allerdings verzweifel ich quasi schon an den Grundlagen. Ich erwarte hier auch keine Hilfe. Mir ist klar, dass ich es selbst Schuld bin usw.
Also zum Thema:
Wir verwenden eine Unit Schlange, die den Typ TSchlange deklariert und die wichtigsten Funktionen enthält. Dequeue, Enqueue usw.
Im Hauptprogramm hab ich einen button, der die Schlange erstellen soll. Dieser verwendet die Funktionen aus der Unit Schlange.
Achja, ich verwende zur Darstellung ein Image-Objekt.
Allerdings erhalte ich immer eine Zugriffsverletzung, die auf die Funktion Enqueue verweist und ich habe keine Ahnung was das Problem ist.
Achtung: Wall of text...
Create button:
Alles anzeigen
Enqueue:
Alles anzeigen
Komplette Unit Schlange:
Alles anzeigen
Außerdem natürlich das Hauptprogramm:
Alles anzeigen
Danke schonmal.
ich bin leider gerade irgendwie am verzweifeln, wahrscheinlich an einem total blöden Fehler. Achtung schonmal... Es kommt ein relativ großes programm auf euch zu, falls ihr weiterlest.
Erstmal muss ich sagen, dass ich Informatik ziemlich hasse und morgen ein vollständiges Snakeprogramm abliefern muss.
Allerdings verzweifel ich quasi schon an den Grundlagen. Ich erwarte hier auch keine Hilfe. Mir ist klar, dass ich es selbst Schuld bin usw.
Also zum Thema:
Wir verwenden eine Unit Schlange, die den Typ TSchlange deklariert und die wichtigsten Funktionen enthält. Dequeue, Enqueue usw.
Im Hauptprogramm hab ich einen button, der die Schlange erstellen soll. Dieser verwendet die Funktionen aus der Unit Schlange.
Achja, ich verwende zur Darstellung ein Image-Objekt.
Allerdings erhalte ich immer eine Zugriffsverletzung, die auf die Funktion Enqueue verweist und ich habe keine Ahnung was das Problem ist.
Achtung: Wall of text...
Create button:
Quellcode
- procedure TForm1.btncreateClick(Sender: TObject);
- var
- element1:TElement;
- begin
- richtung:='R';
- Form1.Image1.Canvas.Brush.Color:=clWhite;
- Form1.Image1.Canvas.FillRect(Rect(0,0,600,450));
- Snake:=Createqueue;
- Element1.x:=4;
- Element1.y:=6;
- Snake:=Enqueue(Snake,Element1);
- ZeichneElement(Back(Snake),clBlue);
- Element1.x:=Element1.x+1;
- Snake:=Enqueue(Snake,Element1);
- ZeichneElement(Back(Snake),clBlue);
- Element1.x:=Element1.x+1;
- Snake:=Enqueue(Snake,Element1);
- ZeichneElement(Back(Snake),clBlue);
- Element1.x:=Element1.x+1;
- Snake:=Enqueue(Snake,Element1);
- ZeichneElement(Back(Snake),clBlue);
- end;
Enqueue:
Quellcode
- function Enqueue(schlange:TSchlange;element:TElement):TSchlange;
- var
- Knoten:TKnotenzeiger;
- begin
- New(Knoten);
- Knoten^.element:=element;
- if isEmpty(Schlange)=True then
- begin
- Schlange.kopf:=Knoten;
- Schlange.Fuss:=Knoten;
- Knoten.next:=NIL;
- result:=Schlange
- end
- else
- begin
- Schlange.Fuss.next:=Knoten; // Debugger verweist auf diese Zeile
- Schlange.Fuss.next.next:=NIL;
- Schlange.Fuss:=Knoten;
- result:=Schlange;
- end;
- end;
Komplette Unit Schlange:
Quellcode
- unit Schlange;
- interface
- type TElement = record
- x : integer;
- y : integer;
- end;
- TKnotenzeiger = ^TKnoten;
- TKnoten = record
- element : TElement;
- next : TKnotenzeiger;
- end;
- TSchlange = record
- kopf : TKnotenzeiger;
- Fuss : TKnotenzeiger;
- end;
- function CreateQueue : TSchlange;
- function Enqueue(schlange:TSchlange;element:TElement):TSchlange;
- function Dequeue(schlange:Tschlange):TSchlange;
- function Front(schlange:Tschlange):TElement;
- function Back(Schlange:Tschlange):Telement;
- function isEmpty(Schlange:Tschlange):boolean;
- var
- Snake:TSchlange;
- implementation
- function CreateQueue : TSchlange;
- begin
- Snake.Fuss:=NIL;
- Snake.Kopf:=NIL;
- end;
- function Enqueue(schlange:TSchlange;element:TElement):TSchlange;
- var
- Knoten:TKnotenzeiger;
- begin
- New(Knoten);
- Knoten^.element:=element;
- if isEmpty(Schlange)=True then
- begin
- Schlange.kopf:=Knoten;
- Schlange.Fuss:=Knoten;
- Knoten.next:=NIL;
- result:=Schlange
- end
- else
- begin
- Schlange.Fuss.next:=Knoten;
- Schlange.Fuss.next.next:=NIL;
- Schlange.Fuss:=Knoten;
- result:=Schlange;
- end;
- end;
- function Dequeue(schlange:Tschlange):TSchlange;
- var
- zeiger:TKnotenzeiger;
- begin
- if Schlange.kopf=NIL then
- result:=Schlange
- else if Schlange.kopf=Schlange.Fuss then
- begin
- dispose(Schlange.kopf);
- Schlange.kopf:=NIL;
- Schlange.Fuss:=NIL;
- result:=Schlange;
- end
- else
- begin
- zeiger:=Schlange.kopf;
- Schlange.kopf:=Schlange.kopf.next;
- dispose(zeiger);
- result:=Schlange;
- end;
- end;
- function Front(schlange:Tschlange):TElement;
- begin
- if isEmpty(Schlange)=True then
- begin
- result.x:=-1;
- result.y:=-1;
- end
- else
- result:=Schlange.kopf.element;
- end;
- function Back(Schlange:Tschlange):Telement;
- begin
- if isEmpty(Schlange)=True then
- begin
- result.x:=-1;
- result.y:=-1;
- end
- else
- result:=Schlange.Fuss.element;
- end;
- function isEmpty(Schlange:Tschlange):boolean;
- begin
- if Schlange.kopf=NIL then
- result:=True
- else
- result:=false;
- end;
- end.
Außerdem natürlich das Hauptprogramm:
Quellcode
- unit Unit1;
- interface
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, Schlange, StdCtrls, ExtCtrls;
- type
- TForm1 = class(TForm)
- Image1: TImage;
- btncreate: TButton;
- btnadd: TButton;
- btndelete: TButton;
- btnschritt: TButton;
- Timer1: TTimer;
- btngo: TButton;
- procedure btncreateClick(Sender: TObject);
- procedure btnaddClick(Sender: TObject);
- procedure btndeleteClick(Sender: TObject);
- procedure btnschrittClick(Sender: TObject);
- procedure Timer1Timer(Sender: TObject);
- procedure btngoClick(Sender: TObject);
- procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
- private
- { Private-Deklarationen }
- public
- { Public-Deklarationen }
- end;
- var
- Form1: TForm1;
- Snake:TSchlange;
- richtung:char;
- procedure ZeichneElement(Element: TElement;farbe:Tcolor);
- implementation
- procedure ZeichneElement(Element: TElement;farbe:Tcolor);
- begin
- Form1.Image1.Canvas.Brush.Color:=farbe;
- Form1.Image1.Canvas.FillRect(Rect(element.x*15,element.y*15,element.x*15+15,element.y*15+15));
- end;
- {$R *.dfm}
- procedure TForm1.btncreateClick(Sender: TObject);
- var
- element1:TElement;
- begin
- richtung:='R';
- Form1.Image1.Canvas.Brush.Color:=clWhite;
- Form1.Image1.Canvas.FillRect(Rect(0,0,600,450));
- Snake:=Createqueue;
- Element1.x:=4;
- Element1.y:=6;
- Snake:=Enqueue(Snake,Element1);
- ZeichneElement(Back(Snake),clBlue);
- Element1.x:=Element1.x+1;
- Snake:=Enqueue(Snake,Element1);
- ZeichneElement(Back(Snake),clBlue);
- Element1.x:=Element1.x+1;
- Snake:=Enqueue(Snake,Element1);
- ZeichneElement(Back(Snake),clBlue);
- Element1.x:=Element1.x+1;
- Snake:=Enqueue(Snake,Element1);
- ZeichneElement(Back(Snake),clBlue);
- end;
- procedure TForm1.btnaddClick(Sender: TObject);
- var
- ele:TElement;
- begin
- if richtung='R' then
- begin
- ele.x:=((Back(Snake).x)+1);
- ele.y:=(Back(Snake).y);
- Snake:=Enqueue(Snake,ele);
- ZeichneElement(Back(Snake),clBlue);
- end
- else if richtung='L' then
- begin
- ele.x:=((Back(Snake).x)-1);
- ele.y:=(Back(Snake).y);
- Snake:=Enqueue(Snake,ele);
- ZeichneElement(Back(Snake),clBlue);
- end
- else if richtung='U' then
- begin
- ele.x:=((Back(Snake).x));
- ele.y:=(Back(Snake).y+1);
- Snake:=Enqueue(Snake,ele);
- ZeichneElement(Back(Snake),clBlue);
- end
- else if richtung='H' then
- begin
- ele.x:=((Back(Snake).x));
- ele.y:=(Back(Snake).y-1);
- Snake:=Enqueue(Snake,ele);
- ZeichneElement(Back(Snake),clBlue);
- end
- end;
- procedure TForm1.btndeleteClick(Sender: TObject);
- begin
- Zeichneelement(Front(Snake),clWhite);
- Snake:=DeQueue(Snake);
- end;
- procedure TForm1.btnschrittClick(Sender: TObject);
- begin
- Btnadd.Click;
- Btndelete.click;
- end;
- procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
- Shift: TShiftState);
- begin
- if key=37 then
- richtung:='L'
- else if key=39 then
- richtung:='R'
- else if key=40 then
- richtung:='U'
- else if key=38 then
- richtung:='H';
- end;
- procedure TForm1.btngoClick(Sender: TObject);
- begin
- Timer1.Enabled:=TRUE;
- btncreate.Enabled:=False;
- btnadd.Enabled:=False;
- btndelete.Enabled:=False;
- btnschritt.Enabled:=False;
- btngo.Enabled:=false;
- end;
- procedure TForm1.Timer1Timer(Sender: TObject);
- begin
- Btnschritt.click;
- end;
- end.
Danke schonmal.