Fragen zu Arrays?

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

bruce85

Betreff: Fragen zu Arrays?

BeitragSa, Jan 17, 2009 17:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
wie könnte ich in BlitzBax am einfachsten solche Felder erzeugen?http://www.bhv.de/pressedownlo...300dpi.jpg

Ich habe schon gegoogelt, aber nix gefunden was mein Problem lösen könnte.

Danke euch schonmal.

MfG
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250

Suco-X

Betreff: .....

BeitragSa, Jan 17, 2009 19:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo.
Mit
Code: [AUSKLAPPEN]
array:wunschtype[10,12]

?
Mfg
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB
 

bruce85

BeitragSa, Jan 17, 2009 19:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke Dir.

Ich meinte die Dreieckige Felder indem die Zahlen drin stehen.
So wie bei dem Spiel Kakuro.

Wie könnte ich das ambesten machen?

MfG
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250

skey-z

Betreff: Re: .....

BeitragSa, Jan 17, 2009 20:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Suco-X hat Folgendes geschrieben:
Hallo.
Mit
Code: [AUSKLAPPEN]
array:wunschtype[10,12,2]

?
Mfg
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter
 

bruce85

BeitragSa, Jan 17, 2009 21:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Achso, ein 3 Dimensionales Array.
Ich dachte es gäbe noch einen anderen Weg.

Ich werde es dann mal versuchen und vielen Dank.

MfG
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250

skey-z

BeitragSa, Jan 17, 2009 21:50
Antworten mit Zitat
Benutzer-Profile anzeigen
es gibt bestimmt noch andere Wege, aber das war der einfachste der mir einfiehl, so kannst du wenn nötig ein Feld in 2 Bereiche aufteilen oder auch nur in eines.
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter
 

bruce85

BeitragSa, Jan 17, 2009 23:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke.

Kann mir vieleicht jemand Tips geben, wie man bestimmte Felder aufteilen kann?
Ich habe mich mit sowas noch nicht so beschäftigt.

Es gibt bestimmt befehle in BlitzMax die das bereitstellen oder so, wenn ich micht nicht irre.

Danke euch schonmal.

Edit: Oder ich könnte die Sumenierung mit Types erstellen, welche geteilt sind und ein Array Feld indem man dann die Zahlen einträgt.

MfG
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250

Xeres

Moderator

BeitragSo, Jan 18, 2009 0:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde ein Zweidimensionales Array bevorzugen, dass in jeder Zelle einen Feld-Type enthält.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

bruce85

BeitragSo, Jan 18, 2009 2:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke Dir.
Ich habs hinbekommen, is ja nicht so schwer wie ich mir das vorgestellt habe.

Code: [AUSKLAPPEN]

Type TSpielFeld
  Field Wert:Int
  Field SumeX:Int
  Field SumeY:Int

  Function NewStein:TSpielFeld(fwert:Int)
    Local S:TSpielFeld = New TSpielFeld
    S.Wert = fwert
    Return S
  End Function
End Type

Global FeldX:Int, FeldY:Int, p:Int
ReadData FeldX, FeldY
Global SpielFeld:TSpielFeld[FeldX, FeldY]

For Local x:Int=0 Until FeldX
  For Local y:Int=0 Until FeldY
    ReadData(p)
    SpielFeld[x, y] = TSpielFeld.NewStein(p)
  Next
Next


Den Rest schaffe ich ohne Probleme und vielen Dank für die antworten.

MfG
 

bruce85

BeitragDi, Jan 20, 2009 9:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo nochmal,
das Spiel ist schon fertig bis auf ein paar kleinigkeiten und zwar, erstelle ich meine Felder so:

Code: [AUSKLAPPEN]
Type TSpielFeld
  Field Wert:Int=0
  Field Feld:String="N"
  Field SumeX:Int=0
  Field SumeY:Int=0
  Field SumeXOK:Int=0
  Field SumeYOK:Int=0

  Function NewStein:TSpielFeld(fwert:Int)
    Local S:TSpielFeld = New TSpielFeld
    S.Wert = fwert
    Return S
  End Function
End Type

