Frage zu Dim Felder?
Übersicht

blackmasterBetreff: Frage zu Dim Felder? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo,
ich habe folgendes Problem, hab mir mal überlegt so ein Kugelspiel zu schreiben mit Dim Felder. Jetzt wollt ich mal wissen wie ihr das mit den Kugeln machen würdet wo man dann später Verschieben kann sowie das Spiel hier: Screen also da kann man ja auch die Sachen Vertauschen. hab mal so angefangen: Code: [AUSKLAPPEN] Graphics 1024,768,32,2
SetBuffer BackBuffer() Global kugel = LoadAnimImage("kugel.png",32,32,0,6) MaskImage kugel,255,0,255 Global backround = LoadImage("backround.png") SeedRnd MilliSecs() ;Spielfeld erstellen Dim Spielfeld(11,13) ;Spielfeld lesen Restore map_data For y=0 To 13 For x=0 To 11 Read Spielfeld(x,y) Next Next ;Types für die Kugeln Type kugel Field kugel_x Field kugel_y Field kugel_farbe End Type Repeat Cls ;Hintergrund bild anzeigen DrawImage backround,0,0 ;Spielfeld zeichnen For y=0 To 13 For x=0 To 11 map = Spielfeld(x,y) If map = 1 Then DrawImage kugel,x*32+320,y*32+160,kugel_farbe Next Next ;Und hier die berechnung der einselne Felder X und Y If (MouseX()-320)/32 < 12 And (MouseX()-320)/32 >= 0 Then Feld_x = (MouseX()-320)/32 If (MouseY()-160)/32 < 14 And (MouseY()-160)/32 >= 0 Then Feld_y = (MouseY()-160)/32 ;Wenn Spielfeld=1 dann an der Position ein Rect zeichnen If Spielfeld(Feld_x,Feld_y) = 1 Then Color 0,0,128 Rect Feld_x*32+320,Feld_y*32+160,32,32,0 EndIf ;Das aktuelle Feld anzeigen wo man mit der Maus drauf ist Text 20,20,"Feld X: "+Feld_x Text 20,40,"Feld Y: "+Feld_y Flip Until KeyHit(1) End .map_data Data 1,1,1,1,1,1,1,1,1,1,1,1 Data 1,1,1,1,1,1,1,1,1,1,1,1 Data 1,1,1,1,1,1,1,1,1,1,1,1 Data 1,1,1,1,1,1,1,1,1,1,1,1 Data 1,1,1,1,1,1,1,1,1,1,1,1 Data 1,1,1,1,1,1,1,1,1,1,1,1 Data 1,1,1,1,1,1,1,1,1,1,1,1 Data 1,1,1,1,1,1,1,1,1,1,1,1 Data 1,1,1,1,1,1,1,1,1,1,1,1 Data 1,1,1,1,1,1,1,1,1,1,1,1 Data 1,1,1,1,1,1,1,1,1,1,1,1 Data 1,1,1,1,1,1,1,1,1,1,1,1 Data 1,1,1,1,1,1,1,1,1,1,1,1 Data 1,1,1,1,1,1,1,1,1,1,1,1 Ist es besser die kugeln mit Types zu erstellen? Man muss ja irgendwie Types mit Dim Feld Verknüpfen oder so. Könnt ihr mir bitte vieleicht ein beispiel posten? Danke euch schonmal. Gruss Markus |
||
![]() |
garret |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du benötigst hier keine Types für die Kugeln. Speichere die Kugeln einfach im Dim-Feld ab. Für eine Kugel die jeweilige Zahl, für ein leeres Feld eine 0. Wenn du eine Kugel mit einer anderen vertauschen willst, fragst du einfach ab, ob die zweite Kugel in einem Nachbarfeld liegt und tauschst die zwei dann aus.
Lediglich für das Verschwindenlassen gleicher Kugeln könntest du Types nehmen. Nachdem du die Kugel getauscht hast, fragst du die Nachbarfelder ab, ob sie die gleiche Farbe haben und erstellst dafür je einen neuen Type-Eintrag. Von diesen fragst du wieder die Nachbarfelder ab bis kein Nachbarfeld mehr die gleiche Farbe hat wie die Ursprungskugel. Dann lässt du alle verschwinden ![]() MfG garret |
||
>>nec aspera terrent<< (Auch Widerwärtigkeiten schrecken nicht) |
blackmaster |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke dir ![]() Ich weiss wie ich das mit Dim hinbekomme, aber ich lade ja ein AnimImage wo mehr farben von kugeln dabei sind, und ich möchte das immer andere Farbe von Kugel im Feld ist, also als Rnd will ich es irgendwie machen, deshalb wollte ich es mit Types machen. also 1=Rote Kugel, 2=Grüne Kugel, 3=Blaue Kugel, 4=Lila Kugel und 5=Braune Kugel. wie kann ich es als Rnd laden das immer beim Start eine andere kugel im Data Feld ist? Gruss Markus |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Einfach zuerst die Daten einladen und dann nochmal über den Array und überall wo eine 1 ist durch zufall eine neue Zahl reinpacken. (1 wäre dabei als farbe vielleicht nicht umbedingt optimal da 1 ja auch schon vorab für "besetz" benutzt wird) | ||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
garret |
![]() Antworten mit Zitat ![]() |
---|---|---|
Warum machst du es dir nicht einfach und nutzt das Feld doppelt? Wenn in einem Eintrag eine 0 steht, ist das Feld leer. Steht etwas anderes, muss das Feld besetzt sein und diese Zahl kannst du gleich für die entsprechende Grafik nehmen. Wenn da also eine 1 steht, heißt das, es ist eine rote Kugel vorhanden, bei einer 2 eine blaue etc.
Am Anfang füllst du das Feld einfach mit zufälligen Zahlen von 1 bis x. Außerdem reicht für dein Spiel Rand() aus, Rnd() liefert gebrochene Zahlen und die brauchst du ja theoretisch nicht. |
||
>>nec aspera terrent<< (Auch Widerwärtigkeiten schrecken nicht) |
blackmaster |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke dir, habs so die Zufallszahlen erzeugt:
Code: [AUSKLAPPEN] For y=0 To 13
For x=0 To 11 Spielfeld(x,y) = Rand(5) Next Next und jetzt gehts, danke euch für die Hilfe ![]() Gruss Markus |
||
blackmaster |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo nochmal,
habt ihr vieleicht eine idee wie ich es machen könnte wenn jetzt z.B. welche paare verschwinden das dann neue steine von oben kommen? Ich wäre euch sehr dankbar für ein paar tips wie man das am einfachsten machen könnte. Gruss Markus |
||
blackmaster |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich hab mir das Spiel jetzt anders überlegt, also man schießt von unten eine kugel 1 Feld nach oben, hier mal ein Screen:
![]() Jetzt meine Frage, wie bekomme ich hin wenn ich an dieser Position eine kugel nach oben schieße das diese Reihe die kugeln ein feld nach oben rutschen? Könnt ihr mir vieleicht ein paar tips geben wie man das am effektivsten hinbekommt? Vielen Dank schonmal. MFG Markus |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Einfach in der Reihe wo die kugel rein kommt von ganz oben rein gehen.
Wenn dort im Array keine 0 steht, kann die kugel nicht reingeschossen werden (oder der spieler verliert) wenn dort eine 0 steht dann gehst du von oben nach unten durch und schreibst jeweils ins obere feld das was im feld drunter war ... und ganz unten halt die daten der reingeschossenen kugel Gleich geht es übrigens auch wenn du von oben reinwerfen willst bzw. kugeln auslöschen. Dann gehst du einfach von unten nach oben, nur dass du dann nicht von ganz unten gehst (beim auslöschen), sondern von dort wo die kugel effektiv ausgelöscht wurde. Am besten ein Blatt papier nehmen und das ganze aufzeichnen. Dann irgendwo die Zahl durch 0 ersetzen und überlegen was passieren muss, damit der definierte Zustand wieder erreicht wird. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
blackmaster |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Vielen Dank!
Aber ich bin noch nicht so fit bei Dim Felder, berechnen kann ich das ja, aber ich weiss net wie ich es hinbekomme das die eine reihe der kugel um ein Feld hoch rutschen. Ich glaub net das ich es hinbekomme aber werds probieren. Danke dir. Edit: ich habs mal so probiert: Code: [AUSKLAPPEN] Function CheckSteine()
For Feld_y=0 To 10 For Feld_x=0 To 9 If Spielfeld(Merk_Feld_x,Feld_y) Then Spielfeld(Merk_Feld_x,Feld_y-1) = 2 EndIf Next Next End Function also wenn ich an dieser position mit der maus klicke, dann werden alle Kugel in der gleiche Farbe angezeigt und ein Feld hoch gesetzt. Ich weiss nur nicht wie ich die Farben der Kugel speichern kann das die dann auch wieder angezeigt werden ![]() Gruss Markus |
||
blackmaster |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Cool, ich habs hinbekommen, hab das was du mir erklärt hast, ein paar mal durchgelesen und überlegt, und jetzt gehts ![]() hab es so gelöst: Code: [AUSKLAPPEN] Function CheckSteine()
For Feld_y=0 To 10 For Feld_x=0 To 9 If Spielfeld(Merk_Feld_x,Feld_y) Then If Spielfeld(Merk_Feld_x,Feld_y-1) = 0 Then Spielfeld(Merk_Feld_x,Feld_y-1) = Spielfeld(Merk_Feld_x,Feld_y) Spielfeld(Merk_Feld_x,Feld_y) = 0 EndIf EndIf Next Next End Function Und danke dir für deine Hilfe. Gruss Markus |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Keine Ursache
Freut mich zu hören das es geklappt hat ![]() |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
blackmaster |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Kannst du mir vieleicht noch ein tip geben wie ich überprüfe ob sich mehr als 3 kugeln neben einander sich befinden oder so, die dann gelöscht werden, weil wenn ich das machen möchte, erhalte ich sofort eine fehlermeldung "Array Index out of Bounds"
Ich wäre dir sehr dankbar wenn du mir ein kleines beispiel posten könntest, wie man das am einfachsten machen könnte. Gruss Markus |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Dazu würde ich beim platzieren die 2 linken und rechten (oberen und unteren evtl auch) nachbaren betrachten, vorausgesetzt, das diese im erlaubten bereich sind. das heisst du musst vor der abfrage der array daten überprüfen ob die x / y koordinate überhaupt gültig ist. | ||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
blackmaster |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke dir, genau das ist mein Problem, wie würdest du mit einem kleinem Code prüfen ob sich mehr als 3 kuggeln neben einander sind?
weiss net ob das so stimmt wie ich es gemacht habe: Code: [AUSKLAPPEN] Function SteineLoeschen()
For F_y=0 To 10 For F_x=0 To 9 If Spielfeld(F_x,F_y) = 2 Then If Spielfeld(F_x+1,F_y) = 2 And Spielfeld(F_x+2,F_y) = 2 Then Spielfeld(F_x,F_y) = 0 EndIf EndIf Next Next End Function sry das ich soviele probleme habe, ich hab mir Dim Felder ein bisschen selber beigebracht da es nicht soviele tuts im netz gibt die das genau erklären. Ich muss nur noch überprüfen wie ich am besten die paare die nebeneinander sind zu löschen. Gruss Markus |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Das Problem sind nicht die DIMs. Ein Dim in deinem Fall vereinfacht gesagt ein Schachbrett mit farbigen Steinen drauf.
Wenn du auf Nachbaren prüfen willst, würde ich empfehlen nur von denen Feldern aus +- 3 x bzw. y zu gehen, die sich auch effektiv verändert haben. Sonst könnte das dann doch länger dauern, da du 2x über das ganze gehen müsstest (nämlich einmal links rechts oben nach unten. und einmal oben unten links nach rechts) Sofern dir ein Blatt Papier nicht reicht, nimmer dir ma ein Schachbrett und Damesteine zur Hand und überleg dir welche Bedingung bei der Überprüfung erfüllt sein muss. Array out of bound heisst, dass du versuchst hast, die Farbe eines steines abzufragen, der nicht auf dem brett ist (links, rechts oben oder unten ausserhalb wo natürlich kein stein sein kann) |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Schranz0r |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das problem liegt noch da, das du wenn du einen Stein ganz am rand links nimmst, sagen wir in zeile 6 (Y6), und du frägst nach den linken Stein ab, springt die abfrage auf zeile 5 (Y5) auf den letzten rechten Stein.
Das hatte ich auch schonmal, ich bau mir seit ein paar tagen ein ähnliches Game. Abhilfe konnte ich mir nur durch eine Mauer schaffen, alle Steine aussenrum hab ich jetzt als Mauer gemacht. Hier ein Screenshot: anders konnte ich mir da jetzt nicht helfen. Aber ich denke da gibts bestimmt noch ne andere möglichkeit! EDIT: Nur hab ich das Problem, das der die Steineanzahl nich richtig abzieht, und ich weis nicht wieso? |
||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!HAUPTSACH et kost VIEL!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
![]() |
garret |
![]() Antworten mit Zitat ![]() |
---|---|---|
Warum baust du keine Sicherheitsabfrage ein, die verhindert, dass Werte außerhalb deines Arrays liegen? Das sind ein bis zwei If-Bedingungen, schätze ich.
Schranz0r hat Folgendes geschrieben: Aber ich denke da gibts bestimmt noch ne andere möglichkeit! EDIT: Nur hab ich das Problem, das der die Steineanzahl nich richtig abzieht, und ich weis nicht wieso? Und weiter? Ich hege die Vermutung, dass wir dir helfen sollen, was sich aber ohne Code schlecht gestaltet... |
||
>>nec aspera terrent<< (Auch Widerwärtigkeiten schrecken nicht) |
![]() |
Schranz0r |
![]() Antworten mit Zitat ![]() |
---|---|---|
garret hat Folgendes geschrieben: Und weiter? Ich hege die Vermutung, dass wir dir helfen sollen, was sich aber ohne Code schlecht gestaltet... NEIN ![]() Das will ich selber ausknobeln... War nur dafür gedacht falls er, oder andere auch das problem haben, mal was zu schreiben haben ![]() Gut, wollte nur auf meine aktuelle Aufgabe aufmerksam machen ![]() EDIT: Wie könnte den so eine Abfrage aussehen? |
||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!HAUPTSACH et kost VIEL!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
![]() |
garret |
![]() Antworten mit Zitat ![]() |
---|---|---|
Sagen wir, du prüfst, ob drei Kugeln der gleichen Farbe nebeneinander sind. Entweder realisiert man das indem man schreibt:
Code: [AUSKLAPPEN] For y=0 to MAX_ZEILE For x=0 to MAX_SPALTE If x<=MAX_SPALTE-2 If feld[x,y]=feld[x+1,y] And feld[x,y]=feld[x+2,y] Then (Lösche Kugeln) EndIf Next Next Oder man lässt die For-Schleife gar nicht erst so weit laufen. Code: [AUSKLAPPEN] For y=0 to MAX_ZEILE For x=0 to MAX_SPALTE-2; Anzahl der Kugeln die in einer Reihe sein müssen -1, also hier im Beispiel 3 Kugeln If feld[x,y]=feld[x+1,y] And feld[x,y]=feld[x+2,y] Then (Lösche Kugeln) Next Next Plastischer ausgedrückt: Du weißt, dass dein Feld 10 Spalten breit ist und drei Kugeln nebeneinander sein müssen. Wenn du immer von links nach rechts prüfst, reicht es also, nur von 1 bis 8 zu gehen. Ab Spalte 9 können keine drei Kugeln mehr in einer Reihe nach rechts sein. |
||
>>nec aspera terrent<< (Auch Widerwärtigkeiten schrecken nicht) |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group