Archief - [JAVA] vraagje over een if-structuur

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.

godf@ther

Legacy Member
Hallo,


Ik vroeg me af of de volgende code zou werken?

if(sp.getSymbool() == continenten.get(0).getLanden().get(i).getSymboolSpeler() && sp.getSymbool() == continenten.get(1).getLanden().get(i).getSymboolSpeler() && (sp.getSymbool() ==
continenten.get(2).getLanden().get(i).getSymboolSpeler() || sp.getSymbool() ==
continenten.get(3).getLanden().get(i).getSymboolSpeler() || sp.getSymbool() ==
continenten.get(4).getLanden().get(i).getSymboolSpeler() || sp.getSymbool() ==
continenten.get(5).getLanden().get(i).getSymboolSpeler()))

In mensentaal:

if(1 = veroverd && 2 = veroverd && (3 = veroverd || 4 = veroverd || 5 = veroverd || 6 = veroverd))
maar kanz o'n code
dus 1 en 2 zowiezo veroverd
en dan nog 1 van de andere 4
dus alle or's tussen haakjes

Alvast bedankt voor de help!

profound

Legacy Member
Ik zie nie in waarom et nie zou werken. Probeer het misschien is uit te voeren, dan wete et direct ;)

godf@ther

Legacy Member
Mja wegens omstandigheden kan ik het zelf niet testen, daarmee dat ik het hier even kom vragen :D

Nu een andere vraag, heb mezelf in de problemen gewerkt:

for(int i=0;i<continenten.get(0).getLanden().size();i++)
{
if(sp.getSymbool() == continenten.get(0).getLanden().get(i).getSymboolSpeler() && sp.getSymbool() ==
continenten.get(1).getLanden().get(i).getSymboolSpeler() && (sp.getSymbool() ==
continenten.get(2).getLanden().get(i).getSymboolSpeler() || sp.getSymbool() ==
continenten.get(3).getLanden().get(i).getSymboolSpeler() || sp.getSymbool() ==
continenten.get(4).getLanden().get(i).getSymboolSpeler() || sp.getSymbool() ==
continenten.get(5).getLanden().get(i).getSymboolSpeler()))
{
isGewonnen = true;
}
}

Die code klopt dus niet, en ik ben aan het zoeken hoe ik die fout kan wegwerken, maar ben al redelijk vermoeid en zie het niet echt meer ... Normaal zou ik morgen verder doen maar mijn deadline van 2de zit project komt alsmaar dichterbij...

Alvast bedankt Profound (Zeldafreak?)

profound

Legacy Member
Jah just, zeldafreak was menne naam vroeger, zalig da ge da nog weet, kwast al compleet vergeten :D
Goeie tijden op het gunkforum, haha.


Ivm met uw code; welke foutmelding krijgde juist?

godf@ther

Legacy Member
Geen, maar de eerste regel
for(int i=0;i<continenten.get(0).getLanden().size();i++)

Daar gaat het over het eerste continent (continenten.get(0)).
Kan ik dan in die for-lus nog wel andere continenten erbij betrekken?

Hatelijk dak het nie kan testen!

profound

Legacy Member
Maak gewoon een 2de for lus dan?

Code:
for(int j = 0; i < maximum aantal continenten; i++){
       for(int i=0;i<continenten.get(j).getLanden().size();i++){
       }
}

Als continenten nen arraylist is, dan ist in dieje eerste for loop continenten.size().
Ofwel ben ek nie goe mee.

godf@ther

Legacy Member
Bedankt, ik had al zoiets in gedachten, maar tkwam nie direct uit men vingers :p morgen eens proberen.

godf@ther

Legacy Member
Ok, ik heb nu de volgende code:

if(sp.getOpdracht().contains("Afrika"))
{
for(int j = 0; j < continenten.size(); j++)
{
for(int i=0;i<continenten.get(j).getLanden().size();i++)
{
if(sp.getSymbool() == continenten.get(2).getLanden().get(i).getSymboolSpeler() && sp.getSymbool() ==
continenten.get(3).getLanden().get(i).getSymboolSpeler() && (sp.getSymbool() ==
continenten.get(4).getLanden().get(i).getSymboolSpeler() || sp.getSymbool() ==
continenten.get(5).getLanden().get(i).getSymboolSpeler() || sp.getSymbool() ==
continenten.get(0).getLanden().get(i).getSymboolSpeler() || sp.getSymbool() ==
continenten.get(1).getLanden().get(i).getSymboolSpeler()))
{
isGewonnen = true;
}
}
}
}
----------------------------

Dit doet normaal het volgende:
* De volgende for-lus controleert of een speler al dan niet gewonnen is door bepaalde continenten te veroveren.
* Voorbeeld voor de eerste if-structuur:
* Als de opdracht van een speler "Afrika" bevat, dan controleert deze if-structuur of de speler aan beurt de continenten
* Afrika en Australië heeft veroverd.
* Zoja => Speler aan beurt = winnaar
* Zonee => We gaan naar de volgende if-structuur ...

