Page 1 of 3 123 Last
  1. #1
    godf@ther's Avatar
    Registered
    27/05/10
    Location
    /
    Posts
    2,234
    iTrader
    0
    Mentioned
    0 Post(s)
    Reputation
    0/17

    [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  

  2. #2
    profound's Avatar
    Registered
    13/12/08
    Location
    Dendermonde
    Posts
    3,899
    iTrader
    5 (100%)
    Mentioned
    0 Post(s)
    Ik zie nie in waarom et nie zou werken. Probeer het misschien is uit te voeren, dan wete et direct
    no votes  

  3. #3
    godf@ther's Avatar
    Registered
    27/05/10
    Location
    /
    Posts
    2,234
    iTrader
    0
    Mentioned
    0 Post(s)
    Reputation
    0/17
    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  

  4. #4
    profound's Avatar
    Registered
    13/12/08
    Location
    Dendermonde
    Posts
    3,899
    iTrader
    5 (100%)
    Mentioned
    0 Post(s)
    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  

  5. #5
    godf@ther's Avatar
    Registered
    27/05/10
    Location
    /
    Posts
    2,234
    iTrader
    0
    Mentioned
    0 Post(s)
    Reputation
    0/17
    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  

  6. #6
    profound's Avatar
    Registered
    13/12/08
    Location
    Dendermonde
    Posts
    3,899
    iTrader
    5 (100%)
    Mentioned
    0 Post(s)
    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.
    Last edited by profound; 17-08-2013 at 01:01.
    no votes  

  7. #7
    godf@ther's Avatar
    Registered
    27/05/10
    Location
    /
    Posts
    2,234
    iTrader
    0
    Mentioned
    0 Post(s)
    Reputation
    0/17
    Bedankt, ik had al zoiets in gedachten, maar tkwam nie direct uit men vingers morgen eens proberen.
    no votes  

  8. #8
    godf@ther's Avatar
    Registered
    27/05/10
    Location
    /
    Posts
    2,234
    iTrader
    0
    Mentioned
    0 Post(s)
    Reputation
    0/17
    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  

  9. #9
    Jerre Muesli's Avatar
    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  

  10. #10

    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  

  11. #11
    godf@ther's Avatar
    Registered
    27/05/10
    Location
    /
    Posts
    2,234
    iTrader
    0
    Mentioned
    0 Post(s)
    Reputation
    0/17
    Mja, hoe zou ik het dan compacter kunnen oplossen?
    no votes  

  12. #12
    Sir.Sleepalot's Avatar
    Registered
    10/07/09
    Location
    Houthalen
    Posts
    300
    iTrader
    16 (100%)
    Mentioned
    0 Post(s)
    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.
    Last edited by Sir.Sleepalot; 19-08-2013 at 16:52. Reason: Code tags toegevoegd
    no votes  

  13. #13

    Registered
    15/05/06
    Location
    Lint
    Posts
    107
    iTrader
    0
    Mentioned
    0 Post(s)
    Quote Originally Posted by godf@ther View Post
    This quote is hidden because you are ignoring this member. Show
    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.
    no votes  

  14. #14
    godf@ther's Avatar
    Registered
    27/05/10
    Location
    /
    Posts
    2,234
    iTrader
    0
    Mentioned
    0 Post(s)
    Reputation
    0/17
    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  

  15. #15
    Jerre Muesli's Avatar
    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  

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  

Log in

Log in