Archief - [PROG]Java snake volgens MVC in Java

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.

gamer1

Legacy Member
Ben momenteel bezig met snake proberen te maken volgens de MVC methode. Wat ik tot nu toe heb is:
1 een veld
2 een slang die uit 1 element bestaat en die kan rondlopen in de 4 richtingen (ook door de wanden gelijk bij snake II) (moet wel nog iets aan veranderd worden vermits ik rechtstreeks in tegenovergestelde richting kan lopen (bv van links meteen naar rechts enz))

Nog te doen:
3 vakje random genereren wat ge kunt opnemen
4 slang verlengen als ge vakje opneemt
5 bonusvakje da om de 5 hits komt en voor korte tijd blijft staan
6 algemene controle van t volledige spel

Was nu bezig met onderdeel 3, maar dit wil precies niet echt lukken. Zou iemand hier een tip/oplossing voor kunnen geven?
Als ik nog kemels geschoten heb of er dingen beter kunnen of overbodig zijn moogt ge t ook altijd zeggen natuurlijk.
Alvast merci!
(code komt in volgende post)

gamer1

Legacy Member
Klasse voor t model:
Code:
public class SnakeModel
{
    // instance variables - replace the example below with your own
    protected int x, y, dx, dy;
    protected boolean snakeVeld[][];
    protected int breedte, hoogte;
    
    // classe constanten
    static final int NOORD = 0;
    static final int OOST = 1;
    static final int ZUID = 2;
    static final int WEST = 3;
    
    /**
     * Default constructor voor een veld van 20x20. 
     * Zet de slang in het midden 
     */
    public SnakeModel()
    {
        // initialise instance variables
        breedte = hoogte = 20;
        initsnakeVeld();
    }
    
    /**
     * Constructor voor een veld waarbij je breedte en hoogte zelf kan kiezen. 
     * Zet de slang in het midden
     */
    public SnakeModel(int breedte, int hoogte) 
    {
        this.breedte = breedte;
        this.hoogte = hoogte;
        initsnakeVeld();
    }

    /**
     * Initialiseer het snakeVeld 
     */
    protected void initsnakeVeld() 
    {
        x = breedte/2;
        y = hoogte/2;
        snakeVeld = new boolean[breedte][hoogte];    
        for (int i=0; i<breedte; i++) 
        {
           for (int j=0; j<hoogte; j++) 
           {
              if (Math.random() < 0.01/5) 
              {
                 snakeVeld[i][j]= false;
              }
              else 
              {
                 snakeVeld[i][j]= true;
              }
           }   
        }
    }
    
    /**
     * Geeft de horizontale coördinaat van de slang
     * 
     * @return     x-coordinaat
     */
    public int waarBenIkHorizontaal()
    {
        // put your code here
        return x;
    }

    /**
     * Geeft de verticale coördinaat van de slang
     * 
     * @return     y-coordinaat
     */
    public int waarBenIkVerticaal()
    {
        // put your code here
        return y;
    }
    
    public void move()    // nu kan de slang door de wanden heen (cfr snake2)
    {                          // de methode isVrij moet nog gecheckt worde 
       x = x + dx;
       y = y + dy;
       if (x > breedte-1)
       {
           x = 1;
       }
       if (x < 0)
       {
           x = breedte-1;
       }
       if (y > hoogte-1)
       {
           y = 0;
       }
       if (y < 0)
       {
           y = hoogte-1;
       }
    }
    /**
     * Laat de slang naar rechts gaan.
     * Controle (niet op het einde van het doolhof) is inbegrepen.
     */
    public void rechts()
    {
        // put your code here
        if (isVrij(OOST))
        dx = 1;
        dy = 0;
    }
    
    /**
     * Laat de slang naar links gaan.
     * Controle (niet op het einde van het doolhof) is inbegrepen.
     */
    public void links()
    {
        // put your code here
        if (isVrij(WEST))
        dx = -1;
        dy = 0;
    }
    
    /**
     * Laat de slang naar boven gaan.
     * Controle (niet op het einde van het doolhof) is inbegrepen.
     */ 
    public void boven()
    {
        if (isVrij(NOORD))
        dx = 0;
        dy = -1;
    }
    
