"Blitz Snake" - ein Snake Klon

Übersicht Sonstiges Projekte

Neue Antwort erstellen

 

BlackCat

Betreff: "Blitz Snake" - ein Snake Klon

BeitragMo, Okt 13, 2008 14:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo.
Ich habe es nun endlich geschafft mein allererstes halbwegs vernuenftiges Spiel zu schreiben. Habe vor 2 wochen mit blitzbasic angefangen und bin selbst erstaunt ueber das ergebniss von den 2 wochen Very Happy
Das ganze spiel habe ich uebrigens in 2 Tagen gemacht (gestern + heute)

Executable gibts hier: https://www.blitzforum.de/upload/file.php?id=3598

Einen Screenshot von meinem Spiel hab ich auch noch gemacht:

user posted image
user posted image


Den Code werde ich euch natuerlich auch nicht vorenthalten.
Bugs bitte melden wenn ihr welche findet.
Sagt mir bitte auch welche Fehler ich gemacht habe, was ich haette einfacher machen koennen und welche Funktionen ueberfluessig sind.
Ich warte schon gespannt auf eure Antwort.

Hier der Code:


Code: [AUSKLAPPEN]
; *****************************************
; Einfuehrungsbildschirm
; *****************************************

Graphics 640, 480
Color 0, 206, 209
Rect 20, 20, 600, 440, 0
Rect 30, 30, 580, 420, 0

Color 244, 164, 96
SetFont LoadFont("Comic Sans MS", 50)
Text 190, 150, "BLITZ-SNAKE"
Text 190, 150, "__________"
SetFont LoadFont("Arial", 13)
Color 0, 255, 0
Text 310, 280, "created by BlackCat"
Text 310, 295, "mein allererstes Game in BB ^^"
Text 310, 310, "viel Spass beim Spielen!"

SetFont LoadFont("Arial", 20)
Color 127, 255, 0
Text 100, 400, "Bitte eine beliebige Taste druecken um das Spiel zu starten!"
WaitKey()








;*****************************************
; VORBEREITUNGEN
;*****************************************

SetBuffer BackBuffer()
For i = 1 To 2
punkte% = 0
blocks% = 4
richtung$ = "links"
futterx% = 0
futtery% = 0
Dim schlangex(100)
Dim schlangey(100)
Cls
Color 255, 255, 255
Rect 200, 100, 200, 150, 0

SetFont LoadFont("Arial", 13)
Color 238, 149, 115
Text 40, 170, "created by BlackCat"
Text 440, 150, "ENTER - Spiel beginnen"
Text 440, 165, "Pfeiltasten - Schlange bewegen"
Text 440, 180, "Leertaste - Pause"
Text 440, 195, "ESC - Spiel beenden"

Color 255, 165, 0
Text 130, 350, "Ziel das Spiels ist, die Schlange zum Futter zu bewegen."
Text 130, 365, "Wenn die Schlange etwas aufgefressen hat verlaengert sie sich."
Text 130, 380, "Stoesst die Schlange gegen die Wand oder ihren Koerper ist das Spiel zu Ende."
Text 130, 395, "Pro Block gibt es 5 Punkte."

Color 255, 255, 255
Text 280, 260, "Punkte: " + punkte%
Oval 250, 170, 10, 10, 0
Oval 260, 170, 10, 10
Oval 270, 170, 10, 10
Oval 280, 170, 10, 10

schlangex(1) = 250
schlangex(2) = 260
schlangex(3) = 270
schlangex(4) = 280

schlangey(1) = 170
schlangey(2) = 170
schlangey(3) = 170
schlangey(4) = 170

futterx% = 250
futtery% = 120

Rect 250, 120, 10, 10
Flip
Next






;************************************************
;DAS SPIEL
;************************************************


