Delphi-PRAXiS
Seite 1 von 2  1 2      

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)

MarkusUhl 20. Jun 2006 20:28


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:

inherited 20. Jun 2006 20:31

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 -.-

MarkusUhl 20. Jun 2006 20:34

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.

inherited 20. Jun 2006 20:37

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

MarkusUhl 20. Jun 2006 20:44

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?

inherited 20. Jun 2006 20:51

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

MarkusUhl 20. Jun 2006 20:53

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
Das hab ich verstanden, nur die umstetzung!

inherited 20. Jun 2006 20:57

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
Delphi-Quellcode:
  if (kopf.X=futter.X) and (kopf.Y=futter.Y) then
  begin
    Punkte:=Punkte+5;
    Inc(laenge);
    neues_futter;
  end;
Und dann
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;

MarkusUhl 20. Jun 2006 21:00

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^^

inherited 20. Jun 2006 21:01

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
Ohne das T vor TForm^^

MarkusUhl 20. Jun 2006 21:05

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

inherited 20. Jun 2006 21:08

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
LOL, das muss so heißen:
Delphi-Quellcode:
Form1.Pause.Visible:=False;

MarkusUhl 20. Jun 2006 21:11

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

MarkusUhl 20. Jun 2006 21:52

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?

inherited 21. Jun 2006 07:45

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

MarkusUhl 21. Jun 2006 13:44

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
Wegen der Geschwindigkeit...

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  calc_snake;
  if not ende then
    paint_map;
end;
Wie soll ich denn da ein Intervall einfügen? Oder ist es die falsche Prozedur?

Die Muhkuh 21. Jun 2006 13:47

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

den Intervall kannst du mit

Delphi-Quellcode:
Timer1.Intervall := 100; // z.B.
verändern. Je kleiner die Zahl ist (also statt 100 nimmst du 80), desto schneller läuft das Spiel.

MarkusUhl 21. Jun 2006 13:51

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
Danke, sorry dass ich so ein noob bin

Daniel 21. Jun 2006 14:10

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

Zitat von MarkusUhl
Danke, sorry dass ich so ein noob bin

Kein Problem - jeder hat mal angefangen. ;-)

Die Muhkuh 21. Jun 2006 14:12

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. :)

MarkusUhl 21. Jun 2006 14:38

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!

Die Muhkuh 21. Jun 2006 14:44

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

ich würde evtl. so etwas vorschlagen:

Delphi-Quellcode:
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.
Das mit Const kannst du über "implementation" hinschreiben.

Die Lösung ist zwar nicht perfekt, aber ich denke für die Schule ist das völlig ausreichend.

Zitat:

Ne Lösung dass er die Punkte während dessen anzeigt, habe ich auch noch nicht
Geht auch ganz einfach. Du machst dir irgendwo ein Label auf die Form, auf dem die Punkte angezeigt werden sollen.
Dann kannst du einfach in deinem Timer per:

Delphi-Quellcode:
PunkteLabel.Caption := 'Punkte:' + IntToStr(Punkte);

MarkusUhl 21. Jun 2006 14:53

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!

Die Muhkuh 21. Jun 2006 14:54

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

Zitat von MarkusUhl
So einfach kann Delphi sein! Warums sagt man uns sowas nicht in der Schule! Danke dir. Funzt perfekt!

Bitte, kein Problem :)

inherited 22. Jun 2006 14:10

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);

netscanner 22. Jun 2006 14:48

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

inherited 22. Jun 2006 14:56

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

netscanner 22. Jun 2006 16:52

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....

inherited 22. Jun 2006 16:53

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.

netscanner 22. Jun 2006 16:56

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
hier der link: http://www.delphipraxis.net/internal...423&highlight=

es liegt nicht an einer richtungsänderung sondern an zwei direkt aufeinanderfolgenden inerhalb von einer sekunde...

MarkusUhl 26. Jun 2006 13:36

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

inherited 26. Jun 2006 14:22

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:
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;
Ohne garantie bin heut nich so gut drauf^^
Also, verbessert mich wenn ich falsch liege oder stehe^^

MarkusUhl 26. Jun 2006 14:25

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?

DGL-luke 26. Jun 2006 14:41

Re: Snake für die Schule programmieren,Pause;Highscoures ein
 
also bei onkeydown kannst du die pfeiltasten (MSDN-Library durchsuchenVK_LEFT etc.) abprüfen, außerdem in einer schleife o.ä. über MSDN-Library durchsuchengetAsyncKeyState

MarkusUhl 26. Jun 2006 14:44

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---

DGL-luke 26. Jun 2006 15:52

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:
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;
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:

Delphi-Quellcode:
if Key = VK_LEFT then
  ...

MarkusUhl 26. Jun 2006 16:01

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

DGL-luke 26. Jun 2006 16:49

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:
case Key of
  VK_LEFT: Schlange_Links(self); // wird bei dir wohl Button1Click oder so heißen ;)
  VK_RIGHT: ...
end;
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...

Evenutell solltest du KeyPreview der Form im OI auf true stellen, damit du alle Tastendrücke mitkriegst.

MarkusUhl 26. Jun 2006 20:56

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

MarkusUhl 26. Jun 2006 20:58

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.
Seite 1 von 2  1 2      

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