    /**
     * Laat de slang naar onder gaan.
     * Controle (niet op het einde van het doolhof) is inbegrepen.
     */
    public void onder()
    {
        // put your code here
        if (isVrij(ZUID))
        dx = 0;
        dy = 1;
    }
    
    public boolean isVrij(int x, int y) 
    {
        if (x < 0 || x >= breedte || y < 0 || y >= hoogte) 
          return false;
        else 
          return snakeVeld[x][y];
    }

    public boolean isVrij(int richting) 
    {
        switch (richting) 
        {
           case NOORD:
              if (y == 0) 
                return false;
              else 
                return snakeVeld[x][y-1];
           case ZUID:
              if (y == hoogte-1) 
                return false;
              else 
                return snakeVeld[x][y+1];
           case WEST:
              if (x == 0) 
                return false;
              else 
                return snakeVeld[x-1][y];
           case OOST:
              if (x == breedte-1) 
                return false;
              else 
                return snakeVeld[x+1][y];
        }
        return false;
    }
}

klasse voor de view:
Code:
import java.awt.*;

public class SnakeView extends Canvas
{
    // instance variables - replace the example below with your own
    protected SnakeModel model;
    protected Image buffer;

    /**
     * Constructor for objects of class SnakeView.
     * Heeft altijd een Model nodig.
     * 
     * @param m SnakeModel dat gevisualiseerd moet worden
     */
    public SnakeView(SnakeModel m)
    {
        // initialise instance variables
        model = m;
    }

    public void teken(Graphics g) 
    {
        int b = getSize().width / model.breedte;
        int h = getSize().height / model.hoogte;
        for (int i=0; i<model.breedte; i++) 
        {
           for (int j=0; j<model.hoogte; j++) 
           {  // initialiseer snakeVeld[i][j]
              if (model.isVrij(i,j))
              {
                g.setColor(new Color(222, 222, 0));
                g.fillRect(i*b, j*h, b, h);
              }  
              else
              {
                g.setColor(Color.BLUE);
                g.fillRect(i*b, j*h, b, h);
                //g.setColor(Color.BLUE);
                //g.fillOval(i*b+5, j*h+5, b-10, h-10);
              }    
            }   
        }
        
        // en ten slotte de slang
        int x = model.waarBenIkHorizontaal()*b+10;
        int y = model.waarBenIkVerticaal()*h+10;

        g.setColor(Color.RED);   
        g.fillOval(x-8,y-8,16,16);
}
    
    /**
     * De double gebufferde tekenmethode van deze view
     * 
     * @param  g   De Graphics van de Canvas
     */
    public void paint(Graphics g) 
    {
        // initialiseer de buffer
        if (buffer == null ||
           buffer.getWidth(null) != getSize().width ||
           buffer.getHeight(null) != getSize().height) 
           buffer = createImage(getSize().width, getSize().height);
           // teken op de buffer
           teken(buffer.getGraphics());
           // breng nu de buffer op het scherm
           g.drawImage(buffer, 0, 0, null);
    }
    
    public void update(Graphics g) {
        paint(g);    
    }
    
    /** 
     *    doet de horizontale omzetting van scherm- naar spelcoordinaten
     */
    public int welkeSpelX(int x) {
        if (x < 0 || x >= model.breedte*20) 
          return -1;
        else
          return x/20;
    }
    /** 
     *    doet de verticale omzetting van scherm- naar spelcoordinaten
     */
    public int welkeSpelY(int y) {
        if (y < 0 || y >= model.hoogte*20) 
          return -1;
        else
          return y/20;
    }
}

klasse voor de controller:
Code:
import java.awt.event.*;

public class SnakeController implements KeyListener
{
    // instance variables - replace the example below with your own
    protected SnakeModel model;
    protected SnakeView view;

    /**
     * Constructor for objects of class SnakeController
     */
    public SnakeController(SnakeModel m, SnakeView v)
    {
        // initialise instance variables
        model = m;
        view = v;
        view.addKeyListener(this);
    }

