Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Snake für die Schule programmieren,Pause;Highscoures einbaun (https://www.delphipraxis.net/71770-snake-fuer-die-schule-programmieren-pause%3Bhighscoures-einbaun.html)

DGL-luke 26. Jun 2006 21:10

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
Meine Glaskugel ist vor kurzem kaputtgegangen... könntest du bitte ein bisschen code posten?

MarkusUhl 26. Jun 2006 21:13

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
Delphi-Quellcode:
procedure TForm1.BLinksKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
case Key of
  VK_LEFT: Form1.BLinksClick (Sender: TObjcect);
end;
hier da kommt dann dass ich hinter Sender ne ) setzten soll... Mach ich das kommt, es nicht hier nicht anwendbar

DGL-luke 26. Jun 2006 21:33

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
also ersma lassen ma das Form1 weg, wenn dann kommt da n self hin. selbiges beim sender. Ich habs doch schon groß hingeschrieben:

Delphi-Quellcode:
Schlange_Links(self); //SELF steht da!

Mavarik 27. Jun 2006 07:29

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
Zitat:

Zitat von MarkusUhl
Delphi-Quellcode:
 VK_LEFT: Form1.BLinksClick (Sender: TObjcect);
end;

Das ist doch ein Aufruf und nicht eine Deklaration...

Also lösch das ":TObject"

Frank

EDatabaseError 27. Jun 2006 07:35

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
bring ihn nicht durcheinander.

That is what you need:
Delphi-Quellcode:
procedure TForm1.BLinksKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
case Key of
  VK_LEFT: BLinksClick(self);
end;

Mfg
ede

Mavarik 27. Jun 2006 07:53

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
Zitat:

Zitat von DGL-luke
Delphi-Quellcode:
while not bClose do
  begin
    Application.ProcessMessages; //wenn du mit der VCL und mit Stuerelementen arbeiten willst, musst du hier die WIndows-Nachrichten überprüfen
    if GetAsyncKeyState(VK_LEFT) < 0 then //sollte man natürlich in eine Prozedur / Funktion auslagern
      ....
    Render; //Frame malen
  end;

Aber doch nicht bei einem einfachen - nennen wir es mal Timer-Programm.... Dein Beispiel sieht eher nach einem DirectX Ansatz aus... :wink:

btw: Der onKey* ist für derartige Programme auf keinen Fall zu langsamm....

Frank :coder:

DGL-luke 27. Jun 2006 13:56

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
Klar Mavarik, ich wollte ja ein wenig Hintergrundwissen vermitteln ^^

MarkusUhl 27. Jun 2006 18:13

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
Zitat:

Zitat von EDatabaseError
bring ihn nicht durcheinander.

That is what you need:
Delphi-Quellcode:
procedure TForm1.BLinksKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
case Key of
  VK_LEFT: BLinksClick(self);
end;

Mfg
ede

So hab ich es gemacht, kommt keine Fehlermelgung funzt aber nicht. Muss ich noch was ändern. Hab bei Form1 im OI Key Preview aktiviert. Was muss ich noch ändern? Danke euch!

MarkusUhl 27. Jun 2006 18:16

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
Achja musst noch ein end; einfügen. Sieht jetzt komisch aus, sonst funzt es aber net...

Kopier mal alles hier rein:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

const
  farben: Array [0..2] of TColor=(clWhite, clLime, clRed);
  stufen: Array [0..2] of Cardinal=(200, 100, 50);
  raster = 7;
  breite = 65;
  hoehe = 45;
  Langsam = 250;
  Mittel = 100;
  Schnell = 50;

type
  TForm1 = class(TForm)
    Spielfeld: TPaintBox;
    Timer1: TTimer;
    BStart: TButton;
    BOben: TButton;
    BLinks: TButton;
    BRechts: TButton;
    BUnten: TButton;
    PEnde: TButton;
    BPause: TButton;
    BWeiter: TButton;
    PLeicht: TButton;
    PSchwer: TButton;
    PMittel: TButton;
    Label1: TLabel;
    Label2: TLabel;
    procedure BStartClick(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure BObenClick(Sender: TObject);
    procedure BLinksClick(Sender: TObject);
    procedure BRechtsClick(Sender: TObject);
    procedure BUntenClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure PEndeClick(Sender: TObject);
    procedure BPauseClick(Sender: TObject);
    procedure BWeiterClick(Sender: TObject);
    procedure PLeichtClick(Sender: TObject);
    procedure PMittelClick(Sender: TObject);
    procedure PSchwerClick(Sender: TObject);
    procedure BRechtsKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private-Deklarationen }
    map: Array [0..breite] of Array [0..hoehe] of Integer;
    kopf,
    richtung,
    punkt: TPoint;
    punkte: Integer;
    laenge: Integer;
    ende,
    rand,
    gebissen: Boolean;
    procedure enable_buttons(status: Boolean);
    procedure spiel_ende;
    procedure neuer_punkt;
    procedure paint_map;
    procedure calc_snake;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
implementation

{$R *.dfm}

procedure TForm1.enable_buttons(status: Boolean);
begin
  BOben.Enabled := status;
  BRechts.Enabled := status;
  BLinks.Enabled := status;
  BUnten.Enabled := status;
  BPause.Enabled := status;
  BWeiter.Enabled := status;
  PLeicht.Enabled := status;
  PMittel.Enabled := status;
  PSchwer.Enabled := status;
end;

