Wer findet den Fehler?

Previous topic - Next topic

x-tra

Ich weiß, ich poste und frage hier zuviel, aber nach all den Mühen werde ich ein Tut zu meinem Spiel schreiben, denn ich hab da auch so einiges bisher gelernt.

Ich habe ein wenig gebastelt, und es wird ein 10x10 felder spielbrett erstellt.

Aber es sollen weder auf x noch auf y drei gleichfarbige steine liegen.

dazu habe ich etwas versucht, aber es klappt nicht so wirklich.

also es werden immer noch teilweise 3 gleiche steine gelegt..............

Findet jemand den Fehler?
Unten der Quellcode und im Anhang das ganze zum ausprobieren als paket.


Code (glbasic) Select
// --------------------------------- //
// Project: aqua
// Start: Tuesday, April 01, 2008
// IDE Version: 5.204
SETSCREEN 600, 600, 1
LIMITFPS 25

 TileSize = 50   //laenge/breite der sprites
 tilesX = 10
 tilesY = 10
 randy = 50    //Randverschiebung
 randx = 49
///Typedefinition
             TYPE Tinfo
             posx
             posy
             posneuy
             box
             boxalt
             ENDTYPE

             LOCAL feld[] AS Tinfo
///Ende Typedefinition

///Dimensionierung
 DIM feld[tilesX][tilesY]
///Ende Dimensionierung

///Material laden
LOADSPRITE "pfeil.png",20
LOADSPRITE "box1.bmp",1
LOADSPRITE "box2.bmp",2
LOADSPRITE "box3.bmp",3
LOADSPRITE "box5.bmp",5
LOADSPRITE "box6.bmp",6
LOADSPRITE "box7.bmp",7
LOADSPRITE "boxclear.png",4
LOADBMP "hintergrund.bmp"
///Ende Material laden



 FOR x = 0 TO tilesX-1
  FOR y = 0 TO tilesY-1
//Falls noch keine 3 werte erstellt worden sind wird nichts überprüft aber die 1. 2 Felder werden gefüllt
IF y < 2
   feld[x][y].box = INTEGER(RND(5)+1)
  ELSE
startY:  
   feld[x][y].box = INTEGER(RND(5)+1)    //nächstes feld wird gefüllt
      LET feld$ = feld[x][y].box    // wert des feldes in string feld$ speichern
      LET feld1$ = feld[x][y-1].box
      LET feld2$ = feld[x][y-2].box
   tempstring$ = (feld$) + (feld1$) + (feld2$)
// überprüfen ob 3 gleiche zeichen sind

SELECT tempstring$
   CASE 000 OR 111 OR 222 OR 333 OR 444 OR 555 OR 666
   GOTO startY
ENDSELECT
ENDIF
//Falls noch keine 3 werte erstellt worden sind wird nichts überprüft aber die 1. 2 Felder werden gefüllt
IF x < 2
   feld[x][y].box = INTEGER(RND(5)+1)
  ELSE
startX:  
   feld[x][y].box = INTEGER(RND(5)+1)     //nächstes feld wird gefüllt
      LET feld$ = feld[x][y].box    // wert des feldes in string feld$ speichern
      LET feld1$ = feld[x-1][y].box
      LET feld2$ = feld[x-2][y].box
   tempstring$ = (feld$) + (feld1$) + (feld2$)
////////////////////////////////////////////

////// überprüfen ob 3 gleiche zeichen sind
SELECT tempstring$
   CASE 000 OR 111 OR 222 OR 333 OR 444 OR 555 OR 666
   GOTO startX
ENDSELECT
ENDIF  
NEXT
NEXT
//////


///Hauptschleife
WHILE TRUE
FOR x = 0 TO tilesX-1
FOR y = 0 TO tilesY-1


              IF feld[x][y].box = 0 THEN DRAWSPRITE 4, ((x*TileSize)+randx),((y*TileSize)+randy)

              IF feld[x][y].box = 1 THEN DRAWSPRITE 1, ((x*TileSize)+randx),((y*TileSize)+randy)

              IF feld[x][y].box = 2 THEN DRAWSPRITE 2, ((x*TileSize)+randx),((y*TileSize)+randy)

              IF feld[x][y].box = 3 THEN DRAWSPRITE 3, ((x*TileSize)+randx),((y*TileSize)+randy)

              IF feld[x][y].box = 4 THEN DRAWSPRITE 5, ((x*TileSize)+randx),((y*TileSize)+randy)

              IF feld[x][y].box = 5 THEN DRAWSPRITE 6, ((x*TileSize)+randx),((y*TileSize)+randy)

              IF feld[x][y].box = 6 THEN DRAWSPRITE 7, ((x*TileSize)+randx),((y*TileSize)+randy)

NEXT
NEXT


//mausbewegung
MOUSESTATE mx, my, b1, b2
DRAWSPRITE 20, mx, my
//mausbewegung ende


SHOWSCREEN

WEND

///Ende Hauptschleife
game.zip - 0.41MB

Kitty Hello

Ich verrat' Dir einen Trick:
-Füll das Feld zufällig.
-Ruf Deine Routine auf "finde 3, lösche die, runterfallen, neue einfügen"
-Achte drarauf, dass keine Punkte vergeben werden
-Lass in dieser Zeit nichts animieren
-Wenn keiner mehr runterfällt -> Spielstart
:D

Schranz0r

