Array Verwaltung?

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

relentless92

Betreff: Array Verwaltung?

BeitragDi, Feb 16, 2010 19:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Huhu, da bin ich nochmal =)
Jeder von euch kennt doch bestimmt Tetris. Ich habe mir jetz überlegt das mit einem zweidimensionalen Array zu machen. Sprich wenn man die Taste runter drückt, geht die obrige stelle des arrays zurück auf 9 (neutral) und die da drunter auf 10 (der tile).

Code: [AUSKLAPPEN]
Function red_dummy_tile_function()
Local x=10,y=0, down

If KeyDown(208) Then down=1 Else down=0

If down=1 Then
   bg(x,y)=9
      y=y+1
   bg(x,y)=10
EndIf

End Function


Problem nun, das geht nur einmal. Bin ich zu doof das jetzt zu sehen oder woran liegts? Danke schonmal Very Happy

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

Midimaster

BeitragDi, Feb 16, 2010 19:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Willst du damit erreichen, dass der Dummy immer weiter fällt?

Dann musst du jedes Mal ein neues Y übergeben! Da ja der Stein eins weiter gerutsch ist.

nur mal als 1.Schritt:

BlitzBasic: [AUSKLAPPEN]
If down=1 Then
For Y=9 To 0 Step -1
If bg(x,y)=10 Then
bg(X,y)=9
bg(x,y+1)=10
EndIf
Next
EndIf


das musst du natürlich auch noch auf alle X erweitern. Aber da kommst du schon selber drauf...

relentless92

BeitragDi, Feb 16, 2010 19:36
Antworten mit Zitat
Benutzer-Profile anzeigen
So gehts natürlich auch... Vielen Dank!
~
Fussball spielen viele, Kart fahren nur die Besten.
~

relentless92

BeitragDi, Feb 16, 2010 19:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Nun äh... Ich bin deinem Muster gefolgt.

Code: [AUSKLAPPEN]
Function red_dummy_tile_function()
Local x,y, tdown,tleft,tright

If KeyHit(208) Then tdown=1 Else tdown=0
If KeyHit(203) Then tleft=1 Else tdown=0
If KeyHit(205) Then tright=1 Else tdown=0

If tdown=1 Then
    For y=0 To 14
      For x=0 To 19 Step -1
            If bg(x,y)=10 Then
                bg(x,y)=9
                bg(x,y+1)=10
            EndIf
       Next
   Next
EndIf

If tleft=1 Then
    For y=0 To 14
      For x=0 To 19
            If bg(x,y)=10 Then
                bg(x,y)=9
                bg(x-1,y)=10
            EndIf
       Next
   Next
EndIf

If tright=1 Then
    For y=0 To 14
      For x=0 To 19
            If bg(x,y)=10 Then
                bg(x,y)=9
                bg(x+1,y)=10
            EndIf
       Next
   Next
EndIf

End Function


Ich überprüfe auf Tastendruck. Wenn der =1 ist, springt er in die Überprüfung des Feldes. (For Schleifen.)
Wenn er jetzt ein Feld mit Rotem Dummy (bg(x,y)=10) findet, soll er es dementsprechend verschieben und das alte überschreiben.

Taste links geht einwandfrei. Runter gar nicht, Rechts gibts Error, Programm schmiert ab. Äh?

Danke im Vorweg nochmal Wink
~
Fussball spielen viele, Kart fahren nur die Besten.
~

Midimaster

BeitragDi, Feb 16, 2010 19:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, logisch...

das verschieben muss für alle 3 richtungen etwas anders aussehen. du musst immer rückwärts von der vorletzten(!!) Zeile her arbeiten. Das Programm überschreitet sonst die DIM-Grenzen.

Deshalb vorhin das For Y=19 to 0 Step -1 für eine senkrechte Bewegung bei gedachten 20 Zeilen (yMax). Wegen des kopierens wird ja immer noch eine Zeile y+1 angesprochen.

Bei einer Bewegung nach links musst du erst ab Spalte 1 (vorwärts) arbeiten. Bei einer Bewegung nach rechts ab Spalte xMax-1 (rückwärts)


Anmerkung:
Hast du nicht in deinem letzten Beispiel X und Y miteinander verwechselt? Wie breit und wie hoch wird der das Array bzw Spielfeld?

relentless92

BeitragDi, Feb 16, 2010 21:38
Antworten mit Zitat
Benutzer-Profile anzeigen
640x480, (20x32)x(15x32)
Verwechselt ist es nicht.
Aber danke für deine Hilfe, das dürfte funktionieren!

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

relentless92

BeitragDi, Feb 16, 2010 22:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay, tut mir Leid das ich nochmal störe, aber so richtig will das nicht in meinen Kopf rein. Very Happy
Beispiel an diesem Schnipsel:

