Seite 1 von 2

Code übersichtlicher und einfacher machen

Verfasst: 27.11.2007 20:55
von obar
Hallo zusammen

Ich wäre froh, wenn mir einer behilflich sein könnte den Code übersichtlicher und einfacher zu machen. Der Code funktioniert eigentlich einwandfrei. Es würde mir auch schon reichen,
wenn man mir Tipps geben könnte, wie man etwas besser Abfragen könnte. Ich hoffe das ist keine Unanständige Frage. Sonst Bitte ich den Mod das Thema wieder zu schliessen.

Code: Alles auswählen

Repeat

  FlipBuffers() 
  ClearScreen(0) 
  
  DisplayTransparentSprite(12, 1, 1)
     
  ; Kanone gesetzt  
  For i = 1 To AnzKanone 
      If Kanone(i)\treffer=1
        DisplayTransparentSprite(15, Kanone(i)\x, Kanone(i)\y)
      Else
        DisplayTransparentSprite(10, Kanone(i)\x, Kanone(i)\y)   
      EndIf
  Next 
  
    ;Schiff gesetzt
  For i = 1 To AnzSchiffe
      If Schiff(i)\treffer=1
        DisplayTransparentSprite(14, Schiff(i)\x, Schiff(i)\y)
      Else
        DisplayTransparentSprite(13, Schiff(i)\x, Schiff(i)\y)
      EndIf
  Next   
  
  ;schüsse abfeuern Kanonen
  
  If KampfEnde1=0
    If FlipFlop = 1
      For i = a To a
        If Kanone(Count1)\treffer = 1
          If Schuss1=2
            a=a+1
            Count1=Count1+1
          Else
            a=a+2
            Count1=Count1+1
          EndIf
          Break
        EndIf
        If Ton=0 
          PlaySound(1,0)
          Ton=1
        EndIf  
        If ZZahl1(i)<yy1(i)
          DisplayTransparentSprite(11,Kanone(Count1)\x+11,Kanone(Count1)\y+yy1(i))
          yy1(i)=yy1(i)-1
        EndIf   
        If ZZahl1(i)=yy1(i)
          StopSound(1)
          Ton=0
          For c=1 To AnzSchiffe
            Kollision.w=SpritePixelCollision(11, Kanone(Count1)\x,Kanone(Count1)\y+yy1(i), 13, Schiff(c)\x, Schiff(c)\y) 
            If Kollision=1
              PlaySound(2,0)
              Schiff(c)\treffer=1
              Ton=0
            EndIf
            Kollision=0
          Next 
          a=a+1
          Schuss1=Schuss1+1
          FlipFlop=0
        EndIf
        If Schuss1=2
          Count1=Count1+1
          Schuss1=0
        EndIf
        If a> AnzKanone*2
          KampfEnde1=1
          Break
        EndIf
      Next 
    EndIf
    Else
    If KampfEnde1=1 And KampfEnde2=1
      Break
    EndIf
    FlipFlop=0
  EndIf
  
  ;schüsse abfeuern Schiffe
 
  If KampfEnde2=0 
    If FlipFlop = 0
      For i = b To b
        If Schiff(Count2)\treffer = 1
          If Schuss1=2
            b=b+1
            Count2=Count2+1
          Else
            b=b+2
            Count2=Count2+1
          EndIf
          Break
        EndIf
        If Ton=0 
          PlaySound(1,0)
          Ton=1
        EndIf  
        If ZZahl2(i)>yy2(i) 
          DisplayTransparentSprite(11,Schiff(Count2)\x+1,Schiff(Count2)\y+yy2(i))
          yy2(i)=yy2(i)+1
        EndIf   
        If ZZahl2(i)=yy2(i) 
          StopSound(1) 
          Ton=0
          For c=1 To AnzKanone
            Kollision.w=SpritePixelCollision(11, Schiff(Count2)\x+1,Schiff(Count2)\y+yy2(i), 10, Kanone(c)\x, Kanone(c)\y) 
            If Kollision=1 
              PlaySound(2,0)
              Kanone(c)\treffer=1
              Ton=0
            EndIf
            Kollision=0
          Next 
          b=b+1
          Schuss2=Schuss2+1
          FlipFlop=1
        EndIf
        If Schuss2=2
          Count2=Count2+1
          Schuss2=0
        EndIf
        If b> AnzSchiffe*2 
          KampfEnde2=1
          Break
        EndIf
      Next
    EndIf
    Else
    If KampfEnde1=1 And KampfEnde2=1
      Break
    EndIf
    FlipFlop=1
  EndIf
   
  ;ESC überprüfen 
  ExamineKeyboard() 
  If KeyboardReleased(#PB_Key_Escape) 
    End 
  EndIf     

ForEver

End

Verfasst: 27.11.2007 21:11
von Fluid Byte
- Du solltest dir angewöhnen noch Schluss-Keywords eine Leerzeile einzufügen (EndIf, Next, etc.) denn so ist alles aneinander geklatscht und schwer zu lesen.

- Füge Leerzeichen zwischen Operatoren ein (y=x+1 zu Y = X + 1)

- Es ist nicht nötig bei Berechnungen die sich auf die eigene Variable beziehen das explizit zu deklarieren. Also aus " Count = Count + 1 " kann man " Count + 1" machen.

- Achte auf GROSS- und kleinschreibung

Das sind allerdings alles grundlegende Regeln der Codeformatierung bzw. der normalen Textverarbeitung. Also (eigentlich) selbstverständlich.

Verfasst: 27.11.2007 21:48
von Vermilion
Zusätlich ist dir dein PC für ein paar extra Leerzeilen nicht böse. Ich mache das meisten auch so bei Einteilung in verschiedene Codesegmente:

Code: Alles auswählen

DM_NaseBohrn()



;-----------------------------------------------
; CREATE CAMERA
;-----------------------------------------------



DM_CreateCamera(*Parent.CEntity)
Man kann mit den Kommentaren schon visuell einiges erreichen. Und nützlich sein können sie auch noch...

Verfasst: 27.11.2007 22:33
von obar
Danke für die ersten Tipps.

Hätte jemand noch eine Idee wie ich den Code oben noch verbessern könnte. Wie man oben sieht, sind der Code für ;schüsse abfeuern Kanonen und ;schüsse abfeuern Schiffe fast identisch, kann man da nichts machen. Ich bin wahrscheinlich etwas festgefahren mit meinem Stil und da ich erst vor kurzem begonnen habe sehe ich momentan keine Lösungen.

Verfasst: 27.11.2007 22:47
von NicTheQuick
Ich blick auf die Schnelle nicht richtig durch, aber was mir direkt aufgefallen
ist:

Code: Alles auswählen

For i = a to a
Was ist das? :o

Ich bin sicher, hier hast du nicht überlegt, wie man das Schleifenkonzept
übersichtlicher gestaltet.

Verfasst: 27.11.2007 23:31
von Fluid Byte
Nö wieso? Sicher war es von ihm jetzt nicht beabsichtigt aber das ist eine valide Schleifenkonstruktion.

Code: Alles auswählen

For i=a To a
	Debug "Warum bin ich hier!?"
Next

Verfasst: 27.11.2007 23:33
von ZeHa
Naja was auch auffällt, ist, daß Du sehr viel Code hast, der sich wiederholt. Der Code für die Schiffe und die Kanonen unterscheidet sich nicht wesentlich. Was Du als nächstes lernen solltest, ist es, modular zu programmieren. Das allerdings in 2-3 Sätzen zu erklären ist nicht möglich. Wichtig ist halt, daß Du Deinen Code logisch gut zerlegst und keinen doppelten Code baust. Sobald Du ein paar Zeilen doppelt machst, ist das ein Hinweis drauf, daß Du etwas falsch gemacht hast. Oder zumindest nicht richtig :)

