jsp鲜花网站开发源代码,永久网站空间,莱芜大集,网站后台权限分配说明目录 游戏规则
小方块类#xff1a;Cell 七种图形类#xff1a;I、J、L、O、S、T、Z J L O S T
Z 俄罗斯方块游戏主类#xff1a;Tetris
效果展示 游戏规则
由小方块组成的不同形状的板块陆续从屏幕上方落下来#xff0c;玩家通过调整板块的位置和方向#xff0c;使它…目录 游戏规则
小方块类Cell 七种图形类I、J、L、O、S、T、Z J L O S T
Z 俄罗斯方块游戏主类Tetris
效果展示 游戏规则
由小方块组成的不同形状的板块陆续从屏幕上方落下来玩家通过调整板块的位置和方向使它们在屏幕底部拼出完整的一条或几条。这些完整的横条会随即消失给新落下来的板块腾出空间与此同时玩家得到分数奖励。没有被消除掉的方块不断堆积起来一旦堆到屏幕顶端玩家便告输游戏结束。
整体代码分为三个模块方格模块七种图形模块俄罗斯方块主模块。
小方块类Cell
package com.zhao.demo.block;import java.awt.image.BufferedImage;
import java.util.Objects;/*** author xiaoZhao* date 2022/5/7* describe* 小方块类* 方法 左移、右移、下落*/
public class Cell {// 行private int row;// 列private int col;private BufferedImage image;public Cell() {}public Cell(int row, int col, BufferedImage image) {this.row row;this.col col;this.image image;}public int getRow() {return row;}public void setRow(int row) {this.row row;}public int getCol() {return col;}public void setCol(int col) {this.col col;}public BufferedImage getImage() {return image;}public void setImage(BufferedImage image) {this.image image;}Overridepublic String toString() {return Cell{ row row , col col , image image };}Overridepublic boolean equals(Object o) {if (this o) {return true;}if (!(o instanceof Cell)) {return false;}Cell cell (Cell) o;return getRow() cell.getRow() getCol() cell.getCol() Objects.equals(getImage(), cell.getImage());}Overridepublic int hashCode() {return Objects.hash(getRow(), getCol(), getImage());}//左移动一格public void left(){col--;}//右移动一格public void right(){col;}//下移动一格public void down(){row;}
} 七种图形类I、J、L、O、S、T、Z
I
package com.zhao.demo.shape;import com.zhao.demo.App.Tetris;
import com.zhao.demo.block.Cell;
import com.zhao.demo.block.Tetromino;/*** author xiaoZhao* date 2022/5/11* describe*/
public class I extends Tetromino {public I() {cells[0] new Cell(0,4, Tetris.I);cells[1] new Cell(0,3, Tetris.I);cells[2] new Cell(0,5, Tetris.I);cells[3] new Cell(0,6, Tetris.I);//共有两种旋转状态states new State[2];//初始化两种状态的相对坐标states[0]new State(0,0,0,-1,0,1,0,2);states[1]new State(0,0,-1,0,1,0,2,0);}} J
package com.zhao.demo.shape;import com.zhao.demo.App.Tetris;
import com.zhao.demo.block.Cell;
import com.zhao.demo.block.Tetromino;/*** author xiaoZhao* date 2022/5/11* describe*/
public class J extends Tetromino {public J() {cells[0] new Cell(0,4, Tetris.J);cells[1] new Cell(0,3, Tetris.J);cells[2] new Cell(0,5, Tetris.J);cells[3] new Cell(1,5, Tetris.J);statesnew State[4];states[0]new State(0,0,0,-1,0,1,1,1);states[1]new State(0,0,-1,0,1,0,1,-1);states[2]new State(0,0,0,1,0,-1,-1,-1);states[3]new State(0,0,1,0,-1,0,-1,1);}
} L
package com.zhao.demo.shape;import com.zhao.demo.App.Tetris;
import com.zhao.demo.block.Cell;
import com.zhao.demo.block.Tetromino;/*** author xiaoZhao* date 2022/5/11* describe*/
public class L extends Tetromino {public L() {cells[0] new Cell(0,4, Tetris.L);cells[1] new Cell(0,3, Tetris.L);cells[2] new Cell(0,5, Tetris.L);cells[3] new Cell(1,3, Tetris.L);statesnew State[4];states[0]new State(0,0,0,-1,0,1,1,-1);states[1]new State(0,0,-1,0,1,0,-1,-1);states[2]new State(0,0,0,1,0,-1,-1,1);states[3]new State(0,0,1,0,-1,0,1,1);}
} O
package com.zhao.demo.shape;import com.zhao.demo.App.Tetris;
import com.zhao.demo.block.Cell;
import com.zhao.demo.block.Tetromino;/*** author xiaoZhao* date 2022/5/11* describe*/
public class O extends Tetromino {public O() {cells[0] new Cell(0, 4, Tetris.O);cells[1] new Cell(0, 5, Tetris.O);cells[2] new Cell(1, 4, Tetris.O);cells[3] new Cell(1, 5, Tetris.O);//无旋转状态states new State[0];}
} S
package com.zhao.demo.shape;import com.zhao.demo.App.Tetris;
import com.zhao.demo.block.Cell;
import com.zhao.demo.block.Tetromino;/*** author xiaoZhao* date 2022/5/11* describe*/
public class S extends Tetromino {public S() {cells[0] new Cell(0,4, Tetris.S);cells[1] new Cell(0,5, Tetris.S);cells[2] new Cell(1,3, Tetris.S);cells[3] new Cell(1,4, Tetris.S);//共有两种旋转状态states new State[2];//初始化两种状态的相对坐标states[0]new State(0,0,0,1,1,-1,1,0);states[1]new State(0,0,1,0,-1,-1,0,-1);}
} T
package com.zhao.demo.shape;import com.zhao.demo.App.Tetris;
import com.zhao.demo.block.Cell;
import com.zhao.demo.block.Tetromino;/*** author xiaoZhao* date 2022/5/11* describe*/
public class T extends Tetromino {public T() {cells[0] new Cell(0,4, Tetris.T);cells[1] new Cell(0,3, Tetris.T);cells[2] new Cell(0,5, Tetris.T);cells[3] new Cell(1,4, Tetris.T);statesnew State[4];states[0]new State(0,0,0,-1,0,1,1,0);states[1]new State(0,0,-1,0,1,0,0,-1);states[2]new State(0,0,0,1,0,-1,-1,0);states[3]new State(0,0,1,0,-1,0,0,1);}
}
Z
package com.zhao.demo.shape;import com.zhao.demo.App.Tetris;
import com.zhao.demo.block.Cell;
import com.zhao.demo.block.Tetromino;/*** author xiaoZhao* date 2022/5/11* describe*/
public class Z extends Tetromino {public Z() {cells[0] new Cell(1,4, Tetris.Z);cells[1] new Cell(0,3, Tetris.Z);cells[2] new Cell(0,4, Tetris.Z);cells[3] new Cell(1,5, Tetris.Z);//共有两种旋转状态states new State[2];//初始化两种状态的相对坐标states[0]new State(0,0,-1,-1,-1,0,0,1);states[1]new State(0,0,-1,1,0,1,1,0);}
} 俄罗斯方块游戏主类Tetris
package com.zhao.demo.App;import com.zhao.demo.block.Cell;
import com.zhao.demo.block.Tetromino;import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.security.cert.Certificate;/*** author xiaoZhao* date 2022/5/11* describe 俄罗斯方块游戏主类*/
public class Tetris extends JPanel {//正在下落的方块private Tetromino currentOne Tetromino.randomOne();//将要下落的方块private Tetromino nextOne Tetromino.randomOne();//游戏主区域private Cell[][] wall new Cell[18][9];//声明单元格的值private static final int CELL_SIZE 48;//游戏分数池int[] scores_pool {0, 1, 2, 5, 10};//当前游戏的分数private int totalScore 0;//当前消除的行数private int totalLine 0;//游戏三种状态 游戏中、暂停、结束public static final int PLING 0;public static final int STOP 1;public static final int OVER 2;//当前游戏状态值private int game_state;//显示游戏状态String[] show_state {P[pause], C[continue], S[replay]};//载入方块图片public static BufferedImage I;public static BufferedImage J;public static BufferedImage L;public static BufferedImage O;public static BufferedImage S;public static BufferedImage T;public static BufferedImage Z;public static BufferedImage background;static {try {I ImageIO.read(new File(images/I.png));J ImageIO.read(new File(images/J.png));L ImageIO.read(new File(images/L.png));O ImageIO.read(new File(images/O.png));S ImageIO.read(new File(images/S.png));T ImageIO.read(new File(images/T.png));Z ImageIO.read(new File(images/Z.png));background ImageIO.read(new File(images/background.png));} catch (IOException e) {e.printStackTrace();}}Overridepublic void paint(Graphics g) {g.drawImage(background, 0, 0, null);//平移坐标轴g.translate(22, 15);//绘制游戏主区域paintWall(g);//绘制正在下落的四方格paintCurrentOne(g);//绘制下一个将要下落的四方格paintNextOne(g);//绘制游戏得分paintSource(g);//绘制当前游戏状态paintState(g);}public void start() {game_state PLING;KeyListener l new KeyAdapter() {Overridepublic void keyPressed(KeyEvent e) {int code e.getKeyCode();switch (code) {case KeyEvent.VK_DOWN:sortDropActive();break;case KeyEvent.VK_LEFT:moveleftActive();break;case KeyEvent.VK_RIGHT:moveRightActive();break;case KeyEvent.VK_UP:rotateRightActive();break;case KeyEvent.VK_SPACE:hadnDropActive();break;case KeyEvent.VK_P://判断当前游戏状态if (game_state PLING) {game_state STOP;}break;case KeyEvent.VK_C:if (game_state STOP) {game_state PLING;}break;case KeyEvent.VK_S://重新开始game_state PLING;wall new Cell[18][9];currentOne Tetromino.randomOne();nextOne Tetromino.randomOne();totalScore 0;totalLine 0;break;}}};//将窗口设置为焦点this.addKeyListener(l);this.requestFocus();while (true) {if (game_state PLING) {try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}if (camDrop()) {currentOne.moveDrop();} else {landToWall();destroyLine();if (isGameOver()) {game_state OVER;} else {//游戏没有结束currentOne nextOne;nextOne Tetromino.randomOne();}}}repaint();}}//创建顺时针旋转public void rotateRightActive() {currentOne.rotateRight();if (outOFBounds() || coincide()) {currentOne.rotateLeft();}}//瞬间下落public void hadnDropActive() {while (true) {//判断能否下落if (camDrop()) {currentOne.moveDrop();} else {break;}}//嵌入到墙中landToWall();destroyLine();if (isGameOver()) {game_state OVER;} else {//游戏没有结束currentOne nextOne;nextOne Tetromino.randomOne();}}//按键一次下落一格public void sortDropActive() {if (camDrop()) {//当前四方格下落一格currentOne.moveDrop();} else {landToWall();destroyLine();if (isGameOver()) {game_state OVER;} else {//游戏没有结束currentOne nextOne;nextOne Tetromino.randomOne();}}}//单元格嵌入墙中private void landToWall() {Cell[] cells currentOne.cells;for (Cell cell : cells) {int row cell.getRow();int col cell.getCol();wall[row][col] cell;}}//判断四方格能否下落public boolean camDrop() {Cell[] cells currentOne.cells;for (Cell cell : cells) {int row cell.getRow();int col cell.getCol();//判断是否到达底部if (row wall.length - 1) {return false;} else if (wall[row 1][col] ! null) {return false;}}return true;}//消除行public void destroyLine() {int line 0;Cell[] cells currentOne.cells;for (Cell cell : cells) {int row cell.getRow();if (isFullLine(row)) {line;for (int i row; i 0; i--) {System.arraycopy(wall[i - 1], 0, wall[i], 0, wall[0].length);}wall[0] new Cell[9];}}//分数池获取分数累加到总分totalScore scores_pool[line];//总行数totalLine line;}//判断当前行是否已经满了public boolean isFullLine(int row) {Cell[] cells wall[row];for (Cell cell : cells) {if (cell null) {return false;}}return true;}//判断游戏是否结束public boolean isGameOver() {Cell[] cells nextOne.cells;for (Cell cell : cells) {int row cell.getRow();int col cell.getCol();if (wall[row][col] ! null) {return true;}}return false;}private void paintState(Graphics g) {if (game_state PLING) {g.drawString(show_state[PLING], 500, 660);} else if (game_state STOP) {g.drawString(show_state[STOP], 500, 660);} else {g.drawString(show_state[OVER], 500, 660);g.setColor(Color.RED);g.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 60));g.drawString(GAME OVER!, 30, 400);}}private void paintSource(Graphics g) {g.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 30));g.drawString(分数: totalScore, 500, 250);g.drawString(行数: totalLine, 500, 430);}private void paintNextOne(Graphics g) {Cell[] cells nextOne.cells;for (Cell cell : cells) {int x cell.getCol() * CELL_SIZE 370;int y cell.getRow() * CELL_SIZE 25;g.drawImage(cell.getImage(), x, y, null);}}private void paintCurrentOne(Graphics g) {Cell[] cells currentOne.cells;for (Cell cell : cells) {int x cell.getCol() * CELL_SIZE;int y cell.getRow() * CELL_SIZE;g.drawImage(cell.getImage(), x, y, null);}}private void paintWall(Graphics g) {for (int i 0; i wall.length; i) {for (int j 0; j wall[i].length; j) {int x j * CELL_SIZE;int y i * CELL_SIZE;Cell cell wall[i][j];//判断是否有小方块if (cell null) {g.drawRect(x, y, CELL_SIZE, CELL_SIZE);} else {g.drawImage(cell.getImage(), x, y, null);}}}}//判断是否出界public boolean outOFBounds() {Cell[] cells currentOne.cells;for (Cell cell : cells) {int col cell.getCol();int row cell.getRow();if (row 0 || row wall.length - 1 || col 0 || col wall[0].length-1) {return true;}}return false;}//按键一次左移一次public void moveleftActive() {currentOne.moveLeft();//判断是否越界或重合if (outOFBounds() || coincide()) {currentOne.moveRight();}}//按键一次右移一次public void moveRightActive() {currentOne.moveRight();//判断是否越界或重合if (outOFBounds() || coincide()) {currentOne.moveLeft();}}//判断是否重合public boolean coincide() {Cell[] cells currentOne.cells;for (Cell cell : cells) {int row cell.getRow();int col cell.getCol();if (wall[row][col] ! null) {return true;}}return false;}public static void main(String[] args) {JFrame jFrame new JFrame(俄罗斯方块);//创建游戏界面Tetris panel new Tetris();jFrame.add(panel);//设置可见jFrame.setVisible(true);//设置窗口大小jFrame.setSize(810, 940);//设置剧中jFrame.setLocationRelativeTo(null);//设置窗口关闭时停止jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//游戏主要开始逻辑panel.start();}
}
效果展示
游戏开始方快下落右边区域展示即将下落的方块图、分数、消除的行数以及游戏切换的状态。 按下空格键方块瞬间下落 按下P键游戏暂停消除一行分数为1此处由分数池进行控制 按下C键游戏继续