    /**
     * Hieronder komt de code voor het bedienen van Snake m.b.v. het toetsenbord.
     * 
     * @param  y   a sample parameter for a method
     * @return     the sum of x and y 
     */
    
    public void keyPressed(KeyEvent e) 
    {
        switch (e.getKeyCode()) 
        {
           case KeyEvent.VK_RIGHT:
             model.rechts();
             break;
           case KeyEvent.VK_LEFT:
             model.links();
             break;
           case KeyEvent.VK_UP:
             model.boven();
             break;
           case KeyEvent.VK_DOWN:
             model.onder();
             break;
        }
        view.repaint();
    }
    public void keyReleased(KeyEvent e) 
    {
    }
    public void keyTyped(KeyEvent e) 
    {
    }
}

klasse voor de animator:
Code:
public class SnakeAnimator implements Runnable
{
    // instance variables - replace the example below with your own
    protected SnakeModel model;
    protected SnakeView view;
    
    /**
     * Constructor for objects of class SnakeAnimator
     */
    public SnakeAnimator(SnakeModel m, SnakeView v)
    {
        // initialise instance variables
        model = m;
        view = v;
    }

    public void run() 
    {
       // de uitvoering van de thread
       while (true) 
       {
         try 
         {
           Thread.sleep(40);
         }
         catch (InterruptedException e) 
         {
             // slaap is voorbij
             // terug aan het werk!
         }           
         model.move();
         view.repaint();
       }
    }
}

hoofdklasse:
Code:
import java.awt.*;
import java.awt.event.*;

public class Snake extends Frame
{
    // data member
    protected SnakeModel model;
    protected SnakeView view;
    protected SnakeController controller;
    protected SnakeAnimator animator;
   
    public Snake()
    {
         model = new SnakeModel();
         view = new SnakeView(model);
         controller = new SnakeController(model, view);
         add(view);
	   
         animator = new SnakeAnimator(model, view);
         Thread t = new Thread(animator); 
         t.start();
	   
         this.addWindowListener  (new WindowAdapter()
         {
               public void windowClosing(WindowEvent e)
	  {
	         dispose();
	         System.exit(0);
			}
	   });
          }
	
           public static void main(String args[])
           {
	      System.out.println("Starting Snake, please be patient");
	      Snake s = new Snake();
	       s.setSize(s.model.breedte*20+8,s.model.hoogte*20+8);
	       s.setTitle("Snake ownt alle gsm-spellen");
	       s.setVisible(true); 
           }
    }
}

Timmos

Legacy Member
Een willekeurige locatie genereren is toch niet zo moeilijk? Met Random laat ge een willekeurige coördinaat in uw veld genereren en ge controleert of die coördinaat niet bezet is door uw slang of een ander item, met uw boolean[][].

En zet uw Thread.sleep(int x) eens wat hoger want nu vliegt da bolleke iets te snel.

Ik zie trouwens dat ge de syntax "while(true)" gebruikt. Dit is eerder 'vuile code'. Vervang dit door "for(;;)".

jodeman

Legacy Member
geen nederlands gebruiken in uw code. Beter direct goede standaarden aanleren. teken(graphics g) & paint(graphics g)? ;)

gamer1

Legacy Member
Heb bij t model wel dit staan:
Code:
protected void initsnakeVeld() 
    {
        x = breedte/2;
        y = hoogte/2;
        snakeVeld = new boolean[breedte][hoogte];    
        for (int i=0; i<breedte; i++) 
        {
           for (int j=0; j<hoogte; j++) 
           {
              if (Math.random() < 0.01/5) 
              {
                 snakeVeld[i][j]= false;
              }
              else 
              {
                 snakeVeld[i][j]= true;
              }
           }   
        }
    }

Maar dit is niet echt de juste methode om zo n vakje da ge moet opeten te genereren e? Het werkt toch niet echt naar behoren.

Bij die vervanging van while (true), wat moet ik dan wel niet bij die for (...;...;...) zetten?

Wat dat engels betreft, dat zal ik op het einde wel in orde maken. Nu wil ik eerst een voor mij werkende en begrijpbare versie maken en dat gaat ,vind ik persoonlijk, iets gemakkelijker int nederlands. Toch merci voor de tip.