I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

x-tra

grins, werd das so versuchen, das kann ich dann gleich weiterverwenden für die abfrage wenn die steine im spiel entfernt werden sollen.

so hab das mal umgeschrieben, bis auf die fallen und ersetzen routine, die folgt noch.

ist das soweit richtig gernot? was sagst du?

Ich bemerke gerade, dass das so garnicht geht.

Kannst du mir vielleicht helfen damit das funktioniert, und sagen was ich an code explizit zu ändern habe.

Ich seh den Fehler einfach nicht.

zumindest in nullen müsste es die felder wandeln, tut es aber nicht.

wenigstens bei dem füllen des spielfeldes auf diese art und weise würde ich mal hilfe brauchen.

kann vielleicht jemand den code korrigieren, bitte.

den fall der steine und das neusetzen wollte ich heute auch noch machen.....büüüdddeeee (@gernot smile)

Code (glbasic) Select
// --------------------------------- //
// Project: aqua
// Start: Tuesday, April 01, 2008
// IDE Version: 5.204
SETSCREEN 600, 600, 1
LIMITFPS 25

 TileSize = 50   //laenge/breite der sprites
 tilesX = 10
 tilesY = 10
 randy = 50    //Randverschiebung
 randx = 49
///Typedefinition
             TYPE Tinfo
             posx
             posy
             posneuy
             box
             boxalt
             ENDTYPE

             LOCAL feld[] AS Tinfo
///Ende Typedefinition

///Dimensionierung
 DIM feld[tilesX][tilesY]
///Ende Dimensionierung

///Material laden
LOADSPRITE "pfeil.png",20
LOADSPRITE "box1.bmp",1
LOADSPRITE "box2.bmp",2
LOADSPRITE "box3.bmp",3
LOADSPRITE "box5.bmp",5
LOADSPRITE "box6.bmp",6
LOADSPRITE "box7.bmp",7
LOADSPRITE "boxclear.png",4
LOADBMP "hintergrund.bmp"
///Ende Material laden
//feld füllen
FOR x = 0 TO tilesX-1
   FOR y = 0 TO tilesY-1
     feld[x][y].box = INTEGER(RND(5)+1)
   NEXT
NEXT
//ende feld füllen

pruefung:
 FOR x = 0 TO tilesX-1
  FOR y = 0 TO tilesY-1

IF y < 2
     y=y+2
  ELSE
startY:
     
      LET feld$ = feld[x][y].box    // wert des feldes in string feld$ speichern
      LET feld1$ = feld[x][y-1].box  // wert des feldes in string feld$ speichern
      LET feld2$ = feld[x][y-2].box   // wert des feldes in string feld$ speichern
   tempstring$ = (feld$) + (feld1$) + (feld2$)  // überprüfen ob 3 gleiche zeichen sind
               SELECT tempstring$
                      CASE 000 OR 111 OR 222 OR 333 OR 444 OR 555 OR 666
                         
                         feld[x][y].box = 0
                         feld[x][y-1].box = 0
                         feld[x][y-2].box = 0
                         //goto fallen routine und neues einfügen
                         GOTO startY
               ENDSELECT
ENDIF

IF x < 2
     x=x+2
  ELSE
startX:
     
      LET feld$ = feld[x][y].box    // wert des feldes in string feld$ speichern
      LET feld1$ = feld[x-1][y].box  // wert des feldes in string feld$ speichern
      LET feld2$ = feld[x-2][y].box   // wert des feldes in string feld$ speichern
   tempstring$ = (feld$) + (feld1$) + (feld2$)  // überprüfen ob 3 gleiche zeichen sind
               SELECT tempstring$
                      CASE 000 OR 111 OR 222 OR 333 OR 444 OR 555 OR 666
                         
                         feld[x][y].box = 0
                         feld[x-1][y].box = 0
                         feld[x-1][y].box = 0
                         //goto fallen routine und neues einfügen
                         GOTO startX
               ENDSELECT
ENDIF
NEXT
NEXT

//////


///Hauptschleife
WHILE TRUE
FOR x = 0 TO tilesX-1
FOR y = 0 TO tilesY-1


              IF feld[x][y].box = 0 THEN DRAWSPRITE 4, ((x*TileSize)+randx),((y*TileSize)+randy)

              IF feld[x][y].box = 1 THEN DRAWSPRITE 1, ((x*TileSize)+randx),((y*TileSize)+randy)

              IF feld[x][y].box = 2 THEN DRAWSPRITE 2, ((x*TileSize)+randx),((y*TileSize)+randy)

              IF feld[x][y].box = 3 THEN DRAWSPRITE 3, ((x*TileSize)+randx),((y*TileSize)+randy)

              IF feld[x][y].box = 4 THEN DRAWSPRITE 5, ((x*TileSize)+randx),((y*TileSize)+randy)

              IF feld[x][y].box = 5 THEN DRAWSPRITE 6, ((x*TileSize)+randx),((y*TileSize)+randy)

              IF feld[x][y].box = 6 THEN DRAWSPRITE 7, ((x*TileSize)+randx),((y*TileSize)+randy)

NEXT
NEXT


//mausbewegung
MOUSESTATE mx, my, b1, b2
DRAWSPRITE 20, mx, my
//mausbewegung ende


SHOWSCREEN

WEND

///Ende Hauptschleife
Hab es selber hinbekommen.im anderen thread der code dazu.

