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.

MilM

Legacy Member
Nu vraagt ge mij iets :)

Ik zou eens in mijn code moeten opzoeken wat ik onbewust schrijf in dit geval :p

killgore

Legacy Member
altijd het 2e, maar zoals ik zei is dit totaal iets anders als die while. Die while is niet overbodig, die if-structuur wel.

if(true) en while(true) zijn 2 totaal verscheidene zaken :x.

edit: en gaat gij true(while) voor iets anders gebruiken als oneindige lussen :rofl:?

edit: achter for(;; ) zit ook impliciet if(true) verwerkt trouwens :/.

en edit 3: why the hell zijn die booleaanse constante denkte in de programmeertaal in gebracht? Om niet gebruikt te worden :/?

gamer1

Legacy Member
Ik vind t fijn te zien da gelle daar zo in kunt opgaan, maar ken der zelf toch niet genoeg van om voor de een of de ander keuze te gaan. Ma zou er iemand op mn vorige post kunnen antwoorden aub? Zit namelijk nog altijd vast me da stom eetbaarBlokske.

Timmos

Legacy Member
gamer1 zei:
Ik vind t fijn te zien da gelle daar zo in kunt opgaan, maar ken der zelf toch niet genoeg van om voor de een of de ander keuze te gaan. Ma zou er iemand op mn vorige post kunnen antwoorden aub? Zit namelijk nog altijd vast me da stom eetbaarBlokske.
Sorry :p

Ik zie dat ge Math.random() gebruikt, nu weet ik niet wat de grenzen daar van zijn. Ik gebruik altijd java.util.Random. Ik zie dat ge moet casten naar int, wat er op wijst dat dit toch niet zo'n goede methode is. Dit genereert dus decimale getallen tussen 0 en 1 wellicht?

Uw fout is dan dat wanneer uw randomgenerator een 1 produceert, dat ge 20 krijgt, en dat is geen geldige index, dus wordt er een IndexOutOfBoundsException opgesmeten.

Ik zou het zo doen (met java.util.Random):
Code:
Random rg = new Random();
int x = rg.nextInt(uw_grens_getal_volgens_x_richting);
int y = rg.nextInt(uw_grens_getal_volgens_y_richting);
// doe iets met tabel[x][y]

rg.nextInt(int getal) genereert een random getal in het halfgesloten interval [0, getal[. Dus als ge 20 invult zal uw maximum 19 zijn. Normaal gezien zult ge dus geen last hebben van een IndexOutOfBoundsException.

gamer1

Legacy Member
En hoe krijg ik da ding wijsgemaakt da die een blokje moet plaatsen met die x en y coordinaten? Is da gewoon in de view class een rechthoekje painten met die coordinaten? Want zoals ik da in een van mn vorige posten gedaan heb genereer ik een array, ma das nie goed e, moet echt ma 1 blokske hebben. Voor da speciaal blokske is da dan gewoon t zelfde, alleen moet da pas na 5 keer een gewoon blokske nemen komen. Ask da heb ben ik dus al een stuk verder.

Timmos

Legacy Member
Die x en y stellen de coördinaten voor in uw array, waar da blokske staat. Uw view moet dan gewoon die x en y opvragen en daarmee een berekeningske doen om da op de juiste plaats te tekenen. Stel dat in uw view de dimensie van een kotteke 20 bij 20 pixels is, dan moet ge uw blokske dus tekenen met het statement
Code:
g.drawRect(20*x, 20*y, 20, 20);
in de veronderstelling dat uw rooster tegen de randen van uw vensterke plakt (anders een constante toevoegen). Inderdaad, stel dat uw x en y beide nul zijn, dan hebt ge een vierkantje van 20x20 getekend in uw linkerbovenhoek. Is uw x en y 19, dan staat het in het rechts onderaan uw speelveld.

Voor da speciaal blokske moet ge ne teller bijhouden e, is die 5 dan weet uw view dus: "haha, nu heb ik een speciaal broksken vlees". Uw teller wordt dan weer 1 na het verorberen van deze lekkernij. Uw view zal dan weten dat er nu geen specialiteit op het menu staat dus moet hij een gewoon blokske tekenen. Iedere keer dat ge iets eet (speciaal of niet) moet die teller verhoogd worden.

Ge kunt dan best eigenlijk van 0 t.e.m. 4 laten tellen, uw teller wordt dan iedere keer ingesteld met
Code:
teller %= 5;
dan hoeft ge niet nodeloos if-else te gebruiken. Bij 4 hebt ge dan een lekkernij.

gamer1

Legacy Member
Heb nu in mn SnakeModel class het volgende gezet:
Code:
protected void initsnakeVeld() 
    {
        x = breedte/2;
        y = hoogte/2;
        
        Random rg = new Random();
        BolX = rg.nextInt(20);
        BolY = rg.nextInt(20); 
         ...

In mn SnakeView class heb ik dan dit:
Code:
    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);
              }    
            }
            
            int c = model.BolX;
            int d = model.BolY;
            g.drawRect(20*c, 20*d, 20, 20);
            g.setColor(Color.BLACK);
        }