procedure TForm1.spiel_ende;
begin
  ende := True;
  Timer1.Enabled := False;
  BPause.Enabled:=False;
  BWeiter.Enabled:=False;
  PLeicht.Enabled:=False;
  PMittel.Enabled:=False;
  PSchwer.Enabled:=False;
  enable_buttons(False);
  BStart.Enabled := True;

end;

procedure TForm1.neuer_punkt;
begin
  punkt := Point(Random(breite), Random(hoehe));
  while map[punkt.X, punkt.Y]<>0 do
    punkt := Point(Random(breite), Random(hoehe));
  map[punkt.X,punkt.Y] := -1;
end;

procedure TForm1.paint_map;
var
  i, j: Integer;
  color: TColor;
begin
  for i := 0 to breite do
    for j := 0 to hoehe do
    begin
      case map[i, j] of
        -1: color := farben[1];
         0: color := farben[0];
      else
        color := farben[2];
      end;
      Spielfeld.Canvas.Brush.Color:=color;
      Spielfeld.Canvas.FillRect(Rect(i*raster, j*raster, (i+1)*raster, (j+1)*raster));
    end;
end;

procedure TForm1.calc_snake;
var
  i, j: Integer;
begin
  for i := 0 to breite do
    for j := 0 to hoehe do
      if map[i, j]>0 then
        Dec(map[i, j]);
  Inc(kopf.X, richtung.X);
  Inc(kopf.Y, richtung.Y);
  if (kopf.X<0) or (kopf.X>breite) or (kopf.Y<0) or (kopf.Y>hoehe) then
  begin
    spiel_ende;
    ShowMessage('Nicht den Rand berühen!');
    ShowMessage('Du hast '+IntToStr(punkte)+' Punkte erreicht')
  end;
  if (map[kopf.X, kopf.Y]>0) and (not ende) then
  begin
    spiel_ende;
    ShowMessage('Nicht in den Schwanz beißen!');
    ShowMessage('Du hast '+IntToStr(punkte)+' Punkte erreicht')
  end;
  if (kopf.X=punkt.X) and (kopf.Y=punkt.Y) then
  begin
    Inc(laenge);
    neuer_punkt;
    if Timer1.Interval = Langsam then
  Punkte := Punkte + 3
else
if Timer1.Interval = Mittel then
  Punkte := Punkte + 8
else
if Timer1.Interval = Schnell then
  Punkte := Punkte + 12;
  end;
  map[kopf.X, kopf.Y] := laenge;

Label2.Caption := 'Aktueller Punktestand: ' + IntToStr(Punkte);
end;

procedure TForm1.BStartClick(Sender: TObject);
var
  i, j: Integer;
begin
  punkte:=0;
  BStart.Enabled := False;
  for i:=0 to breite do
    for j:=0 to hoehe do
      map[i, j] := 0;
  kopf := Point(1, 1);
  laenge := 5;
  richtung := Point(0, 1);
  map[kopf.X, kopf.Y] := laenge;
  neuer_punkt;
  paint_map;
  enable_buttons(True);
  ende := False;
  Timer1.Enabled := true;
  Timer1.Interval := Mittel;
Form1.PLeicht.Visible:=false;
Form1.PMittel.Visible:=false;
Form1.PSchwer.Visible:=true;
Form1.BOben.Visible:=true;
Form1.BLinks.Visible:=true;
Form1.BRechts.Visible:=true;
Form1.BUnten.Visible:=true;
Form1.BPause.Visible:=true;
Form1.BWeiter.Visible:=false;
Form1.Label1.Visible:=true;


end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  calc_snake;
  if not ende then
    paint_map;
end;

procedure TForm1.BObenClick(Sender: TObject);
begin
  if richtung.Y=0 then
    richtung := Point(0, -1);
end;

procedure TForm1.BLinksClick(Sender: TObject);
begin
  if richtung.X=0 then
    richtung := Point(-1, 0);
end;

procedure TForm1.BRechtsClick(Sender: TObject);
begin
  if richtung.X=0 then
    richtung := Point(1, 0);
end;

procedure TForm1.BUntenClick(Sender: TObject);
begin
  if richtung.Y=0 then
    richtung := Point(0, 1);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Randomize;
end;

procedure TForm1.PEndeClick(Sender: TObject);
begin
halt;
end;

procedure TForm1.BPauseClick(Sender: TObject);
begin
Timer1.Enabled := False;
Form1.BPause.Visible:=false;
Form1.BWeiter.Visible:=true;
PLeicht.Enabled:=False;
PMittel.Enabled:=False;
PSchwer.Enabled:=False;
BOben.Enabled:=False;
BLinks.Enabled:=False;
BRechts.Enabled:=False;
BUnten.Enabled:=False;



end;

procedure TForm1.BWeiterClick(Sender: TObject);
begin
Timer1.Enabled := True;
Form1.BPause.Visible:=true;
Form1.BWeiter.Visible:=false;
PLeicht.Enabled:=true;
PMittel.Enabled:=true;
PSchwer.Enabled:=true;
BOben.Enabled:=true;
BLinks.Enabled:=true;
BRechts.Enabled:=true;
BUnten.Enabled:=true;
end;

procedure TForm1.PLeichtClick(Sender: TObject);
begin
Timer1.Interval := Langsam;
calc_snake;
  if not ende then
    paint_map;
Form1.PLeicht.Visible:=false;
Form1.PMittel.Visible:=true;
Form1.PSchwer.Visible:=false;
end;