Kitty Hello

Fehle bei:
Code (glbasic) Select
  tempstring$ = (feld$) + (feld1$) + (feld2$)  // überprüfen ob 3 gleiche zeichen sind
               SELECT tempstring$
                      CASE 000 OR 111 OR 222 OR 333 OR 444 OR 555 OR 666
Muss sein:
Code (glbasic) Select
CASE "000" OR "111" ...Hier mal eine Mini-Bejeweled.


Code (glbasic) Select
DIM feld[10][10]

NeuesLevel()
END




FUNCTION NeuesLevel:
FOR x=0 TO 9
FOR y=0 TO 9
feld[x][y] = RND(4)
NEXT
NEXT

ShowFeld(); SHOWSCREEN; MOUSEWAIT
WHILE PruefeDreier() > 0
ShowFeld(); SHOWSCREEN; MOUSEWAIT
WHILE Nachfallen()>0

WEND
ShowFeld(); SHOWSCREEN; MOUSEWAIT
WEND

ENDFUNCTION


FUNCTION PruefeDreier:
LOCAL x,y
LOCAL nTreffer, gefunden

// horizontale 3er
FOR x=0 TO 9
FOR y=0 TO 9
// feld ist leer
// nicht auf 3er prüfen
IF feld[x][y] = -1 THEN CONTINUE

// sind die Nachbarn gleich?
FOR xGleiche=x+1 TO 9 // nach rechts durchprüfen
IF feld[xGleiche][y] <> feld[x][y] // farbe passt nicht
BREAK // raus aus der Schleife
ENDIF
NEXT

// so, hier ist 'xGleiche' jetzt die position, an der
// die Farbe nicht mit 'x' übereinstimmt
// also haben wir xGleiche - x gleiche gefunden:
// [0] [1] [2]
//  A   A   B  -> x=0; xGleiche=2
gefunden = xGleiche - x
IF gefunden >= 3
FOR xLoeschen = x TO xGleiche-1
feld[xLoeschen][y] = -1
NEXT
INC nTreffer, gefunden // die Treffer zählen
ENDIF
NEXT
NEXT

// vertikale 3er prüfen... wie oben, nur anders :P


RETURN nTreffer // wieviele wurden weggemacht?
ENDFUNCTION

FUNCTION Nachfallen:
LOCAL gefallen
FOR x=0 TO 9
FOR y=9 TO 0 STEP -1
IF feld[x][y] = -1
gefallen = TRUE
// nicht in der ersten Zeile
IF y>0
// oberer Stein runter
feld[x][y] = feld[x][y-1]
feld[x][y-1] = -1 // oben leer machen
ELSE
// oben einen neuen reinmachen
feld[x][y]=RND(4)
ENDIF
ENDIF
NEXT
NEXT

RETURN gefallen
ENDFUNCTION


FUNCTION ShowFeld:
LOCAL x,y
LOCAL col[]
DIMDATA col[],  RGB(0xff, 0xff, 0x40), RGB(0x00, 0xff, 0x80), RGB(0x80, 0x80, 0xff), _
RGB(0xff, 0x00, 0x00), RGB(0xff, 0x80, 0xff)

FOR x=0 TO 9
FOR y=0 TO 9
IF feld[x][y]>=0
DRAWRECT x*16, y*16, 14,14, col[feld[x][y]]
PRINT feld[x][y], x*16, y*16
ENDIF
NEXT
NEXT
ENDFUNCTION

x-tra

so im einfachen stil hatte ich das schon hinbekommen, vielleicht nicht so elegant, aber funktionierte.(optimiert hätte ich später)

aber ich kämpfe im moment mit langsam fallenden steinen beim löschen der steine.

in meinem beispiel hab ich aber nur immer einen stein beim anklicken entfernen lassen.
damit das fallen erstmal realisiert wird.

funktioniert auch nicht ganz, aber ich glaub ich muss erstmal 1-2 tage durchschlafen.

Code (glbasic) Select
// --------------------------------- //
// Project: aqua
// Start: Tuesday, April 01, 2008
// IDE Version: 5.204
SETSCREEN 600, 600, 0
LIMITFPS 25
GOSUB variablen
GOSUB initdim
GOSUB material
GOSUB initfeld

WHILE TRUE
GOSUB statik
GOSUB movement
SHOWSCREEN
WEND

///Ende Hauptschleife


// ------------------------------------------------------------- //
// ---  VARIABLEN  ---
// ------------------------------------------------------------- //
SUB variablen:
GLOBAL TileSize = 50
GLOBAL tilesX = 10
GLOBAL tilesY = 10
GLOBAL randy = 50
GLOBAL randx = 49


ENDSUB // VARIABLEN




// ------------------------------------------------------------- //
// ---  INITDIM  ---
// ------------------------------------------------------------- //
SUB initdim:

             TYPE Tinfo
             posx
             posy

             box
             boxalt
             posyalt
             ENDTYPE

             GLOBAL  feld[] AS Tinfo



 DIM feld[tilesX][tilesY]



ENDSUB // INITDIM




// ------------------------------------------------------------- //
// ---  MATERIAL  ---
// ------------------------------------------------------------- //
SUB material:
LOADSPRITE "pfeil.png",20
LOADSPRITE "box1.png",1
LOADSPRITE "box2.png",2
LOADSPRITE "box3.png",3
LOADSPRITE "box5.png",5
LOADSPRITE "box6.png",6
LOADSPRITE "box7.png",7
LOADSPRITE "boxclear.png",4
LOADBMP "hintergrund.bmp"