gamer1

Legacy Member
Heb iets geprobeerd voor da eetbaarBlokje. Compilen lukt zonder errors, maar als ik t wil runnen krijg ik een outOfBoundsException. Is dit een goede methode voor zo n random eetbaar blokje en zo ja, hoe krijg ik die error gefixt? Die c en d aanpassen helpt niet.
Zo nee, hoe kan ik da dan op een betere manier doen?

Code:
public class SnakeModel
{
    // instance variables - replace the example below with your own
    protected int x, y, dx, dy;
    protected boolean snakeVeld[][];
    protected int breedte, hoogte;
    protected boolean eetbaarBlokje[][];
    protected int c, d;
    
    // classe constanten
    static final int NOORD = 0;
    static final int OOST = 1;
    static final int ZUID = 2;
    static final int WEST = 3;
    

    /**
     * Default constructor voor een veld van 20x20. 
     * Zet de slang in het midden 
     */
    public SnakeModel()
    {
        // initialise instance variables
        breedte = hoogte = 20;
        initsnakeVeld();
    }
    
    /*
     *
     * Constructor voor een veld waarbij je breedte en hoogte zelf kan kiezen. 
     * Zet de slang in het midden
     *
    public SnakeModel(int breedte, int hoogte) 
    {                                           zelf breedte en hoogte kieze mag niet
        this.breedte = breedte;      moete die 20 houden, anders werkt de
        this.hoogte = hoogte;  math.random niemer voor t eetbaarblokje          
        initsnakeVeld();
    }
    */
    /**
     * Initialiseer het snakeVeld 
     */
    protected void initsnakeVeld() 
    {
        x = breedte/2;
        y = hoogte/2;
        
        c = (int)(Math.random()*20); 
        d = (int)(Math.random()*20);
        eetbaarBlokje = new boolean[c][d];
        
        snakeVeld = new boolean[breedte][hoogte];    
        for (int i=0; i<breedte; i++) 
        {
           for (int j=0; j<hoogte; j++) 
           {
                snakeVeld[i][j] = true;
                eetbaarBlokje[c][d] = true;
           }   
        }
    }

Timmos

Legacy Member
gamer1 zei:
Bij die vervanging van while (true), wat moet ik dan wel niet bij die for (...;...;...) zetten?
Neen, je begrijpt me verkeerd :)
Code:
for (;;){
   statement1;
   [statement2;]
}
is een oneindige lus. Dus letterlijk twee puntkomma's tussen de haakjes, niets meer.

[BAT] Hydra

Legacy Member
Timmos zei:
Ik zie trouwens dat ge de syntax "while(true)" gebruikt. Dit is eerder 'vuile code'. Vervang dit door "for(;;)".

ALS er al een verschil is zal
Code:
while(true)
zekere mooiere code zijn dan
Code:
for(;;)

SideShow

Legacy Member
jodeman zei:
geen nederlands gebruiken in uw code. Beter direct goede standaarden aanleren. teken(graphics g) & paint(graphics g)? ;)

Ik gebruik juist doelbewust nederlands voor mijn variabelen enz.
Ik vind dat het de code een stuk leesbaarder maakt (voor dutchies), omda je rapper kan zien wat er systeemwoorden zijn en welke de begrippen zijn je zelf hebt gedefinieerd :unsure:

Timmos

Legacy Member
[BAT] Hydra;8604095 zei:
ALS er al een verschil is zal
Code:
while(true)
zekere mooiere code zijn dan
Code:
for(;;)
Dat is vergelijkbaar met
Code:
if (0 == 0) return true;
else return false;
terwijl ge evengoed kunt schrijven
Code:
return true;

for (;;) is ervoor bedoeld om oneindig lang te lopen. Meestal gebruikt men dit om zo lang door te gaan tot wanneer een Exception wordt opgesmeten die men dan opvangt rond de for.

while (true) is vragen "is true gelijk aan true?". Tuurlijk, dat is altijd zo, dus waarom nog schrijven. In het extreme kunt ge dan al uw condities oneindig lang beginnen uitbreiden. Bvb
Code:
if ((((0 == 0) == (1 == 1)) == false) == false) return true;
else return false;

