Snake Programm ( Delphi )

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Snake Programm ( Delphi )

      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:


      Quellcode

      1. procedure TForm1.btncreateClick(Sender: TObject);
      2. var
      3. element1:TElement;
      4. begin
      5. richtung:='R';
      6. Form1.Image1.Canvas.Brush.Color:=clWhite;
      7. Form1.Image1.Canvas.FillRect(Rect(0,0,600,450));
      8. Snake:=Createqueue;
      9. Element1.x:=4;
      10. Element1.y:=6;
      11. Snake:=Enqueue(Snake,Element1);
      12. ZeichneElement(Back(Snake),clBlue);
      13. Element1.x:=Element1.x+1;
      14. Snake:=Enqueue(Snake,Element1);
      15. ZeichneElement(Back(Snake),clBlue);
      16. Element1.x:=Element1.x+1;
      17. Snake:=Enqueue(Snake,Element1);
      18. ZeichneElement(Back(Snake),clBlue);
      19. Element1.x:=Element1.x+1;
      20. Snake:=Enqueue(Snake,Element1);
      21. ZeichneElement(Back(Snake),clBlue);
      22. end;
      Alles anzeigen


      Enqueue:

      Quellcode

      1. function Enqueue(schlange:TSchlange;element:TElement):TSchlange;
      2. var
      3. Knoten:TKnotenzeiger;
      4. begin
      5. New(Knoten);
      6. Knoten^.element:=element;
      7. if isEmpty(Schlange)=True then
      8. begin
      9. Schlange.kopf:=Knoten;
      10. Schlange.Fuss:=Knoten;
      11. Knoten.next:=NIL;
      12. result:=Schlange
      13. end
      14. else
      15. begin
      16. Schlange.Fuss.next:=Knoten; // Debugger verweist auf diese Zeile
      17. Schlange.Fuss.next.next:=NIL;
      18. Schlange.Fuss:=Knoten;
      19. result:=Schlange;
      20. end;
      21. end;
      Alles anzeigen


      Komplette Unit Schlange:

      Quellcode

      1. unit Schlange;
      2. interface
      3. type TElement = record
      4. x : integer;
      5. y : integer;
      6. end;
      7. TKnotenzeiger = ^TKnoten;
      8. TKnoten = record
      9. element : TElement;
      10. next : TKnotenzeiger;
      11. end;
      12. TSchlange = record
      13. kopf : TKnotenzeiger;
      14. Fuss : TKnotenzeiger;
      15. end;
      16. function CreateQueue : TSchlange;
      17. function Enqueue(schlange:TSchlange;element:TElement):TSchlange;
      18. function Dequeue(schlange:Tschlange):TSchlange;
      19. function Front(schlange:Tschlange):TElement;
      20. function Back(Schlange:Tschlange):Telement;
      21. function isEmpty(Schlange:Tschlange):boolean;
      22. var
      23. Snake:TSchlange;
      24. implementation
      25. function CreateQueue : TSchlange;
      26. begin
      27. Snake.Fuss:=NIL;
      28. Snake.Kopf:=NIL;
      29. end;
      30. function Enqueue(schlange:TSchlange;element:TElement):TSchlange;
      31. var
      32. Knoten:TKnotenzeiger;
      33. begin
      34. New(Knoten);
      35. Knoten^.element:=element;
      36. if isEmpty(Schlange)=True then
      37. begin
      38. Schlange.kopf:=Knoten;
      39. Schlange.Fuss:=Knoten;
      40. Knoten.next:=NIL;
      41. result:=Schlange
      42. end
      43. else
      44. begin
      45. Schlange.Fuss.next:=Knoten;
      46. Schlange.Fuss.next.next:=NIL;
      47. Schlange.Fuss:=Knoten;
      48. result:=Schlange;
      49. end;
      50. end;
      51. function Dequeue(schlange:Tschlange):TSchlange;
      52. var
      53. zeiger:TKnotenzeiger;
      54. begin
      55. if Schlange.kopf=NIL then
      56. result:=Schlange
      57. else if Schlange.kopf=Schlange.Fuss then
      58. begin
      59. dispose(Schlange.kopf);
      60. Schlange.kopf:=NIL;
      61. Schlange.Fuss:=NIL;
      62. result:=Schlange;
      63. end
      64. else
      65. begin
      66. zeiger:=Schlange.kopf;
      67. Schlange.kopf:=Schlange.kopf.next;
      68. dispose(zeiger);
      69. result:=Schlange;
      70. end;
      71. end;
      72. function Front(schlange:Tschlange):TElement;
      73. begin
      74. if isEmpty(Schlange)=True then
      75. begin
      76. result.x:=-1;
      77. result.y:=-1;
      78. end
      79. else
      80. result:=Schlange.kopf.element;
      81. end;
      82. function Back(Schlange:Tschlange):Telement;
      83. begin
      84. if isEmpty(Schlange)=True then
      85. begin
      86. result.x:=-1;
      87. result.y:=-1;
      88. end
      89. else
      90. result:=Schlange.Fuss.element;
      91. end;
      92. function isEmpty(Schlange:Tschlange):boolean;
      93. begin
      94. if Schlange.kopf=NIL then
      95. result:=True
      96. else
      97. result:=false;
      98. end;
      99. end.
      Alles anzeigen



      Außerdem natürlich das Hauptprogramm:

      Quellcode

      1. unit Unit1;
      2. interface
      3. uses
      4. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      5. Dialogs, Schlange, StdCtrls, ExtCtrls;
      6. type
      7. TForm1 = class(TForm)
      8. Image1: TImage;
      9. btncreate: TButton;
      10. btnadd: TButton;
      11. btndelete: TButton;
      12. btnschritt: TButton;
      13. Timer1: TTimer;
      14. btngo: TButton;
      15. procedure btncreateClick(Sender: TObject);
      16. procedure btnaddClick(Sender: TObject);
      17. procedure btndeleteClick(Sender: TObject);
      18. procedure btnschrittClick(Sender: TObject);
      19. procedure Timer1Timer(Sender: TObject);
      20. procedure btngoClick(Sender: TObject);
      21. procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
      22. private
      23. { Private-Deklarationen }
      24. public
      25. { Public-Deklarationen }
      26. end;
      27. var
      28. Form1: TForm1;
      29. Snake:TSchlange;
      30. richtung:char;
      31. procedure ZeichneElement(Element: TElement;farbe:Tcolor);
      32. implementation
      33. procedure ZeichneElement(Element: TElement;farbe:Tcolor);
      34. begin
      35. Form1.Image1.Canvas.Brush.Color:=farbe;
      36. Form1.Image1.Canvas.FillRect(Rect(element.x*15,element.y*15,element.x*15+15,element.y*15+15));
      37. end;
      38. {$R *.dfm}
      39. procedure TForm1.btncreateClick(Sender: TObject);
      40. var
      41. element1:TElement;
      42. begin
      43. richtung:='R';
      44. Form1.Image1.Canvas.Brush.Color:=clWhite;
      45. Form1.Image1.Canvas.FillRect(Rect(0,0,600,450));
      46. Snake:=Createqueue;
      47. Element1.x:=4;
      48. Element1.y:=6;
      49. Snake:=Enqueue(Snake,Element1);
      50. ZeichneElement(Back(Snake),clBlue);
      51. Element1.x:=Element1.x+1;
      52. Snake:=Enqueue(Snake,Element1);
      53. ZeichneElement(Back(Snake),clBlue);
      54. Element1.x:=Element1.x+1;
      55. Snake:=Enqueue(Snake,Element1);
      56. ZeichneElement(Back(Snake),clBlue);
      57. Element1.x:=Element1.x+1;
      58. Snake:=Enqueue(Snake,Element1);
      59. ZeichneElement(Back(Snake),clBlue);
      60. end;
      61. procedure TForm1.btnaddClick(Sender: TObject);
      62. var
      63. ele:TElement;
      64. begin
      65. if richtung='R' then
      66. begin
      67. ele.x:=((Back(Snake).x)+1);
      68. ele.y:=(Back(Snake).y);
      69. Snake:=Enqueue(Snake,ele);
      70. ZeichneElement(Back(Snake),clBlue);
      71. end
      72. else if richtung='L' then
      73. begin
      74. ele.x:=((Back(Snake).x)-1);
      75. ele.y:=(Back(Snake).y);
      76. Snake:=Enqueue(Snake,ele);
      77. ZeichneElement(Back(Snake),clBlue);
      78. end
      79. else if richtung='U' then
      80. begin
      81. ele.x:=((Back(Snake).x));
      82. ele.y:=(Back(Snake).y+1);
      83. Snake:=Enqueue(Snake,ele);
      84. ZeichneElement(Back(Snake),clBlue);
      85. end
      86. else if richtung='H' then
      87. begin
      88. ele.x:=((Back(Snake).x));
      89. ele.y:=(Back(Snake).y-1);
      90. Snake:=Enqueue(Snake,ele);
      91. ZeichneElement(Back(Snake),clBlue);
      92. end
      93. end;
      94. procedure TForm1.btndeleteClick(Sender: TObject);
      95. begin
      96. Zeichneelement(Front(Snake),clWhite);
      97. Snake:=DeQueue(Snake);
      98. end;
      99. procedure TForm1.btnschrittClick(Sender: TObject);
      100. begin
      101. Btnadd.Click;
      102. Btndelete.click;
      103. end;
      104. procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
      105. Shift: TShiftState);
      106. begin
      107. if key=37 then
      108. richtung:='L'
      109. else if key=39 then
      110. richtung:='R'
      111. else if key=40 then
      112. richtung:='U'
      113. else if key=38 then
      114. richtung:='H';
      115. end;
      116. procedure TForm1.btngoClick(Sender: TObject);
      117. begin
      118. Timer1.Enabled:=TRUE;
      119. btncreate.Enabled:=False;
      120. btnadd.Enabled:=False;
      121. btndelete.Enabled:=False;
      122. btnschritt.Enabled:=False;
      123. btngo.Enabled:=false;
      124. end;
      125. procedure TForm1.Timer1Timer(Sender: TObject);
      126. begin
      127. Btnschritt.click;
      128. end;
      129. end.
      Alles anzeigen



      Danke schonmal.
    • Zum einfacher Helfen: Bitte mach korrekte Indents. Und tu den ganzen Code per filebin oder pastebin aufs Netz - sonst etwas viel c/p.

      Wir haben 100 Hacker und Hacksen gefragt: "Was die schrecklichste Programmiersprache, in der du je programmiert hast?"
      1. Java
      2. PHP
      3. Visual Basic
      4. BASIC
    • hab das ma gemacht gehabt is aber schon etwas her, kann sein das es kompletter schwachsinn ist aber muss in zeiel 12 von enque nicht ein ; hin?
      Take your time, don't live too fast. Troubles will come and they will pass.
    • Quellcode

      1. Schlange.Fuss.next:=Knoten; // Debugger verweist auf diese Zeile
      2. Schlange.Fuss.next.next:=NIL;
      3. Schlange.Fuss:=Knoten;

      immer einen schritt nach dem anderen, beim überspringen kommt es eben zu diesem Zugriffsfehler
      mögliche wäre:

      Quellcode

      1. Schlange.Fuss:=Knoten;
      2. Schlange.Fuss.next:=NIL;

      oder

      Quellcode

      1. Schlange.Fuss:=Knoten;
      2. Schlange.Fuss.next:=Knoten;
      3. Schlange.Fuss.next.next:=NIL;

      und so weiter. du hast den ersten schritt zwar dadrunter gesetzt, aber sogar programmierprogramme mach all das, was im code steht, nacheinander. die reihenfolge ist entscheidend.