procedure TForm1.PMittelClick(Sender: TObject);
begin
Timer1.Interval := Mittel;
calc_snake;
  if not ende then
    paint_map;
Form1.PLeicht.Visible:=false;
Form1.PMittel.Visible:=false;
Form1.PSchwer.Visible:=true;
end;

procedure TForm1.PSchwerClick(Sender: TObject);
begin
Timer1.Interval := Schnell;
calc_snake;
  if not ende then
    paint_map;
Form1.PLeicht.Visible:=true;
Form1.PMittel.Visible:=false;
Form1.PSchwer.Visible:=false;
end;

procedure TForm1.BRechtsKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
case Key of
  VK_RIGHT: BRechtsClick(self);
end;
end;
end.
Danke euch

Mavarik 27. Jun 2006 18:50

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
Wenn Du Code innerhalb einer Procedure schreibst die

Procedure TForm1.Wasauchimmer;

heisst....

brauchst Du nicht vor alle Variablen Form1. zu schreiben...

Frank

MarkusUhl 27. Jun 2006 18:52

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
Sry das habe ich sogelernt. Dumm ist nur, dass die Steuerung per Pfeiltasten immer noch net funzt. Warum?

Mavarik 27. Jun 2006 18:53

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
Ach und warum eine Paintbox....?

Da musst Du ja immer das ganze Feld neu "malen"?

Frank :coder:

MarkusUhl 27. Jun 2006 18:56

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
Sry habe doch keine Ahnung... Nur warum geht das mit den Pfeiltasten immer noch nict

Mavarik 27. Jun 2006 19:00

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
Zitat:

Zitat von MarkusUhl
Sry habe doch keine Ahnung... Nur warum geht das mit den Pfeiltasten immer noch nict

Warum ist Deine Richtung ein TPoint.... Egal...

Do hast ja noch nicht alle Richtungen umgesetzt..

Wie wäre es mit :

Delphi-Quellcode:
procedure TMainform.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  case key of
    VK_Left : Globalrichtung := links;
    VK_Right : Globalrichtung := rechts;
    VK_Up   : Globalrichtung := hoch;
    VK_Down : Globalrichtung := runter;
    VK_Escape : Close;
  end; // of Key
end;
Oder besser in Deinen Fall:


Delphi-Quellcode:
procedure TMainform.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  case key of
    VK_Left : BLeftClick(Sender);
    VK_Right : BRightClick(Sender);
    VK_Up   : BUpClick(Sender);
    VK_Down : BDownClick(Sender);
    VK_Escape : Close;
  end; // of Key
end;
Frank

PS.: Hat die Schlange keinen Körper?

PPS.:Warum prüfst Du immer auf Richtung.X=0 ab?

MarkusUhl 27. Jun 2006 19:05

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
Die Schlange besteht aus Punkten? Weiß nicht was du mit Körpern meinst.
Was ist denn daran falsch, so funzt es doch wenigsten?

Dein Forschlag geht auch nicht, FormKeyDown ist undefiniert. Wo muss ich das definieren?
Habe nun folgendes:

Delphi-Quellcode:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  case key of
    VK_Left : BLeftClick(Sender);
    VK_Right : BRightClick(Sender);
    VK_Up   : BUpClick(Sender);
    VK_Down : BDownClick(Sender);
    VK_Escape : Close;
  end;
end;
Danke für deine Hilfe..

Mavarik 27. Jun 2006 19:10

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
OK... Dann nochmal ganz langsam...

Klick auf Dein Form.

Dann F11
Dann Ereignisse
Dann nach unten und OnKeyDown suchen.
Dann Doppelklick.

Frank

MarkusUhl 27. Jun 2006 19:11

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
Danke dir nun funzt es. Sry aber wir lernen nichts in der Schule...

Mavarik 27. Jun 2006 19:14

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
Wieso schreibst Du die Länge in die Map?

Mavarik 27. Jun 2006 19:17

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
PS.: Weil hier schon öffter die Frage nach Snake war, habe ich mich auch mal hingesetzt...

Wenn Du magst, schaues Dir mal an:

2D Version hier
3D Version hier

Frank :coder:

MarkusUhl 27. Jun 2006 19:17

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
Habe dieses Muster hier gefunden und mich daran gehalten. Wie würdest du es machen..

Mavarik 27. Jun 2006 19:28

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
Zitat:

Zitat von MarkusUhl
Habe dieses Muster hier gefunden und mich daran gehalten. Wie würdest du es machen..

Am besten immer auf Zitat klicken, sonst weiss man nie worauf Du antwortest...

Na irgendwie sowas...:

Delphi-Quellcode:

  for i:=1 to Schlange.laenge do
    begin
      case Schlange.Element[i].Richtung of
         Links : dec(Schlange.Element[i].Position.X)
         Rechts: inc(Schlange.Element[i].Position.X);
         runter: inc(Schlange.Element[i].Position.Y);
         hoch : dec(Schlange.Element[i].Position.Y);
         
         for k:=1 to MaxWegpunkte do
           begin
             if (Schlange.Element[i].Position.x = WegPunkt[k].Position.x) and
                (Schlange.Element[i].Position.y = WegPunkt[k].Position.y) then
              Schlange.Element[i].Richtung := WegPunkt[k].Richtung
           end;
      end; // of case
    end;
* Nicht vollständig!!

Frank :coder:

