![]() |
Snake für die Schule programmieren,Pause;Highscoures einbaun
Moin Leute ich bin ganz neu hier und habe ein paar Fragen.
Ich habe es mit meinen bescheiden Delphi Kenntnisse und den Tipps hier im Forum schon geschafft, eine schlange zu bauen, die sich verlängert und das spiel abbricht, wenn die wand oder seiner selbst berüht wird. nun mächte ich noch einne highscoure einbauen. Für jeden Punkt soll es 5 Punkte geben. Wie mache ich das am besten...? Dann hätte ich gerne sowas wie eine Pause Funktion, dass das Spiel angehalten werden kann. Wäre super, wenn ich ein paar Tipps bekommen könnte, wo ich da nachlesen kann oder wie die befehle lauten vielen Dank. PS: Sorry aber ich bin wieder einer der typischen Deppen die bei so einem älteren Herrn Unterricht haben, der selbst keine Peilung hat und man sich so den ganzen kram selber beibringen muss. Kotz.... Danke euch für die Unterstüzung! :thumb: |
Re: Snake für die Schule programmieren,Pause;Highscoures ein
Wie baust/bewegst du die Shclange. Läuft die Geschwindigkeit des Spielsvia Timer?
Ein bisschen QT wäre nich schlecht, Kristallkugel ist grad in Reperatur -.- |
Re: Snake für die Schule programmieren,Pause;Highscoures ein
Ich hab mich ganz an das Beispiel hier im Forum gehalten... Jupp es läuft mit Timer:
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; type TForm1 = class(TForm) Spielfeld: TPaintBox; Timer1: TTimer; BStart: TButton; BOben: TButton; BLinks: TButton; BRechts: TButton; BUnten: TButton; PEnde: TButton; 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); private { Private-Deklarationen } map: Array [0..breite] of Array [0..hoehe] of Integer; kopf, richtung, futter: TPoint; laenge: Integer; ende, rand, gebissen: Boolean; procedure enable_buttons(status: Boolean); procedure spiel_ende; procedure neues_futter; 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; end; procedure TForm1.spiel_ende; begin ende := True; Timer1.Enabled := False; enable_buttons(False); BStart.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; Spielfeld.Canvas.Brush.Color:=col; 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!'); end; if (map[kopf.X, kopf.Y]>0) and (not ende) then begin spiel_ende; ShowMessage('Nicht in den Schwanz beißen!'); end; 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.BStartClick(Sender: TObject); var i, j: Integer; begin 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; neues_futter; paint_map; enable_buttons(True); ende := False; Timer1.Enabled := 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; end. |
Re: Snake für die Schule programmieren,Pause;Highscoures ein
Die Punkte addierst du, wenn auch eine Kollision festgestellt wurde. Die Pause kannst du zb. Durch deaktivierung des Timers verursachen
|
Re: Snake für die Schule programmieren,Pause;Highscoures ein
letzteres kapiere ich noch.
Aber wie addieren. Wenn game over ist muss es doch angezeigt werden? Am besten in einem neuem fenster oder? |
Re: Snake für die Schule programmieren,Pause;Highscoures ein
Du addierst immer wenn eine Kollision nit Futter stattfindet auf eine Variable (sowas wie 'Score') 5 hinzu. Wenn das spiel zuende ist kannst du ja mit einer MessageBox oder Label die Punktezahl/Highscores anzeigen lassen
|
Re: Snake für die Schule programmieren,Pause;Highscoures ein
Das hab ich verstanden, nur die umstetzung!
|
Re: Snake für die Schule programmieren,Pause;Highscoures ein
Delphi-Quellcode:
Und dann
if (kopf.X=futter.X) and (kopf.Y=futter.Y) then
begin Punkte:=Punkte+5; Inc(laenge); neues_futter; end;
Delphi-Quellcode:
procedure TForm1.spiel_ende;
begin ende := True; Timer1.Enabled := False; enable_buttons(False); BStart.Enabled := True; ShowMessage('Du hast '+IntToStr(Punkte)+' Punkte erreicht); end; |
Re: Snake für die Schule programmieren,Pause;Highscoures ein
Danke werd es gleich einbauen. Bin noch an der Pause. Wie bekomme ich den Button weg.
TForm1.PauseClick.Visible:=False; klappt net, der Button heißt Pause- du merkst ich bin ein Noob^^ |
Re: Snake für die Schule programmieren,Pause;Highscoures ein
Ohne das T vor TForm^^
|
Re: Snake für die Schule programmieren,Pause;Highscoures ein
Danke, sag ich ja noob^^ geht aber immer noch nicht Nicht genügend wirkliche parameter
edit. es funzt. Danke die Pause funzt... muss pause nicht pauseclick heißen, ich noob |
Re: Snake für die Schule programmieren,Pause;Highscoures ein
LOL, das muss so heißen:
Delphi-Quellcode:
Form1.Pause.Visible:=False;
|
Re: Snake für die Schule programmieren,Pause;Highscoures ein
das habe ich sogar noch selbst bemerkt. man sollte nicht 2 tage vorher anfangen^^ nun noch die highscore.
Man du hast ja mit 15 schon voll den plan davon. wie machst du das? Kannst du mir auch sagen, wie das mit den pfeiltasten steuern kann? geht ja z.zt. nur über die buttons |
Re: Snake für die Schule programmieren,Pause;Highscoures ein
Soweit so gut, Funzt alles bestens.
Nun wird es etwas schwieriger und zwar, kann ich das auch über die tastatur steuern? Desweiteren, ist es möglich die Punkte während des spieles anzeigen zu lassen? Kann man vielleicht die geschwindigkeit einstellen und so den schwierigkeitsgrad anpassen und die punktzahl? |
Re: Snake für die Schule programmieren,Pause;Highscoures ein
Dei GEschwindigkeit mit dem Interval des Timers -> je geringer desto schwieriger
Pfeiltasten : Nimm die OnKeyDown/OnKeyPRess-Ereignisse der Form |
Re: Snake für die Schule programmieren,Pause;Highscoures ein
Wegen der Geschwindigkeit...
Delphi-Quellcode:
Wie soll ich denn da ein Intervall einfügen? Oder ist es die falsche Prozedur?
procedure TForm1.Timer1Timer(Sender: TObject);
begin calc_snake; if not ende then paint_map; end; |
Re: Snake für die Schule programmieren,Pause;Highscoures ein
Hi,
den Intervall kannst du mit
Delphi-Quellcode:
verändern. Je kleiner die Zahl ist (also statt 100 nimmst du 80), desto schneller läuft das Spiel.
Timer1.Intervall := 100; // z.B.
|
Re: Snake für die Schule programmieren,Pause;Highscoures ein
Danke, sorry dass ich so ein noob bin
|
Re: Snake für die Schule programmieren,Pause;Highscoures ein
Zitat:
|
Re: Snake für die Schule programmieren,Pause;Highscoures ein
Hi Markus,
ich möchte mal kurz klarstellen, da du in jedem Post schreibst, dass du ein "Noob" bist. Ich sehe das anders. Wir alle waren einmal Anfänger. Dieses Forum ist eine Anlaufstelle für Anfänger und auch "alte Hasen". Dieses Forum ist dafür da, um Fragen zu stellen, die wir beantworten. Du brauchst also nicht jedesmal zu sagen, dass du ein Noob bist. Wir sind hier um zu helfen. :) |
Re: Snake für die Schule programmieren,Pause;Highscoures ein
Okay danke, hier im Forum muss man sich einfach wohl fühlen. Das mit dem Geschwindigkeit habe ich hinbekommen. Funzt soweit alles super.
Nun möchte ich für die einzelnen Geschwindigkeiten unterscheidlich Punkte vergeben. Für Langsam nur einen, Mittel 5 und Schnell 10 pro gefressenen Punkt. Bin gerade am Tüfetel wie ich das am besten mache. Ne Lösung dass er die Punkte während dessen anzeigt, habe ich auch noch nicht :wink: Danke dir/euch! |
Re: Snake für die Schule programmieren,Pause;Highscoures ein
Hi,
ich würde evtl. so etwas vorschlagen:
Delphi-Quellcode:
Das mit Const kannst du über "implementation" hinschreiben.
const
Langsam = 250; Mittel = 140; Schnell = 80; // Constende^^ // Diese Zahlen können auch anders lauten. // Dann kannst du mit Timer1.Intervall := Langsam; // die Geschwindigkeit einstellen. (Du kannst Langsam mit Mittel und Schnell ersetzen). // Dann kannst du dort, wo du die Kollision mit dem Futter hast (sprich, da wo die Schlange das Futter frisst) z.B. so etwas machen if Timer1.Intervall = Langsam then Punkte := Punkte + 5 else if Timer1.Intervall = Mittel then Punkte := Punkte + 8 else if Timer1.Intervall = Schnell then Punkte := Punkte + 12; // Diese Punkte können auch variieren. Die Lösung ist zwar nicht perfekt, aber ich denke für die Schule ist das völlig ausreichend. Zitat:
Dann kannst du einfach in deinem Timer per:
Delphi-Quellcode:
PunkteLabel.Caption := 'Punkte:' + IntToStr(Punkte);
|
Re: Snake für die Schule programmieren,Pause;Highscoures ein
So einfach kann Delphi sein! Warums sagt man uns sowas nicht in der Schule! Danke dir. Funzt perfekt!
|
Re: Snake für die Schule programmieren,Pause;Highscoures ein
Zitat:
|
Re: Snake für die Schule programmieren,Pause;Highscoures ein
Für die Punkte: Einfach ein Label irgendwohin und dann hinter dem Addieren der Punkte etwa sowas:
Delphi-Quellcode:
LabelX.Caption:=IntToStr(Punkte);
|
Re: Snake für die Schule programmieren,Pause;Highscoures ein
Hi,
ich habe am anfang gelesen, dass du noch eine Highscore machen willst... Bei Interese meld dich bei mir mal per PM. Ich hab letztens auch snake programmiert. Dann such ich's mal für die raus. Ach außerdem: Wie steuerst du die schlange? Über buttons? Das ginge nämlich auch per tastenklick - da muss man aber was bei beachten, denn die methode onkeydown is zu langsam dafür :) Auch hier gillt: Bei interesse: PM |
Re: Snake für die Schule programmieren,Pause;Highscoures ein
Tut mir leid ich kann typen wie dich nicht leiden: Das ist ein FORUM also weigere dich nicht zu Posten.
Wie langsam das über die OnKey...-ereignisse ist liegt an DIR. Das ist kaum zu langsam. Wenn du auf GetAsyncKeyState anspielst, ist das zwar eine Möglichkeit, aber die OnKey...-ereignisse reichen hier völlig aus. Das mi den Highscors ist glaub ich auch hinreichend geklärt |
Re: Snake für die Schule programmieren,Pause;Highscoures ein
@inherited: das du mich nicht leiden kannst ist deine sache :)
Er hatte in diesem Treath nach was anderem gefragt und ich habe schon genug anschiss bekommen weil ich versch in einem Treath angefangen habe... daher wollte ich das über PM oder von miraus auch einen neuen forumeintrag (treath) regeln... Ja ich spiele auf GetAsyncKeyState an... Bei einigen bewegungen ist onkeydown zu langsam. das habe ich damals schon beim entwickeln von meinem snake gesagt bekommen - und es stimmt! Bei interesse kann ich dir ja mal den Treath von mir hier rein schreiben... EDIT: Ich finde übrigens keinen einigen hinweis zu rekorddatenbank in diesem forum....also was ist da geklärt? =>ich habe nicht nach punktezählern gefragt.... |
Re: Snake für die Schule programmieren,Pause;Highscoures ein
Wieso sollte OnKEyDown/Press zu langsam sein? es reicht ja wenn die richtung geändert wird.
|
Re: Snake für die Schule programmieren,Pause;Highscoures ein
hier der link:
![]() es liegt nicht an einer richtungsänderung sondern an zwei direkt aufeinanderfolgenden inerhalb von einer sekunde... |
Re: Snake für die Schule programmieren,Pause;Highscoures ein
Hallo da bin ich wieder. Leider habe ich nichts darüber gefunden, wie es schnell genug mit den Pfeiltasten steuern kann. Jemand ne Idee?
Dann noch das Problem mit der Highscore, es müsse eine datei angelegt werden, in der der eingegebene Name und die Punkte gespeichert werden. Leider habe ich davon überhaupt keinen Plan |
Re: Snake für die Schule programmieren,Pause;Highscoures ein
Entweder nimmst d
u dafür eine Ini-Datei oder einen FileStream. Beispiel Filestream:
Delphi-Quellcode:
Ohne garantie bin heut nich so gut drauf^^
var
fs: TFileStream; begin try fs:= TFileStream.Create(Dateiname, fmCreate); fs.Write(Length(RekordName), SizeOf(Integer)); fs.Write(RekordName, SizeOf(RekordName)); fs.Write(Length(RekordZahl), SizeOf(Integer)); fs.Write(RekordZahl, SizeOf(RekordZahl)); finally fs.Free; end; [...] var fs: TFileStream; begin fs:= TFileStream.Create(Dateiname, fmOpenRead); try fs.Read(Laenge, SizeOf(Integer)); fs.Read(AktuellerRekordName, Laenge); fs.Read(Laenge, SizeOf(Integer)); fs.Read(AktuellerRekord, Laenge); finally fs.Free; Also, verbessert mich wenn ich falsch liege oder stehe^^ |
Re: Snake für die Schule programmieren,Pause;Highscoures ein
Danke dir, leider verstehe ich das net....^^
Es muss sich doch auch ein edit fenster öffnen wo ich den namen eintragen muss. kannst du mir helfen bei den pfeiltasten die zu steuern? |
Re: Snake für die Schule programmieren,Pause;Highscoures ein
also bei onkeydown kannst du die pfeiltasten (
![]() ![]() |
Re: Snake für die Schule programmieren,Pause;Highscoures ein
Sry ich habe davon keine Ahnung. Verstehe nur Bahnhof. Onekeydown soll zu langsam sein habe ich gehört---
|
Re: Snake für die Schule programmieren,Pause;Highscoures ein
Keine Ahnung ist keine Entschuldigung ;)
In Spielen ist es oft üblich, eine enge Haupt- oder Renderschleife laufen zu lassen, in der alle Stati des Programmes (deshalb auch "Statemachine-Ansatz") überprüft und Aktionen ausgeführt werden:
Delphi-Quellcode:
Ich denke nicht, dass OnKeyDown langsam wäre; OnKeyDown reagiert auf die "WM_KEYDN" (o.ä. ;) ) Windows-Message und sollte über die Form unmittelbar erreicht werden. Dort kannst du dann die Eigenschaft Key überprüfen:
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;
Delphi-Quellcode:
if Key = VK_LEFT then
... |
Re: Snake für die Schule programmieren,Pause;Highscoures ein
Ich finde letzteres einfacher. Nur wie baue ich das in den quelltext ein. habe z.zt prozeduren, für die buttonclicks
|
Re: Snake für die Schule programmieren,Pause;Highscoures ein
Du hast bereits mit den Buttons entsprechende Prozeduren für die Bewegung? dann so:
- Auf die Form gehen - Im OI auf "Ereignisse" - auf "OnKeyDown" doppelklicken - dann das in die neue Prozedur eintragen:
Delphi-Quellcode:
Du rufst also einfach die Prozeduren auf, die du schon bei den Buttons benutzt. Warum das irgendwie langsamer sein sollte als anders, weiß ich nicht...
case Key of
VK_LEFT: Schlange_Links(self); // wird bei dir wohl Button1Click oder so heißen ;) VK_RIGHT: ... end; Evenutell solltest du KeyPreview der Form im OI auf true stellen, damit du alle Tastendrücke mitkriegst. |
Re: Snake für die Schule programmieren,Pause;Highscoures ein
Da kommt immer ) erwartet aber : gefunden.... In der parameterliste ist irgendwas falsch...
was muss da rein |
Re: Snake für die Schule programmieren,Pause;Highscoures ein
Und wenn ich da die Klammer mach wo er sie haben will, dann kommt
"Dies Form des Methodenaufrufs ist nur für Klassenmethoden erlaubt" |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:10 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