framet = CreateTimer(60)
Local Timer_dauer = 400
Local Timer_start
Repeat
If KeyDown(28) Then
   Repeat
      ms = MilliSecs()
      
      If Timer_dauer + Timer_start < ms Then
      Timer_start = ms
      If (richtung$ = "links") Then
         
         For i = blocks% To 1 Step -1
            If i <> 1 Then
               schlangex(i) = schlangex(i-1)
               schlangey(i) = schlangey(i-1)
            EndIf
         Next
         schlangex(1) = schlangex(1) - 10
      ElseIf (richtung$ = "oben") Then
         
         For i = blocks% To 1 Step -1
            If i <> 1 Then
               schlangex(i) = schlangex(i-1)
               schlangey(i) = schlangey(i-1)
            EndIf
         Next
         schlangey(1) = schlangey(1) - 10
      ElseIf (richtung$ = "rechts") Then
         
         For i = blocks% To 1 Step -1
            If i <> 1 Then
               schlangex(i) = schlangex(i-1)
               schlangey(i) = schlangey(i-1)
            EndIf
         Next
         schlangex(1) = schlangex(1) + 10
      ElseIf (richtung$ = "unten") Then
         
         For i = blocks% To 1 Step -1
            If i <> 1 Then
               schlangex(i) = schlangex(i-1)
               schlangey(i) = schlangey(i-1)
            EndIf
         Next
         schlangey(1) = schlangey(1) + 10
      EndIf
      
      
      Color 0, 0, 0
      Rect 201, 101, 198, 148
      Color 255, 255, 255
      For i = 2 To blocks%
         Oval schlangex(i), schlangey(i), 10, 10
      Next
      Oval schlangex(1), schlangey(1), 10, 10, 0
      
      
      
      If schlangex(1) <= 200 Or schlangex(1) >= 390 Or schlangey(1) <= 100 Or schlangey(1) >= 240 Then
         Color 255, 0, 0
         Text 240, 105, "Verloren! Punktestand: " + punkte%
         Color 255, 255, 255
         
         Flip 0
         Repeat
            If KeyDown(1) Then End
         Until KeyDown(28)
         
         Color 0, 0, 0
         Rect 201, 101, 198, 148
         Color 255, 255, 255
         schlangex(1) = 250
         schlangex(2) = 260
         schlangex(3) = 270
         schlangex(4) = 280
         
         schlangey(1) = 170
         schlangey(2) = 170
         schlangey(3) = 170
         schlangey(4) = 170
         
         Oval 250, 170, 10, 10, 0
         Oval 260, 170, 10, 10
         Oval 270, 170, 10, 10
         Oval 280, 170, 10, 10
         
         richtung$ = "links"
         blocks% = 4
         punkte% = 0
         
         Flip 0
         
         WaitKey()
      EndIf
      
      For i = 2 To blocks%
         If schlangex(1) = schlangex(i) And schlangey(1) = schlangey(i) Then
            Color 255, 0, 0
            Text 240, 105, "Verloren! Punktestand: " + punkte%
            Color 255, 255, 255
         
            Flip 0
            Repeat
               If KeyDown(1) Then End
            Until KeyDown(28)
            
            Color 0, 0, 0
            Rect 201, 101, 198, 148
            Color 255, 255, 255
            schlangex(1) = 250
            schlangex(2) = 260
            schlangex(3) = 270
            schlangex(4) = 280
         
            schlangey(1) = 170
            schlangey(2) = 170
            schlangey(3) = 170
            schlangey(4) = 170
         
            Oval 250, 170, 10, 10, 0
            Oval 260, 170, 10, 10
            Oval 270, 170, 10, 10
            Oval 280, 170, 10, 10
         
            richtung$ = "links"
            blocks% = 4
            punkte% = 0
         
            Flip 0
         
            WaitKey()
         EndIf
      Next
            
      If (schlangex(1) = futterx% And schlangey(1) = futtery%) Then
         blocks% = blocks% + 1
         punkte% = punkte% + 5
         
         SeedRnd MilliSecs()
         futterx% = Rand(22, 37) * 10
         
         SeedRnd MilliSecs()
         futtery% = Rand(12, 22) * 10
      End If
      
      Rect futterx%, futtery%, 10, 10
      Color 0, 0, 0
      Rect 280, 260, 200, 50
      Color 255, 255, 255
      Text 280, 260, "Punkte: " + punkte%
      Flip 0
      EndIf
      
      If KeyDown(203) And richtung$ <> "rechts" Then richtung$ = "links"
      If KeyDown(200) And richtung$ <> "unten" Then richtung$ = "oben"
      If KeyDown(208) And richtung$ <> "oben" Then richtung$ = "unten"
      If KeyDown(205) And richtung$ <> "links" Then richtung$ = "rechts"
      If KeyDown(57) Then WaitKey()
      
      WaitTimer(framet)
      
      
      FlushKeys
   Until KeyDown(1)
   