MarkusUhl 27. Jun 2006 20:24

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
Da unsere Lehrer keinen Plan hat und ich auch nicht - lasse ich es so wie ich es habe..
Du arbeitest nun komplett über die Arrays oder?

Und ich, wie nennt man das was ich da gemacht habe mit der map. Da erzeugt er immer alles neu oder wie?
Es gibt nun noch ein Prob.
Wenn ich zuerst die Pfeiltasten benuzte habe ich eingestellt, dass dass die Richtungsbutton deaktiviert werden. Nur wenn ich erst die Buttons nehme, dann gehen die Pfeiltasten nicht mehr, kann man das ändern?

Danke

Mavarik 28. Jun 2006 08:18

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
Zitat:

Zitat von MarkusUhl
Da unsere Lehrer keinen Plan hat und ich auch nicht - lasse ich es so wie ich es habe..
Du arbeitest nun komplett über die Arrays oder?

Und ich, wie nennt man das was ich da gemacht habe mit der map. Da erzeugt er immer alles neu oder wie?
Es gibt nun noch ein Prob.
Wenn ich zuerst die Pfeiltasten benuzte habe ich eingestellt, dass dass die Richtungsbutton deaktiviert werden. Nur wenn ich erst die Buttons nehme, dann gehen die Pfeiltasten nicht mehr, kann man das ändern?

Danke

Hallo!

Liegt am Focus...

Setze im Formular im ObjectInspector (F11) KeyPreview := true;

Frank :coder:

MarkusUhl 28. Jun 2006 12:57

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
Das habe ich schon... Wenn ich erst die Buttons und dann die Pfeiltasten benutze, dann springt er mit den pfeiltasten nur noch auf den buttons hin und her und steuert nicht mehr die schlange^.

So wenn das Problem da oben klappt, dann hab ich nur noch eins und zwar dei Highscore, die in einer Datei abgespeichert wird. Wenn das Spiel vorbei ist, soll nach dem "game over" Fenster sich ein weiteres Fenster öffnen, in dem ich mein Namen eintragen kann. Dieser Name soll dann zusammen mit den akutellen Punkten in eine Textdatei abgespeichert werden.
Die Idee hab ich ja, aber leider kein Plan mit der Umsetzung.
Als erstes brauch ich wohl nen Fesnter mit einem Editfeld, wie mach ich das?

DGL-luke 28. Jun 2006 16:22

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
Wegen dem Fokusproblem: Du musst einfach bei den Buttons im OnFocus-Event den Fokus wieder woandershin setzen.

Wegen der Datei: Dazu kannst du z.B. Hier im Forum suchenInputQuery oder Hier im Forum suchenInputBox aufrufen, glaube das sollte es sein...

MarkusUhl 28. Jun 2006 18:56

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
Ich habe doch keine Ahnung... Im OI steht nix von Focus... Bitte helft mir die Zeit läuft mir davon

MarkusUhl 29. Jun 2006 13:57

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
Bitte helft mir... ich kann doch auch nichts dafür, dass der alte uns nichts lehrt.

DGL-luke 29. Jun 2006 15:21

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
Sorry, beim button heißt das OnEnter.

Zu InputQuery und InputBox sollten dir die code completion und die OH genug sagen.

MarkusUhl 30. Jun 2006 10:47

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
Und was muss ich in die Prozedor reinschreiben? Damit er die Buttons nicht mehr anspricht danach?

DGL-luke 30. Jun 2006 11:38

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
Due musst den focus zurück auf die form legen.

also self.setfocus;

MarkusUhl 3. Jul 2006 13:32

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
wie genau nun? das Programm muss heute fertig werden... :?

Namenloser 3. Jul 2006 13:42

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
hmm, also ich würde das anders machen.

Ich würde statt der Buttons ganz einfach panels (Oder Images?) nehmen, bei denen dürfte es das fokus-problem nicht geben. :wink:

MarkusUhl 3. Jul 2006 13:45

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
Hallo, da die zeit wegläuft ist das auch egal.. hab es schon anderes gelöst...

nun nur noch ein problem... ich will ne highscore, und zwar soll sich ein pop up fesnter öffnen wo ich den namen eingeben kann. dieser name soll dann in einer datei abgespeichert werden. für die pros hier sicherlich kein prolem..

DGL-luke 3. Jul 2006 13:56

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
:roll:

Zitat:

Zitat von DGL-luke
[...]Zu InputQuery und InputBox sollten dir die code completion und die OH genug sagen.

ansonsten:

Delphi-Quellcode:
type THighScore = record
  name: string[255];
  score: Integer;
end;

procedure Save(fname: string; data: array of THighScore);
var fs: TFileStream;
    i: Integer;
