Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Snake - meine Kreation (https://www.delphipraxis.net/164806-snake-meine-kreation.html)

Drachenchamp 30. Nov 2011 14:14


Snake - meine Kreation
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hey Leute,

ich habe während einer Praktikumswoche mal Snake programmiert. Als Vorlage nahm ich dieses Tutorial:
http://www.delphipraxis.net/22871-snake-das-spiel.html
Dann habe ich ein paar Sachen hinzugefügt (u.a. 3 Schwierigkeitsstufen). Vielleicht wollt ihr mir ja sagen, was ihr davon haltet...
(Zur Info: Ich programmiere erst seit ca. 3 Wochen mit Delphi.)

Drachenchamp

schlagzu 30. Nov 2011 14:32

AW: Snake - meine Kreation
 
Nicht schlecht. Zwei Fehler ist mir aufgefallen, wenn man kein Bild im Laden-Dialog auswählt, kommt 'Unbekannte Bilderweiterung (.)' und die Form startet bei mir über den linken Bildschirmrand hinaus.

MfG schlagzu

wicht 30. Nov 2011 14:33

AW: Snake - meine Kreation
 
Das konnte mich 15 Minuten vom langweiligen Arbeitsalltag ablenken!

Zwei Kleinigkeiten:
- Ich war tot, habe neu angefangen auf Mittel. Meine Schlange wurde scheinbar genau vor einem Hindernis wiederbelebt und ich bekam sofort die Meldung, dass ich gegen ein Hindernis gelaufen bin.
- Wenn man sich nach rechts bewegt und ganz schnell hintereinander "Pfeil nach oben" und dann "Pfeil nach links" drückt ist man tot, obwohl die Schlange sich nicht nach oben bewegt hat. Im Programmablauf vielleicht schon, visuell aber nicht.

Wenn du daran weiter arbeiten möchtest, würde ich den Quelltext (der für "nur 3 Wochen Programmiererfahrung" nicht schlecht ist wie ich sagen würde) vielleicht mit ein paar Klassen ausstatten, z.B. TSchlange, TSchlangenTeil, TFutter (Sichtwort Objektorientierte Programmierung). Damit wird das alles noch leserlicher. Und wenn du es auf die Spitze treiben möchtest kannst du vielleicht auch mit Andorra 2D experimentieren, dann kannst du DirectX/OpenGL nutzen für ein paar schöne Effekte und so :)

Drachenchamp 30. Nov 2011 15:56

AW: Snake - meine Kreation
 
Danke für die Antworten!
Zitat:

Zitat von schlagzu (Beitrag 1138627)
Nicht schlecht. Zwei Fehler ist mir aufgefallen, wenn man kein Bild im Laden-Dialog auswählt, kommt 'Unbekannte Bilderweiterung (.)' und die Form startet bei mir über den linken Bildschirmrand hinaus.

Den Fehler mit dem Bildschirm habe ich behoben. (Das kommt daher, dass ich während des Praktikums 2 Bildschirme benutze.) Das mit der Bilddatei, fällt mir grade auf, funktioniert gar nicht. Das Futter wird dann gar nicht dargestellt. Weiß jemand, woran das liegt?

Zitat:

Zitat von wicht (Beitrag 1138628)
Zwei Kleinigkeiten:
- Ich war tot, habe neu angefangen auf Mittel. Meine Schlange wurde scheinbar genau vor einem Hindernis wiederbelebt und ich bekam sofort die Meldung, dass ich gegen ein Hindernis gelaufen bin.
- Wenn man sich nach rechts bewegt und ganz schnell hintereinander "Pfeil nach oben" und dann "Pfeil nach links" drückt ist man tot, obwohl die Schlange sich nicht nach oben bewegt hat. Im Programmablauf vielleicht schon, visuell aber nicht.

Weißt du, wie ich diese Fehler beheben kann?

Gruß, Drachenchamp

wicht 30. Nov 2011 16:09

AW: Snake - meine Kreation
 
Zitat:

