hallo miteinander.
ich habe bis jetzt nie mit array's gearbeitet, immer einzelne variablen eingespeist (was natürlich vielmals blödsinn ist).
Da ich nun zuhause (krank) bin, hab ich mich wieder ans glbasic gesetzt um dies zu verstehen.
ich will ein 9x9 grosses feld machen (mit dim), dann über eine aufgerufene funktion ein spielfeld erstellen und die entsprechenden bilder (je was für eine zahl das feld hat) pasten.
level 1 könnte also so aussehen:
111111111
101110111
101110111
100000111
110111111
101111111
100000011
111111011
111111111
wobei das 0 ein feld zum betreten ist und das 1 eine wand. dachte das wäre relativ simpel, habe die bilder eingebunden (bis jetzt nur 2) und die funktion erstellt um nur mal ein 9x9 grosses feld zu haben und die bilder anzuzeigen. das programm kommt dann, bleibt eine sekunde und verschwindet wieder. da ich noch wie gesagt nie mit arrays geschafft habe und ich vermute, dass die array nicht global ist und die funktion nicht auf x+y-arrays vom feld zugreifen können, beendet es sich auch gleich.
ich hoffe generell den richtigen lösungsansatz dazu zu schreiben, danach sollte ja auch die kollisionsabfrage anhand der feldtypen stattfinden usw.
aber eben, wieso klappts nu nicht oder ists schrott was ich bis jetzt ausprobiert habe?
DIM feld[8][8]
GLOBAL curx, cury, ende
ende = 0
curx=4
cury=4
LOADSPRITE "media/feld.png", 0
LOADSPRITE "media/marker.png", 1
WHILE ende=0
updater()
SHOWSCREEN
MOUSEWAIT
WEND
// ------------------------------------------------------------- //
// --- UPDATER ---
// ------------------------------------------------------------- //
FUNCTION updater:
// Diese Variablen sind als LOCAL definiert:
//
FOR x=0 TO 8
FOR y=0 TO 8
IF feld[x][y]=0
FOR cord=0 TO 8
x2=x*50
y2=y*50
DRAWSPRITE 0, x2, y2
NEXT
ENDIF
NEXT
NEXT
ENDFUNCTION // UPDATER
Hi
Dein Feld ist 8*8 groß. In der FOR Schleife zählst du aber von 0 bis 8. Das sind dann ja 9. :)
Also dann mußt du es so machen:
FOR x=0 TO 7
FOR y=0 TO 7
Oder immer -1. Dann kann nicht schiefgehen. :)
MaxX=8
MaxY=8
DIM feld[MaxX][MaxY]
FOR x=0 TO MaxX-1
FOR y=0 TO MaxY-1
Oder irgendwie so. Bin etwas aus der Übung. =D Hoffe das hilft.
Cheers
0 ist doch beim dim auch ein wert, somit wärs 9 gross. steht in der glbasic-anleitung
Edit: habs auf 9 gesetzt den wert und voila.
aber bei dim feld[8][8]
wär das feld ja 9 gross? 0-9? hab das aus der anleitung. oder ist dies überholt:
zitat anleitung (tutorial-allgemein):
LET schachbrett[2][3]=7
Warum 2 und nicht 3?? Nun weil Datenfelder nun einmal bei 0 beginnen. 0,1,2,3,4,5,6 sind 7 Felder. Zugegeben, das mag etwas verwirren, ist aber nach kurzer Zeit vergessen und wird automatisch richtig gemacht.
Du kannst Datenfelder auch mit Variablen anspringen
nochmals editiert:
wie kann ich eine array erhöhen?
sprich wie kann ich das erste array um 1 erhöhen? für den spieler x und y, dass in dem feld player[9][9] die koordinaten gespeichert werden.
geht ja nicht mehr so einfach wie bei einfachen variablen:
playerx=playerx+1
Bumblebee hat Recht, bei DIM gibst du an, wie viele Elemente dein Array haben soll. Wenn du also DIM array[9] machst beinhaltet dies die Elemente 0,1,2,3,4,5,6,7,8 = 9 Elemente. Wenn du also x 0-8 und y 0-8 willst, musst du ein DIM array[9][9] machen.
Um ein Array zu vergrößern oder verkleinern kannst du erneut DIM array[_x][_y] aufrufen, dabei werden aber alle Element auf 0 (bzw auf "" wenn es ein string array ist) gesetzt. Willst du die werte der Elemente beibehalten, dann kannst du die Größe eines Arrays auch mit REDIM array[_x][_y] ändern. (Bemerkung am Rand: wenn du mit REDIM verkleinerst wird der Speicher nicht freigegeben, vergrößerst du später wieder, geht dass dann viel schneller, als wenn neuer Speicher akquiriert werden müsste)
Die Größe eines Arrays kannst du auch mit DIMPUSH und DELETE/DIMDEL ändern, wobei ich die drei nur auf eindimensionale Arrays anwenden würde, da es bei mehrdimensionalen immer schwer ist sich vorher vorzustellen, was passierten wird. Übrigens sind eindimensionale Arrays auch schneller, als mehrdimensionale.
Edit: blöde Autoformatierung hatte meinen Text schwerer lesbar gemacht...
sorry ich hab das jetzt mehrmals durchgelesen und in der hilfe von glbasic, aber kapieren tu ichs nicht.
simples beispiel: ein array mit 4 feldern a 0
dim beispiel[2][2]
ergo
00
00
standartgemäss sind alle auf 0
nun will ich bei jedem tastendruck, dass er den wert von beispiel[2][1] nimmt und um 1 erhöht
wäre also nachher
00
10
und dann wieder den wert übernehmen und daraus
00
20
machen usw. wie bekomme ich das hin?
Oh dann habe ich deine Frage falsch verstanden gehabt, dachte du willst das Array vergrößern, dabei willst du nur einen gespeicherten Wert erhöhen. Ok, das ist einfach:
Du schreibst auf ein Element so:
beispiel[2][1] = 1
Und du liest ein Element so:
local a = beispiel[2][1]
Folglich kannst du den Wert eines Elements einfach so erhöhen:
beispiel[2][1] = beispiel[2][1] +1
oder einfach:
INC beispiel[2][1]
jetzt hab ich mich doch echt selbst verzettelt.
ach danke dir, das hätt ich auch nicht gewusst.
aber ach, ich nerv mich. ich meinte was anderes. sorry.
ich will dass ein dim beispiel[2][2]
00
00
dass wenn ein feld auf 1 gesetzt wird, also
00
10
dass ich dies auslesen kann und das 1 "verschieben" kann.
sprich ist das 1 dort und drückt er nach rechts, lösche das 1 aus dem feld und platziere es ins nächste feld. also
00
01
und das alles dynamisch. es einfach neu setzen ginge ja mit dim, das einfach in eine gescheite schlaufe oder wasweissich bringen das es funzt
Hier mal ein Beispiel (Pseudocode ohne Garantie auf nicht-Codefehler)
LOCAL map%[] //array deklarieren
DIM map[2][2] //array initialisieren mit Größe 2x2
//Map initialisieren
FOREACH T in map[] //FOREACH durchläuft jedes Feld in jeder Dimension (hoffe, dass das noch so ist :)
T = 0
NEXT
//Array sieht nun so aus
//0 0
//0 0
//Nun setzen wir Feld "1"
map[0][1] = 1
//Array sieht nun so aus
//0 0
//1 0
PseudoFunktionDieAufKeyInputWartet()
//Nun wurde "Rechts" gedrückt und der Wert 1 wird um einen nach Rechts verschoben
map[0][1] = 0
map[1][1] = 1
//Array sieht nun so aus
//0 0
//0 1
//...Das wäre nun der reine Ablauf, man kann das ganze natürlich noch viel schöner machen
//Aber so hast Du mal einen Ansatz, wie es rein technisch geht. ;)
MfG
Vieleicht hilft Dir das zum verständniss von einem ARRAY weiter.
http://www.deuteriumoxid.com/glbasic/Array.app.zib (http://www.deuteriumoxid.com/glbasic/Array.app.zib)