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.

Nepherte

Legacy Member
godf@ther zei:
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
de variabele i itereert over alle landen van continent j:
Code:
for(int i=0;i<continenten.get(j).getLanden().size();i++)
En een beetje verder op, gebruik je i om een land op te roepen voor continenten 0, 1, 3, 4 en 5:
Code:
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()))
Niets garandeert dat die continenten een i-de land hebben. Als een van die contenten minder dan i landen heeft, krijg je dus een IndexOutOfBoundsException.

Mackenzie

Legacy Member
Ik zou het properder doen zoals al is voorgesteld hierboven

Code:
for(Continent cont:continenten)
 for(Land l:cont.getLanden)
  land.ownedByPlayer(player);

of wat dan ook voor die laatste regel als je het enkel voor de current player ofzo wilt checken.

in die ownedByPlayer check je dan in 1 regel of het symbool van dat land overeenkomt met dat van de meegegeven speler.

Passieve verantwoordelijkheden zoals dat moet je altijd zo diep mogelijk duwen.

godf@ther

Legacy Member
In de klasse continent heb ik de volgende methode toegevoegd:

public boolean isVeroverdDoor(String naamSpeler)
{
for(Land l : landen)
{
if(!l.getNaamSpeler().equals(naamSpeler))
return false;
}
return true;
}

---------------------------------------

In de klasse Wereldkaart heb ik het volgende gedaan (vorige foute code weggedaan ook trouwens):

if(sp.getOpdracht().contains("Afrika"))
{
if(continenten.get(0).isVeroverdDoor(sp.getNaam()) && continenten.get(1).isVeroverdDoor(sp.getNaam()) &&
(continenten.get(2).isVeroverdDoor(sp.getNaam()) || continenten.get(3).isVeroverdDoor(sp.getNaam())
|| continenten.get(4).isVeroverdDoor(sp.getNaam()) || continenten.get(5).isVeroverdDoor(sp.getNaam())))
{
isGewonnen = true;
}
}

Ik heb er over nagedacht en dit leek me toch de kortste versie om te controleren of de 2 verplichte continenten te controleren of ze veroverd waren en dan nog 1 optionele continent.

Alvast bedankt voor jullie hulp, hetgeen jullie zeggen houdt ook steek voor me, die fout zal ik in de toekomst dus niet meer maken ^^

blackrabbit

Legacy Member
Dus uw klasse Wereldkaart (brrr) staat vol met dergelijke code? As in, voor elke mogelijke opdracht? Vind je dat zelf niet 'lelijk'? Of anders gezegd: vind je het makkelijk om je code aan te passen of om een bepaalde opdracht terug te vinden in al die lijnen code?

Uw Wereldkaart zou eigenlijk niet veel meer moeten zijn dan een collection van uw continenten.

godf@ther

Legacy Member
Mja ik zou nie direct weten hoe ik het nog compacter kan maken? Ik werkte verder op het project van iemand anders (dit moest ik doen) en die had de methode isGewonnen in de klasse Wereldkaart gezet. Daarom had ik al deze code bij in die methode gezet.

Verstuurd vanaf mijn Joyz met Tapatalk 4

godf@ther

Legacy Member
Ik snap wel wa ge wilt zeggen, deze code in de klasse Continent zetten, maar maakt het een verschil?

Verstuurd vanaf mijn Joyz met Tapatalk 4

godf@ther

Legacy Member
Oftewel een eigen klasse Opdracht maken, en daar dan alle wincondities in verwerken. Maar da zou wel alles omvergooien van mijn gemaakte code, en daar heb ik spijtig genoeg niet meer de tijd voor :p

godf@ther

Legacy Member
Nog een vraag:

Met deze methode:

public boolean isVeroverdDoor(String naamSpeler)
{
boolean isVeroverdDoor = true;
for(Land l : landen)
{
if(!l.getNaamSpeler().equals(naamSpeler))
isVeroverdDoor = false;
}
return isVeroverdDoor;
}

Als ik deze dan oproep met Continenten.get(1).isVeroverdDoor()

Gaat hij dan gwn de landen af die tot dat continent behoren, of gaat hij alle landen af die in het spel zijn?

Jerre Muesli

Legacy Member
Maak van uw opdrachten een enum en check de win in een specifieke klasse. Bvb WinConditionFactory.getInstance (sp.getOpdracht());
12 if-else if-else if- stukken zijn niet leesbaar en niet te onderhouden

blackrabbit

Legacy Member
godf@ther zei:
Oftewel een eigen klasse Opdracht maken, en daar dan alle wincondities in verwerken. Maar da zou wel alles omvergooien van mijn gemaakte code, en daar heb ik spijtig genoeg niet meer de tijd voor :p

Er zijn nog mooiere oplossingen, maar deze is alvast makkelijk implementeerbaar + je hoeft er de interface van Wereldkaart (of Speler) niet voor aan te passen (ok, gewoon een adder toevoegen).

Concreet:
- abstracte klasse AbstractObjective die een referentie naar Wereldkaart heeft (zodat je met het spel kan communiceren), een referentie naar de 'owner' (de speler die deze opdracht heeft) en een abstracte method isAchieved() (oid)
- concrete klasses die elk 1 bepaalde opdracht implementeren (bvb: ConquerAfricaAmericaAsiaObjective) (en overerven van AbstractObjective) en isAchieved() concret implementeren.

- je klasse Wereldkaart bevat dan een lijst van AbstractObjective objecten (met size = aantal spelers), die je in 'isGewonnen()' dan simpelweg kan aflopen en aan elke opdracht kan vragen 'isAchieved()'
- Alternatief voor dat laatste: Player referentie naar naar concrete objective laten bijhouden en Wereldkaard lijst van Players laten aflopen.

Hangt beetje van huidige code af I guess, maar dat alternatief vind ik wel net iets properder.



Maar eerlijk gezegd: denk je dat je het verdient om te slagen (en naar een volgend jaar te gaan?) als je deze vragen moet stellen? Je moet écht wat meer tijd steken in oefenen (zowel qua analyse, modeling als programming zelf)

blackrabbit

Legacy Member
130 lijnen lelijke code? Sorry, daar begin ik niet aan..

In hoeverre moest ge de bestaande code behouden? En waarom?
Zolang interface bewaard wordt kan je imho alle code aanpassen...

godf@ther

Legacy Member
Ik mocht alles aanpassen, maar ik moest ook denken aan de tijd waarin ik het moest doen, ik had enkele herexamens, en daartussen moest ik dan nog dit project uitbreiden. Ik had gekozen om gewoon de opdracht te doen, zonder te letten op mooie code en dergelijke, nu heb ik wat extra tijd om dit te doen.

godf@ther

Legacy Member
alles werkt eindelijk, er was nog wel het een en ander mis ... Maar goed. Gasten bedankt voor de hulp!
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