Bubbles-Game - Ansatz Probleme

Übersicht BlitzBasic Allgemein

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

Schrolli

Betreff: Bubbles-Game - Ansatz Probleme

BeitragDo, Dez 23, 2010 17:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

ich würde gerne so etwas in der Art selbst einmal entwickeln, da mich diese Spielart schon ewig fesselt: http://www.jk-spiele.de/bubbles.php

Mein Problem ist nur der Ansatz:
-> der Aufbau und das generieren des Spielfeldes bekomm ich noch ohne Probleme hin dann aber stellt sich die Frage ob man die Kugeln am besten in Types speichert oder in einem 2-dimmensionalen Array balls(x,y)

Evtl weitere Ansätze?

Jenachdem ob nun Types oder Array ist dann die Frage wie ich am besten die benachbarten Kugeln auswerte. Wenn diese die selbe Farbe haben müsste ich ja deren Nachbarn auch wieder auswerten um alle direkt zusammenhängenden mit der selben Farbe zu löschen.

Danke schon mal für euer geistiges bemühen,
Gruß Basti
 

Sterbendes Lüftlein

BeitragDo, Dez 23, 2010 18:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Text entfernt

ozzi789

BeitragDo, Dez 23, 2010 18:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Guten Tag Basti

Ich würde da ein zwei Dimensionales Dim Feld nehmen.
Die Nachbaren überprüfen sollte einfach sein.

z.B.

cur(rent) speichert das aktuell ausgewählte feld

cur_x=5
cur_y=2

feld links=feld (cur_x+1,cur_y)
feld rechts=feld (cur_x-1,cur_y)

mfg
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5
 

Schrolli

BeitragDo, Dez 23, 2010 18:07
Antworten mit Zitat
Benutzer-Profile anzeigen
oke also doch über Arrays Wink Da sind wir uns ja dann schon mal soweit einig, da ich bei Types wsl immer alles gegen jeden prüfen müsste.

Die Direkten Nachbarn zu checken ist einfach, mein Problem liegt eher darin dann die Nachbarn der Nachbars-Nachbarn usw Very Happy zu checken. Denn es können ja mehr gleichfarbige Bälle zusammenhängend liegen, die ja alle verschwinden müssen.

Basti

Tennisball

BeitragDo, Dez 23, 2010 18:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Da brauchst du eine Funktion, die sich immer weiter selbst aufruft.
so z.B. :

Code: [AUSKLAPPEN]
Function asdf(x,y,color)
feld(x,y) = 0
If feld(x+1,y) = color then asdf(x+1,y,color)
'...
End Function


So in etwa.

mfg,
Tennisball

ozzi789

BeitragDo, Dez 23, 2010 18:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Entweder du rufst diese Funktion rekursiv auf, oder du checkst halt so


feld links=feld (cur_x+1,cur_y)
feld links2=feld (cur_x+2,cur_y)
feld links3=feld (cur_x+3,cur_y)

Gibt sicher elegantere Lösungen, aber keep it simple Smile
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5
 

Schrolli

BeitragDo, Dez 23, 2010 18:15
Antworten mit Zitat
Benutzer-Profile anzeigen
sowas nennt sich doch rekursiv oder? Macht Sinn bei so einer Aufgabe. Aber wie würde ich dann Speichern, welche die richtigen Farben sind? und woher weis ich welche gefundenen Nachbarn ich schon auf Nachbarn geprüft habe und welche nicht?

Dasverschachteltet sich so tief das ich mit dem Denken nciht mehr so recht nach komm Very Happy

Basti

edit:
@ozzi789
Aber wie sollte ich bei einer solchen Vorgehensweise wissn wie viele nebeneinander liegen könnten? das können ja sehr viele sein im ungünstigsten Fall... und die können ja auch so liegen:

001100
011000
001110

Und dann wären in dem Fall viele links und viele rechts... und eins ist recht'ser als das andere und und und ?Very Happy Das verwirrt mich ein wenig, wie das sinnvoll auszuwerten sein soll?

Tennisball

BeitragDo, Dez 23, 2010 18:20
Antworten mit Zitat
Benutzer-Profile anzeigen
also ich denke mal in dem Array speicherst du die Farben so, dass du z.B. für rot die 1 hast, für blau die Nummer 2 usw.

Die richtige Farbe wird dann immer mit dem Parameter color der Funktion weitergegeben. Du weißt, welche du schon überprüft hast, weil du die Felder auf 0 setzt (=keine Farbe), somit werden sie bei dem Test:
Code: [AUSKLAPPEN]
If feld(x+1,y) = color then asdf(x+1,y,color)
automatisch durchfallen und ignoriert werden.

