Bubbles-Game - Ansatz Probleme
Übersicht

SchrolliBetreff: Bubbles-Game - Ansatz Probleme |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Text entfernt | ||
![]() |
ozzi789 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
oke also doch über Arrays ![]() Die Direkten Nachbarn zu checken ist einfach, mein Problem liegt eher darin dann die Nachbarn der Nachbars-Nachbarn usw ![]() Basti |
||
![]() |
Tennisball |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5 |
Schrolli |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() 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 ? ![]() |
||
![]() |
Tennisball |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
ozzi, das wären äußerst viele Formen und imho sehr unelegant und hardcoded! | ||
Schrolli |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
achaje... kleiner denkfehler.... ![]() 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 ![]() Rückmeldung folgt... Basti Danke schonmal für alle |
||
Schrolli |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
BlitzBasic: [AUSKLAPPEN] Function check_balls(x,y,col) Das geht so schon ![]() 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() 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 ![]() |
||
![]() |
SpionAtom |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Auch eines der Spiele hier im Board, welches mich extrem lange gefesselt hat ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() 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? |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group