steffen1997 hat geschrieben:Wie lange dauert das ungefähr als Anfänger?Das PRoblem bei mir ist ,ich weiß nicht wie ich etwas planen muss.
Das kann ich dir leider nicht sagen, es hängt von vielen persönlichen Faktoren ab...
Tja... planen ist so ne Sache. Ich für meinen Teil plane sowas nicht, sondern mach einfach drauf los.
Also ich könnte ja mal kurz umreißen, wie ich da gestern ran gegangen bin:
Zuerst hab ich mir überlegt, was braucht man? Das geht dann los, indem man erstmal versucht ein Quadrat auf die Form zu malen mit einer bestimmten Farbe. Hat man das geschafft wäre es gut, wenn man, da Snake ja in einem Raster unterteilt ist, durch einen Index, den man für X und Y angibt, das entsprechende Quadrat zeichnen lassen könnte. Damit die einzelnen Kästchen noch zu erkennen sind, wird dann jeweils ein Pixel von dem Quadrat weg gelassen. In der Funktion könnte man dann gleich noch einen Offset mit reinrechnen, damit die Kästchen nicht an der linken oberen Ecke der Form beginnen, sondern mit etwas Versatz... nun könnte man die gesamte Spielfläche schonmal mittels einer zweier verschachtelten Schleife, die die Zeichenfunktion aufruft, füllen. Dann zeichnet man um das ganze noch einen Rahmen, damit man die Spielfläche als solche erkennt. Als nächstes gilt es, eine Schlange zu erzeugen. Da anscheinend X und Y Werte ausreichen, um einen Punkt auf dem Feld zu bestimmen, könnte die Schlange aus einem entsprechenden Datentyp bestehen ( bei Delphi TPoint ). Und da die Schlange aus mehreren Feldern besteht, wäre ein dynamisches Array ( da die Schlange ja auch wachsen soll ) nicht schlecht. Nun braucht man eigentlich nur noch das dynamische Array mit Werten füllen und eine Funktion zu bauen, die dieses Array dann Zeichnen kann. Eine "Frucht" ist dann genau das gleiche, nur eben, dass es sich dabei nur um einen einzigen Punkt handelt... Mit einer Funktion lässt sich ein Zufallsort für die Frucht bestimmen. Damit diese aber nicht direkt auf der Schlange liegt, bräuchte man noch eine Funktion, die das feststellt. Die Funktion muss nun nur alle Schlangenfelder durchgehen und schauen, ob die an die Funktion übergeben Koordinaten ein Schlangenfeld treffen. Nun kann solange die Frucht per Zufall erzeugt werden, bis sie nicht mehr auf der Schlange liegt.
Will sich die Schlange bewegen, wird es etwas schwieriger... also was muss passieren, damit sich die Schlange bewegt? Es muss ein neues Feld bestimmt werden. Die Schlange ist so gespeichert, dass bei Index 0 der Kopf liegt. Das hatte ich so gewählt, weil sie ja nach hinten hin wächst. Also müsste man den Index 0 verschieben. Verschieben geht entweder in X oder Y Richtung jeweils um -1 oder +1... Damit der Kopf nun nicht vom Körper abreißt, wird das Array einmal von hinten nach vorne durchgegangen und jeweils die Koordinaten des davor dahinterliegenden Punktes geholt. Dabei lässt man allerdings das erste Element aus, weil es keinen Vorgänger hat. Man hat nun die Schlange um einen Punkt vorgerückt, allerdings liegt nun der Kopf auf dem Körper... nun kann dieser auch um eine Einheit auf die neue Position verschoben werden. Das ganze klappt nun ganz gut, aber wir haben da noch ein Problem, da das Bild nicht gelöscht wird, wirds mit der Schlange immer weiter voll gemalt. Also machen wir folgendes, bevor die Schlange verschoben wird, wird der letzte Punkt der Schlange mit der Hintergrundfarbe aufs Bild gezeichnet. Nun kriecht die Schlange wirklich. Nun müssen wir Tastendrücke mit einbauen. Dabei muss eigentlich nur geschaut werden, welche Pfeiltaste gedrückt wird, diese gibt die Richtung an. Wird die Richtung auch als TPoint gespeichert, muss man diese nur korrekt setzen und kann diese dann bei jedem Zeitschritt auf den Schlangenkopf addieren. Genau, dabei hab ich die Zeitschritte übergangen. Also um die zu realisieren habe ich einfach einen Timer benutzt. Diesen kannst du auf ein bestimmtes Intervall einstellen, damit die Prozedur alle paar Millisekunden ausgeführt wird.
Nachdem nun die technische Grundlage steht, muss noch ein wenig Spiellogik rein. Also wenn der Schlangenkopf, dessen Position wir immer neu bestimmen von den Koordinaten her die Spielfeldgrenze überschreiten würde, ist das Spiel verloren. Genauso, wenn man sich selbst trifft. Dafür haben wir ja glücklicherweise jetzt schon die Routine um zu prüfen, ob ein Punkt auf der Schlange liegt... also liegt die neue Position des Schlangenkopfes auf der Schlange, so ist das Spiel ebenfalls verloren. Liegt der Schlangenkopf auf einer Frucht, so wird die Frucht auf neue Koordinaten gesetzt. Auch dafür haben wir ja schon eine Funktion. Nun muss man das dynamische Array, aus welchem die Schlange besteht, einfach um ein Feld verlängern. Nun brauchen wir noch eine Zählervariable. Sie stellt die Punkte da. Auch diese wird erhöht, wenn der Schlangenkopf auf der Frucht liegt. Hier lasse ich noch das Zeitintervall des Timers mit einfließen, so erhält man für jede Frucht etwas mehr Punkte, denn außerdem wird das Zeitintervall des Timers verringert.
Nun brauchen fehlt nicht mehr viel. Zwei Buttons auf die Form gesetzt: Starten und Beenden. Beim Starten werden die ganzen Initialisierungen vorgenommen, die eine Spielrunde bestimmen, also Schlange und Schlangenlänge auf Startposition, Richtung setzen, Punkte auf 0 Setzen, Timerintervall setzen, die beiden Buttons verstecken und den Timer starten. Ist das Spiel verloren ( ja gewinnen ist nicht möglich ), dann wird eine Meldung angezeigt, der Timer wieder deaktiviert und die Buttons wieder angezeigt. Der Beenden Button ist trivial. Nun fehlt nur noch eine Kleinigkeit, die Punkte müssen noch über ein entsprechendes Label ausgegeben werden.
Das wars... schon ist das erste Spiel fertig.
Wenn du dich lange genug mit Programmieren beschäftigst, dann musst du garnicht mehr darüber nachdenken, wie das alles umgesetzt wird. Genauso wie wenn du die Treppen hoch und runtergehst... da denkst du auch nicht über das "wie" nach. Selbst wenn du anfängst sie hoch oder runterzurennen, zu springen oder sonstwas, du musst nicht jedesmal neu lernen, wie man die eine oder andere Bewegung beim Treppen erklimmen anwendet, man macht es intuitiv.
Ich hoffe mal, die Anleitung hilft dir ein wenig, das Vorgehensprinzip für so ein Spiel zu verstehen.
Vielleicht machst du ja dann mal was für eine kommende ZFX-Action. Ich würde mich freuen! :D
PS: Und vergiss nicht, das, was du hinbekommst uns im Vorstellungsthread zu präsentieren!
Happy Coding! :D