ENDSUB // MATERIAL




// ------------------------------------------------------------- //
// ---  INITFELD  ---
// ------------------------------------------------------------- //
SUB initfeld:
FOR x = 0 TO tilesX-1
  FOR y = 0 TO tilesY-1
    feld[x][y].box = (RND(5)+1)
    WHILE ( y>1 AND feld[x][y-1].box = feld[x][y].box AND feld[x][y-2].box = feld[x][y].box) OR ( x>1 AND feld[x-1][y].box = feld[x][y].box AND feld[x-2][y].box = feld[x][y].box)
      feld[x][y].box = (RND(5)+1)
    WEND
  NEXT
NEXT
FOR x = 0 TO tilesX-1
 FOR y = 0 TO tilesY-1
 GLOBAL feld[x][y].posx = ((x*TileSize)+randx)
 GLOBAL feld[x][y].posy = ((y*TileSize)+randy)
 NEXT
NEXT

ENDSUB // INITFELD


// ------------------------------------------------------------- //
// ---  STATIC  ---
// ------------------------------------------------------------- //
SUB statik:

FOR x = 0 TO tilesX-1
FOR y = 0 TO tilesY-1

MOUSESTATE mx, my, b1, b2
DRAWSPRITE 20, mx, my
feld[x][y].boxalt = feld[x][y].box

IF y > 0
 feld[x][y-1].boxalt = feld[x][y-1].box
 feld[x][y-1].posyalt = feld[x][y-1].posy
ENDIF
IF b1 = 1
   IF mx >= feld[x][y].posx AND mx <= (feld[x][y].posx + 48) AND  my >= feld[x][y].posy AND my <= (feld[x][y].posy + 48)
    feld[x][y].box = 0
    feld[x][y-1].box = 0
ENDIF
ENDIF





IF feld[x][0].box = 0
     feld[x][0].box = (RND(5)+1)
ENDIF


              IF feld[x][y].box = 0 THEN DRAWSPRITE 4, feld[x][y].posx,feld[x][y].posy

              IF feld[x][y].box = 1 THEN DRAWSPRITE 1, feld[x][y].posx,feld[x][y].posy

              IF feld[x][y].box = 2 THEN DRAWSPRITE 2, feld[x][y].posx,feld[x][y].posy

              IF feld[x][y].box = 3 THEN DRAWSPRITE 3, feld[x][y].posx,feld[x][y].posy

              IF feld[x][y].box = 4 THEN DRAWSPRITE 5, feld[x][y].posx,feld[x][y].posy

              IF feld[x][y].box = 5 THEN DRAWSPRITE 6, feld[x][y].posx,feld[x][y].posy

              IF feld[x][y].box = 6 THEN DRAWSPRITE 7, feld[x][y].posx,feld[x][y].posy

PRINT mx, 10, 20
PRINT my, 10, 30



NEXT
NEXT

ENDSUB // STATIC




// ------------------------------------------------------------- //
// ---  MOVEMENT  ---
// ------------------------------------------------------------- //
//SUB movement:
FOR x = 0 TO tilesX-1
 FOR y = 0 TO tilesY-1
  IF y > 0
   IF feld[x][y].box = 0 AND  feld[x][y-1].box = 0
     feld[x][y-1].posyalt = feld[x][y-1].posyalt + 1
     DRAWSPRITE feld[x][y].boxalt, feld[x][y-1].posx, feld[x][y-1].posyalt
       IF feld[x][y-1].posyalt = feld[x][y].posy          
           feld[x][y].box = feld[x][y-1].boxalt            
        ENDIF              
             
   ENDIF              
  ENDIF
 NEXT
NEXT
//ENDSUB // MOVEMENT

Kitty Hello

Aso.
Ich mach das so - und es gibt da mehrere Wege, meine muss nicht der Beste sein - dass ich in der Funktion "Draw" eine Variable einbaue, die Blöcke, wenn darunter leer ist, um nY Pixel verschoben anzeigt.
Die rufe ich dann mehrmals nach dem FallStones() auf, das dann die Werte im Feld geändert hat.
Wichtig dabei, dass man die oberste Zeile quasi versteckt hält.

Hat jemand eine bessere Idee?

x-tra

ich hatte es mir schon so überlegt: ein schleifenteil in draw, wo die statischen werte in den feldern gezeichnet werden.und darunter der teil, wo alle sprites um ein pixel verschoben werden wo das feld oberhalb x,y leer ist, und sozusagen mit 0 gefüllt.das darüber liegende feld müsste dann noch mit einem extra type wert markiert werden, damit das nächste feld oben drüber auch noch mit nach unten kommt, usw usw. ausser natürlich y> null, da erfolgt oben keine abfrage mehr, sondern nur noch wenn x,0 dann eben zufalls x,y = zufallswert.

aber ich denke mal, ich machs einfach zu umständlich.....

[edit] es geht ausschliesslich um die fallroutine der steine, die ich noch nicht hinbekomme......

Jemand eine bessere Idee?


