Programmiertechnikfrage zu Bejeweled o.ä.
Übersicht

BB-FanBetreff: Programmiertechnikfrage zu Bejeweled o.ä. |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Schonmal etwas von einem Array gehört?
http://www.blitzbase.de/befehle2d/dim.htm mfG, Thorsten |
||
BB-Fan |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ü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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
niemand noch ein paar ideen? | ||
BB-Fan |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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] |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group