Dazu mußt Du allerdings lernen, Prozeduren zu verwenden. Das heißt, Du lagerst ein bißchen Code in eine eigene "Unter-Einheit" aus, und rufst sie nur auf. Das "If KampfEnde1=0", das um den gesamten Ablauf drumrum gebastelt wurde, ist z.B. schon seeehr unübersichtlich. Wenn Du jetzt aber alles, was zum Schießen gehört, in eine Prozedur packst, steht da letztendlich z.B. nur noch:

Code: Alles auswählen

If KampEnde = 0
    Shoot()
EndIf
...und Shoot erledigt dann den Rest. Natürlich kann es sein, daß Du Shoot() auch ein paar Parameter übergeben mußt, bzw. es wird wohl nötig sein, Deinen Code sowieso komplett umzustrukturieren. Allerdings ist das eben, wie bereits gesagt, nicht mal einfach so zu erklären. Versuche einfach nach und nach das Konzept von Prozeduren zu lernen und zu verstehen, und Dein Code wird schon bald sehr viel strukturierter aussehen ;)

Verfasst: 28.11.2007 00:19
von obar
Habe eine Frage zu den Prozeduren. Ich habe mal versucht eine zu erstellen.

z.B.

Code: Alles auswählen

For i = 1 To AnzKanone 
     If Kanone(i)\treffer = 1
        DisplayTransparentSprite(15, Kanone(i)\x, Kanone(i)\y)
      Else
        DisplayTransparentSprite(10, Kanone(i)\x, Kanone(i)\y)   
      EndIf
  Next 

