Seite 1 von 1

Problem mit Linked List

Verfasst: 03.01.2010 18:14
von DerMeister
Hallo
Ich habe mal begonnen eine Art Tetris-Klon zu programmieren bin aber gleich am Anfang auf ein Problem gestoßen.
Zuerst klappt alles ganz normal, der Klotz bewegt sich nach unten, bis er unten angekommen ist und bleibt dort stehen, wenn aber dann ein neuer Klotz entstehen soll entstehen statt einem gleich unendlich viele neue Klötze, jedenfalls entsteht ein roter "Batzen" der immer länger wird, je weiter er sich nach unten bewegt.

Hier ist der Code:

Code: Alles auswählen

Structure brick
  PosX.l
  PosY.l
  Speed.l
  Stuck.l
EndStructure

Global NewList Brick.brick()

Procedure NewBrick(PosX,PosY,Speed,Stuck)
  AddElement(Brick())
  Brick()\PosX = PosX
  Brick()\PosY = PosY
  Brick()\Speed = Speed
  Brick()\Stuck = Stuck
EndProcedure

Global delay

InitSprite()
InitKeyboard()

OpenScreen(800,600,32,"Tetris")

Repeat
  ExamineKeyboard()
  ClearScreen(RGB(255,255,255))
    
  If delay = 0
    NewBrick(200,0,1,0)
    delay = 1
  EndIf
    
  Gosub display

  FlipBuffers()
  
  If KeyboardPushed(1)
    End
  EndIf  

Until KeyboardPushed(1)

display:
  StartDrawing(ScreenOutput())
  
  ResetList(Brick())
  While NextElement(Brick())
    ;Display
    Box(Brick()\PosX,Brick()\PosY,50,20,RGB(255,0,0))   
    ;Movement down
    If Brick()\Stuck = 0
      Brick()\PosY + Brick()\Speed
    EndIf
    If Brick()\PosY = 580
      Brick()\Stuck = 1
      delay = 0
    EndIf  
  ;Movement Left\Right
    If KeyboardPushed(#PB_Key_Right) And Brick()\Stuck = 0
      Brick()\PosX + 2
    ElseIf KeyboardPushed(#PB_Key_Left) And Brick()\Stuck = 0
      Brick()\PosX - 2
    EndIf    
  Wend    
  
  StopDrawing()   

Return
Vielleicht kann mir ja jemand sagen was ich falsch gemacht habe...

Re: Problem mit Linked List

Verfasst: 03.01.2010 18:59
von Kevin
aus:

Code: Alles auswählen

    If Brick()\Stuck = 0
      Brick()\PosY + Brick()\Speed
    EndIf
    If Brick()\PosY = 580
      Brick()\Stuck = 1
      delay = 0
    EndIf 
muss

Code: Alles auswählen

   If Brick()\Stuck = 0
      Brick()\PosY + Brick()\Speed
      If Brick()\PosY = 580
        Brick()\Stuck = 1
        delay = 0
      EndIf 
  EndIf
werden weil er sonst wenn das Teil ankommt, und Stuck=1 ist, auch noch das delay auf 0 zurücksetz

Re: Problem mit Linked List

Verfasst: 03.01.2010 19:00
von gnasen
Du prüfst, ob ein Stein unten angekommen ist, um dann den "delay switch" umzulegen. Soweit so gut. Nun prüfst du aber immer ob irgendein Stein unten angekommen ist und die Bedingung ist immer Wahr, wenn ersteinmal ein Stein unten angekommen ist.
Also müsstest du einen bereits platzierten Stein markieren, sodass dieser nichtmehr daraufhin geprüft wird, ob er so langsam mal unten ist (denn das ist er ja bereits)

Re: Problem mit Linked List

Verfasst: 03.01.2010 19:15
von DerMeister
Ah, OK Vielen Dank.
Die logischen Fehler sind immer die schlimmsten...