![]() |
Berechnungszeit zu lang. Optimierung??
Hi,
ich arbeite gerade an einem Programm, dass dem alten Spiel "Snake" ähneln soll. ![]() Es läuft soweit eig alles, bis auf eine Sache. Ich hoffe ihr könnt mir dabei helfen. Während des Spiels werden immer wieder 'Essens-Objekte' erstellt, durch welche die Schlange eben wachsen kann. Für die positionierung dieser Elemente müssen bestimmte Kriterien erfüllt sein: Erstens darf die Position nicht x > 20 und y > 20 betragen, da das Essen sonst außerhalb des Spielfeldes liegt. Zweitens muss jede Positionsangabe durch 10 teilbar sein, da sich die Schlange in 10er px Schritten auf der Form bewegt. (Anderst habe ich es nicht hinbekommen.) Hier mal meine Funktion:
Delphi-Quellcode:
Die Berechnung von diesen Koordinaten dauert einfach viel zu lange,
function throwFood():boolean;
var x,y:integer; begin repeat randomize; x:=0; y:=0; x := random(200); y := random(200); until (x > 20) and (y > 20) and (x mod 10 = 0) and (y mod 10 = 0); Form1.ShapeFood.Left := x; Form1.ShapeFood.Top := y; foodposx := x; foodposy := y; end; sodass das Spiel nicht wirklich dynamisch wirkt. Gibt es eine Möglichkeit die Berechnungszeit zu verkürzen? mfg. rotte |
Re: Berechnungszeit zu lang. Optimierung??
Naja, du lässt den computer x mal zahlen würfeln, bis deine zahl endlich den bedinungen entspricht... mach es doch so, dass die zahlen direkt so angepasst werden, dass sie auf alle fälle deinen bedinungen entsprechen!
z.B. so: //edit: Denkfehler-> Post von Phantom1 enthält den korrekten Code ;-) |
Re: Berechnungszeit zu lang. Optimierung??
Das "randomize" in deiner Schleife ist bestimmt nicht mit absicht gewesen oder? "randomize" sollte man nur einmal beim programmstart aufrufen, am besten im formcreate.
mein vorschlag um dein problem zu lösen:
Delphi-Quellcode:
function throwFood():boolean;
begin foodposx := (random(17)+3)*10; // zufallszahl von 30 bis 190 in 10er schritten foodposy := (random(17)+3)*10; // zufallszahl von 30 bis 190 in 10er schritten Form1.ShapeFood.Left := foodposx; Form1.ShapeFood.Top := foodposy; end; |
Re: Berechnungszeit zu lang. Optimierung??
wenn x und y nicht größer 20 sein dürfen, warum erzeugst du dann Zufallswerte bis 199 und nicht nur bis 20?
Ein anderer Punkt ist das ich persönlich niemals so eine Funktion schreiben würde da es eben im schlimmsten Fall eine Endlosschleife ist. Denn zufällig könnte random dir immer Werte größer 20 ausgeben. Zu deinem Punkt das die Werte durch 10 Teilbar sein müssen. So wirklich viel Punkte bleiben dann gar nicht übrig! denn kleiner gleich 20 sind nur 0,10 und eben 20. Was ich auch nicht verstehe ist warum du x und y auf 0 setzt und direkt danach einen Zufallswert zuweist. Kurz und knapp wie man es performanter macht ohne Endlosschleife etc.
Delphi-Quellcode:
var
MAX_VAL: Integer; FACTOR: Integer; x: Integer; y: Integer; begin MAX_VAL := 20; FACTOR := 10; x := random(MAX_VAL div FACTORY + 1); y := random(MAX_VAL div FACTORY + 1); |
Re: Berechnungszeit zu lang. Optimierung??
Zitat:
|
Re: Berechnungszeit zu lang. Optimierung??
als im ersten Beitrag steht:
Zitat:
|
Re: Berechnungszeit zu lang. Optimierung??
Zitat:
|
Re: Berechnungszeit zu lang. Optimierung??
Danke für die schnelle Hilfe.
Funktioniert jetzt wunderbar. Edit: Die Zahlen müssen größer als 20 sein. Tut mir Leid, wenn es etwas missverständlich war. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:25 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