killgore

Legacy Member
for( ; ; ) en while(true) zijn syntactisch krak hetzelfde en ik ben er bijna compleet zeker van dat dit naar dezelfde assembler zal omgezet worden dmv jumps ipv conditionele jumps, dus nie beginnere zevere.

Het komt er dus op aan wat je duidelijker vind, for gebruik je als teller imho, while voor algemenere lussen, ik zal dus ook eerder de while-methode gebruiken. Het is duidelijker.

En wat is die bs van vergelijken? de conditie true is geen vergelijking he, dit is gewoon een booleaanse waarde.

while(1) zou ook gaan bv.

[BAT] Hydra

Legacy Member
Timmos zei:
Dat is vergelijkbaar met
Code:
if (0 == 0) return true;
else return false;
terwijl ge evengoed kunt schrijven
Code:
return true;

for (;;) is ervoor bedoeld om oneindig lang te lopen. Meestal gebruikt men dit om zo lang door te gaan tot wanneer een Exception wordt opgesmeten die men dan opvangt rond de for.

while (true) is vragen "is true gelijk aan true?". Tuurlijk, dat is altijd zo, dus waarom nog schrijven. In het extreme kunt ge dan al uw condities oneindig lang beginnen uitbreiden. Bvb
Code:
if ((((0 == 0) == (1 == 1)) == false) == false) return true;
else return false;

Het maakt nauwelijks verschil uit wat je gebruikt hoor, while(true) is elegant,

Code:
if (0 == 0) return true;
else return false;

is gewoon lomp.

Wie was het alweer die zei dat een for lus voor een vast aantal iteraties gebruikt moet worden?

Tyfius

Legacy Member
Timmos zei:
for (;;) is ervoor bedoeld om oneindig lang te lopen. Meestal gebruikt men dit om zo lang door te gaan tot wanneer een Exception wordt opgesmeten die men dan opvangt rond de for.

while (true) is vragen "is true gelijk aan true?". Tuurlijk, dat is altijd zo, dus waarom nog schrijven. In het extreme kunt ge dan al uw condities oneindig lang beginnen uitbreiden. Bvb
Code:
if ((((0 == 0) == (1 == 1)) == false) == false) return true;
else return false;
Code:
[COLOR="Red"]int i = 0[/COLOR];
while ([COLOR="SandyBrown"]i < 10[/COLOR]) {
  [COLOR="YellowGreen"]i++[/COLOR];
}
Dit is net hetzelfde als:
Code:
for ([COLOR="Red"]int i = 0[/COLOR]; [COLOR="SandyBrown"]i < 10[/COLOR]; [COLOR="YellowGreen"]i++[/COLOR]) {}
Een goede compiler zet dit om naar exact dezelfde assembler code, en de twee manieren leveren dus dezelfde performantie. De leesbaarheid van while (true) {} is gewoon veel beter dan for(;; ) {} en ik ken geen enkele programmeur (een goede dan toch) die ooit de for(;; ) manier zal gebruiken, edoch het dezelfde performantie oplevert.

Timmos

Legacy Member
[BAT] Hydra;8604238 zei:
Wie was het alweer die zei dat een for lus voor een vast aantal iteraties gebruikt moet worden?
Ik :cool: Oneindig keer is 'in de Nederlandse taal' geen vast aantal, in die semantiek hebt ge dus gelijk. Met oneindig aantal iteraties weet ge wel hoeveel keren de for-lus zal lopen, namelijk 'oneindig' keer. In die zin bedoel ik dus ook 'een vast aantal'.

Dus zaken zoals Arrays overlopen doet ge met nen for, of horizontale lijntjes tekenen in een JPanel om de 10 pixels vanaf de bovenkant van uw venster, ook in een for. Ge weet namelijk hoeveel ge er zult moeten tekenen als ge de hoogte van uw JPanel kent. Dus ook hier bedoel ik een 'vast aantal'. Maar zaken die met dubbele conditie overlopen worden steekt ge in een while, want hier kunt ge niet vooraf bepalen hoeveel keren er zal overlopen worden.