Als ik nu compile krijg ik geen errors, en kan t ook opstarten, maar zie geen blokje verschijnen.

edit:
probleem opgelost. Heb die drawrect vervangen door filloval en nu zie ik t wel

gamer1

Legacy Member
Bolleke genereren is gelukt, ook het verplaatsen van t bolleke is gedaan. Da speciaal bonus bolleke doe ik pas als ik echt tijd teveel zou hebbe.
Nu zit nog met een probleempje om die slang te verlengen. Moet ik dan voor die slang een array maken van x'en en y'en ipv zo 1 x en y gelijk nu t geval is? Dan ook een teller toevoegen om t aantal gepakte bollekes te tellen en de slang zolang te maken als de teller aangeeft?
Hoe moet ik da dan klaarkrijgen of zijn er eenvoudigere methodes voor (array's zijn niet echt mn favoriet)?

Zal ff mn model, animator en view posten:
model:
Code:
import java.util.Random;
/**

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 int bolX, bolY;
    
    // classe constanten
    static final int NOORD = 0;
    static final int OOST = 1;
    static final int ZUID = 2;
    static final int WEST = 3;
    
    public SnakeModel()
    {
        // initialise instance variables
        breedte = hoogte = 20;
        x = breedte/2;
        y = hoogte/2;
        
        initSnakeVeld();
    }   
    
    protected void initSnakeVeld() 
    {
        // genereert de bolcoordinaten
        Random rg = new Random();
        bolX = rg.nextInt(20);           // genereert een getal in het halfopen 
        bolY = rg.nextInt(20);           // interval [0,20[ dus van 0 t.e.m. 19
        
        snakeVeld = new boolean[breedte][hoogte];    
        for (int i=0; i<breedte; i++) 
        {
           for (int j=0; j<hoogte; j++) 
           {
                snakeVeld[i][j] = true;
           }   
        }
    }
    
    public int getX()
    {
        return x;
    }

    public int getY()
    {
        return y;
    }
    
    public int getBolX()
    {
        return bolX;
    }   
    
    public int getBolY()
    {
        return bolY;
    }   
    
    public void vergelijkCoord(int x, int y, int bolX, int bolY)
    {   
        if (getX() == getBolX() && getY() == getBolY())
        {
            initSnakeVeld();
        }   
    }     
    public void move()   
    {                       
       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;
       }
    }

    public void rechts()
    {
        // put your code here
        if (isVrij(OOST))
        dx = 1;
        dy = 0;
    }
    
    public void links()
    {
        // put your code here
        if (isVrij(WEST))
        dx = -1;
        dy = 0;
    }
    
    public void boven()
    {
        if (isVrij(NOORD))
        dx = 0;
        dy = -1;
    }
    
    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;
    }
}

view:
Code:
import java.awt.*;

public class SnakeView extends Canvas
{
    protected SnakeModel model;
    protected Image buffer;

    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);
              }    
            }
        }
        
        // nu de slang
        int x = model.getX()*b+10;
        int y = model.getY()*h+10;

        g.setColor(Color.RED);   
        g.fillOval(x-10, y-10, 20, 20);
        
        // en tenslotte de eetbare bol
        int c = model.getBolX();
        int d = model.getBolY();
            
        g.setColor(Color.BLACK);
        g.fillOval(b*c+5, h*d+5, b/2, h/2);
}
    
    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;
    }
}

animator:
Code:
public class SnakeAnimator implements Runnable
{
    // instance variables - replace the example below with your own
    protected SnakeModel model;
    protected SnakeView view;
    public int x, y, bolX, bolY;
    
    /**
     * 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) 
       {
         model.move();
         model.vergelijkCoord(x, y, bolX, bolY);
         view.repaint();
         try 
         {
           Thread.sleep(150);
         }
         catch (InterruptedException e) 
         {
             // slaap is voorbij
             // terug aan het werk!
         }           
       }
    }
  
}

gamer1

Legacy Member
Hoe kan ik eigenlijk hier zo n array maken van bollen en de i-de bol de coordinaten geven van i-1-de bol? Dan zou t probleem toch opgelost moeten zijn. Of overzie ik hier iets?

gamer1

Legacy Member
Is het mogelijk om een int [] te vergelijken met een (gewone) int? Kan dan mn array laten lopen en de coordinaten van de kop vergelijken met die van de eetbare bol, maar als ik da gewoon doe gaat da nie (omda ene int [] is en de andere int) Zou dus de waarde ofzo uit die int[] moeten kunnen halen.

gamer1

Legacy Member
Ik heb ondertussen een lopende array. De slang wordt verlegd als ik een bolleke pak, maar de kop van de slang en t 2e bolleke is nog iets mis mee, die coordinaten komen niet goed uit. Heeft er iemand een idee waar da aan kan liggen en hoe het dan moet zijn?

SnakeModel:
Code:
import java.util.Random;
public class SnakeModel
{
    // instance variables - replace the example below with your own
    protected boolean snakeVeld[][];
    protected int x, y, dx, dy;
    protected int breedte, hoogte;
    protected int bolX, bolY;
    protected int teller;
    protected int einde;
    int [] slangX = new int[400];
    int [] slangY = new int[400];
    
    // 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;
        slangX[0] = breedte/2;                  
        slangY[0] = hoogte/2;                           
        teller = 1;
        einde = 0;
        initSnakeVeld();
    }   
    
    /**
     * Initialiseer het snakeVeld 
     */
    protected void initSnakeVeld() 
    {
        // genereert de bolcoordinaten
        Random rg = new Random();
        bolX = rg.nextInt(breedte);         
        bolY = rg.nextInt(hoogte);
        
        snakeVeld = new boolean[breedte][hoogte];    
        for (int i=0; i<breedte; i++) 
        {
           for (int j=0; j<hoogte; j++) 
           {
                snakeVeld[i][j] = true;
           }   
        }  
    }
    
    /**
     * Bepaalt de coördinaten van de slang
     * 
     */
    public void snakePositie () 
    {           
        for (int m=0; m < einde; m++) 
        {
            slangX[einde-m] = slangX[einde-(m+1)];
            slangY[einde-m] = slangY[einde-(m+1)];
        }
        if (einde < (teller * 4 + 4))
            einde++;

        //slangX[0] = x;
        //slangY[0] = y;
    }
    /**
     * Geeft de horizontale coördinaat van de slang
     * 
     * @return     x-coordinaat
     */
    public int getX()
    {
        return slangX[0];
    }

    /**
     * Geeft de verticale coördinaat van de slang
     * 
     * @return     y-coordinaat
     */
    public int getY()
    {
        return slangY[0];
    }
    
    /**
     * Geeft de horizontale coördinaat van het eetbaar bolletje
     * 
     * @return     x-coordinaat
     */
    public int getBolX()
    {
        return bolX;
    }   
    
    /**
     * Geeft de verticale coördinaat van het eetbaar bolletje
     * 
     * @return     y-coordinaat
     */
    public int getBolY()
    {
        return bolY;
    }   
    
    public void vergelijkCoord(int x, int y, int bolX, int bolY)
    {   
        if (getX() == getBolX() && getY() == getBolY())
        {
            initSnakeVeld();
            teller++;
        }   
    }     
    public void move()     
    {                       
       slangX[0] = slangX[0] + dx;
       slangY[0] = slangY[0] + dy;
       if (slangX[0] > breedte-1)
       {
           slangX[0] = 1;
       }
       if (slangX[0] < 0)
       {
           x = breedte-1;
       }
       if (slangY[0] > hoogte-1)
       {
           slangY[0] = 0;
       }
       if (slangY[0] < 0)
       {
           slangY[0] = 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) 
    {
        return true;                                
        /*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;
        */
    }
}

klienks

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

Ge moet uw huiswerk zelf maken hé ;)