Weißt du, wie ich diese Fehler beheben kann?
Auf Anhieb leider nicht, aber vielleicht findet sich hier noch jemand, der sich etwas näher damit auseinandersetzt :stupid:

Bummi 30. Nov 2011 16:15

AW: Snake - meine Kreation
 
wegen der Bilddatei
Delphi-Quellcode:
    case map[i, j] of
        .....
       -1: if CheckBox_Futterbild.Checked then
              Apple.Picture.LoadFromFile(OpenDialog.FileName)
Du willst das Bild wirklich beim Zeichnen jedes Mappoints neu laden?
setze hier einfach nur die Farbe.
Da wo Du zeichnest fehlt die Unterscheidung
Delphi-Quellcode:
  if CheckBox_Futterbild.Checked and Assigned(Apple.Picture.Graphic) then
tja und da fehlt dann das Malen...

von Vorteil wäre auch:
Delphi-Quellcode:
  if OpenDialog.Execute then
     Apple.Picture.LoadFromFile(OpenDialog.FileName);
und ein Dialog der es nicht zulässt alles Möglich zu laden.

Drachenchamp 1. Dez 2011 10:28

AW: Snake - meine Kreation
 
Zitat:

Zitat von Bummi (Beitrag 1138661)
Delphi-Quellcode:
  if CheckBox_Futterbild.Checked and Assigned(Apple.Picture.Graphic) then
tja und da fehlt dann das Malen...

Wo und wie genau muss ich das in den Quelltext einbauen?

Drachenchamp 2. Dez 2011 12:49

AW: Snake - meine Kreation
 
Wenn noch jemand dieses Thema verfolgt, wäre ich dankbar für eine Erklärung, wie ich den o.g. Abschnitt in den Quelltext einbauen kann...

Bummi 2. Dez 2011 13:11

AW: Snake - meine Kreation
 
Das Stichwort für die Suche wäre Canvas.Draw ...

Blup 2. Dez 2011 14:43

AW: Snake - meine Kreation
 
Dem Ereignis "CheckBox_Futterbild.OnClick" ist derzeit die Methode "FormCreate()" zugewiesen.
Es sollte aber besser die Methode "FutterBild()" sein.

Ich hab mich bemüht nicht zu viel zu ändern:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  {Apfel erzeugen, unsichtbar}
  Apple:=TImage.Create(Form1);
  Apple.Visible := False;
  Application.HintHidePause:=4000;

{...}

end;

procedure TForm1.FutterBild(Sender: TObject);
begin
  {Checkbox wurde an oder ausgeschalten}
  if CheckBox_Futterbild.Checked then
  begin
    if OpenDialog.Execute then
    begin
      Apple.Picture.LoadFromFile(OpenDialog.FileName);
      if Assigned(Apple.Picture.Graphic) then
        Apple.Picture.Graphic.Transparent := True;
    end;
    CheckBox_Futterbild.Checked := Assigned(Apple.Picture.Graphic);
  end;
  {neu Zeichnen}
  paint_map;
end;

{Das Zeichnen auf mehrere Methoden verteilt}
function TForm1.GetItemColor(AItem: Integer): TColor;
begin
  case AItem of
    -2: Result := ColorDialog_Wand.Color;
    -1: Result := ColorDialog_Futter.Color;
     0: Result := ColorDialog_HG.Color;
  else Result := ColorDialog_Schlange.Color;
  end;
end;

procedure TForm1.paint_background(ARect: TRect);
begin
  {Hintergrund zeichnen}
  Spielfeld.Canvas.Brush.Color := ColorDialog_HG.Color;
  Spielfeld.Canvas.FillRect(ARect);
end;

procedure TForm1.paint_field(AItem: Integer; ARect: TRect);
begin
  {Bild des Futters zeichnen}
  if CheckBox_Futterbild.Checked and (AItem = -1) then
  begin
    paint_background(ARect);
    Spielfeld.Canvas.StretchDraw(ARect, Apple.Picture.Graphic);
  end
  else if RadioButton_Kreise.Checked then
  begin
    paint_background(ARect);
    if AItem <> 0 then
    begin
      Spielfeld.Canvas.Brush.Color := GetItemColor(AItem);
      Spielfeld.Canvas.Ellipse(ARect);
    end;
  end
  else
  begin
    Spielfeld.Canvas.Brush.Color := GetItemColor(AItem);
    Spielfeld.Canvas.FillRect(ARect);
  end;