while(true) associeer ik onmiddelijk met if (true), iets overbodig dus. Ook al zal de compiler zowel while(true) en for(;; ) omzetten naar dezelfde code, ik vind dat er vreemd uitzien omdat ge dan ook moogt schrijven if(true). De compiler zal die if dan ook weghalen he.

for(;; ) is er speciaal voor gemaakt ook :) En vanaf ge de betekenis hiervan kent, zal dat 'de leesbaarheid' toch niet naar beneden halen?

gamer1

Legacy Member
Ice zei:
toevallig op dezelfde school als
https://www.beyondgaming.be/forums ?

Ge moet uw huiswerk zelf maken hé ;)

Waar ben ik dan mee bezig misschien? Wa er nu allemaal staat heb ik zelf gedaan. Ben wel vertrokken van een programma dat we in de les gemaakt hebben. Kon evengoed een bestaand spel kopieren e. Tis niet omdat ik hier hulp kom vragen dat ik t niet zelf maak, of toch tenminste probeer. Nu die ;) in uw reactie doet mij vermoeden dat ge t mss niet serieus bedoelt :p

En op uw vraag: ik denk t wel. Heb al een sterk vermoeden wie die persoon is :) Sterker nog, als dat die persoon is, dan komt die hier op mijn aanraden.

Weet er iemand mss hoe ik aan die outOfBoundsException kom en hoe ik die wegkrijg? Of is heel die manier om zo n blokje te genereren fout?

edit: heb t dus over dit stukje code:

Code:
protected void initsnakeVeld() 
    {
        x = breedte/2;
        y = hoogte/2;
        
        c = (int)(Math.random()*20); 
        d = (int)(Math.random()*20);
        eetbaarBlokje = new boolean[c][d];
        
        snakeVeld = new boolean[breedte][hoogte];    
        for (int i=0; i<breedte; i++) 
        {
           for (int j=0; j<hoogte; j++) 
           {
                snakeVeld[i][j] = true;
                eetbaarBlokje[c][d] = true;
           }   
        }
    }

edit2 :

ik heb eetbaarBlokje[][], maar dit zou dan een array (protected boolean eetbaarBlokje[][]; ) zijn, terwijl ik eigenlijk de coordinaten van t blokje moet hebben. Ik moet 1 eenheidje van de array snakeVeld true maken ofzo, terwijl ik nu eigenlijk een array maak. Of klopt dit niet?

killgore

Legacy Member
Timmos zei:
while(true) associeer ik onmiddelijk met if (true), iets overbodig dus. Ook al zal de compiler zowel while(true) en for(;; ) omzetten naar dezelfde code, ik vind dat er vreemd uitzien omdat ge dan ook moogt schrijven if(true). De compiler zal die if dan ook weghalen he.

for(;; ) is er speciaal voor gemaakt ook :) En vanaf ge de betekenis hiervan kent, zal dat 'de leesbaarheid' toch niet naar beneden halen?

Gij maakt wel zeer rare associaties ze :/. if(true) is overbodige & slechte code. While(true) is dit zeker niet.

for(;; ) is daar zeker niet speciaal voor gemaakt, dat is gewoon een expressie zoals een andere :x.

Timmos

Legacy Member
killgore zei:
for(;; ) is daar zeker niet speciaal voor gemaakt, dat is gewoon een expressie zoals een andere :x.
Ge kunt for(;; ) toch niet gebruiken voor andere zaken dan oneindige lussen? Dus dat is geen expressie gelijk een andere, het is een controlestructuur, speciaal gemaakt voor oneindige lussen.

Ik heb het gewoon over het feit dat nergens 'true' of 'false' moet gebruikt worden in de voorwaarden van controlestructuren zoals er zijn: if, while en for.

Dus zoals ge nooit if (true) zult schrijven, ook while(true) niet. Ik weet wel dat while(true) u natuurlijk een oneindige lus bezorgt, maar om dus geen letterlijke booleaanse waarde te schrijven, bestaat dus for(;; ).

Enfin, snapt ge wat ik bedoel? Ik probeer een gezonde discussie te houden eh, ik versta wel dat while(true) dus ergens wel 'juist' is, maar persoonlijk vind ik het beter dat er nergens expliciet 'true' of 'false' staat in een booleaanse uitdrukking :)

