erstes mal arbeiten mit array's und levelerstellung

Previous topic - Next topic

Metamorphose

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?

Code (glbasic) Select

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
lalagames - www.metamo.ch/lalagames/
Keine K?nstler Online - www.keinekuenstler.ch
M?rchenwelt PNP-RPG - www.metamo.ch/maerchenwelt

BumbleBee

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:

Code (glbasic) Select
   
     FOR x=0 TO 7
          FOR y=0 TO 7


  Oder immer -1. Dann kann nicht schiefgehen. :)
Code (glbasic) Select
     
  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
The day will come...

CPU Intel(R) Core(TM) i5-3570k, 3.4GHz, AMD Radeon 7800 , 8 GB RAM, Windows 10 Home 64Bit

Metamorphose

#2
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

lalagames - www.metamo.ch/lalagames/
Keine K?nstler Online - www.keinekuenstler.ch
M?rchenwelt PNP-RPG - www.metamo.ch/maerchenwelt

kanonet

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...
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

Metamorphose

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?
lalagames - www.metamo.ch/lalagames/
Keine K?nstler Online - www.keinekuenstler.ch
M?rchenwelt PNP-RPG - www.metamo.ch/maerchenwelt

kanonet

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]
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

Metamorphose

#6
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
lalagames - www.metamo.ch/lalagames/
Keine K?nstler Online - www.keinekuenstler.ch
M?rchenwelt PNP-RPG - www.metamo.ch/maerchenwelt

backslider

Hier mal ein Beispiel (Pseudocode ohne Garantie auf nicht-Codefehler)
Code (glbasic) Select

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

D2O

I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell