Archief - [PROG][JAVA] Tetris (WIP)

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.

Wover

Legacy Member
Hoi,

voor school hebben we een vrije opdracht gekregen in Java Swing, en ik wou Tetris maken, maar ben er niet mee klaargeraakt.

De (gedeeltelijke) opdracht is ingeleverd, maar ik zat dus met enkele probleempjes.

Ik zet hier de code voor mensen die een uitdaging willen en de code verder willen afmaken :p.

Er zit redelijk wat commentaar bij, dus normaal wijst hetgeen ik al heb zichzelf wel uit.

Veel succes :p

Greetz,

Wout

Code:
package tetrimadness;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

//Verlinden Wout :: Java 2; Vrije opdracht
//::::::::::::::::::::::::::
//....:::TETRIMADNESS:::....
//::::::::::::::::::::::::::

//De bedoeling was om een gewone Tetris te programmeren, maar helaas is dat niet gelukt
//Ik heb vooral problemen met het animeren en het implementeren van blokjes met meer dan één y-co
//Normaalgezien moet het meeste dat we in de lessen gezien hebben er wel inzitten, behalve
//filedialogs en een menu.
//De opdracht was om iets vrij te programmeren waar minstens 4,5u werk inzat, en hier ben 
//ik gemakkelijk het driedubbele aan bezig geweest, dus ik hoop dat het niet zo erg is
//dat het uiteindelijk niet werkt.
//
//Normaalgezien staat overal voldoende commentaar bij. Moest u toch nog vragen hebben
//kan u mij mailen op [email protected]
//
//Dit project is aangemaakt met NetBeans 6.0.1, het zou kunnen dat in vorige versies gevraagd wordt
//voor een bepaalde library van JUtils. Het volstaat om deze zelf aan te maken en te laten verwijzen
//naar de oude jutils library. De foutmelding wijst zichzelf uit normaalgezien.


public class TetriMadness extends JFrame
{
    JLabel lblTitel;
    JButton btnStarten;
    boolean start = false;
    SpeelVeld speelVeld;
    
    int toets;
    
    public static void main(String[] args) 
    {
           new TetriMadness();
    }
    
    public TetriMadness() 
    {
        Container c = getContentPane();
        
        lblTitel = new JLabel("TetriMadness");
        lblTitel.setFont(new Font("Verdana",Font.BOLD+Font.ITALIC,20));
        
        btnStarten = new JButton("Start/Stop het spel");
        btnStarten.addActionListener(new KnopHandler());
        btnStarten.setFocusable(false);
        
        speelVeld = new SpeelVeld();
        
        c.add(lblTitel,BorderLayout.NORTH);
        c.add(speelVeld, BorderLayout.CENTER);
        c.add(btnStarten, BorderLayout.SOUTH);
              
        addKeyListener(new KeybHandler());
        requestFocus();
        
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        
        setSize(300,600);
        setTitle("TetriMadness :: Wout Verlinden");
        setVisible(true);
    }
    
    class KnopHandler implements ActionListener 
    {
        public void actionPerformed(ActionEvent e) 
        {
            if(start==true)
            {
                speelVeld.setStartStop(false);
                speelVeld.repaint();
            }
            else
            {
                speelVeld.setStartStop(true);
                speelVeld.repaint();
            }
        }
    }
    
    class KeybHandler extends KeyAdapter
    {
        public void keyPressed(KeyEvent e)
        {
            toets = e.getKeyCode();
            
            switch(toets)
            {
                case KeyEvent.VK_DOWN:
                    speelVeld.moveDown();
                break;
                case KeyEvent.VK_LEFT:
                    speelVeld.moveLeft();
                break;
                case KeyEvent.VK_RIGHT:
                    speelVeld.moveRight();
                break;
            }
            repaint();
        }
    }
}

class SpeelVeld extends JPanel
{    
    private boolean start;
    private Color[][] arrSpeelVeld;
    private Blokje blokje = new Blokje(0);
    
