基本信息
源码名称:java 俄罗斯方块 游戏源码
源码大小:0.23M
文件格式:.rar
开发语言:Java
更新时间:2017-12-27
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
java基础编写的俄罗斯方块
package com.akxy.yp.tetris; //Frame 框, 相框 JFrame窗口框 import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.image.BufferedImage; import java.util.Arrays; import java.util.Timer; import java.util.TimerTask; import javax.imageio.ImageIO; import javax.swing.JFrame; import javax.swing.JPanel; /** * 俄罗斯方块 * 俄罗斯方块 扩展了 空白面板, 添加了属性: 墙, 正在下落 * 的方块和下一个方块. */ public class Tetris extends JPanel { private int score;//累计分数 private int lines;//销毁的行数 private Cell[][] wall;//(墙 20行X10列) private Tetromino tetromino;//正在下落的(4格方块,有7种形态) private Tetromino nextOne;//下一个准备下落的方块 /** 背景图片 */ private static BufferedImage background; private static BufferedImage overImage; public static BufferedImage T; public static BufferedImage S; public static BufferedImage I; public static BufferedImage L; public static BufferedImage J; public static BufferedImage O; public static BufferedImage Z; public static final int ROWS = 20;//行 public static final int COLS = 10;//列 //将图片素材, 复制到包中. /** 使用静态代码块加载静态的图片 */ static{ try{ //Tetris.class的同一个包中找 "tetris.png" background=ImageIO.read( Tetris.class.getResource("tetris.png")); overImage=ImageIO.read( Tetris.class.getResource("game-over.png")); T=ImageIO.read( Tetris.class.getResource("T.png")); I=ImageIO.read( Tetris.class.getResource("I.png")); S=ImageIO.read( Tetris.class.getResource("S.png")); Z=ImageIO.read( Tetris.class.getResource("Z.png")); J=ImageIO.read( Tetris.class.getResource("J.png")); L=ImageIO.read( Tetris.class.getResource("L.png")); O=ImageIO.read( Tetris.class.getResource("O.png")); }catch(Exception e){ e.printStackTrace(); } } /** JPanel paint() paint画 * 重写 paint() 修改原有的绘制方法 **/ @Override public void paint(Graphics g) { //画背景, 画墙, 画正在下落的方块 画下一个方块... g.drawImage(background, 0, 0, null); g.translate(15, 15);//坐标系平移 paintWall(g);//画墙 paintTetromino(g);//画正在下落的方块 paintNextOne(g); paintScore(g); g.translate(-15, -15); if(gameOver){ g.drawImage(overImage, 0, 0, null); } //g.setColor(new Color(0x0000ff)); //g.drawRect(10, 10, 50, 80); } public static final int FONT_COLOR=0x667799; public static final int FONT_SIZE=30; private void paintScore(Graphics g) { int x = 290; int y = 160; g.setColor(new Color(FONT_COLOR)); Font font = g.getFont();//取得g当前字体 font = new Font(font.getName(), font.getStyle(), FONT_SIZE); g.setFont(font);//更改了g的字体 String str = "SCORE:" score; g.drawString(str, x, y); y =56; str = "LINES:" lines; g.drawString(str, x, y); y =56; str = "[P]Pause"; if(pause){ str = "[C]Continue"; } if(gameOver){ str = "[S]Start!"; } g.drawString(str, x, y); } private void paintNextOne(Graphics g) { if(nextOne==null){ return; } //将每个格子的row,col 换算为x,y 然后贴图 Cell[] cells = nextOne.cells; for(int i=0; i<cells.length; i ){ //i = 0 1 2 3 Cell cell = cells[i]; //cell 每个格子 int x = (cell.getCol() 10)*CELL_SIZE; int y = (cell.getRow() 1)*CELL_SIZE; g.drawImage(cell.getImage(), x-1, y-1, null); } } public void paintTetromino(Graphics g){ //System.out.println("paint:" tetromino); if(tetromino==null){ return; } //将每个格子的row,col 换算为x,y 然后贴图 Cell[] cells = tetromino.cells; for(int i=0; i<cells.length; i ){ //i = 0 1 2 3 Cell cell = cells[i]; //cell 每个格子 int x = cell.getCol() * CELL_SIZE; int y = cell.getRow() * CELL_SIZE; g.drawImage(cell.getImage(), x-1, y-1, null); } } public static final int CELL_SIZE = 26; /** 画墙 */ private void paintWall(Graphics g){ for(int row=0; row<wall.length; row ){ Cell[] line = wall[row]; //line 代表墙上的每一行 for(int col=0; col<line.length; col ){ Cell cell = line[col]; //cell 代表墙上的每个格子 int x=col*CELL_SIZE; int y=row*CELL_SIZE; if(cell==null){ //g.drawRect(x,y,CELL_SIZE,CELL_SIZE); }else{ g.drawImage(cell.getImage(), x-1, y-1, null); } } } } /** 在Tetris 添加启动方法 action() */ public void action(){ wall = new Cell[ROWS][COLS]; startAction(); // wall[2][2] = new Cell(2,2, T); // tetromino = Tetromino.randomOne(); // System.out.println( // "After rendomOne:" tetromino); // nextOne = Tetromino.randomOne(); //处理键盘按下事件, 在按下按键时候执行下落方法 KeyAdapter l = new KeyAdapter(){ @Override //key 按键 Pressed按下了 public void keyPressed(KeyEvent e) { int key = e.getKeyCode();//[c] if(key==KeyEvent.VK_Q){ System.exit(0);//结束Java进程 } if(gameOver){ if(key==KeyEvent.VK_S){ startAction(); repaint(); } return; } if(pause){//pause = true if(key==KeyEvent.VK_C){ continueAction(); repaint(); } return; } switch (key) { case KeyEvent.VK_DOWN:softDropAction();break; case KeyEvent.VK_RIGHT:moveRightAction();break; case KeyEvent.VK_LEFT:moveLeftAction();break; case KeyEvent.VK_SPACE:hardDropAction();break; case KeyEvent.VK_UP:rotateRightAction();break; case KeyEvent.VK_P:pauseAction();break; } repaint();//再画一次! } }; // 下落流程: 监听键盘事件->如果下箭头按下-> // 执行下落算法tetromino.softDrop()-> // 修改每个格子对象的数据->调用repaint()-> // 尽快调用paint()->paint方法会根据当前的数据 // 重新绘制界面 -> 看到移动以后的方块了 //绑定事件到当前面板 this.requestFocus(); this.addKeyListener(l); } /** 在Tetris 类上添加方法, 向右移动的流程控制 */ public void moveRightAction(){ //尝试先向右移动, 如果发现超出了边界, 就 //向左移动, 修正回来. tetromino.moveRight();//coincide重叠 if(outOfBounds() || coincide()){ tetromino.moveLeft(); } } /** 检查正在下落的方块是否与墙上的砖块重叠 */ private boolean coincide() { Cell[] cells = tetromino.cells; for(int i=0; i<cells.length; i ){ Cell cell = cells[i]; int row = cell.getRow(); int col = cell.getCol(); //如果墙的row,col位置上有格子,就重叠了! if(row>=0 && row<ROWS && col>=0 && col<=COLS && wall[row][col]!=null){ return true;//重叠 } } return false; } /** 检查当前正在下落的方块是否出界了 */ private boolean outOfBounds(){ Cell[] cells = tetromino.cells; for(int i=0; i<cells.length; i ){ Cell cell = cells[i]; int col = cell.getCol(); if(col<0 || col>=COLS){ return true; } } return false; } public void moveLeftAction(){ tetromino.moveLeft(); if(outOfBounds() || coincide()){ tetromino.moveRight(); } } /** 下落流程控制 */ public void softDropAction(){ if(canDrop()){ tetromino.softDrop(); }else{ landIntoWall(); destoryLines(); checkGameOverAction(); tetromino = nextOne; nextOne = Tetromino.randomOne(); } } private static int[] scoreTable ={0,1,10,50,100}; // 0 1 2 3 4 private void destoryLines() { int lines = 0; for(int row=0; row<wall.length; row ){ if(fullCells(row)){ deleteRow(row); lines ; } } this.score = scoreTable[lines]; this.lines =lines; } private void deleteRow(int row) { for(int i=row; i>=1; i--){ System.arraycopy( wall[i-1], 0, wall[i], 0, COLS); } Arrays.fill(wall[0], null); } /** 检查当前行的每个格子, 如果有null返回false * 否则返回 true */ private boolean fullCells(int row) { Cell[] line = wall[row]; for(Cell cell: line){ if(cell==null){ return false; } } return true; } private void landIntoWall() { Cell[] cells = tetromino.cells; for(int i=0; i<cells.length; i ){ Cell cell = cells[i]; int row = cell.getRow(); int col = cell.getCol(); wall[row][col]=cell; } } /** 检查当前的方块是否能够下落, 返回true能够下落 */ private boolean canDrop() { Cell[] cells = tetromino.cells; for(int i=0; i<cells.length; i ){ Cell cell = cells[i]; int row = cell.getRow(); if(row == ROWS-1){ return false; } } for(Cell cell: cells){//Java 5 以后可以使用 int row = cell.getRow() 1; int col = cell.getCol(); if(row>=0 && row<ROWS && col>=0 && col<=COLS && wall[row][col]!=null){ return false; } } return true; } /** 硬下落流程, 下落到不能下落为止 * 绑定到 空格(VK_SPACE)事件上 * */ public void hardDropAction(){ while(canDrop()){ tetromino.softDrop(); } landIntoWall(); destoryLines(); checkGameOverAction(); tetromino = nextOne; nextOne = Tetromino.randomOne(); } /** 在Tetris类中添加 旋转流程控制方法 */ public void rotateRightAction(){ tetromino.rotateRight(); if(outOfBounds() || coincide()){ tetromino.rotateLeft(); } } private Timer timer; private boolean pause; private boolean gameOver; private long interval = 600;//间隔时间 /** 在Tetris类中添加 开始流程控制 */ public void startAction(){ pause = false; gameOver = false; score = 0; lines=0; clearWall(); tetromino = Tetromino.randomOne(); nextOne = Tetromino.randomOne(); timer = new Timer(); timer.schedule(new TimerTask(){ public void run(){ softDropAction(); repaint(); } }, interval, interval); } private void clearWall() { //Arrays.fill(wall, null); for(Cell[] line: wall){ Arrays.fill(line, null); } // for(int i=0; i<wall.length; i ){ // Arrays.fill(wall[i], null); // } } /** 在Tetris类中添加暂停方法 */ public void pauseAction(){ timer.cancel(); pause = true; } public void continueAction(){ timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { softDropAction(); repaint(); } }, interval, interval); pause = false; } public void checkGameOverAction(){ if(wall[0][4]!=null){ gameOver = true; timer.cancel(); } } public static void main(String[] args) { JFrame frame = new JFrame(); //在加载Tetris类的时候, 会执行静态代码块 //静态代码块,装载了图片素材, 为图片对象 Tetris tetris = new Tetris(); //tetris.setBackground(new Color(0x0000ff)); frame.add(tetris); frame.setSize(530, 580); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE); frame.setVisible(true);//在显示窗口时候,会"尽快" tetris.action(); //的调用paint()方法绘制界面 } }