Java 小游戏开发之俄罗斯方块

Java项目 俄罗斯方块

一、心得

二、游戏实例

游戏截图

目录结构

三、代码

1、主界面 Tetris.java

package com.fry.tetris;

import java.util.Arrays;

import java.util.Random;

/**

* 4格方块

*/

public class Tetromino {

protected Cell[] cells = new Cell[4];

/** 保存旋转的相对于轴位置状态 */

protected State[] states;

/** 随机生成 4格方块, 使用简单工厂方法模式!

* randomTetromino 随机生成一个四格方块

* 这个方面的返回值是多态的!

* */

public static Tetromino randomTetromino(){

Random r = new Random();

int type = r.nextInt(7);

switch(type){

case 0: return new T();

case 1: return new I();

case 2: return new J();

case 3: return new L();

case 4: return new O();

case 5: return new S();

case 6: return new Z();

}

return null;

}

public Cell[] getCells() {

return cells;

}

/** 下落 */

public void softDrop(){

for(int i=0; i<cells.length; i++){

cells[i].moveDown();

}

}

public void moveRight(){

//System.out.println("moveRight()");

for(int i=0; i<cells.length; i++){

this.cells[i].moveRight();

}

}

public void moveLeft(){

for(int i=0; i<cells.length; i++){

cells[i].moveLeft();

}

}

private int index = 100000;

/** 在 Tetromino 上添加方法 */

public void rotateRight() {

index++;//index = 10001

// index % states.length = 10001 % 4 = 1

State s = states[index%states.length];//s1

// [0] + s1 = [1]

Cell o = cells[0];//获取当前的轴

//轴与相对位置的和作为旋转以后的格子位置

cells[1].setRow(o.getRow()+s.row1);

cells[1].setCol(o.getCol()+s.col1);

cells[2].setRow(o.getRow()+s.row2);

cells[2].setCol(o.getCol()+s.col2);

cells[3].setRow(o.getRow()+s.row3);

cells[3].setCol(o.getCol()+s.col3);

}

/** 在 Tetromino 上添加方法 */

public void rotateLeft() {

index--;//index = 10001

// index % states.length = 10001 % 4 = 1

State s = states[index%states.length];//s1

// [0] + s1 = [1]

Cell o = cells[0];//获取当前的轴

cells[1].setRow(o.getRow()+s.row1);

cells[1].setCol(o.getCol()+s.col1);

cells[2].setRow(o.getRow()+s.row2);

cells[2].setCol(o.getCol()+s.col2);

cells[3].setRow(o.getRow()+s.row3);

cells[3].setCol(o.getCol()+s.col3);

}

@Override

public String toString() {

return Arrays.toString(cells);

}

/** Tetromino 类中添加的 内部类 用于记录旋转状态 */

protected class State{

int row0,col0,row1,col1,row2,col2,row3,col3;

public State(int row0, int col0, int row1, int col1,

int row2, int col2,

int row3, int col3) {

this.row0 = row0;

this.col0 = col0;

this.row1 = row1;

this.col1 = col1;

this.row2 = row2;

this.col2 = col2;

this.row3 = row3;

this.col3 = col3;

}

}

}//Tetromino 类的结束

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);

states = new State[]{

new State(0,0, 0,-1, 0,1, 1, 0),

new State(0,0, -1,0, 1,0, 0,-1),

new State(0,0, 0,1, 0,-1, -1,0),

new State(0,0, 1,0, -1,0, 0,1)};

}

}

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[]{

new State(0,0, 0,1, 0,-1, 0,-2),

new State(0,0, -1,0, 1,0,2,0)};

}

}

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);

states = new State[]{

new State(0,0, 0,-1, 0,1, 1,-1 ),

new State(0,0, -1,0, 1,0, -1,-1),

new State(0,0, 0,1, 0,-1, -1,1),

new State(0,0, 1,0, -1,0, 1,1)};

}

}

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);

states = new State[]{

new State(0,0, 0,-1, 0,1, 1,1),

new State(0,0, -1,0, 1,0, 1,-1),

new State(0,0, 0,1, 0,-1, -1,-1),

new State(0,0, 1,0, -1,0, -1,1 )};

}

}

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[]{

new State(0,0, 0,1, 1,-1, 1,0 ),

new State(0,0, -1,0, 1,1, 0,1 )};

}

}

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[]{

new State(0,0, -1,-1, -1,0, 0,1 ),

new State(0,0, -1,1, 0,1, 1,0 )};

}

}

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[]{

new State(0,0, 0,1, 1,0, 1,1 ),

new State(0,0, 0,1, 1,0, 1,1 )};

}

}

二、Cell.java

package com.fry.tetris;

import java.awt.Image;

/**

* 格子

* 每一个小格子,就有所在的行 列 和图片

*/

