Seite 1 von 1

Snake

Verfasst: 07.02.2010 11:41
von Marvin133
ich habe heute angefangen ein snake-clone zu programmieren und habe halt eine score variable die um eins hoch gezählt wird,wenn der blaue pixel den weißen auffrisst.dann wird an einer anderen stellen eine neuer weißer pixel gezeichnet.

da ich ja noch ein anfänger bin weiss ich nun nicht wie ich die schlange um ein pixel erweitern kann und das dann,wenn man sich in eine richtung bewegt dass er dann die typische snake bewegung macht und den schwanz immer beim knick mit nimmt.

ich hoffe ihr habt eine gute lösung für mein problem.

Code: Alles auswählen

OpenWindow(0, 50,50, 600, 400, "Box", #PB_Window_SystemMenu |#PB_Window_MaximizeGadget |#PB_Window_MinimizeGadget )
InitKeyboard()
InitSprite()     
OpenWindowedScreen(WindowID(0), 0, 0,600,400, 1, 1, 20)
   
CreateSprite(0,5,5)
StartDrawing(SpriteOutput(0))
    Box(0,0,5,5,RGB(0,0,250))
StopDrawing()

CreateSprite(1,5,5)
StartDrawing(SpriteOutput(1))
    Box(0,0,5,5,RGB(250,250,250))
StopDrawing()


score=0
speed=1
pos_x=Random(250)
pos_y=Random(250)

Repeat
  Repeat
    Event = WaitWindowEvent(10)
    If Event = #PB_Event_CloseWindow
      EXIT = 1
    EndIf
  Until Event = #Null
  ExamineKeyboard()
  If KeyboardPushed(#PB_Key_Right)
     x=x+speed
      If x>=612
         x=-12
      EndIf
  EndIf
 
  If KeyboardPushed(#PB_Key_Left)
     x=x-speed
      If x<=-12
         x=612
      EndIf
  EndIf
 
  If KeyboardPushed(#PB_Key_Down)
     y=y+speed
      If y>=412
         y=-12
      EndIf
  EndIf
 
  If KeyboardPushed(#PB_Key_Up)
     y=y-speed
      If y<=-12
         y=412
      EndIf
  EndIf

  ClearScreen(0)
    DisplaySprite(0,x,y)
    DisplaySprite(1,pos_x,pos_y)
    StartDrawing( ScreenOutput() )
    DrawText( 400,2, "Score : "+Str(score) )
    StopDrawing()
  FlipBuffers()
 
  If SpriteCollision(0,x,y,1,pos_x,pos_y)=1
     score=score+1
     pos_x=Random(250)
     pos_y=Random(250)
  EndIf
Until EXIT = 1

Re: Snake

Verfasst: 07.02.2010 12:28
von man-in-black
du musst jeden teil der schlange als EIN Element nehmen. Jedes dieser Elemente hat eine eigene position (x/y).

Habs selber zwar noch nie probiert, aber ich denk mal, so könnte man es machen:

1) Liste ertellen = Schlange
2) du steuerst NUR das erste Glied zu den 3 übrigen richtungen (1 Richtung geht ja nichmehr, da du aus dieser kommst)
z.B. beim rechtspfeil wird die richtung zu RichtungX=1 u. RichtungY=0 (oben: RichtungX=0 u. RichtungY=-1)
diese richtung wird bei jedem durchlauf zu dem ersten glied hinzuaddiert:

Code: Alles auswählen

structure struc_schlange
  x.l
  y.l
endstructure
newlist schlange.struc_schlange()

repeat
  ...

  selectelement(schlange(),0) ;das erste Glied/Element der Liste wird ausgewählt
  schlange()\x+RichtungX
  schlange()\y+RichtungY

until ...
3) die anderen Glieder erhalten dann pro durchlauf nurnoch die position des jeweils oberen gliedes:

Code: Alles auswählen

posx=0:posy=0;
pos2x=0:pos2y=0;

Foreach schlange()
  posx = schlange()\x ;Position des aktuellen Gliedes 
  posy = schlange()\y

  if listindex(schlange()) > 0
    schlange()\x = pos2x ;Die Position des oberen Gliedes wird übernommen, außer beim obersten Glied (logisch^^)
    schlange()\y = pos2y
  endif

  pos2x = posx ;die aktuelle Position wird in eine art "zwischenspeicher" verschoben, damit wir beim wiederholten Schleifendurchlauf
  pos2y = posy ; die Position noch abrufen können
next
4) neue glieder einfach mit addelement(...) hinzufügen
5) das überprüfen von kollision überlass ich dir^^