EndIf
Until KeyDown(1)
            
         
      

End
  • Zuletzt bearbeitet von BlackCat am Mo, Okt 13, 2008 16:56, insgesamt einmal bearbeitet
 

da_poller

BeitragMo, Okt 13, 2008 15:08
Antworten mit Zitat
Benutzer-Profile anzeigen
also ich finde es für ein 2 tage projekt sehr schön gelungen

den code hab ich mir (noch) nciht angesehen aber werd meine meinung zu jedenfals ncoh nachholen.. erster eindruck: GUT

Xeres

Moderator

BeitragMo, Okt 13, 2008 15:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Für ein erstes Projekt finde ich es Codemäßig nicht besonders schlimm; "elegante" Varianten erlernt man mit der Zeit, Hauptsache ist erstmal das es funktioniert.
Meine Hinweise:
"Goto Ende" ist nicht nötig. End kannst du an beliebiger Position aufrufen, dafür musst du nicht zum ende Springen.
Den Timer von 5Hz würde ich so nicht anwenden -> Normalerweise nimmt man die Bildschirmwiederholung von 60Hz. Um dein Spiel dann auf eine Spielbare Geschwindigkeit zu bringen, verwendet man einen Timer um alle X Sekunden die Positionen der Schlange zu ändern. Das macht insgesamt die Steuerung flüssiger, da dann auch Keyhit funktioniert und der Spieler exakter reagieren kann.
Bei deiner Abfrage zum verlieren des Spielers sehe ich grad nicht so astrein durch; aber mir scheint, du könntest viel Code in eine Funktion auslagern anstatt Copy&Paste-like überall das selbe stehen zu haben...

...und Types könnte man benutzen Razz
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)
 

BlackCat

BeitragMo, Okt 13, 2008 15:42
Antworten mit Zitat
Benutzer-Profile anzeigen
erstmal thx an beide Very Happy

Xeres hat Folgendes geschrieben:
"Goto Ende" ist nicht nötig. End kannst du an beliebiger Position aufrufen, dafür musst du nicht zum ende Springen.


ok werd ich gleich mal rausnehmen

Xeres hat Folgendes geschrieben:
Den Timer von 5Hz würde ich so nicht anwenden -> Normalerweise nimmt man die Bildschirmwiederholung von 60Hz. Um dein Spiel dann auf eine Spielbare Geschwindigkeit zu bringen, verwendet man einen Timer um alle X Sekunden die Positionen der Schlange zu ändern. Das macht insgesamt die Steuerung flüssiger, da dann auch Keyhit funktioniert und der Spieler exakter reagieren kann.


Stimmt, mit der Steuerung bin ich auch noch nicht wirklich zufrieden.
Ich werd das mal mit 60Hz probieren und eine Variable bei jedem Schleifendurchgang erhoehen, bis sie eine bestimmte nummer erreicht und dann erst die schlange bewegen lassen. mal sehen obs klappt.

Xeres hat Folgendes geschrieben:
Bei deiner Abfrage zum verlieren des Spielers sehe ich grad nicht so astrein durch; aber mir scheint, du könntest viel Code in eine Funktion auslagern anstatt Copy&Paste-like überall das selbe stehen zu haben...

...und Types könnte man benutzen Razz