[edit] momentan versuch ichs damit:  ich gehe das spielfeld gleich zu beginn von unten nach oben durchlaufen, setze dabei die statischen steine in den feldern. als nächstes gehe ich die zeilen y eine nach der anderen durch, und zeichne ein sprite von der position eins drüber wenn das drunterliegende feld leer ist. naja alles bisschen kompliziert, hoffe ich bekomme das bald hin, die letzten nächte waren einfach zu lang.

hierzu mal ein code, der natürlich wieder mal nicht funktioniert, wie er soll.......menno (achja die cases unten sollten später zusammengefügt werden, aber ich hats nun schon dastehen.

Code (glbasic) Select
// --------------------------------- //
// Project: aqua
// Start: Tuesday, April 01, 2008
// IDE Version: 5.204
SETSCREEN 600, 600, 0
LIMITFPS 25
GOSUB variablen
GOSUB initdim
GOSUB material
GOSUB initfeld

WHILE TRUE
GOSUB statik
GOSUB movement
SHOWSCREEN
WEND

///Ende Hauptschleife


// ------------------------------------------------------------- //
// ---  VARIABLEN  ---
// ------------------------------------------------------------- //
SUB variablen:
GLOBAL TileSize = 50
GLOBAL tilesX = 10
GLOBAL tilesY = 10
GLOBAL randy = 50
GLOBAL randx = 49


ENDSUB // VARIABLEN




// ------------------------------------------------------------- //
// ---  INITDIM  ---
// ------------------------------------------------------------- //
SUB initdim:

             TYPE Tinfo
             posx
             posy
             box
             boxalt
             posyalt
             wandern
             ENDTYPE

             GLOBAL  feld[] AS Tinfo



 DIM feld[tilesX][tilesY]



ENDSUB // INITDIM




// ------------------------------------------------------------- //
// ---  MATERIAL  ---
// ------------------------------------------------------------- //
SUB material:
LOADSPRITE "pfeil.png",20
LOADSPRITE "box1.png",1
LOADSPRITE "box2.png",2
LOADSPRITE "box3.png",3
LOADSPRITE "box5.png",5
LOADSPRITE "box6.png",6
LOADSPRITE "box7.png",7
LOADSPRITE "boxclear.png",4
LOADBMP "hintergrund.bmp"
LOADSPRITE "hintergrund.bmp",50

ENDSUB // MATERIAL




// ------------------------------------------------------------- //
// ---  INITFELD  ---
// ------------------------------------------------------------- //
SUB initfeld:
FOR x = 0 TO tilesX-1
  FOR y = 0 TO tilesY-1
    feld[x][y].box = (RND(5)+1)
    WHILE ( y>1 AND feld[x][y-1].box = feld[x][y].box AND feld[x][y-2].box = feld[x][y].box) OR ( x>1 AND feld[x-1][y].box = feld[x][y].box AND feld[x-2][y].box = feld[x][y].box)
      feld[x][y].box = (RND(5)+1)
    WEND
  NEXT
NEXT
FOR x = 0 TO tilesX-1
 FOR y = 0 TO tilesY-1
 GLOBAL feld[x][y].posx = ((x*TileSize)+randx)
 GLOBAL feld[x][y].posy = ((y*TileSize)+randy)
 NEXT
NEXT

ENDSUB // INITFELD


// ------------------------------------------------------------- //
// ---  STATIC  ---
// ------------------------------------------------------------- //
SUB statik:
BLACKSCREEN
DRAWSPRITE 50, 0, 0
FOR x = 9 TO 0 STEP -1
FOR y = 9 TO 0 STEP -1


feld[x][y].boxalt = feld[x][y].box

IF y > 0
 feld[x][y-1].boxalt = feld[x][y-1].box
 feld[x][y-1].posyalt = feld[x][y-1].posy
ENDIF
IF b1 = 1
   IF mx >= feld[x][y].posx AND mx <= (feld[x][y].posx + 48) AND  my >= feld[x][y].posy AND my <= (feld[x][y].posy + 48)
    feld[x][y].box = 0
   
   
ENDIF
ENDIF





IF feld[x][0].box = 0
     feld[x][0].box = (RND(5)+1)
ENDIF


              IF feld[x][y].box = 0 THEN DRAWSPRITE 4, feld[x][y].posx,feld[x][y].posy

              IF feld[x][y].box = 1 THEN DRAWSPRITE 1, feld[x][y].posx,feld[x][y].posy

              IF feld[x][y].box = 2 THEN DRAWSPRITE 2, feld[x][y].posx,feld[x][y].posy

              IF feld[x][y].box = 3 THEN DRAWSPRITE 3, feld[x][y].posx,feld[x][y].posy

              IF feld[x][y].box = 4 THEN DRAWSPRITE 5, feld[x][y].posx,feld[x][y].posy

              IF feld[x][y].box = 5 THEN DRAWSPRITE 6, feld[x][y].posx,feld[x][y].posy

              IF feld[x][y].box = 6 THEN DRAWSPRITE 7, feld[x][y].posx,feld[x][y].posy

MOUSESTATE mx, my, b1, b2
DRAWSPRITE 20, mx+1, my+1
PRINT mx, 10, 20
PRINT my, 10, 30
NEXT
NEXT
USEASBMP
ENDSUB // STATIC




// ------------------------------------------------------------- //
// ---  MOVEMENT  ---
// ------------------------------------------------------------- //
SUB movement:
FOR y = 9 TO 1 STEP -1
//////////////////////////////////
 SELECT feld[9][y].box
  CASE 0
      IF feld[9][y].wandern = 0
         feld[9][y].boxalt=feld[9][y-1].box
         feld[9][y].posyalt=feld[9][y-1].posy
         feld[9][y].wandern = 1
      ENDIF
      feld[9][y-1].box = 0
     IF feld[9][y].wandern = 1
     feld[9][y].posyalt = feld[9][y].posyalt + 1
     DRAWSPRITE feld[9][y].boxalt, feld[9][y].posy, feld[9][y].posyalt
     ENDIF  
      IF feld[9][y].posy = feld[9][y].posyalt
      feld[9][y].box = feld[9][y].boxalt
      feld[9][y].wandern = 0
      ENDIF
 ENDSELECT
//////////////////////////////////
 SELECT feld[8][y].box
  CASE 0
 IF feld[8][y].wandern = 0
         feld[8][y].boxalt=feld[8][y-1].box
         feld[8][y].posyalt=feld[8][y-1].posy
         feld[8][y].wandern = 1
      ENDIF
      feld[8][y-1].box = 0
     IF feld[8][y].wandern = 1
     feld[8][y].posyalt = feld[8][y].posyalt + 1
     DRAWSPRITE feld[8][y].boxalt, feld[8][y].posy, feld[8][y].posyalt
     ENDIF  
      IF feld[8][y].posy = feld[8][y].posyalt
      feld[8][y].box = feld[8][y].boxalt
       feld[8][y].wandern = 0
      ENDIF
 ENDSELECT
//////////////////////////////////
 SELECT feld[7][y].box
  CASE 0
 IF feld[7][y].wandern = 0
         feld[7][y].boxalt=feld[7][y-1].box
         feld[7][y].posyalt=feld[7][y-1].posy
         feld[7][y].wandern = 1
      ENDIF
      feld[7][y-1].box = 0
     IF feld[7][y].wandern = 1
     feld[7][y].posyalt = feld[7][y].posyalt + 1
     DRAWSPRITE feld[7][y].boxalt, feld[7][y].posy, feld[7][y].posyalt
     ENDIF  
      IF feld[7][y].posy = feld[7][y].posyalt
      feld[7][y].box = feld[7][y].boxalt
       feld[7][y].wandern = 0
      ENDIF
 ENDSELECT
//////////////////////////////////
 SELECT feld[6][y].box
  CASE 0
 IF feld[6][y].wandern = 0
         feld[6][y].boxalt=feld[6][y-1].box
         feld[6][y].posyalt=feld[6][y-1].posy
         feld[6][y].wandern = 1
      ENDIF
      feld[6][y-1].box = 0
     IF feld[6][y].wandern = 1
     feld[6][y].posyalt = feld[6][y].posyalt + 1
     DRAWSPRITE feld[6][y].boxalt, feld[6][y].posy, feld[6][y].posyalt
     ENDIF  
      IF feld[6][y].posy = feld[6][y].posyalt
      feld[6][y].box = feld[6][y].boxalt
       feld[6][y].wandern = 0
     ENDIF
 ENDSELECT
//////////////////////////////////
 SELECT feld[5][y].box
  CASE 0
 IF feld[5][y].wandern = 0
         feld[5][y].boxalt=feld[5][y-1].box
         feld[5][y].posyalt=feld[5][y-1].posy
         feld[5][y].wandern = 1
      ENDIF
      feld[5][y-1].box = 0
     IF feld[5][y].wandern = 1
     feld[5][y].posyalt = feld[5][y].posyalt + 1
     DRAWSPRITE feld[5][y].boxalt, feld[5][y].posy, feld[5][y].posyalt
     ENDIF  
      IF feld[5][y].posy = feld[5][y].posyalt
      feld[5][y].box = feld[5][y].boxalt
       feld[5][y].wandern = 0
      ENDIF
 ENDSELECT
//////////////////////////////////
 SELECT feld[4][y].box
  CASE 0
 IF feld[4][y].wandern = 0
         feld[4][y].boxalt=feld[4][y-1].box
         feld[4][y].posyalt=feld[4][y-1].posy
         feld[4][y].wandern = 1
      ENDIF
      feld[4][y-1].box = 0
     IF feld[4][y].wandern = 1
     feld[4][y].posyalt = feld[4][y].posyalt + 1
     DRAWSPRITE feld[4][y].boxalt, feld[4][y].posy, feld[4][y].posyalt
     ENDIF  
      IF feld[4][y].posy = feld[4][y].posyalt
      feld[4][y].box = feld[4][y].boxalt
       feld[4][y].wandern = 0
      ENDIF
 ENDSELECT
//////////////////////////////////
 SELECT feld[3][y].box
  CASE 0
 IF feld[3][y].wandern = 0
         feld[3][y].boxalt=feld[3][y-1].box
         feld[3][y].posyalt=feld[3][y-1].posy
         feld[3][y].wandern = 1
      ENDIF
      feld[3][y-1].box = 0
     IF feld[3][y].wandern = 1
     feld[3][y].posyalt = feld[3][y].posyalt + 1
     DRAWSPRITE feld[3][y].boxalt, feld[3][y].posy, feld[3][y].posyalt
     ENDIF  
      IF feld[3][y].posy = feld[3][y].posyalt
      feld[3][y].box = feld[3][y].boxalt
       feld[3][y].wandern = 0
      ENDIF
 ENDSELECT
//////////////////////////////////
 SELECT feld[2][y].box
  CASE 0
 IF feld[2][y].wandern = 0
         feld[2][y].boxalt=feld[2][y-1].box
         feld[2][y].posyalt=feld[2][y-1].posy
         feld[2][y].wandern = 1
      ENDIF
      feld[2][y-1].box = 0
     IF feld[2][y].wandern = 1
     feld[2][y].posyalt = feld[2][y].posyalt + 1
     DRAWSPRITE feld[2][y].boxalt, feld[2][y].posy, feld[2][y].posyalt
     ENDIF  
      IF feld[2][y].posy = feld[2][y].posyalt
      feld[2][y].box = feld[2][y].boxalt
       feld[2][y].wandern = 0
      ENDIF
 ENDSELECT
//////////////////////////////////
 SELECT feld[1][y].box
  CASE 0
 IF feld[1][y].wandern = 0
         feld[1][y].boxalt=feld[1][y-1].box
         feld[1][y].posyalt=feld[1][y-1].posy
         feld[1][y].wandern = 1
      ENDIF
      feld[1][y-1].box = 0
     IF feld[1][y].wandern = 1
     feld[1][y].posyalt = feld[1][y].posyalt + 1
     DRAWSPRITE feld[1][y].boxalt, feld[1][y].posy, feld[1][y].posyalt
     ENDIF  
      IF feld[1][y].posy = feld[1][y].posyalt
      feld[1][y].box = feld[1][y].boxalt
       feld[1][y].wandern = 0
      ENDIF
 ENDSELECT
//////////////////////////////////
 SELECT feld[0][y].box
  CASE 0
 IF feld[0][y].wandern = 0
         feld[0][y].boxalt=feld[0][y-1].box
         feld[0][y].posyalt=feld[0][y-1].posy
         feld[0][y].wandern = 1
      ENDIF
      feld[0][y-1].box = 0
     IF feld[0][y].wandern = 1
     feld[0][y].posyalt = feld[0][y].posyalt + 1
     DRAWSPRITE feld[0][y].boxalt, feld[0][y].posy, feld[0][y].posyalt
     ENDIF  
      IF feld[0][y].posy = feld[0][y].posyalt
      feld[0][y].box = feld[0][y].boxalt
       feld[0][y].wandern = 0
      ENDIF
 ENDSELECT
//////////////////////////////////
NEXT
ENDSUB // MOVEMENT

x-tra

Ich muss jetzt einfach mal nen neuen post machen, ist wichtig.(okay für mich zumindest)

Ich hab jetzt bisschen probiert, und das Ganze der Übersicht halber auf ein eindimensionales array beschränkt, welches bei maustastenbetätigung, das unterste feld leeren soll, und eigentlich alles oben drüber nach unten "gleiten" soll.

und ich habs geschafft, zumindest in diesem beispiel hab ich die gewünschte funktionsweise erreicht.

muss ich das nur noch auf ein 2d array umbiegen.

wer mir dabei helfen will, Hilfe nehme ich dankend an.

[edit] okay es hat noch seine macken, stelle ich fest, aber naja wie gesagt, sagt ruhig was dazu.


     (und zum thema doppelpostkasse, ich sponsor für den nächsten contest ein board, cpu und ein grafiktablet, grins)

Code (glbasic) Select
// --------------------------------- //
// Project: 1dfall
// Start: Tuesday, April 08, 2008
// IDE Version: 5.222
SETSCREEN 800,600,0
LIMITFPS 25

tiles=7

TYPE Ttest
     tx
     ty
     voll
     typ
     sx
     sy
     alt
     ENDTYPE

     LOCAL feld[] AS Ttest

     DIM feld[tiles]

LOADSPRITE "box1.png",1
LOADSPRITE "box2.png",2
LOADSPRITE "box3.png",3
LOADSPRITE "box5.png",4
LOADSPRITE "box6.png",5
LOADSPRITE "boxclear.png",8
LOADBMP "hintergrund.bmp"



feld[1].tx = 0
feld[1].ty = 0
feld[2].tx = 0
feld[2].ty = 50
feld[3].tx = 0
feld[3].ty = 100
feld[4].tx = 0
feld[4].ty = 150
feld[5].tx = 0
feld[5].ty = 200
feld[6].tx = 0
feld[6].ty = 250



FOR x = 0 TO tiles-1
feld[x].typ = (RND(4)+1)
NEXT

WHILE TRUE

FOR x = 0 TO tiles-1
DRAWSPRITE feld[x].typ, feld[x].tx, feld[x].ty
NEXT
//fallen

FOR x = 0 TO tiles-1
IF x = 0
   IF feld[x].typ = 0 THEN feld[x].typ = (RND(4)+1)
ENDIF
MOUSESTATE mx, my, b1, b2
IF b1 = 1 THEN feld[6].voll = 1
IF x > 1
IF feld[x].voll = 1
      feld[x-1].alt = feld[x-1].typ
      feld[x].typ = 0
      feld[x-1].sy = feld[x-1].ty
   feld[x].voll = 0
ENDIF
 IF feld[x].typ = 0
    feld[x-1].typ = 8       /////////////////////musste ich auf 1 setzen sonst verschwinden alle
    DRAWSPRITE feld[x-1].alt, 0, feld[x-1].sy
    feld[x-1].sy = feld[x-1].sy +1
    IF feld[x-1].sy = feld[x].ty
        feld[x].typ = feld[x-1].alt
        feld[x-1].voll = 1
        feld[x-1].sy = feld[x-1].ty
       
    ENDIF
ENDIF
ENDIF

NEXT
//fallen ende

SHOWSCREEN
WEND

Schranz0r

Haste den auch eine Art -> Mousehit <- gemacht?
Da du ja jeden Schleifendurchlauf, wenn du auf der Maustaste bist, wieder ein Feld löschst....
Nur mal so als Anregung :)
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