    public SpeelVeld()
    {
        //De array van het speelveld bevat enkel grijze blokjes
        arrSpeelVeld = new Color[10][18];
        for(int i=0;i<10;i++)
        {
            for(int j=0;j<18;j++)
            {
                arrSpeelVeld[i][j] = Color.GRAY;
            }
        }    
    }

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        //Speelveld = 250pix * 450pix = 10 * 18 vakjes
        g.drawRect(15,25,250,450);
        if(start==true)
            if(!blokje.bezig())
            {
                //Verwijder volledige lijnen
                blokje.rmLijnen();
                //Genereer een nieuw random blokje
                blokje = new Blokje((int)(5*Math.random())+1);
                blokje.setBezig(true);
            }
            animeer();
            for(int i=0;i<10;i++)
            {
                for(int j=0;j<18;j++)
                {
                    g.setColor(arrSpeelVeld[i][j]);
                    g.fillRect(15+(i*25), 25+(j*25), 25, 25);
                    g.setColor(Color.BLACK);
                    g.drawRect(15+(i*25), 25+(j*25), 25, 25);
                }
            }
        }
        
        public void animeer()
        {
            //while(blokje.bezig)
            //{
                //Animeren lijkt niet te werken, er wordt niet gerepaint
                //Bij het gebruik van de pijltjes werkt het wel
                //blokje.wait(200); 
                //blokje.moveDown();
            //}
        }
    
    public void setStartStop(boolean start)
    {
        this.start = start;        
    }
    
    public void moveDown()
    {
        blokje.moveDown();
    }
    
    public void moveLeft()
    {
        blokje.moveLeft();
    }
    
    public void moveRight()
    {
        blokje.moveRight();
    }
    
 //Interne klasse "Blokje"   
  
    class Blokje extends Thread
    {
        int vorm;
        int [] xPos, yPos;
        boolean bezig = false;
        
        public Blokje(int vorm)
        {
            this.vorm = vorm;
            switch(vorm)
            {
                case 1:
                    arrSpeelVeld[5][0] = Color.GREEN;
                    xPos = new int[] { 5 };
                    yPos = new int[] { 0 };
                break;                  
                case 2:
                    arrSpeelVeld[4][0] = Color.BLUE;
                    arrSpeelVeld[5][0] = Color.BLUE;
                    xPos = new int[] { 4, 5 };
                    yPos = new int[] { 0 };
                break;               
                case 3:
                    arrSpeelVeld[3][0] = Color.YELLOW;
                    arrSpeelVeld[4][0] = Color.YELLOW;
                    arrSpeelVeld[5][0] = Color.YELLOW;
                    xPos = new int[] { 3, 4, 5 };
                    yPos = new int[] { 0 };
                break;
                case 4:
                    arrSpeelVeld[3][0] = Color.RED;
                    arrSpeelVeld[4][0] = Color.RED;
                    arrSpeelVeld[5][0] = Color.RED;
                    arrSpeelVeld[6][0] = Color.RED; 
                    xPos = new int[] { 3, 4, 5, 6 };
                    yPos = new int[] { 0 };
                case 5:
                    arrSpeelVeld[2][0] = Color.BLACK;
                    arrSpeelVeld[3][0] = Color.BLACK;
                    arrSpeelVeld[4][0] = Color.BLACK;
                    arrSpeelVeld[5][0] = Color.BLACK; 
                    arrSpeelVeld[6][0] = Color.BLACK;
                    xPos = new int[] { 2, 3, 4, 5, 6 };
                    yPos = new int[] { 0 };
                break;
            }   
        }
        
        public void rmLijnen()
        {
            int som = 0;
            
            for(int j=0;j<18;j++)
            {
                for(int i=0;i<10;i++)
                {
                    if(!arrSpeelVeld[i][j].equals(Color.GRAY))
                    {
                        som++;
                    }
                }
                if(som==10)
                {
                    for(int k=j;k>0;k--)
                    {
                        for(int i=0;i<10;i++)
                        {
                            if(k == j)
                            {
                                arrSpeelVeld[i][k] = Color.GRAY;
                            }
                            arrSpeelVeld[i][k] = arrSpeelVeld[i][k-1]; 
                            arrSpeelVeld[i][k-1] = Color.GRAY;
                        }
                    }
                    wait(100);              
                }
                som = 0;
            }          
        }
        
        public void setBezig(boolean status)
        {
            bezig = status;
        }
        
        boolean bezig()
        {
            return bezig;
        }
        
        public void moveDown()
        {
            if(yPos[yPos.length-1] < 17)
            {
                //Check of het blokje een vakje naar beneden schuiven een botsing veroorzaakt
                for(int i=0;i<xPos.length;i++)
                {
                    for(int j=yPos.length-1;j>=0;j--)
                    {
                        if(!arrSpeelVeld[xPos[i]][yPos[j]+1].equals(Color.GRAY))
                        {
                            bezig = false;
                        }
                    }
                }
                
                //PROBLEEM: wanneer een blokje meer dan één lijn in beslag neemt:
                //  --> bezig zal op false komen omdat de onderste lijn niet fysiek verschoven is
                //  --> De functie hieronder in dezelfde for loop zetten kan ook niet, want dan
                //      zouden er al blokjes naar beneden vallen wanneer nog geen botsing vastgesteld is.
                //OPLOSSING: geen gevonden
            
                if(bezig)
                {
                    for(int i=0;i<xPos.length;i++)
                    {
                        for(int j=yPos.length-1;j>=0;j--)
                        {
                            arrSpeelVeld[xPos[i]][yPos[j]+1] = arrSpeelVeld[xPos[i]][yPos[j]];
                            arrSpeelVeld[xPos[i]][yPos[j]] = Color.GRAY;
                        }
                }
                    for(int j=yPos.length-1;j>=0;j--)
                    {
                        yPos[j]++;
                    }
                }    
            }
            else
            {
                bezig = false;
            }
        }
        
        public void moveLeft()
        {
            if(xPos[0] > 0)
            {
                for(int i=0;i<xPos.length;i++)
                {
                    for(int j=yPos.length-1;j>=0;j--)
                    {
                        if(arrSpeelVeld[xPos[i]-1][yPos[j]].equals(Color.GRAY))
                        {
                            arrSpeelVeld[xPos[i]-1][yPos[j]] = arrSpeelVeld[xPos[i]][yPos[j]];
                            arrSpeelVeld[xPos[i]][yPos[j]] = Color.GRAY;
                        }
                    }
                }
               
                for(int i=0;i<xPos.length;i++)
                {
                    xPos[i]--;
                }            
            }
        }
        
        public void moveRight()
        {
            if(xPos[xPos.length-1] < 9)
            {
                for(int i=xPos.length-1;i>=0;i--)
                {
                    for(int j=yPos.length-1;j>=0;j--)
                    {
                        if(arrSpeelVeld[xPos[i]+1][yPos[j]].equals(Color.GRAY))
                        {
                            arrSpeelVeld[xPos[i]+1][yPos[j]] = arrSpeelVeld[xPos[i]][yPos[j]];
                            arrSpeelVeld[xPos[i]][yPos[j]] = Color.GRAY;
                        }
                    }
                }
               
                for(int i=xPos.length-1;i>=0;i--)
                {
                    xPos[i]++;
                }            
            }               
        }
        
        public void wait(int ms)
        {
            try
            {
            Thread.sleep(ms);
            }
            catch( InterruptedException e) {}
        }
    }
}