gamer1 zei:
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.

Ik denk het ook. Denk dat ik zelfs de docent van deze heerschappen ben
:naughty:

Alhoewel echt naughty is het niet als je het doet zoals gamer1: die maakt iets, vraagt wat hulp en leert er van bij.

Maar als je plots een programma in de schoot geworpen wordt en je gebruikt dat verder zonder dat je er iets van begrijpt, dan kan ik daar véél minder gelukkig mee zijn! :sad:

Enfin: voor de rest ga ik hier niet op ingaan: studenten mogen me altijd mailen, maar ik wil gewoon even meegeven dat ook docenten kunnen googlen :p

Timmos

Legacy Member
klienks zei:
Ik denk het ook. Denk dat ik zelfs de docent van deze heerschappen ben
...
Enfin: voor de rest ga ik hier niet op ingaan: studenten mogen me altijd mailen, maar ik wil gewoon even meegeven dat ook docenten kunnen googlen :p
Speciaal geregistreerd om ffkes een zegske te doen tegen uw leerling of wa :lol:

killgore

Legacy Member
Hilarisch :p

Hoewel ik moet zeggen dat gamer1 in mijn ogen niets heeft misdaan, hij heeft enkel hulp gevraagd op een forum om zijn programma beter te maken, commentaar te geven, .... Komt uiteindleijk op hetzelfde neer als uren zitten googlen naar vben.

