Archief - [PROG][JAVA] Array out of bounds

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

killgore

Legacy Member
Nu effe verdergaan op wat ik bedoelde qua slecht design daarjuist (ik moest naar gent dus had niet teveel tijd om het nog geheel uit te typen).

Wat je (imho) beter doet is een dergelijke structuur:

Je maakt een klasse doolhof, hier wordt logischerwijs de interne structuur (bv. die 2D-array) opgeslagen.
Nu, in deze klasse maak je dan methoden die per veld iets ophalen, een vb is:

Code:
public bool isBlocked(int i, int j)
{
    if( buitenGrenzen(i,j) ) return false;
    return doolhof[i][j]<=0;
}

Hierbij houdt je bv. doolhof[j] zo bij dat in elk veld een int zit dat overeenkomt met een bepaald getal. Postief -> geblokt, negatief -> item, maar niet geblokt, 0=gewoon pad. Merk op dat hij natuurlijk blocked weergeeft als je buiten je grenzen wilt gaan :p! buitengrenzen hoeft trouwens geen aparte functie te zijn, tis nog steeds een soort pseudocode.
Een andere methode kan dan zijn:

Code:
public Item getItemAt(int i, int j)
{
    return intItemMap[doolhof[i][j]];
}

Een item kan dan in dat geval bv. een power-up zijn, maar even goed een duer, een muur, een speler, ... . In de meeste game-engines wordt dit dan ook entity genoemd ipv item, maar ik wou de benaming nog duidelijk houden.

Nu, dan ga je ergens een klasse hebben die de input afhandelt, stel dat je ergens een functie hebt die keys opvangt:

Code:
public void getKey(int key)
{
    ...
    if(key == keyRight) speler->beweegRechts();
    ...
}

Dit is dus eigenlijk je controller. In mijn geval ga ik vanuit controller niets doorgeven aan klasses direct, maar implementeer ik een eigen event-systeem als link daartussen, maar dat leidt u te ver :p.

Dan heb je in je spelerklasse een functie beweegRechts die er bv. als volgt zal uitzien:

Code:
public bool beweegRechts()
{
    if(doolhof->isBlocked(i+1,j)) return false;
    i++;
    Item itemAtNewPos = doolhof->getItem(i,j);
    if(itemAtNewPos)
    {
        /// Roep interactiecode op, bv. itemAtNewPos->action();
    }
    return true;
}

Enige opmerking hierbij: i,j zijn privé-variabelen van de Speler klasse die zijn positie in het doolhof bijhudt.

Ook zou ik niet echt een beweeg-functie maken voor elke richting, maar de richting als argument meegeven ;), maar dat zou men vb. code weer wat te lang maken.

Voordelen: beter & duidelijker design. Je gaat richting een MVC-model, je moet al zeer lomp zijn om out-of-bounds errors te krijgen, ...

eniac

Legacy Member
Timmos zei:
Het probleem is dat hij te pas en te onpas dan in zijn for-lus gaat checken op plaats j + 1...

Zal me leren om code effectief te bekijken voor ik antwoord :)

killgore

Legacy Member
eniac zei:
Zal me leren om code effectief te bekijken voor ik antwoord :)

Denkte gij da ik zijn code deftig bekeken heb :p?

Ik zie gewoon een simpele situatie & veel te veel code voor die situatie.

presario

Legacy Member
@killgore
code ziet er idd stukken beter uit maar heb de tijd neit meer op die manier te doen :/
Mijn manier is mss zeer veel code maar het zou toch ook moeten werken. Zo ongeloofelijk onlogisch dat het niet werkt!

killgore

Legacy Member
Ik heb 10 minuten erover gedaan om die vb. code te schrijven, zet u daar een uur achter en uw algorithmes zijn herschreven.

Hoe gij prutst met for-lussen is gewoon veel te zot :x.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan