俄罗斯方块Java版
来源:互联网 发布:个人导航源码 编辑:程序博客网 时间:2024/05/17 03:54
简单版的俄罗斯方块,还可以添加菜单和下一个块提示,等分等等扩展
package myown;import java.awt.Graphics;import java.awt.Point;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import javax.swing.JPanel;import javax.swing.Timer;public class Tetris extends JPanel{ /** * */ private static final long serialVersionUID = 1L; private static int TimeDelay = 1000; private static final int BlockSize = 30; private static final int BlockWidth = 6; private static final int BlockHeigth = 10; private boolean[][] currBlock = Block.Shape[(int)(Math.random()*Block.Shape.length)]; private Point newBlockPosition = new Point(BlockWidth/2, 0); private boolean[][] fixedBlock = new boolean[BlockHeigth][BlockWidth]; private Timer timer; public Tetris() { this.addKeyListener(keyListener); timer = new Timer(Tetris.TimeDelay, this.TimerListener); timer.start(); } public void newBlock() { currBlock = Block.Shape[(int)(Math.random()*Block.Shape.length)]; newBlockPosition = new Point(BlockWidth/2, 0); } // 是否碰到墙壁 public boolean isTouchWall() { for(int i=0; i<currBlock.length; i++) for(int j=0; j<currBlock[0].length; j++) { if(currBlock[i][j]) if(j + newBlockPosition.x <= 0 || j + newBlockPosition.x >= (BlockWidth + 1)) { System.out.println("碰墙"); return true; } } return false; } // 是否碰到固定好的,底层的墙看成是固定好的Block public boolean isTouchFixedBlock() { for(int i=0; i<currBlock.length; i++) for(int j=0; j<currBlock[0].length; j++) { if(currBlock[i][j]) if(i + newBlockPosition.y >= BlockHeigth || j + newBlockPosition.x >= BlockWidth + 1 || fixedBlock[i + newBlockPosition.y][j + newBlockPosition.x - 1]) { System.out.println("要固定了"); return true; } } return false; } // 固定当前Block并消除得分 public void fixBlock() { for(int i=0; i<currBlock.length; i++) for(int j=0; j<currBlock[0].length; j++) { if(currBlock[i][j]) fixedBlock[i + newBlockPosition.y][j + newBlockPosition.x-1] = true; } System.out.println("fixed"); newBlock(); for(int i=0; i<BlockHeigth; i++) { boolean isFull = true; for(int j=0; j<BlockWidth; j++) { if(!fixedBlock[i][j]) { isFull = false; break; } } if(isFull) { for(int p=i; p > 0; p--) for(int k=0; k<BlockWidth; k++) fixedBlock[p][k] = fixedBlock[p-1][k]; for(int k=0; k<BlockWidth; k++) fixedBlock[0][k] = false; } } } // 旋转实现transfer public void transfer() { int row = currBlock.length; int col = currBlock[0].length; boolean[][] temp = new boolean[row][col]; for(int i=0; i<row; i++) for(int j=0; j<col; j++) temp[j][col - 1 - i] = currBlock[i][j]; currBlock = temp; } // test method public static void main(String[] args) { new Tetris(); } // repaint method @Override protected void paintComponent(Graphics g) { // TODO Auto-generated method stub super.paintComponent(g); //System.out.println(newBlockPosition.x + "," + newBlockPosition.y); // 画墙 for(int i=0; i<=BlockHeigth; i++) { g.drawRect(0 * BlockSize, i * BlockSize, BlockSize, BlockSize); g.drawRect((BlockWidth + 1) * BlockSize, i * BlockSize, BlockSize, BlockSize); } for(int i=1; i<=BlockWidth; i++) { g.drawRect(i * BlockSize, BlockHeigth * BlockSize, BlockSize, BlockSize); } // 画已经固定了的 for(int i=0; i<BlockHeigth; i++) for(int j=0; j<BlockWidth; j++) { if(fixedBlock[i][j]) g.fillRect((1+j) * BlockSize, i * BlockSize, BlockSize, BlockSize); } // 画当前在下落的 for(int i=0; i<currBlock.length; i++) for(int j=0; j<currBlock[0].length; j++) { if(currBlock[i][j]) g.fillRect((j + newBlockPosition.x) * BlockSize, (i + newBlockPosition.y) * BlockSize, BlockSize, BlockSize); } } // 定时器监听器 ActionListener TimerListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub newBlockPosition.y++; if(isTouchFixedBlock()) { newBlockPosition.y--; fixBlock(); } repaint(); } }; // 按键监听 KeyListener keyListener = new KeyListener() { @Override public void keyPressed(KeyEvent e) { // TODO Auto-generated method stub switch (e.getKeyCode()) { case KeyEvent.VK_DOWN: newBlockPosition.y++; if(isTouchFixedBlock()) newBlockPosition.y--; break; case KeyEvent.VK_UP: transfer(); break; case KeyEvent.VK_RIGHT: newBlockPosition.x++; if(isTouchWall() || isTouchFixedBlock()) newBlockPosition.x--; break; case KeyEvent.VK_LEFT: newBlockPosition.x--; if(isTouchWall() || isTouchFixedBlock()) newBlockPosition.x++; break; } repaint(); } @Override public void keyReleased(KeyEvent e) {} @Override public void keyTyped(KeyEvent e) {} };}
package myown;import javax.swing.JFrame;public class TetrisApp extends JFrame{ /** * */ private static final long serialVersionUID = 1L; Tetris tetris = new Tetris(); public TetrisApp() { this.add(tetris); this.setLocationRelativeTo(null); setSize(400, 400); setDefaultCloseOperation(EXIT_ON_CLOSE); // 如果没有设置获得焦点,按键是没有用的 tetris.setFocusable(true); } public static void main(String[] args) { new TetrisApp().setVisible(true); }}
效果图:
要点就是:下标的控制,有时候加1,还是减1还是要明白清楚
0 0
- Java版的俄罗斯方块
- Java版俄罗斯方块
- 俄罗斯方块java版
- JAVA版俄罗斯方块学习
- 俄罗斯方块Java版
- 俄罗斯方块——Java版
- 俄罗斯方块——Java版
- java基础俄罗斯方块加强版
- JAVA俄罗斯方块
- Java 俄罗斯方块
- java俄罗斯方块
- java 俄罗斯方块
- Java 俄罗斯方块
- java俄罗斯方块
- Java俄罗斯方块
- [JAVA] 俄罗斯方块游戏
- [JAVA] 俄罗斯方块游戏
- [JAVA] 俄罗斯方块游戏
- Android之Canvas自定义画一个时钟
- Javascript模块化编程(一):模块的写法
- Java Socket编程
- 文章标题
- oracle创建job
- 俄罗斯方块Java版
- Linux上配置vim
- Jlex 安装记录
- 【华为OJ5】进制转换
- 计算机网络课程总结(未完)
- Python 使用Picking进行二进制IO
- web连接数据库
- Unity 3D中的射线与碰撞检测
- JAVA基础---反射