da muesste man jetzt wissen was types sind xD

aber das mit den funktionen stimmt schon. weiss nur nicht wirklich wann und wozu ich eine funktion erstellen soll - fand es in meinem fall halt unnoetig...

sobald ich mit den verbesserungen fertig bin, werde ich updaten Wink

Xeres

Moderator

BeitragMo, Okt 13, 2008 16:09
Antworten mit Zitat
Benutzer-Profile anzeigen
BlackCat hat Folgendes geschrieben:
Ich werd das mal mit 60Hz probieren und eine Variable bei jedem Schleifendurchgang erhoehen, bis sie eine bestimmte nummer erreicht und dann erst die schlange bewegen lassen. mal sehen obs klappt.
Jaein... Für den Konstanten 60Hz Timer geht's vielleicht, besser ist aber eine Konstruktion mit millisecs -> man kann exakte Zeiten unabhängig von der Bildwiederholungsfrequenz festlegen.

Edit:
Types kann man auch dafür verwenden, war aber eigentlich mehr ironisch gemeint, da Types generell für so vieles gut sind... Die kannst du dir auch noch für's nächste Projekt aufheben...

Edit 2:
Beispiel kommt gleich...
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)
  • Zuletzt bearbeitet von Xeres am Mo, Okt 13, 2008 16:19, insgesamt einmal bearbeitet
 

BlackCat

BeitragMo, Okt 13, 2008 16:12
Antworten mit Zitat
Benutzer-Profile anzeigen
@Xeres
Und wie soll das gehen?

DaysShadow

BeitragMo, Okt 13, 2008 16:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Also dein Spiel ist ganz nett, allerdings reagieren die Tasten manchmal nicht wenn man sie nicht hält( hat mich die ersten beiden Runden das Schlangenleben gekostet ^^)

Und das erste Cls kannst du dir sparen, da du Graphics erst danach stehen hast und dementsprechend auch keinen Bildschirm zum löschen hast...(in BMax gäbe es nen Unhandled Memory Exception Error ^^)

Keine Ahnung ob dir das was sagt, aber Types sind Klassen(C++, Java usw.), mit denen man sich bspw.
einen Type Player und einen Type Futter erstellen könnte, wobei ich jetzt gerade nicht weiß ob die Types in B3D und BlitzMax gleich sind, da ich nur BlitzMax nutze.

Vielleicht hilft dir das ja ein wenig:
http://de.wikipedia.org/wiki/O...ng#Klassen

MfG DaysShadow
Blessed is the mind too small for doubt

Xeres

Moderator

BeitragMo, Okt 13, 2008 16:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Local ms
;Darin wird der Aktuelle Wert von Millisecs() gespeichert
Local Timer_Start, Timer_dauer=500
;Zeitpunkt zu dem der Timer anfängt zu messen und die Dauer in Millisekunden (1/2 Sekunde)
Const KEY_Escape=1
;Konstanten für Tasten schaffen auch übersicht...
Local timer=CreateTimer(60)
;Standartmäßiger Timer

Repeat
   ms = MilliSecs() ;* In der Hauptschleife einmal die Aktuelle Zeit nehmen
   
   If Timer_Start + Timer_dauer < ms Then
      ;*** Wenn die Startzeit + Dauer kleiner ist als die aktuelle zeit...
      Timer_Start=ms ;... wird die Startzeit nachgestellt...
      ;... und dann folgen alle Aktionen die alle <Timer_dauer> Millisekunden ausgeführt werden sollen...
      Print "Blink!"
   EndIf
   
   WaitTimer(timer)
Until KeyHit(KEY_Escape)

Ich hab mich auf das wesentliche beschränkt... ich hoffe verständlich.
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)
 

BlackCat

BeitragMo, Okt 13, 2008 17:03
Antworten mit Zitat
Benutzer-Profile anzeigen
@Xeres
Hab das gleich mal ins Prog uebernommen. Funktioniert einwandfrei, thx Very Happy