end;

procedure TForm1.paint_map;
var
  x, y: Integer;
begin
  for y := 0 to breite do
    for x := 0 to hoehe do
      paint_field(map[x, y], Rect(x*raster, y*raster, (x+1)*raster, (y+1)*raster));
end;

Drachenchamp 3. Dez 2011 18:18

AW: Snake - meine Kreation
 
Danke, ich werde es Montag ausprobieren. :thumb:

isilive 14. Dez 2011 22:16

AW: Snake - meine Kreation
 
Also vor allem eines hab ich gelernt: Ja nicht auf Futterbild laden klicken :shock:
Klick mal drauf, dann auf abbrechen, dann auf Spiel starten und dann versuch mal aus dem Sumpf wieder rauszukommen :twisted:

Ansonsten sehr gut für ein erstes Programmierprojekt! Respekt! :thumb:

Meine Verbesserungsvorschläge:

- das Fenster kleiner machen
- die Spielfeldgrösse sollte man gleich zu Beginn sehen / sobald man Breite und Höhe verändert (onchange)
- ein Icon wär noch schön (Projektoptionen)
- mach ein RICHTIGES Spiel draus! :-D Soll heissen: Verstecke/verkleinere unwichtige Buttons wie die ganzen Farboptionen und mach nur die wichtigsten Buttons hin. So dass sich ein Kind sofort auskennt und drauflosspielt. Das ist jetzt nicht mehr viel Arbeit, aber macht dann gleich mehr "her".
- evtl. die Optionen auf ein zweites Form (das ist dann aber am Anfang etwas Aufwand bis man's einmal gelernt hat (ist nicht schwer))
- das mit dem Futterbild muss leicht verständlich funktionieren (für reine Anwender, die den Quellcode nicht kennen) und wenn man abbricht darf keine Exception kommen.
- evtl. ein einzigartiger Name: xxx's Snake vielleicht ?
- ich find Kreise als defaultwert schöner, is aber Geschmackssache

LG Stefan

Coffeecoder 15. Dez 2011 13:27

AW: Snake - meine Kreation
 
Hey,

Gute Arbeit :thumb:
Doch ich will auf einen kleinen Fehler hinweisen:
Das Eingabefeld "Schlangenlänge" kann man manipulieren und die Schlange wird länger. Dieses Eingabefeld sollte disabled werden oder durch einen Label komplett ersetzt werden.

Drachenchamp 9. Jan 2012 15:59

AW: Snake - meine Kreation
 
Frohes neues Jahr!

Zitat:

Zitat von Coffeecoder (Beitrag 1141582)
Das Eingabefeld "Schlangenlänge" kann man manipulieren und die Schlange wird länger. Dieses Eingabefeld sollte disabled werden oder durch einen Label komplett ersetzt werden.

Das ist Absicht, damit man, falls man verliert, da anfangen kann, wo man aufgehört hat.
Werd mich evtl. bald mal wieder dran setzen und das Projekt weiter ausbauen/verbessern. Ich bin im Moment in der Schule sehr beschäftigt (u.a. Java-Programmierung... :evil:), kann also eine Weile dauern. Danke für die vielen Vorschläge! :thumb:

Drachenchamp

Coffeecoder 9. Jan 2012 16:56

AW: Snake - meine Kreation
 
Zitat:

Zitat von Drachenchamp (Beitrag 1145075)

Das ist Absicht, damit man, falls man verliert, da anfangen kann, wo man aufgehört hat.

Ich finde es nicht sinnvoll, da weiterzumachen wo du verloren hast. Doch es heisst "Snake - meine Kreation".
Wenn du in die Richtung gehen willst dann füge z.B. 3 Leben für den Spieler ein. Jedes mal wenn er verliert dann verliert er auch ein Leben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:41 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