Code: [AUSKLAPPEN]
If tleft=1 Then
    For y=14 To 0 Step -1
      For x=19 To 0 Step -1
            If bg(x,y)=10 Then
                bg(x,y)=9
                bg(x-1,y)=10
            EndIf
       Next
   Next
EndIf


Wenn die Taste gedrückt ist, Springt er in die Schleifen. Wir befinden uns also bei bg(19,14). wenn diese nun =10 ist, macht er sie =9 und zieht vom x einen ab. also bg(18,14). Allerdings sagt er: Array out of Bounds. Wo ist denn da die Logik?
~
Fussball spielen viele, Kart fahren nur die Besten.
~

Midimaster

BeitragDi, Feb 16, 2010 22:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Na, wenn du nach links suchst und die letzte Spalte darf wie bei dir die X=0 sein, dann kommt die Stelle, wo du Feld(x-1,... schreibst. Und das wäre ja dann wohl Feld(-1,... Das gibt es nicht. Es liegt OUT OF BOUNDS.

Deshalb sollt du bei einer Bewegung nach links auch mit der Untersuchung links anfangen und dich nach rechts durcharbeiten. Beginne Bei X=1 und nicht bei X=0.

Zusammenfassung:
Wenn Spielerbewegung nach links...
..dann Untersuchung von links nach rechts
...beginne bei 1 und geh ruhig bis xMax

Wenn Spielerbewegung nach rechts...
..dann Untersuchung von rechts nach links
...beginne bei xMax-1 und geh ruhig bis 0

Wenn Spielerbewegung nach unten...
..dann Untersuchung von unten nach oben
...beginne bei YMax-1 und geh ruhig bis 0


Anmerkung I:
bei den Bewegungen nach links/rechts ist es bei der Reihenvariable Y egal, ob du mit negativer Richtung untersuchst.

Anmekung II: Ah 20x15, dann ist dein Spielfeld also breiter als hoch!

Anmerkung III:
Du störtst natürlich nicht!

relentless92

BeitragMi, Feb 17, 2010 18:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Alles klar, danke dir nochmal vielmals.
Rechts und links habe ich jetzt verstanden. Erst einmal so erklärt ist es natürlich ganz logisch, danke dir.

Ein Problem habe ich dummerweise trotzdem noch. Rechts und Links funktioniert. Aber bei einem Druck auf die Runter-Taste passiert gar nischt, obwohl die Funktion eigentlich richtig ist.

Code: [AUSKLAPPEN]
If tdown=1 Then
    For y=14 To 0 Step -1
      For x=19 To 0 Step -1
            If bg(x,y)=10 Then
                bg(x,y)=9
                bg(x,y+1)=10
            EndIf
       Next
   Next
EndIf


Ist da ein Fehler so offensichtlich, das ich ihn nicht erkennen kann?

Achja, hier mal die beiden funktionierenden für rechts und links, falls es interessiert:

Code: [AUSKLAPPEN]
If tleft=1 Then
    For y=0 To 14
      For x=7 To 19
            If bg(x,y)=10 Then
                bg(x,y)=9
                bg(x-1,y)=10
            EndIf
       Next
   Next
EndIf

If tright=1 Then
    For y=14 To 0 Step -1
      For x=11 To 0 Step -1
            If bg(x,y)=10 Then
                bg(x,y)=9
                bg(x+1,y)=10
            EndIf
       Next
   Next
EndIf


Danke im Vorraus!
MfG
~
Fussball spielen viele, Kart fahren nur die Besten.
~

Alfadur

BeitragMi, Feb 17, 2010 19:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Du hattest auch in nem obigen code sowas stehen wie


If KeyHit(208) Then tdown=1 Else tdown=0
If KeyHit(203) Then tleft=1 Else tdown=0
If KeyHit(205) Then tright=1 Else tdown=0

das tdown am Ende kann nicht richtig sein ... da fehlt ein tleft und ein tright.
A Cray is the only computer that runs an endless loop in less than four hours.

Nibor

BeitragMi, Feb 17, 2010 21:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]

If KeyHit(208) Then tdown=1 Else tdown=0
If KeyHit(203) Then tleft=1 Else tdown=0
If KeyHit(205) Then tright=1 Else tdown=0


geht übrigens einfacher mit:

Code: [AUSKLAPPEN]
tdown=KeyHit(208)
tleft=KeyHit(203)
tright=KeyHit(205)
http://www.blitzforum.de/showcase/203/

relentless92

BeitragMi, Feb 17, 2010 23:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke euch, es musste ja so etwas offensichtliches sein. Rolling Eyes

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

Silver_Knee

BeitragDo, Feb 18, 2010 1:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei Nibor könnten aber evtl auch die werte 2 oder 3 auftauchen wenn du die taste in einem frame 2 mal drückst... rein hypothetisch

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group