@DaysShadow
Problem mit dem Haengen der Tasten wurde dank Xerex behoben Wink


Hab oben jetzt upgedatet. Den neuen Timer hinzugefuegt, GoTo raus, Cls raus und ausserdem - was ich selbst bemerkt habe - die Pause-Funktion noch schnell einprogrammiert. Die hatte ich vergessen mit reinzumachen

Die Executable wurde auch mit der neuen Version ersetzt.

Auf weitere Kommentare freue ich mich jetzt schon Very Happy

DaysShadow

BeitragMo, Okt 13, 2008 18:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Eingabe ist jetzt schöner, allerdings habe ich noch einen Bug gefunden und zwar wenn die Schlange bspw. nach rechts oder links schlängelt und man dann schnell nacheinander runter oder hoch und links oder rechts drückt, dann macht die Schlange kehrt, trifft sich selbst und man hat verloren...

Hier z.B. war die Richtung nach links, ich drückte schnell hoch und dann rechts und schon war die Richtung nach rechts in Richtung des Schlangenkörpers!
user posted image

MfG DaysShadow
Blessed is the mind too small for doubt
 

BlackCat

BeitragDi, Okt 14, 2008 13:55
Antworten mit Zitat
Benutzer-Profile anzeigen
DaysShadow hat Folgendes geschrieben:
Die Eingabe ist jetzt schöner, allerdings habe ich noch einen Bug gefunden und zwar wenn die Schlange bspw. nach rechts oder links schlängelt und man dann schnell nacheinander runter oder hoch und links oder rechts drückt, dann macht die Schlange kehrt, trifft sich selbst und man hat verloren...

Hier z.B. war die Richtung nach links, ich drückte schnell hoch und dann rechts und schon war die Richtung nach rechts in Richtung des Schlangenkörpers!
user posted image

MfG DaysShadow



Der Bug wird dadurch verursacht, dass sich bei jedem Schleifendurchgang die Richtung der Schlange durch druecken der Pfeiltasten aendern kann - ABER die Schlange wird nur alle paar Schleifendurchgaenge neu gezeichnet wegen des neuen eingebauten Timers. Das Ergebnis ist: Man kann die Richtung oefter wechseln bis die Schlange neu gezeichnet ist. Ich hab die Steuerung aus dem Timer deswegen raus, um die Lenkung fluessiger zu machen - was ja auch wunderbar geklappt hat - nur eben hat sich dieser Bug angeschlichen.

Zuerst habe ich folgenden Loesungsansatz versucht:

Code: [AUSKLAPPEN]
      If KeyDown(203) And richtung$ <> "rechts" Then
         richtung$ = "links"
         keyge = 1
      ElseIf KeyDown(200) And richtung$ <> "unten" Then
         richtung$ = "oben"
         keyge = 1
      ElseIf KeyDown(208) And richtung$ <> "oben" Then
         richtung$ = "unten"
         keyge = 1
      ElseIf KeyDown(205) And richtung$ <> "links" Then
         richtung$ = "rechts"
         keyge = 1
      ElseIf KeyDown(57) Then
         WaitKey()
         keyge = 1
      EndIf



keyge fuer "keygedrueckt" *gg* Diese Variable wird auf 1 bzw. wahr gesetzt, wenn eine Tastatur gedrueckt wurde und wieder auf 0, wenn der Timer gestartet wird und die Schlange neugezeichnet wird. In der If-Abfrage hab ich dann folgendes eingebaut:

Code: [AUSKLAPPEN]
If Timer_dauer + Timer_start < ms Or keyge = 1 Then
   keyge = 0
   ; der ganze rest ^^
End If


wenn keyge 1 ist, also zuvor ne Taste gedrueckt wurde, wird die schlange neu gezeichnet, ob Timer oder nicht.. danach wieder auf 0 gesetzt.