x-tra

[edit]  so der code funktioniert jetzt auf jeden fall erstmal soweit.

aber vielleicht weiß jemand, ob es einen fehler geben könnte, wenn ich den code in mein spiel einbaue, aus dem anderen thread, und mehr als nur ein feld gelöscht wird.

werd das heute abend mal testen, aber da muss ich ja erst noch das restliche spiel fertigmachen, damit die steine durch einfache kombinationen entfernt werden, bin schon sehr gespannt.

Code (glbasic) Select
// --------------------------------- //
// Project: 1dfall
// Start: Tuesday, April 08, 2008
// IDE Version: 5.222
SETSCREEN 800,600,0
LIMITFPS 25

tiles=7

TYPE Ttest
     tx
     ty
     voll
     typ
     sx
     sy
     alt
     ENDTYPE

     LOCAL feld[] AS Ttest

     DIM feld[tiles]
LOADSPRITE "pfeil.png",20
LOADSPRITE "box1.png",1
LOADSPRITE "box2.png",2
LOADSPRITE "box3.png",3
LOADSPRITE "box5.png",4
LOADSPRITE "box6.png",5
LOADSPRITE "boxclear.png",8
LOADBMP "hintergrund.bmp"



feld[1].tx = 0
feld[1].ty = 0
feld[2].tx = 0
feld[2].ty = 50
feld[3].tx = 0
feld[3].ty = 100
feld[4].tx = 0
feld[4].ty = 150
feld[5].tx = 0
feld[5].ty = 200
feld[6].tx = 0
feld[6].ty = 250



