![]() |
Re: Snake für die Schule programmieren,Pause;Highscoures ein
Meine Glaskugel ist vor kurzem kaputtgegangen... könntest du bitte ein bisschen code posten?
|
Re: Snake für die Schule programmieren,Pause;Highscoures ein
Delphi-Quellcode:
hier da kommt dann dass ich hinter Sender ne ) setzten soll... Mach ich das kommt, es nicht hier nicht anwendbar
procedure TForm1.BLinksKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); begin case Key of VK_LEFT: Form1.BLinksClick (Sender: TObjcect); end; |
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!
|
Re: Snake für die Schule programmieren,Pause;Highscoures ein
Zitat:
Also lösch das ":TObject" Frank |
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 |
Re: Snake für die Schule programmieren,Pause;Highscoures ein
Zitat:
btw: Der onKey* ist für derartige Programme auf keinen Fall zu langsamm.... Frank :coder: |
Re: Snake für die Schule programmieren,Pause;Highscoures ein
Klar Mavarik, ich wollte ja ein wenig Hintergrundwissen vermitteln ^^
|
Re: Snake für die Schule programmieren,Pause;Highscoures ein
Zitat:
|
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:
Danke euch
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. |
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 |
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?
|
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: |
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
|
Re: Snake für die Schule programmieren,Pause;Highscoures ein
Zitat:
Do hast ja noch nicht alle Richtungen umgesetzt.. Wie wäre es mit :
Delphi-Quellcode:
Oder besser in Deinen Fall:
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;
Delphi-Quellcode:
Frank
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; PS.: Hat die Schlange keinen Körper? PPS.:Warum prüfst Du immer auf Richtung.X=0 ab? |
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:
Danke für deine Hilfe..
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; |
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 |
Re: Snake für die Schule programmieren,Pause;Highscoures ein
Danke dir nun funzt es. Sry aber wir lernen nichts in der Schule...
|
Re: Snake für die Schule programmieren,Pause;Highscoures ein
Wieso schreibst Du die Länge in die Map?
|
Re: Snake für die Schule programmieren,Pause;Highscoures ein
|
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..
|
Re: Snake für die Schule programmieren,Pause;Highscoures ein
Zitat:
Na irgendwie sowas...:
Delphi-Quellcode:
* Nicht vollständig!!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; Frank :coder: |
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 |
Re: Snake für die Schule programmieren,Pause;Highscoures ein
Zitat:
Liegt am Focus... Setze im Formular im ObjectInspector (F11) KeyPreview := true; Frank :coder: |
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? |
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. ![]() ![]() |
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
|
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.
|
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. |
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?
|
Re: Snake für die Schule programmieren,Pause;Highscoures ein
Due musst den focus zurück auf die form legen.
also self.setfocus; |
Re: Snake für die Schule programmieren,Pause;Highscoures ein
wie genau nun? das Programm muss heute fertig werden... :?
|
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: |
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.. |
Re: Snake für die Schule programmieren,Pause;Highscoures ein
:roll:
Zitat:
Delphi-Quellcode:
Aber nur weil du unter Zeitdruck bist, normalerweise könnte man sich das locker selber erarbeiten!
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; (nicht getestet) |
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:
/////Neuer Rekord - ANFANG/////
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; 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:
/////Alter Rekord einlesen - ANFANG/////
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; 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:
der der komplette qt.
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. |
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. |
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ß----
|
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 ![]() ![]() |
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:
In Hoffnung auf hilf- und lehrreiche Antwort(en)
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. mfg Taipi |
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. |
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