Programmiertechnikfrage zu Bejeweled o.ä.

Übersicht BlitzBasic Allgemein

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

BB-Fan

Betreff: Programmiertechnikfrage zu Bejeweled o.ä.

BeitragMo, März 31, 2008 14:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich möchte mal eine programmiertechnische Frage stellen.

Bei einem Spiel wie Bejeweled oder einem ähnlich aufgebauten hat man ja nun dieses Spielfeld, wo die Steine von oben herab purzeln, und man durch das verschieben von Steinen diese in Gruppen entfernen kann.

Wie funktioniert grundlegend das Handling eines solchen Spielfeldes?
Also es besteht ja auch vielen Feldern, dann rutschen die Steine ja immer weiter von oben nach.
Wie werden die Felder bzw. die darin befindlichen Steine abgefragt.

Ich will hier um Gottes Willen keinen code, nur wissen wie man sowas theoretisch umsetzen könnte.

Thorsten

BeitragMo, März 31, 2008 15:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Schonmal etwas von einem Array gehört?
http://www.blitzbase.de/befehle2d/dim.htm

mfG,

Thorsten
 

BB-Fan

BeitragDi, Apr 01, 2008 15:15
Antworten mit Zitat
Benutzer-Profile anzeigen
das gehört glaube ich zu den lieblingsthemen von vielen hier.grins.

ich weiß, dass ich wahrscheinlich eine abfuhr hier bekommen werde, bzw. den rat ich soll doch selber suchen, aber kann mir einer sagen, inwiefern ich das bei so einem spiel am besten umsetzen kann?

SpionAtom

BeitragDi, Apr 01, 2008 15:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Spiele, wie Tetris oder Bejeweled basieren auf einem zweidimensionalen Feld, und genau so ein Feld kann man wunderbar mit einem zweidimensionalen Array realisieren.

Hast du denn nun Arrays drauf oder nicht?
Wenn du die Frage mit nein beantworten kannst, so tu dir den Link von Thorsten an.
Wenn du schon einigermaßen mit Arrays umgehen kannst, so ist es gar nicht mehr soo schwierig, so ein Spiel umzusetzen. Und dann helf ich natürlich gerne weiter.
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080
 

BB-Fan

BeitragDi, Apr 01, 2008 16:21
Antworten mit Zitat
Benutzer-Profile anzeigen
also wie die funktioneren habe ich schon verstanden, das zu deiner ersten frage.

Ich habe mir schon gedacht, dass man damit ein 2D Feld erstellen kann.

Ich zerbreche mir nur den Kopf, wie man den Rest umsetzt.

Also sagen wir mal ein Feld 10x10 Felder.

Dann soll das Spielprinzip so laufen, dass man eben immer die positionen von zwei nebeneinanderliegenden spielsteinen tauschen kann, um somit eine 3er kombination zu erreichen.in dem fall verschwinden die steine, und ansonsten ist ein positionstausch nicht möglich.

dann rutschen ja auch noch von oben steine nach.

und dann frage ich mich, wie man die steine definiert, da diese ja irgendwann verschwinden, etc. etc.

SpionAtom

BeitragDi, Apr 01, 2008 16:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Fangen wir mal mit Feld anzeigen an:
Code: [AUSKLAPPEN]
Graphics 800, 600, 0, 2
SetBuffer BackBuffer()

   ;Initialiseriung
   Const tilesX = 10, tilesY = 10, tileSize = 30   
   Dim feld(tilesX - 1, tilesY - 1)
   
   feld(3, 4) = 1
   feld(5, 6) = 2
   feld(8, 8) = 3
   

   ;Hauptschleife
   Repeat
   
   
      ;Feld anzeigen
      Cls
      For x = 0 To tilesX - 1
      For y = 0 To tilesY - 1
         Select feld(x, y)
            Case 0:   Color 255, 255, 255: Rect x * tileSize, y * tileSize, tileSize, tileSize, 0
            Case 1: Color 255, 0, 0: Rect x * tileSize, y * tileSize, tileSize, tileSize, 1
            Case 2: Color 0, 255, 0: Rect x * tileSize, y * tileSize, tileSize, tileSize, 1
            Case 3: Color 0, 0, 255: Rect x * tileSize, y * tileSize, tileSize, tileSize, 1
         End Select
      Next
      Next
   
   Until KeyDown(1)
   End


Blickst du da durch?
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080
  • Zuletzt bearbeitet von SpionAtom am Di, Apr 01, 2008 16:31, insgesamt einmal bearbeitet
 