FOR x = 0 TO tiles-1
feld[x].typ = (RND(4)+1)
NEXT

WHILE TRUE

FOR x = 1 TO tiles-1
DRAWSPRITE feld[x].typ, feld[x].tx, feld[x].ty
NEXT
//fallen

FOR x = 1 TO tiles-1
IF x = 1
         IF feld[x].typ = 0 THEN feld[x].typ = (RND(4)+1)
ENDIF



IF feld[x].voll = 1
         feld[x-1].alt = feld[x-1].typ
         feld[x].typ = 0
         feld[x-1].sy = feld[x-1].ty
         feld[x].voll = 0
ENDIF
 
 IF feld[x].typ = 0
   IF x > 1
    feld[x-1].typ = 8       /////////////////////musste ich auf 1 setzen sonst verschwinden alle
    DRAWSPRITE feld[x-1].alt, 0, feld[x-1].sy
    feld[x-1].sy = feld[x-1].sy +5
    IF feld[x-1].sy = feld[x].ty
        feld[x].typ = feld[x-1].alt
        feld[x-1].voll = 1
        feld[x-1].sy = feld[x-1].ty

    ENDIF
ENDIF
ENDIF
IF b1 = 1
   IF mx >= feld[x].tx AND mx <= (feld[x].tx + 48) AND  my >= feld[x].ty AND my <= (feld[x].ty + 48)
      feld[x].voll = 1
     
   ENDIF