Jedesmal wenn ich im Spiel ein Key druecke setzt der Timer voellig aus, das spiel lauft rasend schnell und man verliert ^^
Das Problem ist wohl, dass es bei KeyDown keine Rolle spielt, ob die Tastatur gedrueckt wurde oder die ganze zeit gedrueckt gehalten wird.
Wie kann ich das Problem loesen? Ich habe es mit KeyHit versucht aber das scheint irgendwie nicht zu klappen

DaysShadow

BeitragDi, Okt 14, 2008 14:29
Antworten mit Zitat
Benutzer-Profile anzeigen
So habs mal bearbeitet, waren 5 Minuten und eine Variable mehr Wink Jetzt taucht der Bug nicht mehr auf!

MfG DaysShadow

Code: [AUSKLAPPEN]

; *****************************************
; Einfuehrungsbildschirm
; *****************************************

Graphics 640, 480 , 0 , 2
Color 0, 206, 209
Rect 20, 20, 600, 440, 0
Rect 30, 30, 580, 420, 0

Color 244, 164, 96
SetFont LoadFont("Comic Sans MS", 50)
Text 190, 150, "BLITZ-SNAKE"
Text 190, 150, "__________"
SetFont LoadFont("Arial", 13)
Color 0, 255, 0
Text 310, 280, "created by BlackCat"
Text 310, 295, "mein allererstes Game in BB ^^"
Text 310, 310, "viel Spass beim Spielen!"

SetFont LoadFont("Arial", 20)
Color 127, 255, 0
Text 100, 400, "Bitte eine beliebige Taste druecken um das Spiel zu starten!"
WaitKey()

Local KEY_DOWN% ; <---------------- hinzugefügt

;*****************************************
; VORBEREITUNGEN
;*****************************************

SetBuffer BackBuffer()
For i = 1 To 2
punkte% = 0
blocks% = 4
richtung$ = "links"
futterx% = 0
futtery% = 0
Dim schlangex(100)
Dim schlangey(100)
Cls
Color 255, 255, 255
Rect 200, 100, 200, 150, 0

SetFont LoadFont("Arial", 13)
Color 238, 149, 115
Text 40, 170, "created by BlackCat"
Text 440, 150, "ENTER - Spiel beginnen"
Text 440, 165, "Pfeiltasten - Schlange bewegen"
Text 440, 180, "Leertaste - Pause"
Text 440, 195, "ESC - Spiel beenden"

Color 255, 165, 0
Text 130, 350, "Ziel das Spiels ist, die Schlange zum Futter zu bewegen."
Text 130, 365, "Wenn die Schlange etwas aufgefressen hat verlaengert sie sich."
Text 130, 380, "Stoesst die Schlange gegen die Wand oder ihren Koerper ist das Spiel zu Ende."
Text 130, 395, "Pro Block gibt es 5 Punkte."

Color 255, 255, 255
Text 280, 260, "Punkte: " + punkte%
Oval 250, 170, 10, 10, 0
Oval 260, 170, 10, 10
Oval 270, 170, 10, 10
Oval 280, 170, 10, 10

schlangex(1) = 250
schlangex(2) = 260
schlangex(3) = 270
schlangex(4) = 280

schlangey(1) = 170
schlangey(2) = 170
schlangey(3) = 170
schlangey(4) = 170

futterx% = 250
futtery% = 120

Rect 250, 120, 10, 10
Flip
Next






;************************************************
;DAS SPIEL
;************************************************


