-
16-08-2013, 23:50 #1
[JAVA] vraagje over een if-structuur
Hallo,
Ik vroeg me af of de volgende code zou werken?
if(sp.getSymbool() == continenten.get(0).getLanden().get(i).getSymboolSp eler() && sp.getSymbool() == continenten.get(1).getLanden().get(i).getSymboolSp eler() && (sp.getSymbool() ==
continenten.get(2).getLanden().get(i).getSymboolSp eler() || sp.getSymbool() ==
continenten.get(3).getLanden().get(i).getSymboolSp eler() || sp.getSymbool() ==
continenten.get(4).getLanden().get(i).getSymboolSp eler() || sp.getSymbool() ==
continenten.get(5).getLanden().get(i).getSymboolSp eler()))
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!no votes
-
-
17-08-2013, 00:05 #2
Ik zie nie in waarom et nie zou werken. Probeer het misschien is uit te voeren, dan wete et direct
no votes
-
17-08-2013, 00:08 #3
Mja wegens omstandigheden kan ik het zelf niet testen, daarmee dat ik het hier even kom vragen

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).getSymboolSp eler() && sp.getSymbool() ==
continenten.get(1).getLanden().get(i).getSymboolSp eler() && (sp.getSymbool() ==
continenten.get(2).getLanden().get(i).getSymboolSp eler() || sp.getSymbool() ==
continenten.get(3).getLanden().get(i).getSymboolSp eler() || sp.getSymbool() ==
continenten.get(4).getLanden().get(i).getSymboolSp eler() || sp.getSymbool() ==
continenten.get(5).getLanden().get(i).getSymboolSp eler()))
{
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?)no votes
-
17-08-2013, 00:28 #4
Jah just, zeldafreak was menne naam vroeger, zalig da ge da nog weet, kwast al compleet vergeten

Goeie tijden op het gunkforum, haha.
Ivm met uw code; welke foutmelding krijgde juist?no votes
-
17-08-2013, 00:32 #5
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!no votes
-
17-08-2013, 00:36 #6
Maak gewoon een 2de for lus dan?
Als continenten nen arraylist is, dan ist in dieje eerste for loop continenten.size().Code:for(int j = 0; i < maximum aantal continenten; i++){ for(int i=0;i<continenten.get(j).getLanden().size();i++){ } }
Ofwel ben ek nie goe mee.Last edited by profound; 17-08-2013 at 01:01.
no votes
-
17-08-2013, 01:37 #7
Bedankt, ik had al zoiets in gedachten, maar tkwam nie direct uit men vingers
morgen eens proberen.
no votes
-
17-08-2013, 17:36 #8
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).getSymboolSp eler() && sp.getSymbool() ==
continenten.get(3).getLanden().get(i).getSymboolSp eler() && (sp.getSymbool() ==
continenten.get(4).getLanden().get(i).getSymboolSp eler() || sp.getSymbool() ==
continenten.get(5).getLanden().get(i).getSymboolSp eler() || sp.getSymbool() ==
continenten.get(0).getLanden().get(i).getSymboolSp eler() || sp.getSymbool() ==
continenten.get(1).getLanden().get(i).getSymboolSp eler()))
{
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 ...no votes
-
18-08-2013, 11:49 #9Member
- Registered
- 08/09/02
- Location
- -
- Posts
- 2,044
- iTrader
- 9 (100%)
- Mentioned
- 0 Post(s)
- Reputation
- 3/6
Die magic numbers die ge daar gebruikt 'continenten.get (2)' bvb kan geen goed idee zijn. ..
no votes
-
18-08-2013, 12:38 #10Member
- Registered
- 15/05/06
- Location
- Lint
- Posts
- 107
- iTrader
- 0
- Mentioned
- 0 Post(s)
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.
no votes
-
19-08-2013, 15:43 #11
Mja, hoe zou ik het dan compacter kunnen oplossen?
no votes
-
19-08-2013, 16:28 #12
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:
Dit maakt alles een stuk leesbaarder en vermindert ook de kans op fouten.Code:for(Continent continent: continenten){ continent.doeIets(); }
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)':
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.Code:public boolean isConqueredBy(Player player){ for (Country country: countries){ if(!country.getOwner().equals(player)) return false; } return true; }Last edited by Sir.Sleepalot; 19-08-2013 at 16:52. Reason: Code tags toegevoegd
no votes
-
19-08-2013, 19:56 #13Member
- Registered
- 15/05/06
- Location
- Lint
- Posts
- 107
- iTrader
- 0
- Mentioned
- 0 Post(s)
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.no votes
-
19-08-2013, 20:13 #14
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.
no votes
-
19-08-2013, 21:49 #15Member
- Registered
- 08/09/02
- Location
- -
- Posts
- 2,044
- iTrader
- 9 (100%)
- Mentioned
- 0 Post(s)
- Reputation
- 3/6
" De code is van iedereen" ^^
no votes