ChristianK

BeitragDi, Apr 01, 2008 16:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Am besten machst du ein Array von Types, dann kannst du mehrere Informationen speichern wie Position, Farbe und Status ( Herunterfallen, Tauschen, ... ).
Sinnvoll ist es sicher auch, sich das Prinzip auf ein Blatt zu malen, um sich klar zu machen, wie man die Steine herunterfallen lässt oder Kombinationen erkennt.
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT
 

BB-Fan

BeitragDi, Apr 01, 2008 17:04
Antworten mit Zitat
Benutzer-Profile anzeigen
@SpionAtom: noch nicht ganz, aber fast, ich habs sicher gleich...


für was steht das hier: Code: [AUSKLAPPEN]
   feld(3, 4) = 1
   feld(5, 6) = 2
   feld(8, 8) = 3


ich frag lieber einmal zuviel

SpionAtom

BeitragDi, Apr 01, 2008 17:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Da hab ich willkürlich 3 Feldern verschiedene Werte zugewiesen.
Wenn ein Feld zb den Wert 1 hat, so wird es rot gezeichnet. Wenn es den Wert 0 hat, so ist es leer.
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080
 

BB-Fan

BeitragDi, Apr 01, 2008 17:13
Antworten mit Zitat
Benutzer-Profile anzeigen
achso, da steht praktisch gesehen jetzt jeweils die jeweilige zahl drin, könnte aber auch ein stein sein, gut das hab ich verstanden, soweit alles.

aber du hättest sicher auch 0-9 nehmen können statt jeweils -1, richtig, aber das nur am rande.

eine frage, soll hier immer eine 10x10 grosses spielfeld gezeichnet werden?

das haut nämlich nicht hin, wenn ich es in bb ausführe.

ansonsten ist mir die funktionsweise soweit klar.


und damit es nicht so ausschaut, als wenn ich nur irgendeinem code hinterherrenne, hab ich das beispiel ein wenig verändert, drei aufeinanderfolgende felder werden gefärbt, aber warum wird jedesmal ein andersgrosses spielfeld gezeichnet?


Code: [AUSKLAPPEN]
Graphics 800, 600, 0, 2
SetBuffer BackBuffer()

   ;Initialiseriung
   Const tilesX = 9, tilesY = 9, tileSize = 30   
   Dim feld(tilesX, tilesY)
   
   feld(1, 1) = 1
   feld(1, 2) = 2
   feld(1, 3) = 3
   

   ;Hauptschleife
   Repeat
   
   
      ;Feld anzeigen
      Cls
      For x = 0 To tilesX
      For y = 0 To tilesY
         Select feld(x, y)
            Case 0:   Color 255, 255, 255: Rect x * tileSize, y * tileSize, tileSize, tileSize, 0
            Case 1: Color 255, 0, 0: Rect x * tileSize, y * tileSize, tileSize, tileSize, 1
            Case 2: Color 0, 255, 0: Rect x * tileSize, y * tileSize, tileSize, tileSize, 1
            Case 3: Color 0, 0, 255: Rect x * tileSize, y * tileSize, tileSize, tileSize, 1
         End Select
      Next
      Next
   
   Until KeyDown(1)
   End

SpionAtom

BeitragDi, Apr 01, 2008 17:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Das liegt an meiner Nachlässigkeit, Flip() reinzusetzen (siehe Tobis BBP-Episode 1)

Code: [AUSKLAPPEN]

.
.
    Flip()
Until Keydown(1)
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080
 

BB-Fan

BeitragDi, Apr 01, 2008 17:53
Antworten mit Zitat
Benutzer-Profile anzeigen
achgott, stimmt, das hätte mir aber auch auffallen sollen.

so, soweit hab ich das jetzt alles verstanden....

was würdest du jetzt tun?

zufälliges füllen der felder wäre logisch, und da stellt sich auch gleich eine frage für später, bevor ich die vergesse:wie bekommt man sozusagen so ein sliden eines sprites von einem feld ins nächste hin, also wenn die von oben runterrutschen? so könnte man auch gleich das spielfeld komplett füllen.

dann folgen sicher die einzelnen abhängigkeiten der felder untereinander in abhängigkeit, bzw. vorgeschaltet etwaige übereinstimmungen von gleichen feldinhalten.

SpionAtom

BeitragDi, Apr 01, 2008 18:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Über das Sliden würde ich mir erst am Schluss gedanken machen. Zunächst sollte das ganze auch ohne Animationen klappen.
Wann fällt ein Stein? Wenn unter ihm ein freies Feld ist. Du müsstest also jeden Stein fragen, ob unter ihm ein freies Feld ist. Würdest du das hinbekommen?
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080
 

