Sehr ausführliches Snake-Tut für Noobs
Übersicht

![]() |
SpikespineBetreff: Sehr ausführliches Snake-Tut für Noobs |
![]() Antworten mit Zitat ![]() |
---|---|---|
Snake-Tutorial
Dieses Tutorial soll Beginnern einen Ansatz für einen Snake-Clone geben. 1. Vorraussetzungen: -Grundkenntnisse im Programmieren mit BlitzBasic -Types ( http://blitzbase.de/tutorials/shadow_1.htm ) 2. Der Anfang Dieses Programm ist nicht sehr umfangreich. Deshalb braucht es keine großen Vorbereitungen. Schreiben wir einfach mal ein Standart-Grundgerüst: BlitzBasic: [AUSKLAPPEN] Graphics 320,240,16,2 Wir haben eine kleine Auflösung im Fenstermodus gewählt. SetBuffer BackBuffer() sollte klar sein. SeedRnd MilliSecs(), weil selbst Snake Zufallszahlen benötigt. Das Gerüst der Hauptschleife ist standart. 3. Der Kopf Bei Snake wird immer der Kopf gesteuert. Der Rest der Schlange zieht den gleichen Weg nach. Jeder Körperteil ist bei unserem Clone quadratisch und bekommt 10 Pixel Seitenlänge. Somit bildet unser Spielfeld bei einer Auflösung von 320x240 Pixeln ein „Raster“ mit 32x24 Quadraten. Jedem Teil geben wir als Koordinaten also die Koordinaten auf dem Raster (horizontal von 0 bis 31 und vertikal von 0 bis 23) an. Zurück zum Kopf. Es ist sinvoll, zuerst ihn zu programmieren und erst danach den Rest der Schlange. Zuerst setzen wir vor der Hauptschleife die Startkoordinaten des Kopfes fest: BlitzBasic: [AUSKLAPPEN] head_x = 15 Wichtig ist auch die Richtung, in die sich der Kopf bewegt: BlitzBasic: [AUSKLAPPEN] Const Nord = 1 Hier habe ich vier Konstanten bestimmt, mit den Werten 1 bis 4. Die Variable Richtung bekommt zum Start eine dieser Werte zugeteilt, ich habe mich für Ost entschieden. Da Ost eine konstante mit dem Wert 2 ist, hat die Variable Richtung nun den Wert 2. Warum ich nicht sofort und ohne Konstanten Richtung = 2 geschrieben habe? Ganz einfach wegen des besseren Verständnisses und wegen der Übersicht. Nun haben wir dem Kopf die zwei wesentlichen Eigenschaften zugeteilt: Position und Richtung (die Geschwindigkeit kommt später). Gehen wir also in die Hauptschleife. Hier soll ständig überprüft werden, ob eine Taste gedrückt wird, und dann die Richtung entsprechend verändert werden: BlitzBasic: [AUSKLAPPEN] ;Norden? Die zweite Abfrage verhindert, dass man in die entgegengesetzte Richtung steuert. Nun haben wir schon einmal die Richtungsabfrage. Sorgen wir aber noch dafür, dass sich der Kopf bewegt. In der richtigen Richtung natürlich. Eine Schwierigkeit bei der Bewegung ist auch die Geschwindigkeit. Die Schlange soll sich nicht in jedem Schleifendurchlauf einmal Bewegen, sondern nur z.B. alle 50 Millisekunden! Solche Probleme kann man einfach lösen, indem man eine Variable hat, ich nenne sie „letztebewegung“, die die Zeit der letzten Bewegung (mit MilliSecs()) beinhaltet. Falls die Differenz aus MilliSecs() und letztebewegung größer ist als 50, wird die Bewegung durchgeführt, sonst nicht! Wenn die Bewegung durchgeführt wird, wird die Variable letztebewegung auf die derzeitigen MilliSecs() gebracht. BlitzBasic: [AUSKLAPPEN] ;Zeit abfragen Wie bewegen wir also den Kopf? Ganz einfach, indem wir seine Koordinaten auf dem Feld verändern! Aber wie sollen wir die Koordinaten anhand der Variable Richtung verändern? Ich zeige es zuerst und versuche es danach zu erklären BlitzBasic: [AUSKLAPPEN] head_x = head_x - (Richtung=West) + (Richtung=Ost) Wenn die Richtung=West ist, wird head_x verringert, head_y bleibt wie es ist. Warum? head_x = head_x - (Richtung=West). Nehmen wir an, die Richtung IST West. Dann ist die Aussage Richtung=West True, also 1. Anders geschrieben: head_x = head_x - 1 + 0 weil Richtung=Ost in diesem Fall False ist, demnach 0. Bei head_y verändert sich auch nichts, weil die Richtung nicht gleich Nord und auch nicht Sued ist. Weil der Kopf so noch nicht sichtbar ist, zeichnen wir ihn außerhalb der Schleife. Zur übersicht zeige ich den ganzen Code: Code: [AUSKLAPPEN] Graphics 320,240,16,2
SetBuffer BackBuffer() SeedRnd MilliSecs() head_x = 15 head_y = 12 Const Nord = 1 Const Ost = 2 Const Sued = 3 Const West = 4 Richtung = Ost ;Hauptschleife Repeat Cls ;Norden? If Keyhit(200) Then If Richtung <> Sued Then Richtung = Nord endif endif ;Osten? if keyhit(205) Then If Richtung <> West Then Richtung = Ost Endif endif ;Süden? If Keyhit(208) Then If Richtung <> Nord Then Richtung = Sued endif endif ;Westen? If Keyhit(203) then If Richtung <> Ost Richtung = West endif endif ;Zeit abfragen If MilliSecs() - letztebewegung > 50 Then ;Je weniger, desto schneller! letztebewegung = MilliSecs() ;Bewegung durchführen…. head_x = head_x - (Richtung=West) + (Richtung=Ost) head_y = head_y - (Richtung=Nord) + (Richtung=Sued) EndIf ;Kopf zeichnen color 255,255,255 rect head_x*10,head_y*10,10,10,1 Flip Until KeyHit(1) End Wenn wir diesen Code starten, kann der Kopf schon ganz gut über das Feld gesteuert werden … aber auch über das Feld hinaus! Lassen wir den Kopf, wenn er vom Spielfeldrand verschwindet einfach wieder auf der anderen Seite auftauchen! Setzen wir also nach dem Bewegen des Kopfes folgendes ein: BlitzBasic: [AUSKLAPPEN] If head_x < 0 Then head_x = 31 Das sollte klar sein: Falls eine der Koordinaten das Spielfeld verlässt, also bei der horizontalen entweder kleiner ist als 0 oder größer ist als 31 wird sie entsprechend auf 31 bzw. 0 gesetzt. 4. Der Rest der Schlange Was noch fehlt ist der Rest der Schlange. Wie machen wir das? Ich würde sagen, mit Types geht es am einfachsten. Jeder Körperteil ist eine Instanz des Types TTeil, und hat lediglich die Informationen über die Position. Vor der Hauptschleife legen wir also fest: BlitzBasic: [AUSKLAPPEN] ;Schablone für Teile Die Schlange ist auch sehr simpel: Jedes mal, wenn der Kopf sich bewegt, also ein neues Feld betritt, erstellen wir eine Instanz des Types an genau dieser Stelle. Das letzte Teil der Schlange (bzw. eigentlich das erste, da es immer das älteste ist) löschen wir. Somit scheint es, als ob sich die einzelnen Teile auch bewegen. Nach der Bewegung des Kopfes schreiben wir: BlitzBasic: [AUSKLAPPEN] Teil.TTeil = New TTeil ;Instanz erstellen Jetzt müssen wir alle Teile zeichnen. Das machen wir mit einer For Each-Schleife: BlitzBasic: [AUSKLAPPEN] For Teil.TTeil = Each TTeil Ich habe mich für Grau entschieden, damit sie sich vom Kopf unterscheiden. Etwas wichtiges haben wir noch nicht gemacht: Zu Beginn schon ein paar Körperteile zu erstellen. Machen wir das nachdem wir die Startposition des Kopfes bestimmt haben. BlitzBasic: [AUSKLAPPEN] For i=0 To 4 ;Vier Körperteile zu beginn Der komplette Code noch einmal: Code: [AUSKLAPPEN] Graphics 320,240,16,2
SetBuffer BackBuffer() SeedRnd MilliSecs() head_x = 15 head_y = 12 Const Nord = 1 Const Ost = 2 Const Sued = 3 Const West = 4 Richtung = Ost ;Schablone für Teile Type TTeil Field x Field y End Type ;Fünf Körperteile zu beginn For i=0 to 4 Teil.TTeil = New TTeil Teil\x = head_x - 4 + i ;Damit die Schlange nach Westen gerichtet ist Teil\y = head_y Next ;Hauptschleife Repeat Cls ;Norden? If Keyhit(200) Then If Richtung <> Sued Then Richtung = Nord endif endif ;Osten? if keyhit(205) Then If Richtung <> West Then Richtung = Ost Endif endif ;Süden? If Keyhit(208) Then If Richtung <> Nord Then Richtung = Sued endif endif ;Westen? If Keyhit(203) then If Richtung <> Ost Richtung = West endif endif ;Zeit abfragen If MilliSecs() - letztebewegung > 50 Then ;Je weniger, desto schneller! letztebewegung = MilliSecs() ;Bewegung durchführen…. head_x = head_x - (Richtung=West) + (Richtung=Ost) head_y = head_y - (Richtung=Nord) + (Richtung=Sued) if head_x < 0 then head_x = 31 if head_x > 31 then head_x = 0 if head_y < 0 Then head_y = 23 if head_y > 23 Then head_y = 0 Teil.TTeil = New TTeil ;Instanz erstellen Teil\x = head_x ;Position des Kopfes Teil\y = head_y Delete First TTeil EndIf ;Alle Körperteile durchgehen For Teil.TTeil = each TTeil Color 127,127,127 Rect Teil\x*10,Teil\y*10,10,10,1 next ;Kopf zeichnen color 255,255,255 rect head_x*10,head_y*10,10,10,1 Flip Until KeyHit(1) End 5. Futter Natürlich dürfen wir unsere Schlange nicht verhungern lassen! Die Nahrung einzubauen ist ganz leicht: Zu Beginn des Programmes bestimmen wir zwei Variablen, die, wie immer, die Koordinaten, und zwar zufällige, beinhalten. BlitzBasic: [AUSKLAPPEN] Nahrung_x = Rand(0,31) Als nächstes muss die Kollision mit dem Kopf geprüft werden. Nach der Bewegung des Kopfes verknüpfen wir einfach die beiden gebrauchten Bedingungen mit And: BlitzBasic: [AUSKLAPPEN] If head_x = Nahrung_x And head_y = Nahrung_y Then Nach dem Then müssen wir natürlich der Nahrung einen neuen zufälligen Platz geben. Außerdem müssen wir es irgendwie anstellen, dass die Schlange länger wird. Das ist ganz einfach: Vorhin haben wir immer einen neuen Körperteil erstellt und hinten einen gelöscht. Wenn die Schlange gerade etwas gegessen hat, lassen wir das löschen einmal. Am besten nehmen wir eine neue Variable die speichert, ob gerade gegessen wurde: BlitzBasic: [AUSKLAPPEN] If head_x = Nahrung_x And head_y = Nahrung_y Then Und danach beim löschen des letzten Types ( Delete First TTeil ) BlitzBasic: [AUSKLAPPEN] If gegessen = 0 Then Ich habe oben noch eine neue Variable eingeführt: Punkte. Immer wenn gegessen wurde erhöhen sie sich. So. Das Futter muss nurnoch eingezeichnet werden. Ich entscheide mich für gelb: BlitzBasic: [AUSKLAPPEN] Color 255,255,0 Und die Punkte werden Geschrieben: BlitzBasic: [AUSKLAPPEN] Color 255,255,255 6. Kollision Wenn die Schlange sich selbst beißt, hat man verloren. Zu kontrollieren ob der Kopf einen Körperteil berührt ist auch keine große Kunst. In der For-Each-Schleife prüfen wir, ob der Kopf ein Teil berührt. Den vorderen Teil berührt er immer, also schließen wir den in der Abfrage aus. BlitzBasic: [AUSKLAPPEN] For Teil.TTeil = Each TTeil Das wars auch schon. Hier ist der endgültige Code: Code: [AUSKLAPPEN] Graphics 320,240,16,2
SetBuffer BackBuffer() SeedRnd MilliSecs() head_x = 15 head_y = 12 Const Nord = 1 Const Ost = 2 Const Sued = 3 Const West = 4 Richtung = Ost ;Schablone für Teile Type TTeil Field x Field y End Type ;Fünf Körperteile zu beginn For i=0 to 4 Teil.TTeil = New TTeil Teil\x = head_x - 4 + i ;Damit die Schlange nach Westen gerichtet ist Teil\y = head_y Next Nahrung_x = Rand(0,31) Nahrung_y = Rand(0,23) ;Hauptschleife Repeat Cls ;Norden? If Keyhit(200) Then If Richtung <> Sued Then Richtung = Nord endif endif ;Osten? if keyhit(205) Then If Richtung <> West Then Richtung = Ost Endif endif ;Süden? If Keyhit(208) Then If Richtung <> Nord Then Richtung = Sued endif endif ;Westen? If Keyhit(203) then If Richtung <> Ost Richtung = West endif endif ;Zeit abfragen If MilliSecs() - letztebewegung > 50 Then ;Je weniger, desto schneller! letztebewegung = MilliSecs() ;Bewegung durchführen…. head_x = head_x - (Richtung=West) + (Richtung=Ost) head_y = head_y - (Richtung=Nord) + (Richtung=Sued) if head_x < 0 then head_x = 31 if head_x > 31 then head_x = 0 if head_y < 0 Then head_y = 23 if head_y > 23 Then head_y = 0 If head_x = Nahrung_x And head_y = Nahrung_y Then Nahrung_x = Rand(0,31) : Nahrung_y = Rand(0,23) gegessen = 1 Punkte = Punkte + 1 Else gegessen = 0 Endif Teil.TTeil = New TTeil ;Instanz erstellen Teil\x = head_x ;Position des Kopfes Teil\y = head_y If gegessen = 0 then Delete First TTeil Endif EndIf ;Alle Körperteile durchgehen For Teil.TTeil = each TTeil Color 127,127,127 Rect Teil\x*10,Teil\y*10,10,10,1 ;Kollision prüfen if head_x = Teil\x And head_y = teil\Y And (teil<>last tteil) then cls color 255,255,255 text 160,120,"G A M E O V ER",1,1 Flip FlushKeys waitkey end endif next ;Kopf zeichnen color 255,255,255 rect head_x*10,head_y*10,10,10,1 ;Nahrung zeichnen Color 255,255,0 Rect Nahrung_x*10,Nahrung_y*10,10,10,1 ;Punkte schreiben Color 255,255,255 Text 0,0,“Punkte: “+Punkte Flip Until KeyHit(1) End Bei Fragen könnt ihr eine PN an mich schicken. |
||
Athlon 64 3700+ | 1024 MB RAM | GeForce 7900 GT | Blitz2D, Blitz3D, BlitzPlus, BlitzMax |
![]() |
otta |
![]() Antworten mit Zitat ![]() |
---|---|---|
sehr gutes tut, mit guten code.
gefällt mir ![]() allerdings hast “Punkte: “ geschrieben...das mag blitz nciht so ganz das sollte durch "Punkte" ersetzt werden, dann gehtz ![]() |
||
AthlonXP 2800+, Radeon 9600XT,160GBHDD,512 MB DDR Ram (neuer Rechner neues Glück;))
Aktuelles Projekt: momentan Projektlos |
![]() |
-jc- |
![]() Antworten mit Zitat ![]() |
---|---|---|
Jepp. Schönes Tut.
Nur (s.Otta) die An/Abführungszeichen bei "Punkte: " werden beim Kopieren nicht als solche erkannt. |
||
mpcool |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ja, wirklich schönes Tut jeder Noob (sorry für den ausdruck) wird s verstehen und ein sehr guter Code ![]() |
||
spongebob15a |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Warum zeigt er mir beim testen "Expecting 'until' or 'forever' an
wie behebe ich das? und was heist das(für das nächste mal falls das passieren sollte)? |
||
Will lernen mit Blitz 3D umzugehen ![]() |
![]() |
skey-z |
![]() Antworten mit Zitat ![]() |
---|---|---|
genau das was da steht meint es auch, er erwartet ein until oder forever, also einen Abschluss der Schleife | ||
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz BAC#57: 2. Platz |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
...und das Kommt durch die Fehlerhaften Anführungszeichen bei dem "punkte" zustande.
Der Compiler zeigt dir ja die passende Zeile. Er ist verwirrt weil da keine gültige Syntax ist und erwartet daher ein Schliessen der nächsten offenen Loop. Beheb das mit den Punkten wie zuvor schon beschrieben und es wird gehen ![]() |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
Smily |
![]() Antworten mit Zitat ![]() |
---|---|---|
Da kann ich gleich mal was anbringen, was mir schon länger im Forum aufgefallen ist:
die meisten user schalten, wenn andere einen Code posten in den Dummy-Mode. Code Kopieren ![]() ![]() ![]() ![]() Meistens sind es aber fehler, die jeder - ich erlaube mir jetzt auch mal den Ausdruck - noob selber finden und beheben könnte. Man müsste nur mal selber nachdenken und sich das nicht von anderen abnehmen lassen. Also schaut euch bitte auch mal die Codes an und macht nicht blindes C&P Gruß, Smily0412 |
||
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets "Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!" stummi.org |
![]() |
FireballFlame |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hübsche Sache. ![]() Allerdings ist mir im Programm ein Bug aufgefallen: Wenn ich mich beispielsweise nach links bewege und dann die Tasten unten und rechts gleichzeitig drücke, müsste ich doch - je nachdem, in welcher Reihenfolge die Tasten erkannt werden - entweder umkehren (unten -> rechts) oder nach unten drehen (rechts ohne Wirkung -> unten). Stattdessen aber kommt ein "Game Over"... |
||
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit |
CloverBetreff: Dankeschön |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Cooles Tut, hat mir sehr geholfen, vor allem versteh ich jetzt endlich Types, ist ne lustige Idee, die zu einem größeren Prjekt anspornt, großes Lob. | ||
Schadet es niemandem-tu was du willst- Sei dein Gesetz!
Glück und Chaos! Die Geschichte lehrt uns, dass uns die Gecshichte nichts lehrt- Mahatma Ghandi. |
BlackTermi |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Jo, mir hat das auch sehr geholfen, danke nochmal.
PS: Jetzt fällt mir auf, ist ja eigentlich nur pushen, mein Beitrag - bitte trashen - schiel nach oben ![]() |
||
![]() |
MikeDee |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ein wirklich sehr gutes Tut. Habe es nach einander "abgeabeitet" und bin nun hier:
Code: [AUSKLAPPEN] Graphics 320,240,16,2
SetBuffer BackBuffer() SeedRnd MilliSecs() ;Hauptschleife Repeat Cls head_x = 15 head_y = 12 Const Nord = 1 Const Ost = 2 Const Sued = 3 Const West = 4 Richtung = Ost ;Norden? If KeyHit(200) Then If Richtung <> Sued Then Richtung = Nord EndIf EndIf ;Osten? If KeyHit(205) Then If Richtung <> West Then Richtung = Ost EndIf EndIf ;Süden? If KeyHit(208) Then If Richtung <> Nord Then Richtung = Sued EndIf EndIf ;Westen? If KeyHit(203) Then If Richtung <> Ost Richtung = West EndIf EndIf ;Zeit abfragen If MilliSecs() - letztebewegung > 50 Then ;Je weniger, desto schneller! letztebewegung = MilliSecs() ;Bewegung durchführen…. EndIf head_x = head_x - (Richtung=West) + (Richtung=Ost) head_y = head_y - (Richtung=Nord) + (Richtung=Sued) ;Kopf zeichnen Color 255,255,255 Rect head_x*10,head_y*10,10,10,1 Flip Until KeyHit(1) End und wenn ich das starte kommt folgende Fehlermeldung dort: 'Const' can only appear in main program. Welche mir überhaupt nichts sagt. oder kann es sogar daran liegen das ich "noch" die Demo besitze? |
||
Nicht wenige benutzen die Anonymität des Internets um berühmt zu werden. |
![]() |
Hagbard |
![]() Antworten mit Zitat ![]() |
---|---|---|
Code: [AUSKLAPPEN] head_x = 15
head_y = 12 Const Nord = 1 Const Ost = 2 Const Sued = 3 Const West = 4 Richtung = Ost Der Teil kommt natürlich vor der Variable. Es macht auch hier wenig Sinn, einer Variable in jedem Schleifendurchgang den gleichen Wert zuzuweisen. Du willst doch nur, dass die Anfangswerte SO festgelegt sind und dass die Schleife diese dann verändert. |
||
- Zuletzt bearbeitet von Hagbard am Mi, Jun 06, 2007 21:48, insgesamt einmal bearbeitet
![]() |
Silver_Knee |
![]() Antworten mit Zitat ![]() |
---|---|---|
nein es liegt an Cons (wer hätte das gedacht^^) du hast es in die repeat-schleife geschrieben Zitat: Repeat
es muss aber vor die Scheife
Cls head_x = 15 head_y = 12 ;DAAAAAAAAAAAAAAA Const Nord = 1 Const Ost = 2 Const Sued = 3 |
||
![]() |
MikeDee |
![]() Antworten mit Zitat ![]() |
---|---|---|
und gleich noch ein problem.
warum funktioniert dieser code Code: [AUSKLAPPEN] Graphics 320,240,16,2
SetBuffer BackBuffer() SeedRnd MilliSecs() head_x = 15 head_y = 12 Const Nord = 1 Const Ost = 2 Const Sued = 3 Const West = 4 Richtung = Ost ;Schablone für Teile Type TTeil Field x Field y End Type ;Fünf Körperteile zu beginn For i=0 to 4 Teil.TTeil = New TTeil Teil\x = head_x - 4 + i ;Damit die Schlange nach Westen gerichtet ist Teil\y = head_y Next ;Hauptschleife Repeat Cls ;Norden? If Keyhit(200) Then If Richtung <> Sued Then Richtung = Nord endif endif ;Osten? if keyhit(205) Then If Richtung <> West Then Richtung = Ost Endif endif ;Süden? If Keyhit(208) Then If Richtung <> Nord Then Richtung = Sued endif endif ;Westen? If Keyhit(203) then If Richtung <> Ost Richtung = West endif endif ;Zeit abfragen If MilliSecs() - letztebewegung > 50 Then ;Je weniger, desto schneller! letztebewegung = MilliSecs() ;Bewegung durchführen…. head_x = head_x - (Richtung=West) + (Richtung=Ost) head_y = head_y - (Richtung=Nord) + (Richtung=Sued) if head_x < 0 then head_x = 31 if head_x > 31 then head_x = 0 if head_y < 0 Then head_y = 23 if head_y > 23 Then head_y = 0 Teil.TTeil = New TTeil ;Instanz erstellen Teil\x = head_x ;Position des Kopfes Teil\y = head_y Delete First TTeil EndIf ;Alle Körperteile durchgehen For Teil.TTeil = each TTeil Color 127,127,127 Rect Teil\x*10,Teil\y*10,10,10,1 next ;Kopf zeichnen color 255,255,255 rect head_x*10,head_y*10,10,10,1 Flip Until KeyHit(1) End und den, den ich zusammengeschustert habe nicht? Code: [AUSKLAPPEN] Graphics 320,240,16,2
SetBuffer BackBuffer() SeedRnd MilliSecs() head_x = 15 head_y = 12 Const Nord = 1 Const Ost = 2 Const Sued = 3 Const West = 4 Richtung = Ost ;Schablone für Teile Type TTeil Field x Field y End Type For i=0 To 4 ;Vier Körperteile zu beginn Teil.TTeil = New TTeil Teil\x = head_x - i ;Damit die Schlange nach Westen gerichtet ist Teil\y = head_y Next ;Hauptschleife Repeat Cls ;Norden? If KeyHit(200) Then If Richtung <> Sued Then Richtung = Nord EndIf EndIf ;Osten? If KeyHit(205) Then If Richtung <> West Then Richtung = Ost EndIf EndIf ;Süden? If KeyHit(208) Then If Richtung <> Nord Then Richtung = Sued EndIf EndIf ;Westen? If KeyHit(203) Then If Richtung <> Ost Richtung = West EndIf EndIf ;Zeit abfragen If MilliSecs() - letztebewegung > 50 Then ;Je weniger, desto schneller! letztebewegung = MilliSecs() ;Bewegung durchführen…. head_x = head_x - (Richtung=West) + (Richtung=Ost) head_y = head_y - (Richtung=Nord) + (Richtung=Sued) EndIf If head_x < 0 Then head_x = 31 If head_x > 31 Then head_x = 0 If head_y < 0 Then head_y = 23 If head_y > 23 Then head_y = 0 Teil.TTeil = New TTeil ;Instanz erstellen Teil\x = head_x ;Position des Kopfes Teil\y = head_y Delete First TTeil EndIf For Teil.TTeil = Each TTeil Color 127,127,127 Rect Teil\x*10,Teil\y*10,10,10,1 Next ;Kopf zeichnen Color 255,255,255 Rect head_x*10,head_y*10,10,10,1 Flip Until KeyHit(1) End Ist sind doch beide Codes gleich!? Danke schonmal |
||
Nicht wenige benutzen die Anonymität des Internets um berühmt zu werden. |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Sind sie augenscheinlich nicht.
Rück deinen Code ordentlich ein, mach den Debugger an und Du siehst den Unterschied. Du hast da ein endif zuviel. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
MikeDee |
![]() Antworten mit Zitat ![]() |
---|---|---|
wenn ich nun aber das Endif entferne kommt zwar was, aber die "schlange" sieht ganz anderst aus als im Original. Meine ist viel kürzer.
und im Original ist dieses eine Endif doch auch zu viel und trotzdem funktionierts. |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das Original hat kein Endif zuviel, sonst würde es nicht laufen. Und das Endif welches Du wohl entfernt hast war das falsche ![]() Nochmal: Rücke den Code sorgfältig ein, dann passieren solche Fehler nicht. Der Unterschied zwischen den beiden Codes ist subtil, es ist wirklich nur durch den unsauberen Stil so. Da ist ein if im Orginal welches über mehrere Zeilen geht und andere If mit einschliesst. Und bei deinem Versuch wird es vorher geschlossen, daher funktioniert es nicht. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
Solembum |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo!
Ich bin neu hier im Forum und und auch ein Neuling des Programmierens. Ich habe mir dieses Tutorial ausgegraben und erstmal möchte ich dem Autor für dieses Werk danken. Bis auf eine Zeile hab ich auch den Sinn hinter jeder Zeile verstanden. ![]() Jetzt zu meiner Frage auf die mir unschlüssige Zeile bei der Kollisionsabfrage: Code: [AUSKLAPPEN] ;Kollision prüfen
If head_x = Teil\x And head_y = teil\Y And (teil<>Last tteil) Then Cls Color 255,255,255 Text 160,120,\"G A M E O V ER\",1,1 Flip FlushKeys WaitKey End EndIf Next Kann mir bitte jemand erklären was das " And (teil<>Last tteil) Then " in der ersten Zeile macht? vielen dank schon mal im vorraus. mfg Solembum Ps: ich hoffe es ist ok über 3 Jahre alte Threads auszugraben ![]() |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Last![]() head_x = Teil\x head_y = teil\Y ...aber der Kopf beist sich ja nicht selbst, darum muss das geprüfte Objekt ungleich des Kopfes sein. Bitte beachte, das alte Tutorials nicht mehr Up-to-date sein können; Blitz wurde seit dem öfters mal geupdatet. |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group