framet = CreateTimer(60)
Local Timer_dauer = 400
Local Timer_start
Repeat
If KeyDown(28) Then
   Repeat
      ms = MilliSecs()
       
      If Timer_dauer + Timer_start < ms Then
      Timer_start = ms
      KEY_DOWN = 0 ; <------------ TIMER OK, KEY_DOWN WIEDER 0, NEUER TASTENDRUCK VERFÜGBAR!
      If (richtung$ = "links") Then
         
         For i = blocks% To 1 Step -1
            If i <> 1 Then
               schlangex(i) = schlangex(i-1)
               schlangey(i) = schlangey(i-1)
            EndIf
         Next
         schlangex(1) = schlangex(1) - 10
      ElseIf (richtung$ = "oben") Then
         
         For i = blocks% To 1 Step -1
            If i <> 1 Then
               schlangex(i) = schlangex(i-1)
               schlangey(i) = schlangey(i-1)
            EndIf
         Next
         schlangey(1) = schlangey(1) - 10
      ElseIf (richtung$ = "rechts") Then
         
         For i = blocks% To 1 Step -1
            If i <> 1 Then
               schlangex(i) = schlangex(i-1)
               schlangey(i) = schlangey(i-1)
            EndIf
         Next
         schlangex(1) = schlangex(1) + 10
      ElseIf (richtung$ = "unten") Then
         
         For i = blocks% To 1 Step -1
            If i <> 1 Then
               schlangex(i) = schlangex(i-1)
               schlangey(i) = schlangey(i-1)
            EndIf
         Next
         schlangey(1) = schlangey(1) + 10
      EndIf
       
       
      Color 0, 0, 0
      Rect 201, 101, 198, 148
      Color 255, 255, 255
      For i = 2 To blocks%
         Oval schlangex(i), schlangey(i), 10, 10
      Next
      Oval schlangex(1), schlangey(1), 10, 10, 0
       
       
       
      If schlangex(1) <= 200 Or schlangex(1) >= 390 Or schlangey(1) <= 100 Or schlangey(1) >= 240 Then
         Color 255, 0, 0
         Text 240, 105, "Verloren! Punktestand: " + punkte%
         Color 255, 255, 255
         
         Flip 0
         Repeat
            If KeyDown(1) Then End
         Until KeyDown(28)
         
         Color 0, 0, 0
         Rect 201, 101, 198, 148
         Color 255, 255, 255
         schlangex(1) = 250
         schlangex(2) = 260
         schlangex(3) = 270
         schlangex(4) = 280
         
         schlangey(1) = 170
         schlangey(2) = 170
         schlangey(3) = 170
         schlangey(4) = 170
         
         Oval 250, 170, 10, 10, 0
         Oval 260, 170, 10, 10
         Oval 270, 170, 10, 10
         Oval 280, 170, 10, 10
         
         richtung$ = "links"
         blocks% = 4
         punkte% = 0
         
         Flip 0
         
         WaitKey()
      EndIf
       
      For i = 2 To blocks%
         If schlangex(1) = schlangex(i) And schlangey(1) = schlangey(i) Then
            Color 255, 0, 0
            Text 240, 105, "Verloren! Punktestand: " + punkte%
            Color 255, 255, 255
         
            Flip 0
            Repeat
               If KeyDown(1) Then End
            Until KeyDown(28)
             
            Color 0, 0, 0
            Rect 201, 101, 198, 148
            Color 255, 255, 255
            schlangex(1) = 250
            schlangex(2) = 260
            schlangex(3) = 270
            schlangex(4) = 280
         
            schlangey(1) = 170
            schlangey(2) = 170
            schlangey(3) = 170
            schlangey(4) = 170
         
            Oval 250, 170, 10, 10, 0
            Oval 260, 170, 10, 10
            Oval 270, 170, 10, 10
            Oval 280, 170, 10, 10
         
            richtung$ = "links"
            blocks% = 4
            punkte% = 0
         
            Flip 0
         
            WaitKey()
         EndIf
      Next
             
      If (schlangex(1) = futterx% And schlangey(1) = futtery%) Then
         blocks% = blocks% + 1
         punkte% = punkte% + 5
         
         SeedRnd MilliSecs()
         futterx% = Rand(22, 37) * 10
         
         SeedRnd MilliSecs()
         futtery% = Rand(12, 22) * 10
      End If
       
      Rect futterx%, futtery%, 10, 10
      Color 0, 0, 0
      Rect 280, 260, 200, 50
      Color 255, 255, 255
      Text 280, 260, "Punkte: " + punkte%
      Flip 0
      EndIf
             
     If KEY_DOWN = 0 
        If KeyHit(203) And richtung$ <> "rechts"
           richtung$ = "links"
         KEY_DOWN = 1
        EndIf
    EndIf

   If KEY_DOWN = 0
      If KeyHit(200) And richtung$ <> "unten"
         richtung$ = "oben"
         KEY_DOWN = 1
      EndIf
   EndIf

   If KEY_DOWN = 0
      If KeyHit(208) And richtung$ <> "oben"
                  richtung$ = "unten"
                  KEY_DOWN = 1
      EndIf
   EndIf

   If KEY_DOWN = 0
      If KeyHit(205) And richtung$ <> "links"
         richtung$ = "rechts"
         KEY_DOWN = 1
      EndIf
   EndIf
   
   If KeyDown(57) Then WaitKey()
       
      WaitTimer(framet)
       
       
      ;FlushKeys
   Until KeyDown(1)
   