Global FeldX:Int, FeldY:Int, p:Int
ReadData FeldX, FeldY
Global SpielFeld:TSpielFeld[FeldX, FeldY]

For Local x:Int=0 Until FeldX
  For Local y:Int=0 Until FeldY
    ReadData(p)
    SpielFeld[x, y] = TSpielFeld.NewStein(p)
  Next
Next


Jetzt habe ich in meinem Spiel eine Funktion eingebaut, diese ermöglicht das man Verschiedene Spielfeld Grösse wählen kann, nur kann ich irgendwie die Felder nicht ändern.

Ich hab das mal so versucht:
Code: [AUSKLAPPEN]
RestoreData Feld2
ReadData FeldX, FeldY
For Local x:Int=0 Until FeldX
  For Local y:Int=0 Until FeldY
    ReadData(p)
    SpielFeld[x, y] = TSpielFeld.NewStein(p)
  Next
Next


So kann das ja nicht funktionieren.
Muss ich vieleicht vorher erst das Feld wieder löschen bevor ich ein neues erstelle?

Ich hab schon viel versucht, vieleicht kann mir da jemand helfen.

Danke euch schonmal.

MfG
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250

Xeres

Moderator

BeitragDi, Jan 20, 2009 16:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Du gehst die aktuelle Kartengröße durch, setzt alle SpielFeld[x, y] = Null und das sollte es gewesen sein.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

bruce85

BeitragDi, Jan 20, 2009 17:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke Dir.

Das wird mir aber nicht viel bringen, da ich eine grössere Karte einlesen möchte, wärend mein Spiel läuft.

Hier mal die 2 Karten:
Code: [AUSKLAPPEN]
#Karte1
DefData 6,8
DefData 0,0,0,0,0,0
DefData 0,0,0,0,0,0
DefData 0,0,0,0,0,0
DefData 0,0,0,0,0,0
DefData 0,0,0,0,0,0
DefData 0,0,0,0,0,0
DefData 0,0,0,0,0,0
DefData 0,0,0,0,0,0

#Karte2
DefData 12,12
DefData 0,0,0,0,0,0,0,0,0,0,0,0
DefData 0,0,0,0,0,0,0,0,0,0,0,0
DefData 0,0,0,0,0,0,0,0,0,0,0,0
DefData 0,0,0,0,0,0,0,0,0,0,0,0
DefData 0,0,0,0,0,0,0,0,0,0,0,0
DefData 0,0,0,0,0,0,0,0,0,0,0,0
DefData 0,0,0,0,0,0,0,0,0,0,0,0
DefData 0,0,0,0,0,0,0,0,0,0,0,0
DefData 0,0,0,0,0,0,0,0,0,0,0,0
DefData 0,0,0,0,0,0,0,0,0,0,0,0
DefData 0,0,0,0,0,0,0,0,0,0,0,0
DefData 0,0,0,0,0,0,0,0,0,0,0,0


Bei Spielstart wird die erste Karte eingelesen und ich möchte bei neues Spiel die 2te Karte einlesen, nur funktioniert das nicht so wie du es beschrieben hast, da ich dann eine Fehlermeldung erhalte, das ich die Größe von Arrays überschreite.

Wie könnte ich das jetzt ambesten machen?

MfG
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250

Xeres

Moderator

BeitragDi, Jan 20, 2009 17:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich berichtige mich: Die bestehenden TSpielFeld werden gelöscht, sobald auf sie nicht mehr zugegriffen werden kann. Es sollte Prinzipiell reichen, das Array neu zu Dimensionieren und die Felder zu überschreiben.
Code: [AUSKLAPPEN]
SuperStrict
Local array:Int[5, 5]
Print("alte größe: " + array.length)
array = New Int[10, 10]
Print("neue größe: " + array.length)
End
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

bruce85

BeitragDi, Jan 20, 2009 21:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke.

Ich hab das nochmal so versucht:
Code: [AUSKLAPPEN]
RestoreData Karte2
ReadData FeldX, FeldY
For Local x:Int=0 Until FeldX
  For Local y:Int=0 Until FeldY
    ReadData(p)
    SpielFeld[x, y] = TSpielFeld.NewStein(p)
  Next