Falls du das mit den Listen noch nich verstehst, guck sie dir nochmal in der Hilfe an!!

Re: Snake

Verfasst: 07.02.2010 12:32
von Marvin133
geht das denn auch mitder demo version mit den dynamic link list?

Re: Snake

Verfasst: 07.02.2010 12:43
von Kiffi
Marvin133 hat geschrieben:geht das denn auch mitder demo version mit den dynamic link list?
ja, das geht.

Trag bitte in Deine Signatur ein, dass Du die Demo verwendest. Danke!

Grüße ... Kiffi

Re: Snake

Verfasst: 07.02.2010 12:57
von Marvin133
ich bekomm irgendwie nichts gescheites hin weil ich den syntax der list nicht so ganz verstehe

Code: Alles auswählen

OpenWindow(0, 50,50, 600, 400, "Box", #PB_Window_SystemMenu |#PB_Window_MaximizeGadget |#PB_Window_MinimizeGadget )
InitKeyboard()
InitSprite()     
InitSound()
OpenWindowedScreen(WindowID(0), 0, 0,600,400, 1, 1, 20)
   
LoadSound(0,"sound\beep.wav")

CreateSprite(0,5,5)
StartDrawing(SpriteOutput(0))
    Box(0,0,5,5,RGB(0,0,250))
StopDrawing()

CreateSprite(1,5,5)
StartDrawing(SpriteOutput(1))
    Box(0,0,5,5,RGB(250,250,250))
StopDrawing()

Structure struc_snake
  x.l
  y.l
EndStructure

Dim snake.struc_snake(100)
  x=0
  y=0

Structure struc_point
  pos_x.l
  pos_y.l
EndStructure  

Dim point.struc_point()
  pos_x=Random(250)
  pos_y=Random(250)


NewList snake.struc_snake()

score=0
speed=1


Repeat
  Repeat
    Event = WaitWindowEvent(10)
    If Event = #PB_Event_CloseWindow
      EXIT = 1
    EndIf
  Until Event = #Null
  ExamineKeyboard()
  If KeyboardPushed(#PB_Key_Right)
     x=x+speed
      If x>=612
         x=-12
      EndIf
  EndIf
 
  If KeyboardPushed(#PB_Key_Left)
     x=x-speed
      If x<=-12
         x=612
      EndIf
  EndIf
 
  If KeyboardPushed(#PB_Key_Down)
     y=y+speed
      If y>=412
         y=-12
      EndIf
  EndIf
 
  If KeyboardPushed(#PB_Key_Up)
     y=y-speed
      If y<=-12
         y=412
      EndIf
  EndIf

  ClearScreen(RGB(100,100,100))
    DisplaySprite(0,x,y)
    DisplaySprite(1,pos_x,pos_y)
    StartDrawing( ScreenOutput() )
    DrawText(400,2,"Score : "+Str(score))
    StopDrawing()
  FlipBuffers()
 
  If SpriteCollision(0,x,y,1,pos_x,pos_y)=1
     PlaySound(0)
     Delay(25)
     AddElement(snake)
     score=score+1
     pos_x=Random(250)
     pos_y=Random(250)
     
  EndIf
  
  If score=10
     speed=2
  If score=50
     speed=3
  EndIf
  EndIf      
Until EXIT = 1

Re: Snake

Verfasst: 07.02.2010 16:27
von man-in-black
hab mal deinen code gestartet und tausend fehler bekommen...
(daher hab ich ihn nur mal überflogen)

Mal im Urschleim angefangen:

Es gibt Arrays und LinkedLists in PB.

Array (übersetzt "Feld") sind eine art Liste mit FESTER Größe. Z.B. du hast 3 Länder, deren Namen du speichern möchtest.
Da du die größe schon kennst bzw keine größere brauchst, nimmst du einen array.

Code: Alles auswählen

Dim laender.s(2) ;ein weniger, weil die 0 auch als element zählt!!
laender(0) = "Deutschland"
laender(1) = "Dubai"
laender(2) = "Dänemark"
änderst du irgendeine sache bzw liest du einen wert aus, MUSST du die Position des elementes angeben!!

Code: Alles auswählen

debug laender(1) ;Dubai
for x = 0 to 2
  debug laender(x)
next
;es werden nacheinander alle länder ausgegeben

Listen ist eine typische Liste, wie man sie auch in anderen bereichen kennt.
Sie hat eine VARIABLE größe. Man kann mittendrin elemente löschen oder aber auch neue hinzufügen...

Code: Alles auswählen

NewList laender.s()
addelement(laender()) ;erstellt eine neue "Zeile" in der Liste, diese zeile ist auch die aktuell "markierte" Zeile der Liste
 laender() = "Deutschland" ;d.h. schreibst du jetzt was in die Liste (ohne Positionsangabe), in die aktuelle "Zeile"
debug laender()

addelement(laender()) 
 laender() = "Dubai"

debug laender()

selectelement(laender(),0) ;Deutschland ausgewählt

debug laender()
--------------------------------------------------
Du kannst beiden eine Structure ("Spalten") zuordnen:

Code: Alles auswählen

Structure xyz
name.s
alter.l
endstructure

dim person[color=#BF0000].xyz[/color](1)
person(0)\name = "Karl"    ;das "\" muss man zuschreiben, wenn der array/liste eine structure hat, danach kommt dann die variable
person(0)\alter = 20

person(1)\name = "Tim"
person(1)\alter = 30


          \          |      Name         |        Alter
=========================================================
element 0          |       Karl          |          20
-------------------------------------------------------
element 1          |       Tim          |          30




Hoffe mal, das hat fürs Verständnis geholfen...

Re: Snake

Verfasst: 07.02.2010 17:51
von Marvin133
ich hatte jetzt mal ein bsschen was ausprobiert aber es klappt immer noch nicht so wie ich mir das vorgestellt habe

Code: Alles auswählen

OpenWindow(0, 50,50, 600, 400, "Box", #PB_Window_SystemMenu |#PB_Window_MaximizeGadget |#PB_Window_MinimizeGadget )
InitKeyboard()
InitSprite()     
OpenWindowedScreen(WindowID(0), 0, 0,600,400, 1, 1, 20)
   
LoadSprite(2,"bmp\001.bmp",0)
LoadSprite(3,"bmp\008.bmp",0)

CreateSprite(0,5,5)
StartDrawing(SpriteOutput(0))
    Box(0,0,5,5,RGB(0,0,250))
StopDrawing()

CreateSprite(1,5,5)
StartDrawing(SpriteOutput(1))
    Box(0,0,5,5,0)
StopDrawing()

Dim snake.i(2)
    snake(0)=1
    snake(1)=1
    snake(2)=2

Dim snake_struc.i(3)
    snake_struc(0)=x
    snake_struc(1)=y
    snake_struc(2)=x_neu
    snake_struc(3)=y_neu   


x=snake(0)
y=snake(1)
score=0
speed=snake(2)
pos_x=Random(250)
pos_y=Random(250)

Repeat

x_alt=x
y_alt=y
x_neu=x+5
y_neu=y

Repeat


       Event = WaitWindowEvent(10)
    If Event = #PB_Event_CloseWindow
      EXIT = 1
    EndIf
  Until Event = #Null
  ExamineKeyboard()
  If KeyboardPushed(#PB_Key_Right)
     x=x+speed
      If x>=612
         x=-12
      EndIf
  EndIf
 
  If KeyboardPushed(#PB_Key_Left)
     x=x-speed
      If x<=-12
         x=612
      EndIf
  EndIf
 
  If KeyboardPushed(#PB_Key_Down)
     y=y+speed
      If y>=412
         y=-12
      EndIf
  EndIf
 
  If KeyboardPushed(#PB_Key_Up)
     y=y-speed
      If y<=-12
         y=412
      EndIf
  EndIf

  ClearScreen($FFFFFF)
    DisplaySprite(0,x,y)
    DisplaySprite(0,x_neu,y_neu)
    DisplaySprite(1,pos_x,pos_y)
    DisplayTranslucentSprite(2,100,100,100)
    DisplayTranslucentSprite(3,100,100,150)
    StartDrawing( ScreenOutput() )
    DrawText(400,2,"Score : "+Str(score) )
    StopDrawing()
  FlipBuffers()
 
  If SpriteCollision(0,x,y,1,pos_x,pos_y)=1
     x_alt=x_neu
     y_alt=y_neu
     score=score+1
     pos_x=Random(250)
     pos_y=Random(250)

  EndIf
Until EXIT = 1

Re: Snake

Verfasst: 07.02.2010 18:15
von hörmi
Ich hab mal basierend auf deinem Code eine Liste eingebaut, vielleicht hilfts dir zum Verständnis für Listen

Code: Alles auswählen

OpenWindow(0, 50,50, 600, 400, "Box", #PB_Window_SystemMenu |#PB_Window_MaximizeGadget |#PB_Window_MinimizeGadget )
InitKeyboard()
InitSprite()     
OpenWindowedScreen(WindowID(0), 0, 0,600,400, 1, 1, 20)
   

CreateSprite(0,5,5)
StartDrawing(SpriteOutput(0))
    Box(0,0,5,5,RGB(0,0,250))
StopDrawing()

CreateSprite(1,5,5)
StartDrawing(SpriteOutput(1))
    Box(0,0,5,5,0)
StopDrawing()

CreateSprite(2,5,5)
StartDrawing(SpriteOutput(2))
    Box(0,0,5,5,RGB(255,0,250))
StopDrawing()

CreateSprite(3,5,5)
StartDrawing(SpriteOutput(3))
    Box(0,0,5,5,RGB(255,0,0))
StopDrawing()

NewList snake.point()

;Die anfängliche Länge der Schlange setzen
For x=0 To 4
 AddElement(snake())
 snake()\x=x
 snake()\y=y
Next

score=0
speed=2
pos_x=Random(250)
pos_y=Random(250)

Repeat


  Repeat


    Event = WaitWindowEvent(10)
    If Event = #PB_Event_CloseWindow
      EXIT = 1
    EndIf
  Until Event = #Null
  ExamineKeyboard()
  
  Hab_mich_bewegt=0
  
  If KeyboardPushed(#PB_Key_Right)
     Hab_mich_bewegt=1
     x=x+speed
      If x>=612
         x=-12
      EndIf
  EndIf

  If KeyboardPushed(#PB_Key_Left)
     Hab_mich_bewegt=1
     x=x-speed
      If x<=-12
         x=612
      EndIf
  EndIf

  If KeyboardPushed(#PB_Key_Down)
     Hab_mich_bewegt=1
     y=y+speed
      If y>=412
         y=-12
      EndIf
  EndIf

  If KeyboardPushed(#PB_Key_Up)
     Hab_mich_bewegt=1
     y=y-speed
      If y<=-12
         y=412
      EndIf
  EndIf
  
  If Hab_mich_bewegt
    ;neues Element erstellen
    AddElement(snake())
    snake()\x=x
    snake()\y=y
    
    ;letzer Teil der Schlange löschen
    FirstElement(snake())
    DeleteElement(snake())
  EndIf
  
  ClearScreen($FFFFFF)
    ;Zeichne die ganze Schlange
    ForEach snake()
      DisplaySprite(0,snake()\x,snake()\y)
    Next
    DisplaySprite(1,pos_x,pos_y)
    DisplayTranslucentSprite(2,100,100,100)
    DisplayTranslucentSprite(3,100,100,150)
    StartDrawing( ScreenOutput() )
    DrawingMode(#PB_2DDrawing_Transparent)
    DrawText(400,2,"Score : "+Str(score) )
    StopDrawing()
  FlipBuffers()

  If SpriteCollision(0,x,y,1,pos_x,pos_y)=1
     x_alt=x_neu
     y_alt=y_neu
     score=score+1
     pos_x=Random(250)
     pos_y=Random(250)
     ;schlange länger machen
     AddElement(snake())
     snake()\x=x
     snake()\y=y
  EndIf
Until EXIT = 1

Re: Snake

Verfasst: 07.02.2010 19:14
von Marvin133
bei mir hatt pb gemeckert und da ist mir aufgefallen das die liste nicht mit einer srtructure verbunden ist also habe ich eine struckture names point erstellt mit x und y .ist dass denn richtig denn soweit funzt alles.

mfg. marvin133 :)

Code: Alles auswählen

OpenWindow(0, 50,50, 600, 400, "Box", #PB_Window_SystemMenu |#PB_Window_MaximizeGadget |#PB_Window_MinimizeGadget )
InitKeyboard()
InitSprite()     
InitSound()
OpenWindowedScreen(WindowID(0), 0, 0,600,400, 1, 1, 20)
   

CreateSprite(0,5,5)
StartDrawing(SpriteOutput(0))
    Box(0,0,5,5,RGB(0,0,250))
StopDrawing()

CreateSprite(1,5,5)
StartDrawing(SpriteOutput(1))
    Box(0,0,5,5,RGB(0,255,0))
StopDrawing()

LoadSound(0,"sound\beep.wav")



Structure point
x.i
y.i
EndStructure


NewList snake.point()
;Die anfängliche Länge der Schlange setzen
For x=0 To 4
AddElement(snake())
snake()\x=x
snake()\y=y
Next

score=0
speed=2
pos_x=Random(250)
pos_y=Random(250)

Repeat


  Repeat


    Event = WaitWindowEvent(10)
    If Event = #PB_Event_CloseWindow
      EXIT = 1
    EndIf
  Until Event = #Null
  ExamineKeyboard()
 
  Hab_mich_bewegt=0
 
  If KeyboardPushed(#PB_Key_Right)
     Hab_mich_bewegt=1
     x=x+speed
      If x>=612
         x=-12
      EndIf
  EndIf

  If KeyboardPushed(#PB_Key_Left)
     Hab_mich_bewegt=1
     x=x-speed
      If x<=-12
         x=612
      EndIf
  EndIf

  If KeyboardPushed(#PB_Key_Down)
     Hab_mich_bewegt=1
     y=y+speed
      If y>=412
         y=-12
      EndIf
  EndIf

  If KeyboardPushed(#PB_Key_Up)
     Hab_mich_bewegt=1
     y=y-speed
      If y<=-12
         y=412
      EndIf
  EndIf
 
  If Hab_mich_bewegt
    ;neues Element erstellen
    AddElement(snake())
    snake()\x=x
    snake()\y=y
   
    ;letzer Teil der Schlange löschen
    FirstElement(snake())
    DeleteElement(snake())
  EndIf
 
  ClearScreen(RGB(150,150,150))
    ;Zeichne die ganze Schlange
    ForEach snake()
      DisplaySprite(0,snake()\x,snake()\y)
    Next
    DisplaySprite(1,pos_x,pos_y)
    FlipBuffers()

  If SpriteCollision(0,x,y,1,pos_x,pos_y)=1
     PlaySound(0)
     Delay(35)
     x_alt=x_neu
     y_alt=y_neu
     score=score+1
     pos_x=Random(250)
     pos_y=Random(250)
     ;schlange länger machen
     AddElement(snake())
     snake()\x=x
     snake()\y=y
  EndIf
Until EXIT = 1

Re: Snake

Verfasst: 07.02.2010 19:54
von hörmi
Sorry, wusste nicht das in der demo point nicht vordeklariert ist
und ja ist richtig