EndIf
Until KeyDown(1)
             
End
Blessed is the mind too small for doubt
  • Zuletzt bearbeitet von DaysShadow am Di, Okt 14, 2008 15:01, insgesamt 2-mal bearbeitet

Xeres

Moderator

BeitragDi, Okt 14, 2008 14:44
Antworten mit Zitat
Benutzer-Profile anzeigen
@ DaysShadow: Die Lösung hätte ich auch vorgeschlagen, aber bitte die Tastenabfrage trotzdem mit Keyhit gestallten, Keydown ist für längeres Drücken gedacht und sollte auch nur dann eingesetzt werden, ansonsten gibt es eine kleine Verzögerung bei der Steuerung. Global muss die Variable auch nicht sein.

Und (@ BlackCat): bitte verwende auch standardmäßig den Fenstermodus.
Code: [AUSKLAPPEN]
Graphics 640, 480, 0, 2

(Null bei der Farbtiefe übernimmt die aktuelle Einstellung)
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)
  • Zuletzt bearbeitet von Xeres am Di, Okt 14, 2008 14:47, insgesamt einmal bearbeitet

DaysShadow

BeitragDi, Okt 14, 2008 14:45
Antworten mit Zitat
Benutzer-Profile anzeigen
ei stimmt, da braucht man ja kein keydown >.< ändere es mal schnell um ^^

Ah und BlackCat, benutze doch zum Einrücken die wunderbare Taste TAB, dein Einrückungsstil mit der Leertaste bringt mich sonst beim Editieren noch um xD

MfG DaysShadow
Blessed is the mind too small for doubt
 

BlackCat

BeitragDi, Okt 14, 2008 17:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke, jetzt klappts!
Aber KeyHit funktioniert bei mir irgendwie nicht richtig, nur KeyDown. Ich benutze Blitz3D 1.98, liegts vllt daran?

@DaysShadow
versteh ich gar nicht, ich hab immer tab benutzt, waer doch viel zu umstaendlich mit der Leertaste xD

Mr.Hyde

Newsposter

BeitragDi, Okt 14, 2008 17:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein es liegt nicht an der Version. KeyHit sollte nicht häufiger in einem Schleifendurchgang aufgerufen werden. Außerdem könnte Flushkeys() die Abfrage behindern.
Ich mache es in B3D immer so, dass ich mir Variablen schaffe, die die Abfrage zu Beginn der Schleife speichern. (Ein Tastendruck wird ja im Tastaturbuffer gespeichert)
habe dann Variablen wie
Code: [AUSKLAPPEN]

;Schleifenbeginn

;Tastenabfrage
Key_Left = KeyHit (203)
Key_Right = KeyHit (205)
;... alle, die du brauchst

Flushkeys()
;weiterer Programmcode
BBP News RSS | Chaos Interactive | Watanien 2 Screens, Infos und Download | Watanien 2 Worklog | PuzzleMasters
http://abgeordnetenwatch.de - http://www.regierungs-beratung.de - Der Regierung auf die Finger schauen

Neue Antwort erstellen


Übersicht Sonstiges Projekte

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group