Hi,
In diesem Workshop geht es wie ich angekündigt hab um das alte Handygame "Snake", Ziel ist es das Programm wietestgehend selbstständig nachzumachen
Vorwort
Für alle die nicht wissen was Snake überhaupt ist, hier eine kurze Erklärung:
Quote:
Bei dem Spiel Snake geht es um eine Schlange, wie der Name unschwer vermuten lässt .
Im laufe des Spiel muss diese Schlange, die Anfangs ehr ein kleiner Wurm ist, Futterkörner fressen umzu wachsen.
Dabei muss der Spieler darauf achten sich nicht selber zu beissen, ansonsten ist das Spiel vorbei und man hat verloren.
Warum ein Workshop und kein Tutorial?
Ihr werdet später sehn, dass es wenig gibt was einer größeren sachlichen Erklärung bedarf.
Bei dieser Arbeit geht es vorallem darum logische Vorgänge zu verstehn und die Problematik einiger Vorgänge zu durchschaun und zu lösen.
Alles durch ein Tutorial vorgekaut zu bekommen wäre sinnlos, da man nicht nachdenken muss und folglich nichts neues lernt.
Grundvorraussetzungen
grundlegende AutoIT Kenntnisse
AutoIT Compiler und einen geeigneten Editor (SciTe, etc.)
Die ResourceDaten aus dem Anhang (Grafiken)
logisches Denkvermögen und Interesse
An alle Copy&Paster:
Bitte spart euch die Arbeit ab hier weiterzulesen und ladet euch einfach den vollständigen SourceCode aus dem Anhang.
Also, falls ihr alle Voraussetzung erfüllt und genug Bereitschaft habt die Arbeit durchzuziehen kann's ja losgehn
Solltet ihr wirklich mal ernsthafte Probleme, trotz meinen Hinweisen, haben könnt ihr auf meine Codesequenzen im unteren Teil des Abschnittes zurückgreifen.
Das Grundgerüst
Damit man eure Ansätze mit meinen Codebeispielen vergleichen kann, solltet ihr ein ähnliches Grundgerüst haben
Dafür brauch ihr als erstes eine GUI, die ungefähr so aussehn sollte:
Die Maße sind:
Fenster: 300*300px
Kopf und Körpersegmente: 10*10px Die KörperTeile befinden sich in einem Array.
Achtung: Diese Angaben sind für spätere Funktionen äußerst wichtig, solltet ihr die Daten abändern achtet bitte immer darauf, dass der Quotient aus Fenstergröße und Körperteilgröße immer ganzzahlig ist!
Zusätzlich braucht ihr eine Schleife, die sich wiederholt solange kein Fehler gemacht wird.
Ich hab den einfachsten Weg gewählt und einfach eine Endlosschleife genommen.
Wenn man verliert beendet sich das Programm einfach durch "Exit".
Ihr könnt das auch gerne anders lösen, allerdings kann es dann gut sein, dass euer Script nichtmehr mit dem Meinem verglichen werden kann.
Gut, da wir nun das Einfache geklärt hätten kann es weitergehn
Bis jetzt sollte alles verständlich sein, solltet ihr trotzdem schon Probleme bekommen haben schaut euch bitte erstmal die Grundlagen an (was ich aber nicht glaube^^)
Bewegung und Steuerung
Bewgung
Natürlich muss sich die Schlange auch bewegen können, nur wie stell ich das am besten an und worauf muss ich achten?
Nunja, wie ihr das anstellt bleibt euch überlassen (sonst wäre es ja kein Workshop und auch nicht EUER eigenes Programm )
Hier allerdings einige Tipps, die euch helfen werden:
Differenziert die einzelnen Bewegungsrichtungen und probiert nicht sie in einer Funktion zusammenzufassen
Das Programm muss erkennen wann die Schlange den Rand des Fensters erreicht hat und darauf reagieren (Die Schlange kommt am anderen Ende des Fensters wieder herraus)
Additon und Subtraktion spielen eine wichtige Rolle
Die Schlange muss sich auch ohne eine Eingabe vom Spieler in die eingeschlagene Richtung fortbewegen
Der Kopf muss sich immmer in gleichgroßen Schritten bewegen (am besten seine eigene Größe)
Soblad ihr einen funktionierenden Ansatz für eine Richtung habt könnt ihr das Prinzip auf die anderen Richtungen übertragen.
Steuerung
Die Steuerung ist dagegen ehr Schreibkram, auch dafür ein paar Tipps:
Variablen helfen bei der Differenzierung/Bestimmung der Richtungen
Es muss irgendwie erkannt werden welche Taste gedrückt wurde und die jeweilige Taste mit der dazugehörigen Bewegungsfunktion verknüpft werden(Ich hab die Pfeiltasten genommen)
Du musst eine Pause einsetzen, da ansonsten der Kopf einfach so durchrast und gar nicht mehr erkannt werden kann o0 (aber bitte kein Sleep abgesehn von Tests, Timer und Do...Until... ftw. Überlegt was der Vorteil dieser Schreibweise ist und nutzt ihn intelligent aus)
Es geht nur um den Kopf!
Überlegt 2mal ob die Positionen an denen die Schlange am anderen Ende des Fenster wieder herauskommt auch richtig ist (ich hatte nen recht dummen Fehler, der darauf beruhte, dass ich nicht ordentlich über den richtigen Einsetzpunkt nachgedacht hab Folge war, dass die Schlange nach durchschreiten des Fensterrandes ein Bewegungschschritt zuspät wieder am anderen Ende erschien^^300-10=290)
Solltet ihr etwas nicht verstanden haben oder euch ein Tipp gefehlt hat zögert nicht mir eine PM zu schicken oder hier im Thread zu fragen.
Es ist nicht unbedingt leicht abzuschätzen welche Fragen jmnd. hat der das Programm noch nicht geschrieben hat
Futter erstellen und Fressen
Futterkörner an einer zufälligen Position erstellen
Dieser Teil beansprucht nicht viel Zeit aber hier spielen die Fenster und Körpermaße die größte Rolle
Worauf muss ich beim erstellen des Futterkorns achten?
Das Futterkorn muss genauso groß sein wie der Kopf
Das Futterkorn muss sich ein einem Raster befinden, so dass der Schlangenkopf sich genau auf die Position des Korn's bewegen kann (Die Größe des Bewegungschrittes des Kopfes, nen bisschen Multiplikation und "Random" sind hier von Bedeutung)
So sollte das Fenster danach aussehn:
Fressen
Das Fressen bedarf keiner weiter großen Tipps (es muss nur darauf geachtet werden, dass dem Körper-Array ein neues Teil hinzugefügt wird)
Auf den Rest sollte man leicht selber kommen
Die Grafik für das Korn findet ihr im Anhang bei den ResourceDaten.
Körpermangement
Das folgen des Körpers
Jetzt kommt der wohl anspruchsvollste Teil (zumindest hab ich ihn so empfunden, vllt. ist es aber mit den Tipps leichter )
Es geht wie die Überschrifft schon sagt um die Bewegung des restlichen Körpers, Ziel ist es, dass der Körper dem Kopf folgt.
Hier die Tipps:
Der Kopf bleibt unbeeinflusst von dieser Funktion, seine Position spielt aber eine Rolle
Die Funktion wird am besten direkt nach der Bewegung des Kopfes ausgeführt
Man brauch die alte Position des Kopfes bevor er weiterbewegt wurde.
Das Körpersegment x nimmt die Position des Segments x-1 an nachdem x-1 die alte Position von x-1-1 angenommen hat usw.; DIE SEGMENTE BEFINDEN SICH IN EINEM ARRAY *hust* (Brainfuck o0 )
Game Over
Irgendwann kommt der traurige Zeitpunkt wo das Spiel vorbei ist
Die Funktion dafür stellt nach den anderen Dingen die ihr bis jetzt gemacht habt keine Schwierigkeit mehr dar.
Alles was ihr jetzt noch braucht ist eine ForSchleife und den KörperArray.
Das Programm soll überprüfen ob sich der Kopf auf der Position eines der Körpersegmente befindet.
Falls Ja soll sich Snake schließen ansonsten soll es einfach normal weiterlaufen.
Die beiden Aufgaben können am besten in einer Funktion zusammengefasst werden
-Codebeispiele-
Nur dann benutzen, wenn ihr absolut verzweifelt seid und es selber nicht auf die Reihe bekommt!
Ihr werdet bei genauer Betrachtung sehn, dass ich bereits einige Funktionen eingebaut habe, die das Programm flüssiger laufen lassen oder kleine Bugs ausmerzen.
Ihr braucht euch dafür allerdings nicht diese Beispiele durchzulesen, falls ihr euch dafür interessiert könnt ihr euch den 2. Teil des Workshops ansehn
Achtung: Ich nehme euch auch hier nicht die gesamte Denkarbeit ab! :P
Wie die Überschrifft schon sagt geht es hier um die Weiterentwicklung von Snake.
Was soll ich darunter verstehn?
Bis jetzt sind wir allein auf die Grundfunktionen eingegangen und haben ein so grade lauffähiges Spiel entwickelt, dass ist an sich schonmal einiges Wert, normalerweise wird aber mehr erwartet.
In diesem Abschnitt werde ich euch wieder Denkanstöße oder Ideen geben um letzte Unannehmlichkeiten auszuschalten
Entwicklungsansätze
Futter: Position Scanner und Mapping
Wer bereits ein bisschen rumgespielt hat, dem dürfte aufgefallen sein, dass sich zeitweise ein neues Futterkorn unter einem Körperteil der Schlange befindet. Das kann man als mehr oder weniger schlimm ansehn,mich hats genervt, also hab ichs geändert
Wie mache ich das?
Jedem sollte bis jetzt aufgefallen sein, dass ich nicht unbedingt gerne Codebeispiele rausgebe. Das wird sich hier nicht ändern, aber die Arbeit fällt leicht, da ihr etwas ähnliches schon machen musstet, trotzdem noch einige Tipps:
Stichwort: KörperArray
Stichwort: For-Schleife
Die Anwendung muss sich wiederholen bis alles so läuft wie es soll, eine Schleife reicht also nicht (...bei einer übersichtilichen Lösung).
Wer's jetzt noch nicht weiss hat ein verdammt mieses Kurzzeitgedächtniss
Wenn man nun spielt ist auf den ersten Blick alles Top, das Korn ist da wo es sein soll und die Funktion läuft unauffällig im Hintergrund ab - Anfangs.
Bei steigender Punktzahl (--> größere Länge der Schlange -->einem größeren Array) friert sich das Programm ein.
Grund dafür ist die soeben erschaffene Funktion: Bei immer größerer Länge steigt die Wahrscheinlichkeit, dass die zufällig bestimmte Position immer öfter unter der Schlange liegt und die Funktion sich unzählige male wiederholt.
Abhilfe schafft hier ein sog. "Mapping", Ziel ist es ein Abbild des Spielfeldes zu erstellen das wir in einem Array speichern. Worauf muss ich achten?
Der Array muss 2 dimensional sein
Die Funktion orientiert sich anhand des Rasters für Futter und Kopf
auch hier ist der KörperArray von Bedeutung
Die Funktion füllt die entsprechende Stelle im Array mit "True" (Feld nicht belegt) oder "False" (Feld belegt)
Beispiel:
Das Feld in Reihe 1, Spalte 10 (--> $array[1][10] ) soll überprüft werden
ob sich dort ein Objekt befindet oder eben nicht.
Im KörperArray befinden sich alle aktuellen Objekte, daher nehmen wir im Normalfall ihn
Später muss dann ein Fach im Array gewählt werden ab dem geschaut werden soll ob sich ein Objekt an der zugehörigen Stelle befindet, falls ja "Prüfe nächstes Feld", falls Nein "positioniere Korn".
So wird immer, falls es überhaupt eine freie Position gibt, eine Stelle gefunden
Flinkes Futter
Im original Spiel gibt es nicht nur das einfach Futter das sich einfach fressen lässt, sondern auch diese krabelnden Spinnen, etc.
Auch die lassen sich ganz leicht mit uns einer bekannte Funktion erstellen:
bekannte Funktionen mit gewünschter Funktionalität können gut übertragen werden
eigene Extrafunktion die das Verhalten des FutterTieres steuert könnte nen bisschen Arbeit spraren (Bewegung, Gefressen werden, etc.)
Ihr werdet dazu keine Grafiken in meinen Anhängen finden, geschwigeden überhaupt die Funktionen, da ich sie noch nicht eingebaut habe, sowie einige andere Methoden die ich hier vorstellen werden.
Es sollte aber auch nicht schwer sein selber etwas derartiges zu erstellen (ich hab Gimp benutzt, damit ich auch durchsichtige Aussparungen wie z.B beim Futterkorn machen konnte)
Weitere Ideen:
Da die Möglichkeiten, die man hat, recht vielfälltig sind kann ich leider nicht alles ordentlich ausführen, deshalb geb ich euch hier mal eine Liste mit Idee die ich selber noch habe oder schon bei meiner persönlichen Version angewandt hab
zusätzliche GUI, Levelauswahl, etc.
online Highscore via FTP.au3
Maussteuerung
Dynamischer Kopf (bessere Kopfgrafiken für alle 4 Richtungen, Kopf guckt in die grade eingeschlagene Richtung)
Steuerung verfeinern (ist teilweise noch etwas hackelig bei mir gewesen)
Falls ich noch andere Ideen habe Liste ich sie hier auf, wenn ihr etwas als zu kompliziert empfindet werde ich mir das mal ansehn und das Thema vllt. doch noch ein bisschen erklären.
Schlusswort
So, dass war's mit meinem Workshop, ich hoffe ihr hattet Spaß bei der Entwicklung.
Tut mir Leid, wenn ich es euch nicht immer leicht gemacht habe, aber sonst hätte es keinen Sinn gemacht
Ich freu mich also nachwievor über eure Lösungen oder Programme (ob es jetzt C++, Delphi oder AutoIT, etc. ist, ist mir egal^^)
Bis dahin .nAno
Ich bin echt begeistert was du hier großartiges hingeschrieben hast.
Denn obwohl du kein einziges Codestück vorgibst, kommt man relativ gut (bedingt durch die Tipps) zurecht.
Meiner Meinung nach sollten in Zukunft noch mehr solche Tutorials/Workshops geschrieben werden, da sie gerade an dem Beispiel zeigen, das man damit einen bis zu 100% höheren Lernerfolg hat.
Großen Respekt an die Arbeit wie du es erklärt hast.
€: Das Programm Snake ist auch gut, auch wenn ich´s nun schon sehr lange von dir kenne
Der Workshop ist echt gut geworden.
Meiner Meinung nach gehört der hier auch nicht in die AutoIT Section, sondern in die allgemeine coder-section.
Warum?
Der Workshop benutzt nämlich keine speziellen Befehle, sondern die Tipps sind eigentlich für jede Programmiersprache übertragbar.
Ich versuch mal das ganze in C++ nachzubauen, mal schauen was dabei rauskommt. =D
@Freeze
Das Dumme ist, dass ich nacher noch im unteren Teil in nem Spoiler "Notfall" Codesequenzen einbaue, falls man mal wirklich nen Hänger hat.
Da ich in C++ noch lange nicht soweit bin werden die wohl in AutoIT sein
Aber ich bin mal gespannt was bei dir draus wird und danke :P
Ich finde es nur schade, dass sich anscheinend niemand bisher ernsthaft mit der Anleitung auseinandergesetzt hat
Es wurde mehr als doppelt so oft der komplette SourceCode und nicht das ResourceKit geladen.
Ich werde natürlich weiter Ideen für die Weiterentwicklung sammeln und die Arbeit fortsetzen, obwohl sich mir langsam der Eindruck aufzwingt, dass das Interesse doch nicht so groß ist wie vorher behauptet...
Ich finde es nur schade, dass sich anscheinend niemand bisher ernsthaft mit der Anleitung auseinandergesetzt hat
Es wurde mehr als doppelt so oft der komplette SourceCode und nicht das ResourceKit geladen.
Ich werde natürlich weiter Ideen für die Weiterentwicklung sammeln und die Arbeit fortsetzen, obwohl sich mir langsam der Eindruck aufzwingt, dass das Interesse doch nicht so groß ist wie vorher behauptet...
Wie bereits gesagt , Sourcecode hätte vollkommen gereicht
Aber naja trotzdem sehr schön geworden .
deshalb hab ich mich ja dazu entschieden nen Workshop daraus zu machen
Mein fertiges Programm dient dabei letztenedes nur als Leitfaden für mich um die Tipps, etc. zu schreiben
[Mein eigenes Forum]KLICK! 08/08/2010 - Metin2 Private Server - 1 Replies Huhu
also ich versuche grade ein Forum mit Werdenators Forum Scipt zu machen
Ich komme bis zum Punkt:
"So , jetzt öffnet ihr wieder euren Webbrowser , tippt "127.0.0.1/Forum" ein und klickt auf die "install.php".
Nun beginnt ihr , das Forum zu installieren."
Wenn ich 127.0.0.1/Forum eingebe und danna uf install.php anmache kommt da
Mein eigenes Spiel 08/07/2010 - Off Topic - 83 Replies Hey, würde mich über feedback freuen :mofo:
*edited*
Danke :).
Wie macht mein sein eigenes interface ? 07/03/2008 - World of Warcraft - 4 Replies Hallo,
ich suche eine möglichst genaue anleitung dazu wie man sein eigenes interface mit hintergrund bild und styles selbst machen kann ohne eine fertige vorlage zu nehmen.
Mein eigenes Video - gut? schlecht? 12/26/2006 - World of Warcraft - 3 Replies K L I C K
Bitte sagt mir was ihr davon hält. Meine Mutter kommt aus Kanada und deshalb hab ichs auf Englisch gemacht und war zu faul es noch umzuändern..
MfG, Maydie.