diese Zeilen wiederholt sich z.B. 3-4 Mal. Nun wollte ich eine Procedure schreiben die etwas so aussieht.

Code: Alles auswählen

Procedure Sprite_setzen(AnzWas, Was, SpriteNr1, SpriteNr2, Posx , Posy)
    For i = 1 To AnzWas 
      If Was = 1
        DisplayTransparentSprite(SpriteNr1, posx, posy)
      Else
        DisplayTransparentSprite(SpriteNr2, posx, posy)   
      EndIf
    Next
  EndProcedure
Und der Aufruf:

Code: Alles auswählen

Sprite_setzen(AnzKanone, Kanone(i)\treffer, 15, 10, Kanone(i)\x, Kanone(i)\y)
Natürlich funzt es nicht. Ist hier die Struktur das Problem oder die FOR..NEXT Schleife an sich?

Verfasst: 28.11.2007 00:32
von NicTheQuick
Für so etwas bieten sich Makros an. Damit wäre das möglich, was du vorhast.

Oder aber du strukturierst deine Procedure richtig:

Code: Alles auswählen

Procedure Sprite_setzen(AnzWas.l, Was(1).StrukturvonWas, SpriteNr1.l, SpriteNr2.l)
  Protected i.l
  
  For i = 1 To AnzWas
    If Was(i)\treffer = 1
      DisplayTransparentSprite(SpriteNr1, Was(i)\x, Was(i)\y)
    Else
      DisplayTransparentSprite(SpriteNr2, Was(i)\x, Was(i)\y)
    EndIf
  Next
EndProcedure
Wobei 'StrukturvonWas' die Structure von Kanone() ist.

Und der Aufruf:

Code: Alles auswählen

Sprite_setzen(AnzKanone, Kanone(), 15, 10)
Oder als Makro:

Code: Alles auswählen

Macro Sprite_setzen(AnzWas, Was, SpriteNr1, SpriteNr2)
  For i = 1 To AnzWas
    If Was(i)\treffer = 1
      DisplayTransparentSprite(SpriteNr1, Was(i)\x, Was(i)\y)
    Else
      DisplayTransparentSprite(SpriteNr2, Was(i)\x, Was(i)\y)
    EndIf
  Next
EndMacro
Womit die Struktur von 'Kanone()' egal wäre, aber du die Variable 'i' nicht
noch für etwas anderes verwenden solltest.

Und der dazugehörige Aufruf:

Code: Alles auswählen

Sprite_setzen(AnzKanone, Kanone, 15, 10)

Verfasst: 28.11.2007 00:48
von obar
NicTheQuick hat geschrieben:Für so etwas bieten sich Makros an. Damit wäre das möglich, was du vorhast.

Oder aber du strukturierst deine Procedure richtig:

Code: Alles auswählen

Procedure Sprite_setzen(AnzWas.l, Was(1).StrukturvonWas, SpriteNr1.l, SpriteNr2.l)
  Protected i.l
  
  For i = 1 To AnzWas
    If Was(i)\treffer = 1
      DisplayTransparentSprite(SpriteNr1, Was(i)\x, Was(i)\y)
    Else
      DisplayTransparentSprite(SpriteNr2, Was(i)\x, Was(i)\y)
    EndIf
  Next
EndProcedure
Wobei 'StrukturvonWas' die Structure von Kanone() ist.

Und der Aufruf:

Code: Alles auswählen

Sprite_setzen(AnzKanone, Kanone(), 15, 10)
Oder als Makro:

Code: Alles auswählen

Macro Sprite_setzen(AnzWas, Was, SpriteNr1, SpriteNr2)
  For i = 1 To AnzWas
    If Was(i)\treffer = 1
      DisplayTransparentSprite(SpriteNr1, Was(i)\x, Was(i)\y)
    Else
      DisplayTransparentSprite(SpriteNr2, Was(i)\x, Was(i)\y)
    EndIf
  Next
EndMacro
Womit die Struktur von 'Kanone()' egal wäre, aber du die Variable 'i' nicht
noch für etwas anderes verwenden solltest.

Und der dazugehörige Aufruf:

Code: Alles auswählen

Sprite_setzen(AnzKanone, Kanone, 15, 10)


Sorry, das habe ich jetzt nicht ganz begriffen mit der Was(1).StrukturvonWas und dem Aufruf



Das ist die Structur die ich erstellt habe.


Code: Alles auswählen

Structure Kanone_sprite 
  x.l 
  y.l
  treffer.l 
EndStructure

Dim Kanone.Kanone_sprite(AnzKanone)