begin
  fs := TFileStream.Create(fname, fmOpencreate);
  fs.writebuffer(data[0],length(data) * sizeof(THighScore);
  fs.Free;
end;

function Load(fname:string): array of THighScore
var fs: TFileStream;
begin
  fs := TFileStream.Create(fname, fmOpenRead);
  setlength(Result, fs.size div sizeof(THighScore));
  fs.ReadBuffer(data[0], length(data) * sizeof(THighScore);)
end;
Aber nur weil du unter Zeitdruck bist, normalerweise könnte man sich das locker selber erarbeiten!
(nicht getestet)

MarkusUhl 3. Jul 2006 15:06

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
Ich finde den fehler einfach nicht. Es ging einmal, dann hab ich so lange rumprobiert und nun bekomm ich es nicht mehr hin... hoffe im dem roten steck irgendwo der fehler..

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

const
  farben: Array [0..2] of TColor=(clWhite, clLime, clRed);
  stufen: Array [0..2] of Cardinal=(200, 100, 50);
  raster = 7;
  breite = 65;
  hoehe = 45;
  Langsam = 250;
  Mittel = 100;
  Schnell = 50;

type
  TForm1 = class(TForm)
    Spielfeld: TPaintBox;
    Timer1: TTimer;
    BStart: TButton;
    BOben: TButton;
    BLinks: TButton;
    BRechts: TButton;
    BUnten: TButton;
    PEnde: TButton;
    BPause: TButton;
    BWeiter: TButton;
    PLeicht: TButton;
    PSchwer: TButton;
    PMittel: TButton;
    Label1: TLabel;
    Label2: TLabel;
    procedure BStartClick(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure BObenClick(Sender: TObject);
    procedure BLinksClick(Sender: TObject);
    procedure BRechtsClick(Sender: TObject);
    procedure BUntenClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure PEndeClick(Sender: TObject);
    procedure BPauseClick(Sender: TObject);
    procedure BWeiterClick(Sender: TObject);
    procedure PLeichtClick(Sender: TObject);
    procedure PMittelClick(Sender: TObject);
    procedure PSchwerClick(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
   
  private
    { Private-Deklarationen }
    map: Array [0..breite] of Array [0..hoehe] of Integer;
    kopf,
    richtung,
    punkt: TPoint;
    punkte: Integer;
    laenge: Integer;
    ende,
    rand,
    gebissen: Boolean;
    name, rekord:string;
     datei:textfile;
    procedure enable_buttons(status: Boolean);
    procedure spiel_ende;
    procedure neuer_punkt;
    procedure paint_map;
    procedure calc_snake;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
implementation

{$R *.dfm}

procedure TForm1.enable_buttons(status: Boolean);
begin
  BOben.Enabled := status;
  BRechts.Enabled := status;
  BLinks.Enabled := status;
  BUnten.Enabled := status;
  BPause.Enabled := status;
  BWeiter.Enabled := status;
  PLeicht.Enabled := status;
  PMittel.Enabled := status;
  PSchwer.Enabled := status;
end;

procedure TForm1.spiel_ende;
begin
  ende := True;
  Timer1.Enabled := False;
  BPause.Enabled:=False;
  BWeiter.Enabled:=False;
  PLeicht.Enabled:=False;
  PMittel.Enabled:=False;
  PSchwer.Enabled:=False;
  enable_buttons(False);
  BStart.Enabled := True;
/////Neuer Rekord - ANFANG/////
if rekord < inttostr(punkte) then begin //es wird geprüft, ob neue punktezahl höher als rekord
name := InputBox(' Neuer Rekord', 'Dein Name (ohne Leertaste)', ''); //wenn ja wird nach neuem rekordnamen gefragt (wird in var name gelesen)
assignfile (datei, 'rekord.txt'); //file initialisieren
rewrite (datei); //file öffnen und wiederbeschreiben
writeln (datei, name); //variable name in 1. zeile schreiben
writeln(datei, punkte); //variable pnukte in 2. zeile schreiben
closefile (datei); //file schließen

assignfile (datei, 'rekord.txt'); //wieder einlesen (s.u.)
reset (datei);
readln (datei, name);
readln (datei,rekord);
closefile (datei);
end;
/////Neuer Rekord - Ende/////


end;
Delphi-Quellcode:
procedure TForm1.neuer_punkt;
begin
  punkt := Point(Random(breite), Random(hoehe));
  while map[punkt.X, punkt.Y]<>0 do
    punkt := Point(Random(breite), Random(hoehe));
  map[punkt.X,punkt.Y] := -1;
end;

procedure TForm1.paint_map;
var
  i, j: Integer;
  color: TColor;
begin
  for i := 0 to breite do
    for j := 0 to hoehe do
    begin
      case map[i, j] of
        -1: color := farben[1];
         0: color := farben[0];
      else
        color := farben[2];
      end;
      Spielfeld.Canvas.Brush.Color:=color;
      Spielfeld.Canvas.FillRect(Rect(i*raster, j*raster, (i+1)*raster, (j+1)*raster));
    end;
end;

procedure TForm1.calc_snake;
var
  i, j: Integer;
begin
  for i := 0 to breite do
    for j := 0 to hoehe do
      if map[i, j]>0 then
        Dec(map[i, j]);
  Inc(kopf.X, richtung.X);
  Inc(kopf.Y, richtung.Y);
  if (kopf.X<0) or (kopf.X>breite) or (kopf.Y<0) or (kopf.Y>hoehe) then
  begin
    spiel_ende;
    ShowMessage('Nicht den Rand berühen!');
    ShowMessage('Du hast '+IntToStr(punkte)+' Punkte erreicht');
  end;
  if (map[kopf.X, kopf.Y]>0) and (not ende) then
  begin
    spiel_ende;
    ShowMessage('Nicht in den Schwanz beißen!');
    ShowMessage('Du hast '+IntToStr(punkte)+' Punkte erreicht')
  end;
  if (kopf.X=punkt.X) and (kopf.Y=punkt.Y) then
  begin
    Inc(laenge);
    neuer_punkt;
    if Timer1.Interval = Langsam then
  Punkte := Punkte + 3
else
if Timer1.Interval = Mittel then
  Punkte := Punkte + 8
else
if Timer1.Interval = Schnell then
  Punkte := Punkte + 12;
  end;
  map[kopf.X, kopf.Y] := laenge;

Label2.Caption := 'Aktueller Punktestand: ' + IntToStr(Punkte);
end;

procedure TForm1.BStartClick(Sender: TObject);
var
  i, j: Integer;
begin
  punkte:=0;
  BStart.Enabled := False;
  for i:=0 to breite do
    for j:=0 to hoehe do
      map[i, j] := 0;
  kopf := Point(1, 1);
  laenge := 5;
  richtung := Point(0, 1);
  map[kopf.X, kopf.Y] := laenge;
  neuer_punkt;
  paint_map;
  enable_buttons(True);
  ende := False;
  Timer1.Enabled := true;
  Timer1.Interval := Mittel;
Form1.PLeicht.Visible:=false;
Form1.PMittel.Visible:=false;
Form1.PSchwer.Visible:=true;
Form1.BOben.Visible:=true;
Form1.BLinks.Visible:=true;
Form1.BRechts.Visible:=true;
Form1.BUnten.Visible:=true;
Form1.BPause.Visible:=true;
Form1.BWeiter.Visible:=false;
Form1.Label1.Visible:=true;
/////Alter Rekord einlesen - ANFANG/////
If FileExists('rekord.txt') Then begin //es wird geprüft ob rekord datenbank vorhanden ist
assignfile (datei, 'rekord.txt'); //file wird initialisiert
reset (datei); //file öffnen
readln (datei, name); //1. zeile in variable name lesen
readln (datei,rekord); //2. zeile in variable rekord lesen
closefile (datei); //datei schließen
end
else begin //wenn rekord datenbank nicht gefunden wird neue erstellt
assignfile (datei, 'rekord.txt'); //file erstellen (initialisieren)
rewrite (datei); //file offnen und wiederbeschreiben
writeln (datei, 'NoName'); //Noname in 1. Zeile schreiben (Name)
writeln (datei,'10'); //10 in 2. Zeile schreiben (Punkte)
closefile (datei); //datei schließen

assignfile (datei, 'rekord.txt'); //wieder lesen (s.o.)
reset (datei);
readln (datei, name);
readln (datei,rekord);
closefile (datei);

end;
/////Alter Rekord einlesen - Ende/////


Delphi-Quellcode:
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  calc_snake;
  if not ende then
    paint_map;
end;

procedure TForm1.BObenClick(Sender: TObject);
begin
  if richtung.Y=0 then
    richtung := Point(0, -1);
end;

procedure TForm1.BLinksClick(Sender: TObject);
begin
  if richtung.X=0 then
    richtung := Point(-1, 0);
end;

procedure TForm1.BRechtsClick(Sender: TObject);
begin
  if richtung.X=0 then
    richtung := Point(1, 0);
end;

procedure TForm1.BUntenClick(Sender: TObject);
begin
  if richtung.Y=0 then
    richtung := Point(0, 1);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Randomize;
end;

procedure TForm1.PEndeClick(Sender: TObject);
begin
halt;
end;

procedure TForm1.BPauseClick(Sender: TObject);
begin
Timer1.Enabled := False;
Form1.BPause.Visible:=false;
Form1.BWeiter.Visible:=true;
PLeicht.Enabled:=False;
PMittel.Enabled:=False;
PSchwer.Enabled:=False;
BOben.Enabled:=False;
BLinks.Enabled:=False;
BRechts.Enabled:=False;
BUnten.Enabled:=False;



end;

procedure TForm1.BWeiterClick(Sender: TObject);
begin
Timer1.Enabled := True;
Form1.BPause.Visible:=true;
Form1.BWeiter.Visible:=false;
PLeicht.Enabled:=true;
PMittel.Enabled:=true;
PSchwer.Enabled:=true;
BOben.Enabled:=true;
BLinks.Enabled:=true;
BRechts.Enabled:=true;
BUnten.Enabled:=true;
end;

procedure TForm1.PLeichtClick(Sender: TObject);
begin
Timer1.Interval := Langsam;
calc_snake;
  if not ende then
    paint_map;
Form1.PLeicht.Visible:=false;
Form1.PMittel.Visible:=true;
Form1.PSchwer.Visible:=false;
end;

procedure TForm1.PMittelClick(Sender: TObject);
begin
Timer1.Interval := Mittel;
calc_snake;
  if not ende then
    paint_map;
Form1.PLeicht.Visible:=false;
Form1.PMittel.Visible:=false;
Form1.PSchwer.Visible:=true;
end;

procedure TForm1.PSchwerClick(Sender: TObject);
begin
Timer1.Interval := Schnell;
calc_snake;
  if not ende then
    paint_map;
Form1.PLeicht.Visible:=true;
Form1.PMittel.Visible:=false;
Form1.PSchwer.Visible:=false;
end;


procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  case key of
    VK_Left : BLinksClick(Sender);
    VK_Right : BRechtsClick(Sender);
    VK_Up   : BObenClick(Sender);
    VK_Down : BUntenClick(Sender);
    VK_PAUSE : BPauseClick(Sender);
    VK_Escape : Close;
  end;
BOben.Enabled:=false;
BUnten.Enabled:=false;
BLinks.Enabled:=false;
BRechts.Enabled:=false;
  end;

end.
der der komplette qt.

DGL-luke 3. Jul 2006 16:38

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
hmm... du machst das ziemlcih kompliziert, ich finde aber keinen fehler. Was genau funktioniert denn nicht?

Am einfachsten wäre das wohl über Ini-Dateien:

Delphi-Quellcode:
uses Inifiles;

procedure TrySetNewHighscore(score: Integer; fname: TFileName);
var ini: TIniFile;
    highscore : Integer;
    username: string;
begin
  ini := TIniFIle.Create(fname);
  highscore := ini.ReadInteger('highscore','highscore',0);
  if score > highscore then
    begin
      username := InputBox('HighScore!','Bitte gib deinen Namen ein');
      if username <> '' then
        ini.WriteInteger('highscore','highscore',score);
        ini.WriteString('highscore','name',username);
    end;
  ini.Free;
end;

procedure GetHighscore(fname: TFileName; var score: Integer; var username: string);
begin
  ini := TIniFIle.Create(fname);
  score := ini.ReadInteger('highscore','highscore',0);
  username := ini.ReadString('highscore','name','');
  ini.Free;
end;

Das sind erheblich weniger Codezeilen als bei dir, und damit weniger fehlerträchtig.

MarkusUhl 3. Jul 2006 16:44

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
Sorry das versteht ich wieder nicht. Ich habs nun hinbekommen. Es ist fertig. Danke an euch allen die mir geholfen haben. Ich denke ich wähle Informatik ab, so ein scheiß----

DGL-luke 3. Jul 2006 16:55

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
:lol:

Ich glaube nicht, dass mir irgendein Kurs so leichtfallen wird wie Info... jammerschade, dass das hier in BY zum Zusatzangebot gehört...

Delphi ist echt ein gutes Tool, du bist zu beglückwünchen, dass ihr damit arbeitet. In Java wär das noch viel hässlicher.
Lass dich nicht abschrecken von Anfangsschwierigkeiten! Gute Tutorials zu Delphi findest du bei www.dsdt.info/tutorials , unter anderem auch über ini-dateien, und ein ganzes buch unter http://de.wikibooks.org/wiki/Delphi .

TaIPaN 17. Sep 2006 20:11

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
Hi Leute^^ habe auch mal eine Frage zu Snake... (mal wieder ;) )
Also wir haben in der Schule unglücklicherweise einen kleinen Anfang zu Snake bekommen der blöderweise vollkommen anders aussieht,
wie alles was bisher zu diesem Thema hier erörtert wurde, weswegen ich nun das Problem habe, dass ich leider durch lesen der sourcecodes auch nicht weiter komme... :(
ALso meine Schlange kann:
1. Fressen(Apfel)
2. Durch Wände gehen(findich cooler wie dabei zu sterben^^)
3. Score wird gezählt
4. Richtungswechsel wie Rechts==>Links, Hoch==>Runter gehn nich

Mein großes Problem ist: Ich bekomme es einfach nicht gebacken, dass meine Schlange beim Fressen eines Apfels länger wird.
Deswegen wollte ich diejenigen die Ahnung haben darum bitten sich meinen Versuch mal anzuschaun und mir zu sagen was ich falsch mache wies richtig geht oder mir einfach einen kleinen Denkanstoß geben^^
Wie ich sehe sind hier ja eindeutig Leute dies echt sau gut drauf haben :) und würde mich daher echt über eine hilfreiche Antwort freun...


Bin leider wie man sieht alles andere als begabt und hocke nun schon seid mehreren Tagen hilflos vor Delphi und komme einfach nicht weiter... 2Spielermodus, Highscore etc. stelle ich mir da ja um einiges einfacher vor...aber hier bin ich einfach nur aufgeschmissen...

:wall: Für die Unordnung die durch exzessives Rumprobiern entstanden ist im Sourcecode willich mich schonmal im Voraus entschuldigen^^ :wall:


Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  Trichtung = (Hoch,Runter,Links,Rechts);

  TSpielfeld = class(TForm)
    Bild: TImage;
    Timer1: TTimer;
    Panel1: TPanel;
    Label1: TLabel;
    m_start: TMemo;
    l_start: TLabel;
    b_start: TButton;
    Label2: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure b_startClick(Sender: TObject);
    end;

 tsnake = class
  x,y:array[1..100] of integer;
  vx,vy,r,laenge:integer;
  farbe:tcolor;
  richtung:trichtung;
  procedure init(fneu:tcolor; xneu, yneu, vxneu, vyneu, rneu:integer);
  procedure zeigedich;
  procedure bewegedich;
  procedure wachsen;
  end;

 tapfel = class
  x,y,r,score:integer;
  farbe:tcolor;
  procedure ini; overload;
  procedure ini(fneu:tcolor; xneu, yneu, rneu:integer); overload;
  procedure zeigediche;
  procedure fressen;
  end;


var
  Spielfeld: TSpielfeld;
   snake   : Tsnake;
   apfel   : Tapfel;
   big     : bool;
implementation

{$R *.dfm}


// -------------------------------------------------------------------------- //
// alle Prozeduren, die ausschließlich mit "Snake" zu tun haben
// -------------------------------------------------------------------------- //
procedure tsnake.init(fneu:tcolor; xneu, yneu, vxneu, vyneu, rneu:integer);
begin
  laenge:= 1;
  farbe:= fneu;
  x[laenge]   := xneu;
  y[laenge]   := yneu;
  vx  := vxneu;
  vy  := vyneu;
  r   := rneu;

end;

procedure tsnake.zeigedich;
var i:integer;
begin
  Spielfeld.Bild.Canvas.Brush.Color:=Farbe;
  for i:=1 to snake.laenge do
  begin
  Spielfeld.Bild.Canvas.Rectangle(x[i], y[i], x[i]+2*r, y[i]+2*r);
  end;
end;

procedure tsnake.bewegedich;
begin

  case snake.richtung of
  Links: begin //Links
    snake.vx:=-1;
    snake.vy:= 0;
    end;

Hoch: begin //Hoch
    snake.vx:= 0;
    snake.vy:= -1;
    end;

Rechts: begin //Rechts
    snake.vx:= 1;
    snake.vy:= 0;
    end;

Runter: begin //Runter
    snake.vx:= 0;
    snake.vy:= 1;
    end;
  end;

  //Bewegungsberechnung
  x[1] := x[1] + 2*r*vx;
  y[1] := y[1] + 2*r*vy;

  if (x[1]>Spielfeld.Bild.Width-2*r) then
  begin
    x[1] := 0;
  end;

  if x[1]<0 then
  begin
    x[1] := Spielfeld.Bild.Width-2*r;
   end;

  if (y[1] > Spielfeld.Bild.Height-2*r) then
  begin
    y[1] := 0;
  end;

  if y[1] < 0 then
  begin
    y[1] := Spielfeld.Bild.Height-2*r;
  end;

end;

//wachsen
procedure Tsnake.wachsen;
var i:integer;
begin
laenge:= laenge +1;
spielfeld.Label2.Caption:='Länge : ' + inttostr(laenge);
//Array erweitern
for i:=1 to laenge do
  begin
  x[i+1]:=x[i];
  y[i+1]:=y[i];
  Spielfeld.Bild.Canvas.Rectangle(x[i], y[i], x[i]+2*r, y[i]+2*r);


  end;
end;

procedure TSpielfeld.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  case key of
27:close;

37: begin //Links
    if snake.richtung <> Rechts then snake.richtung:=Links;
    end;
38: begin //Hoch
    if snake.richtung <> Runter then snake.richtung:=Hoch;
    end;
39: begin //Rechts
    if snake.richtung <> Links then snake.richtung:=Rechts;
    end;
40: begin //Runter
    if snake.richtung <> Hoch then snake.richtung:=Runter;
    end;
end;
end;

// -------------------------------------------------------------------------- //
// Alle Prozeduren, die ausschließlich mit "Apfel" zu tun haben
// -------------------------------------------------------------------------- //

procedure tapfel.ini;
begin
  farbe:= clGreen;
  x   := Random(30)*20;
  y   := Random(20)*20;
  r   := 10;
end;

procedure tapfel.ini(fneu:tcolor; xneu, yneu, rneu:integer);
begin                                      //
  farbe:= fneu;
  x   := xneu;
  y   := yneu;
  r   := rneu;
end;


procedure tapfel.zeigediche;               //
begin
  Spielfeld.Bild.Canvas.Brush.Color:=clGreen;
  Spielfeld.Bild.Canvas.ellipse(x, y, x+2*r, y+2*r);
end;

procedure tapfel.fressen;
begin

if (x = snake.x[1]) and (y = snake.y[1]) then

    begin
      score:= score +1;
      spielfeld.label1.caption:='Score : ' + inttostr(score);
      apfel.zeigediche;
      apfel.ini;
      apfel.zeigediche;
      big:= true;
    end;
end;
// -------------------------------------------------------------------------- //
// Durch diese Prozedur wird das Spiel gestartet und der Anfangsbildschirm ausgeblendet
// -------------------------------------------------------------------------- //
procedure TSpielfeld.b_startClick(Sender: TObject);
begin
l_start.Visible:=false;
b_start.Visible:=false;
m_start.Visible:=false;
panel1.Visible:=true;
bild.Visible:=true;
end;

// -------------------------------------------------------------------------- //
// Diese Prozedur bringt die Bewegungs- und Fressprozeduren in Gang(regelmäßig
// -------------------------------------------------------------------------- //

procedure TSpielfeld.Timer1Timer(Sender: TObject);
begin
//spielfeld.Timer1.Enabled:=false;

                   //
snake.zeigedich;
snake.bewegedich;
snake.zeigedich;
apfel.fressen;
if big = true then
begin
snake.wachsen;
big:= false;
end;
//spielfeld.Timer1.Enabled:=true;
end;

// -------------------------------------------------------------------------- //
// Alles was von Anfang an existieren soll ist hier aufgeführt
// -------------------------------------------------------------------------- //

procedure TSpielfeld.FormCreate(Sender: TObject);
begin                               //
  with bild.Canvas do
  begin
  pen.Width:=5;
  Brush.Color:=clWhite;
  Brush.Style:=bsSolid;
  Pen.Width:=2;
  Pen.Mode:=pmNOTXOR;

  Rectangle(0,0,Bild.width,Bild.Height);
  end;

  snake.init(clRed, Random(30)*20, Random(20)*20,0,0,10);
  snake.zeigedich;
  apfel.ini;
  apfel.zeigediche;
end;

initialization                     //
  randomize;
  snake := tsnake.Create;
  apfel := tapfel.Create;
  big:= false;
end.
In Hoffnung auf hilf- und lehrreiche Antwort(en)

mfg Taipi

inherited 18. Sep 2006 16:08

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
Neue frage, neuer Thread ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:36 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz