Alle Elemente gleich?

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

relentless92

Betreff: Alle Elemente gleich?

BeitragDo, Feb 18, 2010 18:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Huhu ihrs,
ich versuche grade eine Funktion zu schreiben, welche eine ganze Reihe in einem zweidimensionalen Array prüft. Wenn alle einen bestimmten Wert haben, sollen sie überschrieben werden - doch es passiert nichts.

Code: [AUSKLAPPEN]
Function IsLineCompleted()
Local prufline

For bg_y=14 To 0 Step -1
   If bg(0,bg_y)=9 Then
      For bg_x=6 To 13
         If bg(bg_x,bg_y)=9 Then
            prufline=True
         Else
            prufline=False
            Exit
         EndIf
      Next
   
      If prufline=True Then
         For bg_x=0 To 6
            bg(bg_x,bg_y)=98
         Next
      EndIf
   EndIf
Next

End Function


Kann mir da jemand helfen? Bin zu blauäugig Wink
Vielen Dank,

MfG
~
Fussball spielen viele, Kart fahren nur die Besten.
~

Der Eisvogel

BeitragDo, Feb 18, 2010 19:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich finde da gerade keinen Fehler, wahrscheinlich liegt es daran, da ich nicht weiß wie dein Array aussieht.
Ich würde das ganze allerdings so machen, vielleicht funktioniert das ja:
BlitzBasic: [AUSKLAPPEN]
Function IsLineComplete()
For bg_y=14 To 0 Step -1
If bg(0,bg_y)=9 Then
prufline=True
For bg_x=6 To 13
If bg(bg_x,bg_y)<>9 Then prufline=False : Exit
Next

If prufline=True Then
For bg_x=0 To 6
bg(bg_x,bg_y)=98
Next
EndIf
EndIf
Next
End Function


MfG
Der Eisvogel
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

Midimaster

BeitragDo, Feb 18, 2010 19:42
Antworten mit Zitat
Benutzer-Profile anzeigen
beschreib mal genau, was in der zeile passieren soll.

Momentan steht in deinem Code:

Code: [AUSKLAPPEN]
Gehe alle Zeilen durch...

...Wenn in einer Zeile ganz außen bei Stelle 0 eine "9" steht...

...dann prüfe die anderen Stellen 6 bis 13 in dieser Zeile...

...wenn die auch alle 9 sind...

...dann ändere den Wert in den Stellen 0 bis 6 in dieser Zeile auf "98".


Ist es wirklich, was du erreichen willst?

relentless92

BeitragDo, Feb 18, 2010 21:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Doch, genau das soll passieren =)
@ Der Eisvogel:

Auch ne Möglichkeit, aber geht leider auch nicht. Hier mal mein Array für euch:

Code: [AUSKLAPPEN]
Dim bg(19,14)

Restore bgdata
For bg_y=0 To 14
   For bg_x=0 To 19
      Read bg(bg_x,bg_y)
   Next
Next

...


Function draw_bg()

For bg_y=0 To 14
   For bg_x=0 To 19
   
      Select bg(bg_x,bg_y)
         
         Case 0 DrawImage bg0,bg_x*32,bg_y*32
         Case 1 DrawImage bgi_1,bg_x*32,bg_y*32
         Case 2 DrawImage bgi_2,bg_x*32,bg_y*32
         Case 3 DrawImage bgi_3,bg_x*32,bg_y*32
         Case 4 DrawImage bgi_4,bg_x*32,bg_y*32
         Case 5 DrawImage bgi_OR,bg_x*32,bg_y*32
         Case 6 DrawImage bgi_UR,bg_x*32,bg_y*32
         Case 7 DrawImage bgi_UL,bg_x*32,bg_y*32
         Case 8 DrawImage bgi_OL,bg_x*32,bg_y*32
         Case 99 DrawImage spf,bg_x*32,bg_y*32
         Case 98 DrawImage red_dummy_tile,bg_x*32,bg_y*32
         Case 9 DrawImage rdtset,bg_x*32,bg_y*32
         
      End Select
      
   Next
Next

End Function


spf=Spielfeld, rdt=Block, rdtset=Gesetzter Block.
Dadurch erklärt sich dann auch mein Vorhaben. =) Wenn die komplette Reihe voller Blöcke sitzt, soll das Spielfeld wieder darübergemalt werden.

MfG
~
Fussball spielen viele, Kart fahren nur die Besten.
~

Midimaster

BeitragDo, Feb 18, 2010 21:39
Antworten mit Zitat
Benutzer-Profile anzeigen
sorry, aber ich habs immer noch nicht verstanden...

wieso checkst du dann nur die positionen 6 bis 13. Und beim Füllen füllst du nur die positionen 0 bis 6...

Im Text schreibst du immer "ganze Reihe".

Wie passt das zusammen?

relentless92

BeitragDo, Feb 18, 2010 21:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah, danke, du hast mich auf einen kleinen Denkfehler aufmerksam gemacht.
Das effektive Spielfeld befindet sich nur von Koordinate 6 - 13 - deswegen frag ich die nur ab. (Ressourcen sparen)

Abgeändert sieht das ganze nun also so aus:
Code: [AUSKLAPPEN]
Function IsLineCompleted()
   For bg_y=14 To 0 Step -1
      If bg(6,bg_y)=9 Then
         prufline=True
         For bg_x=6 To 13
            If bg(bg_x,bg_y)<>9 Then prufline=False : Exit
         Next
         
         If prufline=True Then
            For bg_x=6 To 13
               bg(bg_x,bg_y)=99
            Next
         EndIf
      EndIf
   Next
