Sehr ausführliches Snake-Tut für Noobs

Übersicht BlitzBasic FAQ und Tutorials

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

Spikespine

Betreff: Sehr ausführliches Snake-Tut für Noobs

BeitragMo, Sep 05, 2005 12:05
Antworten mit Zitat
Benutzer-Profile anzeigen
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
SetBuffer BackBuffer()
SeedRnd MilliSecs()

;Hauptschleife
Repeat
Cls

Flip
Until KeyHit(1)
End


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
head_y = 12


Wichtig ist auch die Richtung, in die sich der Kopf bewegt:

BlitzBasic: [AUSKLAPPEN]
Const Nord = 1
Const Ost = 2
Const Sued = 3
Const West = 4
Richtung = Ost


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?
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


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
If MilliSecs() - letztebewegung > 50 Then ;Je weniger, desto schneller!
letztebewegung = MilliSecs()

;Bewegung durchführen….
EndIf


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)
head_y = head_y - (Richtung=Nord) + (Richtung=Sued)


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
If head_x > 31 Then head_x = 0
If head_y < 0 Then head_y = 23
If head_y > 23 Then head_y = 0


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
Type TTeil
Field x
Field y
End Type


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
Teil\x = head_x ;Position des Kopfes
Teil\y = head_y
Delete First TTeil


Jetzt müssen wir alle Teile zeichnen. Das machen wir mit einer For Each-Schleife:

BlitzBasic: [AUSKLAPPEN]
For Teil.TTeil = Each TTeil
Color 127,127,127
Rect Teil\x*10,Teil\y*10,10,10,1
Next


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
Teil.TTeil = New TTeil
Teil\x = head_x - i ;Damit die Schlange nach Westen gerichtet ist
Teil\y = head_y
Next


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)
Nahrung_y = Rand(0,23)


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

EndIf

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
Nahrung_x = Rand(0,31) : Nahrung_y = Rand(0,23)
gegessen = 1
Punkte = Punkte + 1
Else
gegessen = 0
EndIf


Und danach beim löschen des letzten Types ( Delete First TTeil )

BlitzBasic: [AUSKLAPPEN]
If gegessen = 0 Then
Delete First TTeil
EndIf


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
Rect Nahrung_x*10,Nahrung_y*10,10,10,1


Und die Punkte werden Geschrieben:

BlitzBasic: [AUSKLAPPEN]
Color 255,255,255
Text 0,0,“Punkte: “+Punkte


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
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



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

BeitragMi, Sep 14, 2005 20:42
Antworten mit Zitat
Benutzer-Profile anzeigen
sehr gutes tut, mit guten code.
gefällt mir Very Happy .

allerdings hast “Punkte: “ geschrieben...das mag blitz nciht so ganz das sollte durch "Punkte" ersetzt werden, dann gehtz Wink
AthlonXP 2800+, Radeon 9600XT,160GBHDD,512 MB DDR Ram (neuer Rechner neues Glück;))

Aktuelles Projekt:
momentan Projektlos

-jc-

BeitragMi, Sep 14, 2005 22:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Jepp. Schönes Tut.
Nur (s.Otta) die An/Abführungszeichen bei "Punkte: " werden beim Kopieren nicht als solche erkannt.
 

mpcool

BeitragMo, März 12, 2007 22:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, wirklich schönes Tut jeder Noob (sorry für den ausdruck) wird s verstehen und ein sehr guter Code Very Happy
 

spongebob15a

BeitragMi, Apr 25, 2007 0:57
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Very Happy

skey-z

BeitragMi, Apr 25, 2007 11:41
Antworten mit Zitat
Benutzer-Profile anzeigen
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
Twitter

BladeRunner

Moderator

BeitragMi, Apr 25, 2007 16:36
Antworten mit Zitat
Benutzer-Profile anzeigen
...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 Smile
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

BeitragMi, Apr 25, 2007 19:47
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Arrow in BB einfügen Arrow Ausführen Arrow Fehler Arrow Im forum ausheulen

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

BeitragMi, Apr 25, 2007 20:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Hübsche Sache. Smile

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
 

Clover

Betreff: Dankeschön

BeitragDo, Mai 03, 2007 15:00
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Mai 03, 2007 16:06
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink .

MikeDee

BeitragMi, Jun 06, 2007 21:36
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Jun 06, 2007 21:46
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Jun 06, 2007 21:47
Antworten mit Zitat
Benutzer-Profile anzeigen
nein es liegt an Cons (wer hätte das gedacht^^) du hast es in die repeat-schleife geschrieben Zitat:
Repeat
Cls


head_x = 15
head_y = 12

;DAAAAAAAAAAAAAAA
Const Nord = 1
Const Ost = 2
Const Sued = 3
es muss aber vor die Scheife

MikeDee

BeitragMi, Jun 06, 2007 22:26
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

BladeRunner

Moderator

BeitragMi, Jun 06, 2007 22:30
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Jun 06, 2007 22:34
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

BladeRunner

Moderator

BeitragDo, Jun 07, 2007 8:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Original hat kein Endif zuviel, sonst würde es nicht laufen. Und das Endif welches Du wohl entfernt hast war das falsche Wink
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

BeitragMi, Okt 20, 2010 14:08
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Laughing

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 Rolling Eyes

Xeres

Moderator

BeitragMi, Okt 20, 2010 14:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Last tteil holt den letzten Eintrag in der tteil-Typeliste hervor - so wie ich den Code beim überfliegen verstanden habe, schließt das den Kopf der Schlange aus: Für den Kopf muss logischerweise immer gelten:
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic FAQ und Tutorials

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group