ENDIF


NEXT
DRAWSPRITE 20, mx, my
MOUSESTATE mx, my, b1, b2
//fallen ende

SHOWSCREEN
WEND

Schranz0r

[Anregung]
Code (glbasic) Select
IF b1 = 1
   IF mx >= feld[x].tx AND mx <= (feld[x].tx + 48) AND  my >= feld[x].ty AND my <= (feld[x].ty + 48)
      feld[x].voll = 1
     
   ENDIF
ENDIF
Wieso benutzt du nicht einfach BOXCOLL ?
Achja, und da man da den Mauspointer auf 1 Pixel Breite setzten muss, machst du folgendes:

Pseudo:
Code (glbasic) Select
IF BOXCOLL(X+1,Y+1,SX-2,SY-2,MX,MY,1,1)     // +1 / -2 damit du nicht 2 Felder gleichzeitig anklicken kannst
    IF B1
        Feld[X][Y] = 0  // nix mehr drin
    ENDIF
ENDIF
[/Anregung]
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

x-tra

och naja, ich lass das erstmal so, kann ich ja später im nachgang bei den optimierungen mit einbauen.

hauptsache ich bekomm das mit den fallenden steinen korrekt in mein komplettes feld rein.

achja, wie meintest du das mit dem Mousehit? Gibts dafür nen beispiel, oder wie macht man das am elegantesten, und einfachsten?
alle felder mittels schleife druchgehen, und die maustastenabfrage nur zulassen, wenn alle felder gefüllt sind?)

[edit] gabs hier nicht auch noch irgendwo nen codeschnippsel, wo man den code auf unterschiedlichen pc´s gleich schnell laufen läßt?
          muss ja dann später auch noch rein.

Kitty Hello

Gleich schnell bei Bejeweled? LIMITFPS 60

x-tra

ja ich dachte wegen den fallenden steinen, dass die überall gleich schnell fallen......