mfg,
Tennisball

ozzi789

BeitragDo, Dez 23, 2010 18:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaube mal einen Algo für dass irgendwo gesehen zu haben.
Definier halt feste mögliche Formen, und if's die zusammen.
if oben=1 & oben_2=1 & links=1 & rechts=1

010
111
000

wäre z.B das

mfg
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

Tennisball

BeitragDo, Dez 23, 2010 18:24
Antworten mit Zitat
Benutzer-Profile anzeigen
ozzi, das wären äußerst viele Formen und imho sehr unelegant und hardcoded!
 

Schrolli

BeitragDo, Dez 23, 2010 18:27
Antworten mit Zitat
Benutzer-Profile anzeigen
ozzi789 hat Folgendes geschrieben:
Ich glaube mal einen Algo für dass irgendwo gesehen zu haben.
Definier halt feste mögliche Formen, und if's die zusammen.
if oben=1 & oben_2=1 & links=1 & rechts=1

010
111
000

wäre z.B das

mfg


könnte aber auch das sein:

0100
0100
1111
0000

und dann müsste ich schon 1.000e vorlagen erstellen um das vernünftig auszuwerten.
Die Idee von Tennisball mit dem auf 0 setzen finde ich da noch am besten.

ALLERDINGS:

00100
00200
04350

von 1 aus geh ich durch die rekursion auf 2 von 2 auf die 3.... so von 3? auf die 4? von 4 komm ich aber nie wieder auf die 5? das wird so noch nicht ganz gehen oder?

ToeB

BeitragDo, Dez 23, 2010 18:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Doch, weil du von der 4 die funktion beendest und wieder bei der Funktion bei 3 landest und von da aus wird wieder die 5 aufgerufen Wink


mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!
 

Schrolli

BeitragDo, Dez 23, 2010 18:38
Antworten mit Zitat
Benutzer-Profile anzeigen
achaje... kleiner denkfehler.... Very Happy
also wenn das so funzt wie ich mir das grade vorstell sollte das jetzt keine große sache mehr sein...
ich fang jetzt nachdem alle größeren sachen geklärt sind einfach mal an ein spielfeld erzreugen zu lassen Wink

Rückmeldung folgt...
Basti

Danke schonmal für alle
 

Schrolli

BeitragDo, Dez 23, 2010 19:02
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic: [AUSKLAPPEN]
Function check_balls(x,y,col)
If balls(x,y) = col Then
balls(x,y) = 0
check_balls(x+1,y,col)
check_balls(x-1,y,col)
check_balls(x,y+1,col)
check_balls(x,y-1,col)
EndIf
End Function


Das geht so schon Smile ... AB-UND-ZU -.- bekomme meistens einen Stack Overflow??? Weis jemand mehr?
Aufgerufen wird das ganze so:

BlitzBasic: [AUSKLAPPEN]
If MouseDown(1) Then check_balls( MouseX()/25, MouseY()/25, balls(MouseX()/25,MouseY()/25))



EDIT:

KEYHIT statt KEYDOWN scheint zu funktionieren... kann wer zum verständniss erklären wieso?
Danke

EDIT2:

BlitzBasic: [AUSKLAPPEN]
Function check_gravity()
For i = 1 To breite
For j = 1 To hoehe

If balls(i,j+1) = 0 And j <> hoehe Then
balls(i,j+1) = balls(i,j)
balls(i,j) = 0
EndIf
Next
Next
End Function

Kümmert sich jetzt auch darum das due Kugeln nach unten fallen wenn in der Mitte etwas verschwindet. Jetzt muss ich nur noch zusehen, dass ich das ganze nach links geschoben bekommen und fertig Smile

SpionAtom

BeitragDo, Dez 23, 2010 20:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Da denke ich doch gleich an ein gutes Beispiel dieser Art:

https://www.blitzforum.de/showcase/197/
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080
 

Schrolli

BeitragDo, Dez 23, 2010 21:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Auch eines der Spiele hier im Board, welches mich extrem lange gefesselt hat Very Happy

Habs jetzt hinbekommen, dass die Steine nach unten fallen wenn darunter etwas weg ist, und sobald alles unten angekommen ist(keine Löcher dazwischen) rücken sie dann evtl um eine reihe nach links, falls sich am boden eine lücke bildet.... Sie rutschen also nur links auf wenn sich im Boden ein loch bildet. Es werden keine Spalten an sich vermischt.