public class Cell {

private int row;

private int col;

//private int color;

private Image image;//格子的贴图

public Cell() {

}

public Cell(int row, int col, Image image) {

super();

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 Image getImage() {

return image;

}

public void setImage(Image image) {

this.image = image;

}

public void moveRight(){

col++;

//System.out.println("Cell moveRight()" + col);

}

public void moveLeft(){

col--;

}

public void moveDown(){

row++;

}

@Override

public String toString() {

return "["+row+","+col+"]";

}

}

三、功能实现 Tetromino.java

package com.fry.tetris;

import java.util.Arrays;

import java.util.Random;

/**

* 4格方块

*/

public class Tetromino {

protected Cell[] cells = new Cell[4];

/** 保存旋转的相对于轴位置状态 */

protected State[] states;

/** 随机生成 4格方块, 使用简单工厂方法模式!

* randomTetromino 随机生成一个四格方块

* 这个方面的返回值是多态的!

* */

public static Tetromino randomTetromino(){

Random r = new Random();

int type = r.nextInt(7);

switch(type){

case 0: return new T();

case 1: return new I();

case 2: return new J();

case 3: return new L();

case 4: return new O();

case 5: return new S();

case 6: return new Z();

}

return null;

}

public Cell[] getCells() {

return cells;

}

/** 下落 */

public void softDrop(){

for(int i=0; i<cells.length; i++){

cells[i].moveDown();

}

}

public void moveRight(){

//System.out.println("moveRight()");

for(int i=0; i<cells.length; i++){

this.cells[i].moveRight();

}

}

public void moveLeft(){

for(int i=0; i<cells.length; i++){

cells[i].moveLeft();

}

}

private int index = 100000;

/** 在 Tetromino 上添加方法 */

public void rotateRight() {

index++;//index = 10001

// index % states.length = 10001 % 4 = 1

State s = states[index%states.length];//s1

// [0] + s1 = [1]

Cell o = cells[0];//获取当前的轴

//轴与相对位置的和作为旋转以后的格子位置

cells[1].setRow(o.getRow()+s.row1);

cells[1].setCol(o.getCol()+s.col1);

cells[2].setRow(o.getRow()+s.row2);

cells[2].setCol(o.getCol()+s.col2);

cells[3].setRow(o.getRow()+s.row3);

cells[3].setCol(o.getCol()+s.col3);

}

/** 在 Tetromino 上添加方法 */

public void rotateLeft() {

index--;//index = 10001

// index % states.length = 10001 % 4 = 1

State s = states[index%states.length];//s1

// [0] + s1 = [1]

Cell o = cells[0];//获取当前的轴

cells[1].setRow(o.getRow()+s.row1);

cells[1].setCol(o.getCol()+s.col1);

cells[2].setRow(o.getRow()+s.row2);

cells[2].setCol(o.getCol()+s.col2);

cells[3].setRow(o.getRow()+s.row3);

cells[3].setCol(o.getCol()+s.col3);

}

@Override

public String toString() {

return Arrays.toString(cells);

}

/** Tetromino 类中添加的 内部类 用于记录旋转状态 */

protected class State{

int row0,col0,row1,col1,row2,col2,row3,col3;

public State(int row0, int col0, int row1, int col1,

int row2, int col2,

int row3, int col3) {

this.row0 = row0;

this.col0 = col0;

this.row1 = row1;

this.col1 = col1;

this.row2 = row2;

this.col2 = col2;

this.row3 = row3;

this.col3 = col3;

}

}

}//Tetromino 类的结束

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);

states = new State[]{

new State(0,0, 0,-1, 0,1, 1, 0),

new State(0,0, -1,0, 1,0, 0,-1),

new State(0,0, 0,1, 0,-1, -1,0),

new State(0,0, 1,0, -1,0, 0,1)};

}

}

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[]{

new State(0,0, 0,1, 0,-1, 0,-2),

new State(0,0, -1,0, 1,0,2,0)};

}

}

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);

states = new State[]{

new State(0,0, 0,-1, 0,1, 1,-1 ),

new State(0,0, -1,0, 1,0, -1,-1),

new State(0,0, 0,1, 0,-1, -1,1),

new State(0,0, 1,0, -1,0, 1,1)};

}

}

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);

states = new State[]{

new State(0,0, 0,-1, 0,1, 1,1),

new State(0,0, -1,0, 1,0, 1,-1),

new State(0,0, 0,1, 0,-1, -1,-1),

new State(0,0, 1,0, -1,0, -1,1 )};

}

}

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[]{

new State(0,0, 0,1, 1,-1, 1,0 ),

new State(0,0, -1,0, 1,1, 0,1 )};

}

}

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[]{

new State(0,0, -1,-1, -1,0, 0,1 ),

new State(0,0, -1,1, 0,1, 1,0 )};

}

}

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[]{

new State(0,0, 0,1, 1,0, 1,1 ),

new State(0,0, 0,1, 1,0, 1,1 )};

}

}

以上就是java实现俄罗斯方块的实例,如有疑问请留言或者到本站社区讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

以上是 Java 小游戏开发之俄罗斯方块 的全部内容, 来源链接: utcz.com/p/213772.html

回到顶部