Jerre Muesli

Legacy Member
Die magic numbers die ge daar gebruikt 'continenten.get (2)' bvb kan geen goed idee zijn. ..

Nepherte

Legacy Member
een if-statement met 5 condities, in een dubbele for-lus, in een if-stament + chains van 4 methods lang (bv. continenten.get(x).getLanden(x).getSymboolSpeler()), je zou je toch moeten realiseren dat dit niet echt geweldige code is, onafhankelijk of dit nu correct is of niet.

Sir.Sleepalot

Legacy Member
Ik heb al even niet meer geprogrammeerd, dus excuses als ik vergissingen maak.

Als je geen indices nodig hebt in een loop, zou ik deze ook vermijden. Je kan je eerste loop bv. herschrijven als:
Code:
for(Continent continent: continenten){
        continent.doeIets();
    }
Dit maakt alles een stuk leesbaarder en vermindert ook de kans op fouten.

Dan in je tweede for-loop ga je alle landen in het huidige continent af via een counter "i". En je test dan voor ALLE continenten of land "i" van een bepaalde speler is. Tenzij ik me vergis (of als alle continenten even veel landen hebben) gaat dit IndexOutOfBoundsExceptions gooien. Volgens mij moet je nog eens goed nadenken over wat je daar juist wil doen, ofwel begrijp ik niet wat je juist bedoelt, ofwel is daar iets heel erg mis...

Als je je "playersymbool" gaat vergelijken, zou ik '.equals()' gebruiken i.p.v. '==', tenzij je playersymbool een integer is of zo.

Tenslotte kan je ook iets doen aan de lange chains die eerder vermeld zijn. Hoe ik het begrijp wil je testen of er verplichte continenten veroverd zijn én een ander continent?

Dan zou ik in de klasse Continent een methode maken 'isConqueredBy(Player player)':

Code:
public boolean isConqueredBy(Player player){
    for (Country country: countries){
        if(!country.getOwner().equals(player))
            return false;
    }
    return true;
}

Dit geeft true terug als een gegeven speler alle landen in een continent veroverd heeft. Dan moet je gewoon dit oproepen vanuit de klasse die je speltoestand controleert. (1 keer oproepen per verplicht continent en de rest tot er een veroverd continent gevonden is.

Nepherte

Legacy Member
godf@ther zei:
Mja, hoe zou ik het dan compacter kunnen oplossen?
Zie comment van Sir.Sleepalot voor verbetering aan de huidige approach.

Over het algemeen los je zulke problemen op, door meer object-georienteerd te werken. Concreet kan je "bijna" alle if statements wegwerken met behulp van polymorfisme (uitgezonderd vergelijkingen met primitieve waarden en null checks, al zijn die laatste ook niet echt wenselijk). Er zijn ook een aantal design patterns die je daarbij kunnen helpen. Bij games komt het strategy pattern goed van pas.

Zulke wijzigingen vragen waarschijnlijk grote veranderingen in je code + mocht dit voor een opdracht zijn, is het misschien out of scope.

godf@ther

Legacy Member
Idd de opdracht is deze morgend ingediend, ik moest verder werken op code van andere mensen. Hierdoor kon ik niets testen(fout in hun code). Maar het is zeker de moeite om jullie hulp te lezen want hoewel ik geen kei ben in java, wil ik dat toch wel worden. Alvast bedankt, als ik meer tijd heb kan ik dit project misschien volledig uitwerken.

godf@ther

Legacy Member
Sir.Sleepalot zei:
Dan in je tweede for-loop ga je alle landen in het huidige continent af via een counter "i". En je test dan voor ALLE continenten of land "i" van een bepaalde speler is. Tenzij ik me vergis (of als alle continenten even veel landen hebben) gaat dit IndexOutOfBoundsExceptions gooien. Volgens mij moet je nog eens goed nadenken over wat je daar juist wil doen, ofwel begrijp ik niet wat je juist bedoelt, ofwel is daar iets heel erg mis...

Als je je "playersymbool" gaat vergelijken, zou ik '.equals()' gebruiken i.p.v. '==', tenzij je playersymbool een integer is of zo.

Kan je even uitleggen waarom hij die exception zou gooien? Ik ga namelijk een deel van de code efficienter maken voor mijn presentatie van volgende week.

Verstuurd vanaf mijn Joyz met Tapatalk 4

blackrabbit

Legacy Member
Effe snel bekeken: als het aantal landen in elk continent niet hetzelfde is, loopt ge dat risico inderdaad (uw test is sowieso raar als niet alle continenten hetzelfde aantal landen hebben)

godf@ther

Legacy Member
Maar ik snap niet goed waarom hij die fout zou geven als alle landen niet gelijk zijn :p

Verstuurd vanaf mijn Joyz met Tapatalk 4
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