BB-Fan

BeitragDi, Apr 01, 2008 18:36
Antworten mit Zitat
Benutzer-Profile anzeigen
also aktuelles feld(tileX+10,tileY+1) auf leerstand prüfen, ja das bekomme ich hin.

mmmm bekomm immer fehler, bei if feld(x+10, y+1) = 0 then feld(x, y) = 0

damit würde das feld gelöscht werden, bzw. ohne farbe gefüllt werden, aber dann muss ich ja auch noch das darunterliegende feld mit dem darüberliegenden rechteck füllen.

kannst du mir nochmal kurz nen tipp geben?
hab wohl zulange nix mehr mit bb gemacht, bzw. viel zu wenig, aber das soll sich ja jetzt ändern.

SpionAtom

BeitragDi, Apr 01, 2008 19:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Zunächst einmal brauchst du die unterste Zeile nie zu überprüfen, da wenn man ganz unten ist, man auch nicht mehr runterfallen kann.
Ein Feld runterfallen wäre technisch so:

Code: [AUSKLAPPEN]

Für alle Felder x, y welche nicht ganz unten liegen

Wenn feld(x, y + 1) = 0, dann
  feld(x, y + 1) = feld(x, y) (Das untere Feld nimmt die Farbe des oberen Feldes an.)
  feld(x, y) = 0 (Das aktuelle Feld wird frei)


Wenn du das begriffen und implementiert hast, bist du schonmal einen großen Schritt weiter. Aber noch lange nicht fertig^^. Danach kann man noch über die ein oder andere Optimierung reden.

P.S. Eigentlich gehört das ja alles in den Anfängerbereich...
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080
 

BB-Fan

BeitragDi, Apr 01, 2008 19:27
Antworten mit Zitat
Benutzer-Profile anzeigen
klar, is logisch, mach ich dann gleich, erstmal was essen....

danke dir auf jeden fall schonmal, hab auch alles verstanden bisher.


[edit] vielleicht kanns ja ein mod verschieben, ist sicher nicht nur für mich hilfreich...


habs


Code: [AUSKLAPPEN]
Graphics 800, 600, 0, 2
SetBuffer BackBuffer()

   ;Initialiseriung
   Const tilesX = 9, tilesY = 9, tileSize = 30   
   Dim feld(tilesX, tilesY)
   
   feld(1, 1) = 1
   feld(1, 2) = 2
   feld(1, 3) = 3
   

   ;Hauptschleife
   Repeat
   
   
      ;Feld anzeigen
      Cls
      For x = 0 To tilesX
      For y = 0 To tilesY
        If y <> 9
             If feld(x,y+1) = 0
                 feld(x,y+1) = feld(x,y)
                 feld(x,y) = 0
         EndIf
         EndIf

         Select feld(x, y)
            Case 0:   Color 255, 255, 255: Rect x * tileSize, y * tileSize, tileSize, tileSize, 0
            Case 1: Color 255, 0, 0: Rect x * tileSize, y * tileSize, tileSize, tileSize, 1
            Case 2: Color 0, 255, 0: Rect x * tileSize, y * tileSize, tileSize, tileSize, 1
            Case 3: Color 0, 0, 255: Rect x * tileSize, y * tileSize, tileSize, tileSize, 1
         End Select
   
                 
      Next
     Next
   
   Flip()
   Until KeyDown(1)
   End




aber wie bekommt man das etwas geschmeidiger hin?
also weicher beim nach unten fallen...

ich würde gern sehen, wie die bausteine nach und nach runter purzeln, irgendwer eine idee?
 

BB-Fan

BeitragMi, Apr 02, 2008 14:45
Antworten mit Zitat
Benutzer-Profile anzeigen
niemand noch ein paar ideen?
 

BB-Fan

BeitragSa, Apr 12, 2008 18:57
Antworten mit Zitat
Benutzer-Profile anzeigen
okay hab mich mal mit einem member hier zusammengesetzt, und hab etwas übernommen, funktioniert aber noch nicht wirklich.

Könnte mir jemand dabei helfen?

Code: [AUSKLAPPEN]
FOR x = 0 TO tilesX-1
FOR y = 0 TO tilesY-1

IF y > 0

   IF feld(x,yb)\belegt = 1
                      feld(x,y)\box = 0
                      feld(x,y)\alt = feld(x,y-1)\box
                      feld(x,y)\sy = feld(x,y-1)\posy
                      feld(x,y-1)\box = 0
                      feld(x,y)\scroll = 1
                      feld(x,y)\belegt = 0
   ENDIF
ENDIF
IF feld(x,y)\box = 0 AND feld(x,y)\scroll = 1
     IF feld(x,y)\sy = feld(x,y)\posy
         feld(x,y)\box = fel([x,y)\alt
         feld(x,y)\scroll = 0
         feld(x,y-1)\belegt = 1
         feld(x,y)\belegt = 0
     ENDIF
         
         
          DRAWIMAGE feld(x,y)\alt, feld(x,y)\posx, feld(x,y)\sy
          feld(x,y)\sy = feld(x,y)\sy +1
          feld(x,y)\belegt = 0


nun folgt code, der die jeweilgen felder mit ihren \box werten füllt.

next
next
ENDIF


wobei \belegt= 1 ist, wenn die maustaste ein feld löscht.nun soll der rest von oben nach unten gleiten.

SpionAtom

BeitragSo, Apr 13, 2008 1:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann wolln wir mal weitermachen. Dieser Code schließt an deinen vorletzten Post an.
Leertaste drücken, um die Steine einen Schritt fallen zu lassen.

Code: [AUSKLAPPEN]

Graphics 800, 600, 0, 2
SetBuffer BackBuffer()

   ;Initialiseriung
   Const tilesX = 10, tilesY = 10, tileSize = 30   
   Dim feld(tilesX - 1, tilesY - 1)
   
   feld(3, 4) = 1 ;rotes Feld
   feld(5, 6) = 2 ;Grünes Feld
   feld(8, 8) = 3 ;Blaues Feld
   feld(3, 5) = 2
   

   ;Hauptschleife
   Repeat


      ;Felder fallen lassen

      If KeyHit(57) ;Leertaste
         For x = 0 To tilesX - 1
         For y = tilesY - 2 To 1 Step -1
            If feld(x, y) <> 0 And feld(x, y + 1) = 0 Then
               feld(x, y + 1) = feld(x, y)
               feld(x, y) = 0
            End If
         Next
         Next
      End If      
   
   
      ;Feld anzeigen
      Cls
      For x = 0 To tilesX - 1
      For y = 0 To tilesY - 1
         Select feld(x, y)
            Case 0:   Color 255, 255, 255: Rect x * tileSize, y * tileSize, tileSize, tileSize, 0
            Case 1: Color 255, 0, 0: Rect x * tileSize, y * tileSize, tileSize, tileSize, 1
            Case 2: Color 0, 255, 0: Rect x * tileSize, y * tileSize, tileSize, tileSize, 1
            Case 3: Color 0, 0, 255: Rect x * tileSize, y * tileSize, tileSize, tileSize, 1
         End Select
      Next
      Next
      Flip()
   
   Until KeyDown(1)
   End


Durcharbeiten und verstehen! Jedesmal wenn Leertaste gedrückt wird, wird zunächst die unterste Reihe auf Steine untersucht, die einen Schritt runterfallen könnten. Danach die zweitunterste Reihe, danach die drittunterste Reihe, usw.
Dies geschieht in diesem If-Block: If KeyHit(57) ;Leertaste

Wenn du das verstanden hast, ist der Schritt zur pixelweichen Animation nur noch ein kleiner. Der folgt dann morgen (oder so...).
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080
 

BB-Fan

BeitragSo, Apr 13, 2008 3:13
Antworten mit Zitat
Benutzer-Profile anzeigen
danke dir, aber das hab ich schon seit ein paar tagen.

bis auf Code: [AUSKLAPPEN]
 For x = 0 To tilesX - 1
         For y = tilesY - 2 To 1 Step -1     


warum so, und nicht For y = 0 to tilesY-1 ?

das feldweise vorgehensweise kann ich mittlerweile beten, also das hab ich auf jeden fall gelernt, und types kann ich mittlerweile auch im schlaf.

das was ich nicht hinbekomme, ist, dass eben die vierecke in deinem beispiel nicht von feld zu feld wandern, sondern sie sollen eben hinuntergleiten.

wenn ich weiß wie das geht, (und glaube mir, ich hab so einiges versucht um das richtig hinzubekommen, nur hakt es immer irgendwo, sodass ich selbst nicht mehr durchsehe) denke ich, müsste ich den rest allein schaffen.

es ist übrigends sehr nett, dass du mir hilfst.[/code]

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group