En hij heeft nog een interessante discussie van for(;; ) vs. while(true) meegekregen ook :ironic:.

Ice

Legacy Member
ik lig hier wel strijk als klienks echt den docent is.

en ja, gamer1 heeft niets misdaan, maar echt veel moeite om zelf dingen op te zoeken heeft hem percies ook niet gedaan hé. Als er nu 1 ding is wat ge later juist wel veel gaat moeten, dan is het toch wel dat.

klienks

Legacy Member
Jaja: ik ben écht de docent, maar helemaal niet kwaad hoor.

Zoals ik al zei:

klienks zei:
Alhoewel echt naughty is het niet als je het doet zoals gamer1: die maakt iets, vraagt wat hulp en leert er van bij.

Ik vind dus dat gamer1 niks fout doet, maar via google vond ik een post van een andere student die wél gewoon in oplossing in de schoot geworpen kreeg (van iemand die tijd te veel had -- alhoewel is dat niet iedereen op dit forum --) en die nog ook gebruikt ook.

Zoiets vind ik er wel over. Ik heb die student dan ook persoonlijk gemaild, maar tegelijk vond ik dat forumtopic alleen nog terug op google en niet meer op telenet-live. Kon daar dus niet replyen, en heb me dus maar even geregistreerd om hier een (klein) woordje te zeggen.

En idd die discussie van while(true) versus for(;; ) vond ik ook wel de max :p

Timmos

Legacy Member
Ha lol die student die die oplossing in zijn schoot geworpen kreeg :lol:

:unsure:

kzal het nooit meer doen :$

Die thread is inderdaad verwijderd precies.

dJeez

Legacy Member
klienks zei:
Maar als je plots een programma in de schoot geworpen wordt en je gebruikt dat verder zonder dat je er iets van begrijpt, dan kan ik daar véél minder gelukkig mee zijn!
Eigenlijk zou iemand voor de grap eens een verkeerde oplossing moeten voorstellen (of een zeer absurde). Misschien valt het dan ook wel op :p.

Maar wat mij steeds verwondert is dat stagiairs blijkbaar niet weten hoe ze zoekmachines moeten gebruiken. Mij lijkt dat als autodidact nogal vanzelfsprekend, maar schijnbaar moet je bij een groot deel van de studenten tegenwoordig alles op een gouden dienblaadje aanbieden... Misschien is een cursus "Hoe zoek ik iets op op het Internet" geen slecht idee - voorzover dat nog niet aan bod zou komen uiteraard. Nu, sowieso lijkt het mij ook geen slecht idee van wat sites te vermelden waar nuttige info te rapen valt.

@Timmos:
Google cache bestaat ook nog hé - de eerste pagina van de thread is daar nog steeds zichtbaar :p.
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