Re: Snake (das Spiel)
habs erstmal hinbekommen....aber diese procedure wählt ja nur die buitton an...kann man die damit auch gleich , quasi "direkt" bedienen?
|
Re: Snake (das Spiel)
Du kannst natürlich den Code in den Buttonevents auslagern und die ausgelagerten Prozeduren dann "direkt" aufrufen.
|
Re: Snake (das Spiel)
um da nen punktezähler einzubauen muss ich ja theoretisch einfach nur die anzahl ausummieren die die schlange mit den futterpunkten übereinstimmt
Delphi-Quellcode:
oder ist das so abwägig?... i wie kommen da höchst dumme punktzahlen raus...
if (kopf.X=futter.X) and (kopf.Y=futter.Y) then
begin edit1.text:=inttostr(punkte); Inc(laenge); neues_futter; [b]punkte:=punkte+1;[/b] end; |
Re: Snake (das Spiel)
i packs net wenn ich des ganze einfach beim futter erschaffen mit rein packe dann gehts trotzdem ent, aber eig muss i ja nur zählen wieoft futter erschaffen wird-1... hmm
|
AW: Snake (das Spiel)
Liste der Anhänge anzeigen (Anzahl: 1)
ich bin neu hier und auch beim Programmieren mit Delphi.
Ich benutze Lazarus ;-) Für Einsteiger ist richtig gut erklärt und nachvollziehbar. Am Anfang konnte ich kein Bild kriegen, aber nach copy/paste von source code, ging das. Allerdings kann ich die Schlange nicht steuern, weder mit den Buttons noch mit den Pfeiltasten :cry: Kann mir jemand dabei helfen? Vielen Dank! |
AW: Snake (das Spiel)
Du musst die Eigenschaft Keypreview
im Formular aktivieren! Dann kannst du dir im KeyDownEvent vom Formular die letzten Gedrückte Pfeiltaste merken. |
AW: Snake (das Spiel)
Danke für die schnelle Antwort, allerdings hat sich nichts geändert. Ich kann leider nicht finden, wo der Fehler sein kann.
object Form1: TForm1 Left = 361 Height = 335 Top = 139 Width = 484 Caption = 'Form1' ClientHeight = 335 ClientWidth = 484 KeyPreview = True OnCreate = FormCreate OnKeyDown = FormKeyDown LCLVersion = '1.8.0.6' Wie Du es beschrieben hast, habe ich in den Eigenschaften der Form das geändert und auch die Methode FormKeyDown verknüpft. Das ist die Implementation der Buttons und von FormKeyDown: procedure TForm1.Button2Click(Sender: TObject); begin if richtung.Y=0 then richtung :=Point(0,-1); end; procedure TForm1.Button3Click(Sender: TObject); begin if richtung.X=0 then richtung:=Point(1, 0); end; procedure TForm1.Button4Click(Sender: TObject); begin if richtung.X=0 then richtung:=Point(1,0); end; procedure TForm1.Button5Click(Sender: TObject); begin if richtung.Y=0 then richtung:= Point(0,1); end; procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin case Key of VK_UP: Button2.Click; VK_DOWN: Button5.Click; VK_RIGHT: Button4.Click; VK_LEFT: Button3.Click; end; end; Danke nochmal für Deine Hilfe! |
AW: Snake (das Spiel)
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo QuickAndDirty,
Hier ist der Code ohne die Anwendungsdatei, sonst war zu gross zum Hochladen. Danke! |
AW: Snake (das Spiel)
Ich hab nicht alles gefixt
nur 2 Zeilen oder so von hier aus müsstest es selbst können. 1. SpielEnde oder der startbutton initialisieren das Spiel nicht komplett! Das muss du dir mal ansehen 2. Der Quelltext ist komisch formatiert! 3. Das malen habe ich in das Paint Ereignis gelegt, so wie Gott es gewollt hat. Grundsätzliches zu spielen: Jedes spiel hat eine Gameloop das ist eine schleife die den status des Spiels iteriert.(OK heute baut keiner mehr solche Spiele, aber irgendwo in der eingekauften Engine ist sicher auch irgendeine mainloop) In deinem Fall ist Timer1 deine "Gameloop für Arme". Hier muss die komplette spiellogik stattfinden. Damit das möglich ist muss der timer auch laufen, bei start! 4. Hab im Startbutton den timer aktiviert. 5. als letzten aufruf im timer die darstellung von Paintbox für ungültig(invalide) erklärt. Paintbox rendert das Canvas dann neue sobald es geht. 6. Dein VK_LEFT war nicht in ordnung es lenkte nach rechts. Habs gerade gebogen 7. Else if in Calc Snake. Weil da kann immer nur eine von den sachen passieren.
Delphi-Quellcode:
unit unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; const farben: Array [0..2] of TColor = (clBlack, clLime, clRed); raster: integer = 10; breite: integer = 24; hoehe: integer = 24; type { TForm1 } TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Button5: TButton; Timer1: TTimer; PaintBox1: TPaintBox; procedure Button1Click(Sender: TObject); procedure PaintBox1Paint(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); private { Private declarations } map: Array [0..24] of Array [0..24] of Integer; kopf, richtung, futter: TPoint; laenge, punkte: Integer; ende: Boolean; bmp: TBitmap; procedure enable_buttons(status: Boolean); procedure spiel_ende; procedure neues_futter; procedure paint_map; procedure calc_snake; public { Public declarations } end; var Form1: TForm1; implementation {$R *.lfm} procedure TForm1.enable_buttons(status: Boolean); begin Button2.Enabled := status; Button3.Enabled := status; Button4.Enabled := status; Button5.Enabled := status; end; procedure TForm1.spiel_ende; Begin ende:= True; Timer1.Enabled := False; enable_buttons(False); Button1.Enabled := True; end; procedure TForm1.neues_futter; begin futter := Point(Random(breite), Random(hoehe)); while map[futter.X, futter.Y]<>0 do futter:= Point(Random(breite), Random(hoehe)); map[futter.X,futter.Y] := -1; end; procedure TForm1.paint_map; var i,j: integer; col:TColor; begin for i := 0 to breite do for j := 0 to hoehe do begin case map[i, j] of -1: col := farben[1]; 0: col := farben[0]; else col := farben[2]; end; PaintBox1.Canvas.Brush.Color:=col; PaintBox1.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('Sie haben den Rand berührt!'); end else if (map[kopf.X, kopf.Y]>0) and (not ende) then begin spiel_ende; ShowMessage('Sie haben sich selbst gebissen!'); end else if (kopf.X=futter.X) and (kopf.Y=futter.Y) then begin Inc(laenge); neues_futter; end; map[kopf.X, kopf.Y] := laenge; end; procedure TForm1.Button1Click(Sender: TObject); var i,j: Integer; begin Button1.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; neues_futter; enable_buttons(True); Timer1.enabled := true; end; procedure TForm1.PaintBox1Paint(Sender: TObject); begin paint_map; end; procedure TForm1.Timer1Timer(Sender: TObject); begin calc_snake; Paintbox1.invalidate; if ende then Timer1.enabled := false; end; procedure TForm1.Button2Click(Sender: TObject); begin if richtung.Y=0 then richtung :=Point(0,-1); end; procedure TForm1.Button3Click(Sender: TObject); begin if richtung.X=0 then richtung:=Point(-1, 0); end; procedure TForm1.Button4Click(Sender: TObject); begin if richtung.X=0 then richtung:=Point(1,0); end; procedure TForm1.Button5Click(Sender: TObject); begin if richtung.Y=0 then richtung:= Point(0,1); end; procedure TForm1.FormCreate(Sender: TObject); begin randomize; end; procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin case Key of VK_UP: Button2.Click; VK_DOWN: Button5.Click; VK_RIGHT: Button4.Click; VK_LEFT: Button3.Click; end; end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz