Results 1 to 3 of 3
  1. #1
    Schnensch is offline New to Programming
    Join Date
    May 2014
    Location
    Germany
    Posts
    4
    Rep Power
    0

    Question Tetris Game Problem

    Hi, i postet a Topic about this yesterday. But know i have a new problem. For some reason when the Tetrominoes touch the bottom of the "Board" the top left block of the Tetromino stays. Maybe some one here can help me
    Btw. there are no Problems with the code itself. I managed to get rid them. I just dont get why some parts of the Tetrominoes just disapear and when you press space so that the peaces just go down fast they just stay where they are and also parts of it disapear (as you can see in the pic)

    Tetris Game  Problem-tetrisproblem.png

    Java Code:
    package tetris;
    
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyAdapter;
    import java.awt.event.KeyEvent;
    
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.Timer;
    
    import tetris.Shape.Tetrominoes;
    
    public class Board extends JPanel implements ActionListener {
    	
    	final int BoardWidth = 10;
    	final int BoardHeight = 22;
    	
    	Timer timer;
    	boolean isFallingFinished = false;
    	boolean isStarted = false;
    	boolean isPaused = false;
    	int numLinesRemoved = 0;
    	int curX = 0;
    	int curY = 0;
    	JLabel statusbar;
    	Shape curPiece;
    	Tetrominoes[] board;
    	
    	
    	public Board(Tetris parent) {
    		
    		setFocusable(true);
    		curPiece = new Shape();
    		timer = new Timer(400, this);
    		timer.start();
    		
    		statusbar = parent.getStatusbar();
    		board = new Tetrominoes[BoardWidth * BoardHeight];
    		addKeyListener(new TAdapter());
    		clearBoard();
    	}
    	
    	
    
    	public void actionPerformed(ActionEvent e) {
    		if (isFallingFinished) {
    			isFallingFinished = false;
    			newPiece();
    		} else {
    			oneLineDown();
    		}
    	}
    	
    	int squareWidth() {return (int) getSize().getWidth() / BoardWidth; }
    	int squareHeight() {return (int) getSize().getHeight() / BoardHeight; }
    	Tetrominoes shapeAt (int x, int y) {return board[(y * BoardWidth) + x]; }
    	
    	
    	public void start()
    	{
    		if (isPaused)
    			return;
    		
    		isStarted = true;
    		isFallingFinished = false;
    		numLinesRemoved = 0;
    		
    		newPiece();
    		timer.start();
    	}
    	
    	private void pause()
    	{
    		if (!isStarted)
    			return;
    		
    		isPaused = !isPaused;
    		if (isPaused) {
    			timer.stop();
    			statusbar.setText("paused");
    		} else {
    			timer.start();
    			statusbar.setText(String.valueOf(numLinesRemoved));
    		
    		}
    		repaint();
    	}
    	 public void paint(Graphics g)
    	 {
    		 super.paint(g);
    		 
    		 Dimension size = getSize();
    		 int boardTop = (int) size.getHeight() - BoardHeight * squareHeight();
    		 
    		 
    		 for (int i = 0; i < BoardHeight; ++i) {
    			 for (int j = 0; j < BoardWidth; ++j) {
    				 Tetrominoes shape = shapeAt(j, BoardHeight - i - 1);
    				 if (shape != Tetrominoes.NoShape)
    					 drawSquare(g, 0 + j * squareWidth(),
    				 		boardTop + i * squareHeight(), shape);
    							 
    			 }
    		 }
    		 
    		 if (curPiece.getShape() != Tetrominoes.NoShape) {
    			 for (int i = 0; i < 4; ++i) {
    				 int x = curX + curPiece.x(i);
    				 int y = curY - curPiece.y(i);
    				 drawSquare(g, 0 + x * squareWidth(),
    						 boardTop + (BoardHeight - y -1) * squareHeight(),
    						 curPiece.getShape());
    			 }
    		 }
    	 }
    	
    	private void oneLineDown()
    	{
    		if (!tryMove(curPiece, curX, curY - 1))
    			piecedropped();
    	}
    	
    	private void clearBoard()
    	{
    		for (int i = 0; i < BoardHeight * BoardWidth; ++i)
    			board[i] = Tetrominoes.NoShape;
    		
    	}
    	
    	private void piecedropped()
    	{
    		for (int i = 0; i < 4; ++i); {
    			int i = 0;
    			int x = curX + curPiece.x(i);
    			int y = curY - curPiece.y(i);
    			board[(y * BoardWidth) + x] = curPiece.getShape();
    		}
    		
    		removeFullLines();
    		
    		if (!isFallingFinished)
    			newPiece();
    	}
    	
    	private void newPiece()
    	{
    		curPiece.setRandomShape();
    		curX = BoardWidth / 2 + 1;
    		curY = BoardHeight - 1 + curPiece.minY();
    		
    		if (!tryMove(curPiece, curX, curY)) {
    			curPiece.setShape(Tetrominoes.NoShape);
    			timer.stop();
    			isStarted = false;
    			statusbar.setText("game over");
    			
    		}
    	}
    	
    	private boolean tryMove(Shape newPiece, int newX, int newY)
    	{
    		for (int i=0; i < 4; ++i) {
    			int x = newX + newPiece.x(i);
    			int y = newY - newPiece.y(i);
    			if (x < 0 || x >= BoardWidth || y < 0 || y >= BoardHeight)
    				return false;
    			if (shapeAt(x, y) != Tetrominoes.NoShape)
    				return false;
    		}
    		
    	    curPiece = newPiece;
    	    curX = newX;
    	    curY = newY;
    	    repaint();
    	    return true;
    	}
    	
    	private void removeFullLines()
    	{
    		int numFullLines = 0;
    		
    		for (int i = BoardHeight - 1; i >= 0; --i) {
    			boolean lineIsFull = true;
    			
    			for (int j=0; j < BoardWidth; ++j) {
    				if (shapeAt(j, i) == Tetrominoes.NoShape) {
    					lineIsFull = false; 
    					break;
    				}
    			}
    			
    			if (lineIsFull) {
    				++numFullLines;
    				for (int k = i; k < BoardHeight - 1; ++k) {
    					for (int j=0; j < BoardWidth; ++j)
    						board[(k * BoardWidth) + j] = shapeAt(j, k +1);
    				}
    			}
    		}
    	
    	if (numFullLines > 0) {
    		numLinesRemoved += numFullLines;
    		statusbar.setText(String.valueOf(numLinesRemoved));
    		isFallingFinished = true;
    		curPiece.setShape(Tetrominoes.NoShape);
    		repaint();
    	}
    	}
    	
    	private void drawSquare(Graphics g, int x, int y, Tetrominoes shape)
    	{
    		Color colors[] = { new Color(0, 0, 0), new Color(204, 102, 102),
    				new Color(102, 204, 102), new Color(102, 102, 204),
    				new Color(102, 204, 204), new Color(204, 102, 204),
    				new Color(102, 204, 204), new Color(218, 170, 0)
    		
    		};
    		
    		Color color = colors[shape.ordinal()];
    		
    		g.setColor(color);
    		g.fillRect(x + 1, y + 1, squareWidth() - 2, squareHeight() - 2);
    		
    		g.setColor(color.brighter());
    		g.drawLine(x +1, y + 1,  squareWidth() - 2,  squareHeight() - 2);
    		g.drawLine(x, y, x + squareWidth() - 1, y);
    		
    		g.setColor(color.darker());
    		g.drawLine(x + 1, y + squareHeight() - 1,
    				x + squareWidth() - 1, y + squareHeight() - 1);
    		g.drawLine(x + squareWidth() - 1, y + squareHeight() - 1,
    				x + squareWidth() - 1, y + 1);
    		
    		
    	}
    	
    	class TAdapter extends KeyAdapter {
    		public void keyPressed(KeyEvent e) {
    			
    			if (!isStarted || curPiece.getShape() == Tetrominoes.NoShape) {
    				return;
    			}
    			
    			int keycode = e.getKeyCode();
    			
    			if (keycode == 'p' || keycode == 'P') {
    				pause();
    				return;
    				
    			}
    			
    			if (isPaused)
    				return;
    			
    			switch (keycode) {
    			case KeyEvent.VK_LEFT:
    				tryMove(curPiece, curX - 1, curY);
    				break;
    			case KeyEvent.VK_RIGHT:
    				tryMove(curPiece, curX + 1, curY);
    				break;
    			case KeyEvent.VK_DOWN:
    				tryMove(curPiece.rotateRight(), curX, curY);
    				break;
    			case KeyEvent.VK_UP:
    				tryMove(curPiece.rotateLeft(), curX, curY);
    				break;
    			case KeyEvent.VK_SPACE:
    				piecedropped();
    				break;
    			case 'd':
    				oneLineDown();
    				break;
    			case 'D':
    				oneLineDown();
    				break;
    			}
    		}
    	}
    }
    PS: if you want to see the code of "Shape" and "Tetris" just let me know

  2. #2
    pj6444 is offline Senior Member
    Join Date
    Jan 2013
    Posts
    168
    Rep Power
    8

    Default Re: Tetris Game Problem

    Can you post the code for both the Tetris and Shape classes? That's probably where the underlying problem will be.

  3. #3
    Schnensch is offline New to Programming
    Join Date
    May 2014
    Location
    Germany
    Posts
    4
    Rep Power
    0

    Default Re: Tetris Game Problem

    Sure thing. Heres the Tetris class:

    Java Code:
    package tetris;
    
    import java.awt.BorderLayout;
    
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    
    public class Tetris extends JFrame {
    
    	JLabel statusbar;
    	
    	
    	public Tetris() {
    		
    		statusbar = new JLabel(" 0");
    		add(statusbar, BorderLayout.SOUTH);
    		Board board = new Board(this);
    		add(board);
    		board.start();
    		
    		setSize(200, 400);
    		setTitle("Tetris");
    		setDefaultCloseOperation(EXIT_ON_CLOSE);
    		
    	}
    	
    	public JLabel getStatusbar() {
    		return statusbar;
    		
    	}
    	
    	public static void main(String[] args) {
    		
    		Tetris game = new Tetris();
    		game.setLocationRelativeTo(null);
    		game.setVisible(true);
    		
    	}
    	
    
    		
    }
    and here the Shape class:

    Java Code:
    package tetris;
    
    import java.util.Random;
    import java.lang.Math;
    
    
    
    public class Shape {
    
    	enum Tetrominoes { NoShape, ZShape, SShape, LineShape, TShape, SquareShape, LShape, MirroredLShape };
    	
    	private Tetrominoes pieceShape;
    	private int coords[][];
    	private int[][][] coordsTable;
    	
    	public Shape() {
    		
    		coords = new int[4][2];
    		setShape(Tetrominoes.NoShape);
    		
    	}
    	
    	public void setShape(Tetrominoes shape) {
    		
    		coordsTable = new int[][][] {
    				{ { 0, 0  },  { 0, 0 },  { 0, 0  },  { 0, 0  } },
    				{ { 0, -1 },  { 0, 0 },  { -1, 0 },  { -1, 1 } },
    				{ { 0, -1 },  { 0, 0 },  { 1, 0  },  { 1, 1  } },
    				{ { 0, -1 },  { 0, 0 },  { 0, 1  },  { 0, 2  } },
    				{ { -1, 0 },  { 0, 0 },  { 1, 0  },  { 0, 1  } },
    				{ { 0, 0  },  { 1, 0 },  { 0, 1  },  { 1, 1  } },
    				{ { -1, -1},  { 0, -1},  { 0, 0  },  { 0, 1  } },
    				{ { 1, -1 },  { 0, -1},  { 0, 0  },  { 0, 1  } },
    		};
    		
    		for (int i = 0; i < 4 ; i++) {
    			for (int j = 0; j < 2; ++j) {
    				coords[i][j] = coordsTable[shape.ordinal()][i][j];
    				
    			}
    		}
    		pieceShape = shape;
    		
    	}
    	
    	private void setX(int index, int x) { coords[index][0] = x; }
    	private void setY(int index, int y) { coords[index][1] = y; }
    	public int x(int index) { return coords[index][0]; }
    	public int y(int index) { return coords[index][1]; }
    	public Tetrominoes getShape() { return pieceShape; }
    	
    	public void setRandomShape()
    	{
    		Random r = new Random();
    		int x = Math.abs(r.nextInt()) % 7 + 1;
    		Tetrominoes[] values = Tetrominoes.values();
    		setShape(values[x]);
    	}
    	
    	public int minX()
    	{
    		int m = coords[0][0];
    		for (int i=0; i < 4; i++) {
    			m = Math.min(m, coords[i][0]);
    		}
    		return m;
    	}
    	
    	public int minY()
    	{
    		int m = coords[0][1];
    		for (int i=0; i < 4; i++) {
    			m = Math.min(m, coords[i][1]);
    		
    		}
    		return m;
    	}
    	
    	public Shape rotateLeft()
    	{
    		if (pieceShape == Tetrominoes.SquareShape)
    			return this;
    		
    		Shape result = new Shape();
    		result.pieceShape = pieceShape;
    		
    		for (int i=0; i < 4; i++) {
    			result.setX(i, y(i));
    			result.setY(i, -x(i));
    		}
            return result;
            
    	}
    	
    	public Shape rotateRight()
    	{
    		if (pieceShape == Tetrominoes.SquareShape)
    			return this;
    		
    		Shape result = new Shape();
    		result.pieceShape = pieceShape;
    		
    		for (int i=0; i < 4; ++i) {
    			result.setX(i, -y(i));
    			result.setY(i, x(i));
    		}
            return result;
            
            
    	}
    	
    	
    }

Similar Threads

  1. Replies: 3
    Last Post: 03-19-2012, 06:17 PM
  2. Java Tetris 1.0
    By levent in forum Java Software
    Replies: 1
    Last Post: 01-07-2012, 09:07 AM
  3. Normal tetris transform to Tetris with MVC.
    By kuburoman in forum Advanced Java
    Replies: 1
    Last Post: 04-24-2011, 11:53 AM
  4. tetris type game--- boundary help
    By ftrengnr in forum New To Java
    Replies: 11
    Last Post: 11-09-2010, 11:00 PM
  5. Replies: 6
    Last Post: 12-15-2009, 03:33 AM

Posting Permissions

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