TiZon

Legacy Member
eigenlijk moet je juist nog een ander soort blokken hebben en ze automatisch laten vallen...

ah, en ook nog om de boel te draaien :)

Mooi :)

Ik heb het eens Together gegooid, maar ik zou meer gebruik maken van Objecten...
Nu is het eigenlijk maar 1 klasse, met daar nog een JPanel aan...

Wover

Legacy Member
Goh ja, ik programmeer zoals we op school hebben geleerd natuurlijk, toen ik op IRC eens een vraag stelden zeiden ze ook meteen dat het niet goed was om JPanel te nemen.

Maar wat bedoel je met meer objecten gebruiken?

Experimenteer gerust hoor, ik dacht dat de algoritmes ook voor blokjes met meer dan één y-coördinaat zouden moeten werken, maar dat bleek helaas niet het geval. Er is in ieder geval niet al te veel werk meer aan (max 4 uurtjes ofzo).

Maar ik ben het wel ff beu :p. Vorige week website gemaakt in php, maandag test van VHDL en dan sinds toen tot vandaag bezig geweest met dit progje... En tzijn bijna examens (volgende week :p), dus kzou daar ook eens moeten aan beginnen :p.

TiZon

Legacy Member
Ik zou bijvoorbeeld mijn blokje al een object maken...

En dan kan je een nieuw blokje makkelijker aanmaken :)
Ik zit nu volop bezig met mijn Java-Project, maar daarna bekijk ik het eens ;)

Wover

Legacy Member
Wat is dan het verschil tussen een klasse en een object?

Want mijn blokje is toch een subklasse van het speelveld. In het speelveld zeg ik ook if blokje.bezig = false; new blokje;...

SharkyXTS

Legacy Member
Een Object is een instantie van een Klasse. Een klasse kan je vergelijken met een bouwplan om één of meerdere objecten uit te maken.

En "blokje" een subklasse van "speelveld" lijkt mij op het eerste zicht onlogisch. Een "blokje" is geen "speelveld", maar een "speelveld" bestaat uit "blokjes". Een one-to-many relatie lijkt me dan toch beter.

Bij momenten vraag ik mij toch af wat men eigenlijk wel nog leert op school :wtf:.

Bavo aka Joske

Legacy Member
Het is een inner-klasse om technisch correct te zijn, en dat valt nog te verdedigen als die objecten nergens anders gaan worden gebruikt.
Ik was al tevreden dat Blokje een Object was, in plaats van talloze arrays ofzo :)

Al snap ik uw threading wel niet helemaal.

TiZon

Legacy Member
@SharkyXTS, zo zie ik het ook :)
En dat na mijn eerste jaartje Java toch :)

ik heb er al een beetje mee bezig geweest, maar als ik blokjes maak die geen rechthoek zijn, zit ik met nog wat probs :)

Wover

Legacy Member
SharkyXTS zei:
Een Object is een instantie van een Klasse. Een klasse kan je vergelijken met een bouwplan om één of meerdere objecten uit te maken.

En "blokje" een subklasse van "speelveld" lijkt mij op het eerste zicht onlogisch. Een "blokje" is geen "speelveld", maar een "speelveld" bestaat uit "blokjes". Een one-to-many relatie lijkt me dan toch beter.

Bij momenten vraag ik mij toch af wat men eigenlijk wel nog leert op school :wtf:.

Dat vraag ik mij ook af ;). Java valt nog mee, maar websites ontwerpen doen we met dreamweaver en daar gebruiken we bijna uitsluitend wizardjes.

Of dan moeten we client side een tekstvak controleren, wat in feite een simpel javascriptje kan zijn, maar nee, dan moet dat met Spry, wat 500 regels code is voor zo'n stom tekstfield :ironic:.

Ik ben echt teleurgesteld in deze richting (ICT), ik ben nu op zoek naar een master die ik hierachter nog kan doen en die van hoger niveau is...

Ik dacht al aan Master Informatica in Leuven, maar die vakken vind ik ook maar raar :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