End Function


Hier einmal mein relativ unübersichtliches Array, vielleicht könnt ihr's euch dann besser vorstellen:

Code: [AUSKLAPPEN]
.bgdata
Data 0,0,0,0,0,1,99,99,99,99,99,99,99,2,0,0, 0,0,0,0      ;## 0|       = 1
Data 0,0,0,0,0,1,99,99,99,99,99,99,99,2,0,0, 0,0,0,0      ;## |0      = 2
Data 0,0,0,0,0,1,99,99,99,99,99,99,99,2,0,0, 0,0,0,0      ;## _       = 3
Data 0,0,0,0,0,1,99,99,99,99,99,99,99,2,0,0, 0,0,0,0      ;## =       = 4
Data 0,0,0,0,0,1,99,99,99,99,99,99,99,2,0,0, 0,0,0,0      ;## OR       = 5
Data 0,0,0,0,0,1,99,99,99,99,99,99,99,2,0,0, 0,0,0,0      ;## UR       = 6
Data 0,0,0,0,0,1,99,99,99,99,99,99,99,2,0,0, 0,0,0,0      ;## UL       = 7
Data 0,0,0,0,0,1,99,99,99,99,99,99,99,2,0,0, 0,0,0,0      ;## OL       = 8
Data 0,0,0,0,0,1,99,99,99,99,99,99,99,2,0,0, 0,0,0,0      ;## blue   = 0
Data 0,0,0,0,0,1,99,99,99,99,99,99,99,2,0,0, 0,0,0,0      ;## grayspf = 99
Data 0,0,0,0,0,1,99,99,99,99,99,99,99,2,0,6, 3,7,0,0      ;## rdummy    = 98
Data 0,0,0,0,0,1,99,99,99,99,99,99,99,2,0,1,99,2,0,0      ;## rdtset   = 9
Data 0,0,0,0,0,5, 4, 4, 4, 4, 4, 4, 4,8,0,5, 4,8,0,0
Data 0,0,0,0,0,0, 0, 0, 0, 0, 0, 0, 0,0,0,0, 0,0,0,0
Data 0,0,0,0,0,0, 0, 0, 0, 0, 0, 0, 0,0,0,0, 0,0,0,0


Allerdings tut sich immer noch nichts.
Danke nochmal. Wink
~
Fussball spielen viele, Kart fahren nur die Besten.
~

das wurgel

BeitragDo, Feb 18, 2010 22:46
Antworten mit Zitat
Benutzer-Profile anzeigen
- Dü prüfst nach 9en, im Datafeld kommen aber keine vor
- Wenn das nicht der Fehler ist führ mal vor IsLineCompleted() das hier aus und mach dannach ein Stop:
Code: [AUSKLAPPEN]
For bg_y=0 To 14
   Local zeile$=""
   For bg_x=0 To 19
      zeile$=zeile$+String(" ", 3-Len(bg(bg_x,bg_y)))+bg(bg_x,bg_y)
   Next
   DebugLog zeile$
Next

Poste dann den Inhalt der DebugLog (Debug-Fenster->Debug Log)
Dort müsste man den Inhalt der Karte sehen.
1 ist ungefähr 3

Midimaster

BeitragDo, Feb 18, 2010 23:04
Antworten mit Zitat
Benutzer-Profile anzeigen
also, leider schreibst du ja immer noch nicht, wozu das ganze dienen soll. das macht das helfen auch nicht gerade leichter.

Es gibt zwei gründe, warum etwas nicht funktioniert:

1. der code hat einen Fehler (das ist was du vermutest)

und

2. der erwartete zustand war gar nicht eingetreten!!!

Deshalb helfen immer ein paar DEBUGLOGs


BlitzBasic: [AUSKLAPPEN]
Function IsLineCompleted()
DebugLog "IsLineCompleted wurde aufgerufen"
For bg_y=14 To 0 Step -1
DebugLog "IsLineCompleted Zeile bg_y=" + bg_y
If bg(6,bg_y)=9 Then
DebugLog "Zustand =9 eingetreten bei " + bg_y
prufline=True
For bg_x=6 To 13
If bg(bg_x,bg_y)<>9 Then prufline=False : Exit
Next
DebugLog "prufline = " + prufline

If prufline=True Then
DebugLog "eine ganze Zeile wird 99 gesetzt "
For bg_x=6 To 13
bg(bg_x,bg_y)=99
Next
EndIf
EndIf
Next
End Function


würde mich jetzt nicht wundern, wenn da was ganz anderes rauskommt, als du erwartest!


Dazu gibt es das echt witzige Kapitel IV in meinem Fehler-Vermeiden Tutorial:

https://www.blitzforum.de/foru...620#354620

Mein Tipp lautet: während der Programm-Erstellung viel mehr DEBUGLOGs einsetzen und bis zum Schluss drinlassen. Es spart soviel Zeit bei der Fehlersuche...

relentless92

BeitragDi, Feb 23, 2010 22:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Das mit dem DebugLog ist gut, werde ich beherzigen.

//EDIT: Vielen Dank! Ich hab jetzt mal Schritt für Schritt mit dem Debugger gearbeitet, und ich hab den Fehler gefunden. Dank an euch!
~
Fussball spielen viele, Kart fahren nur die Besten.
~

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group