Next


komischerweise funktioniert das jetzt, wahrscheinlich habe ich vorhin etwas übersehen oder so.

Edit: Das funktioniert doch nicht, ich erzeuge ja so ein neues Spielfeld vom Type TSpielfeld:
Code: [AUSKLAPPEN]
Global SpielFeld:TSpielFeld[FeldX, FeldY]


Da ist ja bereits die größe Definiert, wie könnte ich die größe im Spiel ändern?

Danke schonmal.

MfG
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250
 

bruce85

BeitragMi, Jan 21, 2009 12:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Es muss doch eine Möglichkeit geben das erstellte SpielFeld vom Typ TSpielFeld zu vergrößern:
Code: [AUSKLAPPEN]
Global SpielFeld:TSpielFeld[FeldX, FeldY]


Wenn man es nicht im Spiel direkt vergößern kann, dann müsste man doch wenigstens das erstellte SpielFeld wieder löschen können.

Ich hab versucht die größe so zu ändern:
Code: [AUSKLAPPEN]
SpielFeld = New TSpielFeld[6,8]

leider klappt das nicht so.

Hat vieleicht jemand eine Idee wie ich das jetzt machen kann?

MfG
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250

BladeRunner

Moderator

BeitragMi, Jan 21, 2009 13:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Benutz slicing. Das geht allerdings nur bei eindimensionalen Arrays.
Also Code: [AUSKLAPPEN]
Spielfeld:Tspielfeld[x*y]

später:
Code: [AUSKLAPPEN]
spielfeld = spielfeld[..x*y]


Ansprechen tust Du die einzelnen Indizes per [x+y*max_X].
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

bruce85

BeitragMi, Jan 21, 2009 13:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke Dir.
Ich bekomme zwar hin das Spielfeld zu vergrößern, aber dann bekomme ich eine Fehlermeldung, wenn ich dann die größere Karte lade:
Code: [AUSKLAPPEN]
RestoreData Karte2
ReadData FeldX, FeldY
SpielFeld = New TSpielFeld[FeldX, FeldY]
SpielfeldLoad()


Code: [AUSKLAPPEN]
Unhandled Exception:Attempt to acces field or method of Null object


Wie könnte ich das problem beheben?

MfG
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250

BladeRunner

Moderator

BeitragMi, Jan 21, 2009 13:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Du musst die einzelnen Felder der Karte mit new initialisieren:
Code: [AUSKLAPPEN]
for local s:Tspielfeld = eachin spielfeld
    s = new Tspielfeld
next
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

bruce85

BeitragMi, Jan 21, 2009 14:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Das funktioniert auch nicht.
Wenn ich die gleiche größe von Spielfeld lade, dann geht es, aber wenn ich eine grössere Karte lade, dann bekomme ich die gleiche Fehlermeldung.

Sry, aber ich bin kein Profi in BlitzMax, in BlitzBasic ist ja alles noch einfach.

Hier mal mein versuch:
Code: [AUSKLAPPEN]
RestoreData Karte2
ReadData FeldX, FeldY
SpielfeldLoad()


Code: [AUSKLAPPEN]
Function SpielfeldLoad()
  Local Datei:TStream = ReadFile("Karte2.dat")

  For Local s:TspielFeld = EachIn SpielFeld
    s = New TspielFeld
  Next

  If Not Datei = 0 Then
    For Local xx:Int=0 Until FeldX
      For Local yy:Int=0 Until FeldY
        SpielFeld[xx,yy].Feld = ReadByte(Datei)
      Next
    Next
    CloseFile(Datei)
  Else

  EndIf
End Function


klappt auch nicht...
Gibt es vieleicht noch andere wege das Problem zu lösen?

MfG
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250

BladeRunner

Moderator

BeitragMi, Jan 21, 2009 14:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Du musst nachdem du die neue Feldgrösse festgelegt hast mit new initialisieren.
Code: [AUSKLAPPEN]
spielfeld = spielfeld[..neux*neuy]
for local s:tspielfeld = eachin ....
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group