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
.
Er zit redelijk wat commentaar bij, dus normaal wijst hetgeen ik al heb zichzelf wel uit.
Veel succes
Greetz,
Wout
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
.Er zit redelijk wat commentaar bij, dus normaal wijst hetgeen ik al heb zichzelf wel uit.
Veel succes

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) {}
}
}
}


.