Follgendes Problem derzeit....
Ich weis nicht so recht, wie ich rausfinden soll, wann mehr als 2 bzw wie viele markiert sind? Jem,and ne Idee?

Basti

Jamagin

BeitragDo, Dez 23, 2010 22:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo!

Da mir Midimaster damit sehr geholfen hat, möchte ich das auch irgendwie weitergeben! Nun, für dein Prinzip mußt es halt etwas umbauen!

Code: [AUSKLAPPEN]

Graphics 800,600,0,2

Global Zaehler% , i%
Dim BrickFeld%(30,30)
Dim BrickFeldCopy%(30,30)

For i=0 To 20
   BrickFeld(0,i)=1
   BrickFeld(20,i)=1
   BrickFeld(i,0)=1
   BrickFeld(i,20)=1
Next

For i=0 To 400
   X=Rand(1,19)
   Y=Rand(1,19)
   C=Rand(2,9)
   BrickFeld(x,y)=c
Next

Repeat
   MausX=MouseX()/20
   MausY=MouseY()/20

   If (MausX>0 And MausX<20) And (MausY>0 And MausY<20)
      Cls
      Color 55,55,55
      Rect MausX*20-4,MausY*20-4,20,20
      For X=0 To 20
         For Y= 0 To 20
            Wert=Brickfeld(x,y)
            If Wert>0 Then
               Color Wert*25,111,255-Wert*25
               Text x*20,y*20,Wert
            EndIf
         Next
      Next
   TesteHier MausX, MausY
   Color 255,255,255
   Text 30,500,"Gefunden: " + Zaehler
EndIf
Delay 15
Flip
Until KeyHit(1)
End

Function TesteHier(PosX%, PosY%)
Zaehler=0
   If BrickFeld(posX, posY)>0 Then
   For i=0 To 20
   For j=0 To 20
   brickFeldCopy(i,j)=brickFeld(i,j)
   Next
   Next
   TesteRekursiv PosX, PosY, BrickFeldCopy(posX, posY)
   EndIf
End Function

Function TesteRekursiv(X%, Y%, Wert%)
;leider nicht gewonnen:
If BrickFeldCopy(X,y) <> Wert Then Return
; richtiges Feld gefunden:
BrickFeldCopy(X,Y)=99
Zaehler = Zaehler +1
TesteRekursiv X-1, Y  , Wert
TesteRekursiv X+1, Y  , Wert
TesteRekursiv X  , Y-1, Wert
TesteRekursiv X  , Y+1, Wert
End Function



lg. Jamagin
Bevor du etwas neues beginnst, erledige das alte
 

Schrolli

BeitragDo, Dez 23, 2010 23:21
Antworten mit Zitat
Benutzer-Profile anzeigen
seh da nicht ganz durch... wsl eher schwer zu portieren... ich musste eig nur zählen wie viele bei meiner rekursion gefunden werden und nur wenn es 2 oder mehr sind diese im array auf 0 setzen... iwie so dachte ich mir das zumindest

Tennisball

BeitragDo, Dez 23, 2010 23:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

ich würde das so machen:

jedes Mal, wenn eine Kugel der richtigen Farbe entspricht, zählst du eine globale Variable eins hoch und trägst die Koordinaten in eine Liste ein. Entweder setzt du das durch ein 2-dimensionales Array oder durch ein Type (mit field x, y) um . Ich würde Types nehmen, da man vorher nicht weiß, wie viele Kugeln zusammenhängen.
Wenn die Zählervariable also einen bestimmten Wert erreicht oder überschritten hat, gehst du alle Type-Instanzen durch und setzt in deinem Kugelarray die entsprechenden Felder auf 0. Danach löschst du so oder so alle Type-Instanzen.

mfg,
Tennisball
 

Schrolli

BeitragDo, Dez 23, 2010 23:49
Antworten mit Zitat
Benutzer-Profile anzeigen
genau so mach ichs grade, denn was brinmgt mir ein zählen, wenn ich eh alle glei auf 0 setze.... sieht bis etz auch ganz gut aus... denk das wird passen so...
trotzdem danke für den post Smile

Basti

EDIT:
kl problem... STACK OVERFLOW... ich prüfe zb das feld darüber... das hat die selbe farbe, dadurch das ich das drunter was ja auch passte nich auf 0 setz sondern nur ins type eintrage prüft der durch die rekursion das darunter auch wieder... sprich endlosschleife... -.- jmd Idee?

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group