Frage zu Dim Felder?

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

blackmaster

Betreff: Frage zu Dim Felder?

BeitragDi, Okt 03, 2006 23:47
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Okt 04, 2006 10:34
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile

MfG garret
>>nec aspera terrent<< (Auch Widerwärtigkeiten schrecken nicht)
 

blackmaster

BeitragMi, Okt 04, 2006 11:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke dir Wink
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

BeitragMi, Okt 04, 2006 14:10
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Okt 04, 2006 14:56
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Okt 04, 2006 16:57
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink

Gruss Markus
 

blackmaster

BeitragMi, Okt 04, 2006 21:11
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Okt 05, 2006 11:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab mir das Spiel jetzt anders überlegt, also man schießt von unten eine kugel 1 Feld nach oben, hier mal ein Screen:

user posted image

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

BeitragDo, Okt 05, 2006 11:47
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Okt 05, 2006 11:55
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Rolling Eyes

Gruss Markus
 

blackmaster

BeitragDo, Okt 05, 2006 17:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Cool, ich habs hinbekommen, hab das was du mir erklärt hast, ein paar mal durchgelesen und überlegt, und jetzt gehts Very Happy

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

BeitragDo, Okt 05, 2006 17:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Keine Ursache

Freut mich zu hören das es geklappt hat Smile
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

blackmaster

BeitragDo, Okt 05, 2006 19:23
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Okt 05, 2006 19:28
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Okt 05, 2006 19:38
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Okt 05, 2006 19:42
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Okt 05, 2006 22:26
Antworten mit Zitat
Benutzer-Profile anzeigen
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:


user posted image


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

BeitragDo, Okt 05, 2006 22:57
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Okt 05, 2006 23:03
Antworten mit Zitat
Benutzer-Profile anzeigen
garret hat Folgendes geschrieben:

Und weiter? Ich hege die Vermutung, dass wir dir helfen sollen, was sich aber ohne Code schlecht gestaltet...



NEIN Very Happy

Das will ich selber ausknobeln...

War nur dafür gedacht falls er, oder andere auch das problem haben, mal was zu schreiben haben Laughing <--- Glaubt keiner was?
Gut, wollte nur auf meine aktuelle Aufgabe aufmerksam machen Very Happy

EDIT:

Wie könnte den so eine Abfrage aussehen?
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!HAUPTSACH et kost VIEL!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

garret

BeitragDo, Okt 05, 2006 23:29
Antworten mit Zitat
Benutzer-Profile anzeigen
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)

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group