Die associatie is trouwens niet zomaar een associatie. Een while lus is niets meer dan een stuk code dat vroeger moest geschreven worden:

Code:
10 %dit is regel 10
if (voorwaarde)
statement1
[statement2 .. [statementn]]
goto 10
end if
Bekijk dit stukje eens. Dit is een lus, maar met een if in die bepaalt of ge terug gaat in uw 'lus' of niet (terugspringen naar dezelfde code of niet).

Dus wat ik zo 'vuil' vind aan 'while(true)' is het feit dat er een if(true) impliciet achter zit verwerkt. De gecompileerde code zal juist hetzelfde zijn als for(;; ), en zal ook niet testen op if(true), maar toch, dit is de gedachtengang erachter. Dus geen 'true' of 'false' zetten in condities, lijkt mij.

MilM

Legacy Member
Timmos zei:
Ge kunt for(;; ) toch niet gebruiken voor andere zaken dan oneindige lussen? Dus dat is geen expressie gelijk een andere, het is een controlestructuur, speciaal gemaakt voor oneindige lussen.
Das nie waar
For-lus is gemaakt om een veel voorkomend iets korter te schrijven.
Men heeft er voor gekozen om de drie in te vullen zaken optioneel te maken en het middelste als "true" te bezien indien niets ingevuld.
Maar dat geeft dus wel degelijk "true" terug (ze staat er gewoon niet)

Dus zoals ge nooit if (true) zult schrijven, ook while(true) niet. Ik weet wel dat while(true) u natuurlijk een oneindige lus bezorgt, maar om dus geen letterlijke booleaanse waarde te schrijven, bestaat dus for(;; ).
Je geeft het zelf aan.
if(true) heeft geen nut, while(true) wel

for( ; ; ) is identiek hetzelfde als for(;true; ) en dus als while(true)

Doordat die "true" er staat, is het juist duidelijk dat het om een oneindige lus gaat.

Enfin, snapt ge wat ik bedoel? Ik probeer een gezonde discussie te houden eh, ik versta wel dat while(true) dus ergens wel 'juist' is, maar persoonlijk vind ik het beter dat er nergens expliciet 'true' of 'false' staat in een booleaanse uitdrukking :)

Zoals killgore aangaf, dat wordt allemaal wel degelijk naar dezelfde code omgezet bij uitvoering.
Dus het gaat vooral om de leesbaarheid.

Zelf kom ik bijna nooit for(;; ) tegen en persoonlijk vind ik while(true) ook veel duidelijk.
Als ik for(;; ) zou tegenkomen, zou mij dat diretc opvallen omdat het zo ongewoon overkomt.

Nu, veel discussie voor iets zeer kleins in feite :p
Zoals hydra al in andere topic aangaf, het is niet alsof iemand die kan programmeren niet zal verstaan wat er bedoeld wordt.

EDIT op uw edit:
Timmos zei:
Dus wat ik zo 'vuil' vind aan 'while(true)' is het feit dat er een if(true) impliciet achter zit verwerkt. De gecompileerde code zal juist hetzelfde zijn als for(;; ), en zal ook niet testen op if(true), maar toch, dit is de gedachtengang erachter. Dus geen 'true' of 'false' zetten in condities, lijkt mij.
Das dan ook de bedoeling van java.
De code meer leesbaar en bruikbaar maken voor de mens.
Weten dat de achterliggende code hetzelfde is, volstaat al.
Dan kies je gewoon voor hetgene dat het duidelijkst overkom.

Maar kom, tis een discussie zonder einde over persoonlijke voorkeuren/gewoontes.

Timmos

Legacy Member
Zal ik dan nog één opmerking hierover geven.

Wat schrijf jij?

1.
Code:
if (uitdrukking) return true;
else return false;
2.
Code:
 return uitdrukking;

Ik neem het tweede. Maar toch is het eerste veel leesbaarder, want bij het tweede kunt ge niet direct zien welk (primitief) object geretourneerd wordt (hier dus een booleaanse waarde).
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