📄 brick3d.java
字号:
/* * Brick3D.java * * 创建于 2004年12月11日, 下午6:09 */package TetrisApplet;/** * * @author 刘斌 china_liubin@hotmail.com */class Brick3D { //常量定义 /* * 形状定义,对应BRICK_INFO数组中的第1维 * 范围:0 - 6 **/ public static final int SQUARE_SHAPE = 0; public static final int T_SHAPE = 1; public static final int BAR_SHAPE = 2; public static final int L_SHAPE = 3; public static final int INVERTED_L_SHAPE = 4; public static final int S_SHAPE = 5; public static final int Z_SHAPE = 6; public static final int MAX_SHAPE_NUM = Z_SHAPE + 1; /** * 砖块单元格的宽度 **/ public static final int CELL_WIDTH = 12; public static final int CELL_HEIGHT = CELL_WIDTH; /** * 旋转角度定义: 0,90,180,270度 * 对应BRICK_INFO数组中的第2维 * 范围:0-3 **/ public static final int ROTATION_0 = 0; public static final int ROTATION_90 = 1; public static final int ROTATION_180 = 2; public static final int ROTATION_270 = 3; /** * BickInfo数组用于定义在Graphics对象上画砖块时 * 要使用的信息。这些信息包括:形状,旋转角度,砖块位置等。 * * 砖块基本信息矩阵是一个4*4大小的矩阵,如果值为1,那么就在这个格子中 * 根据设定的颜色值画砖块,否则就不画。 * * 例如,T形的砖块的数组定义为: * * [ 1, 1, 1, 0, * 0, 1, 0, 0, * 0, 0, 0, 0, * 0, 0, 0, 0 ] * * 逆时针旋转90度以后的矩阵为: * * [ 1, 0, 0, 0, * 1, 1, 0, 0, * 1, 0, 0, 0, * 0, 0, 0, 0 ] * * BlockInfo[形状][角度(逆时针旋转)][X][Y]; **/ private static final int BRICK_INFO[][][][] = { {//方块 {//zoro { 1, 1, 0, 0 }, { 1, 1, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } }, {//90 { 1, 1, 0, 0 }, { 1, 1, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } }, {//180 { 1, 1, 0, 0 }, { 1, 1, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } }, {//270 { 1, 1, 0, 0 }, { 1, 1, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } } }, {//T形 {//zoro { 1, 1, 1, 0 }, { 0, 1, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } }, {//90 { 1, 0, 0, 0 }, { 1, 1, 0, 0 }, { 1, 0, 0, 0 }, { 0, 0, 0, 0 } }, {//180 { 0, 1, 0, 0 }, { 1, 1, 1, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } }, {//270 { 0, 1, 0, 0 }, { 1, 1, 0, 0 }, { 0, 1, 0, 0 }, { 0, 0, 0, 0 } } }, {//棍子形状 {//zoro { 1, 1, 1, 1 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } }, {//90 { 1, 0, 0, 0 }, { 1, 0, 0, 0 }, { 1, 0, 0, 0 }, { 1, 0, 0, 0 } }, {//180 { 1, 1, 1, 1 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } }, {//270 { 1, 0, 0, 0 }, { 1, 0, 0, 0 }, { 1, 0, 0, 0 }, { 1, 0, 0, 0 } } }, {//L形状 {//zoro { 1, 0, 0, 0 }, { 1, 0, 0, 0 }, { 1, 1, 0, 0 }, { 0, 0, 0, 0 } }, {//90 { 0, 0, 1, 0 }, { 1, 1, 1, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } }, {//180 { 1, 1, 0, 0 }, { 0, 1, 0, 0 }, { 0, 1, 0, 0 }, { 0, 0, 0, 0 } }, {//270 { 1, 1, 1, 0 }, { 1, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } } }, {//反L形状 {//zoro { 0, 1, 0, 0 }, { 0, 1, 0, 0 }, { 1, 1, 0, 0 }, { 0, 0, 0, 0 } }, {//90 { 1, 1, 1, 0 }, { 0, 0, 1, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } }, {//180 { 1, 1, 0, 0 }, { 1, 0, 0, 0 }, { 1, 0, 0, 0 }, { 0, 0, 0, 0 } }, {//270 { 1, 0, 0, 0 }, { 1, 1, 1, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } } }, {//S形状 {//zoro { 0, 1, 1, 0 }, { 1, 1, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } }, {//90 { 1, 0, 0, 0 }, { 1, 1, 0, 0 }, { 0, 1, 0, 0 }, { 0, 0, 0, 0 } }, {//180 { 0, 1, 1, 0 }, { 1, 1, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } }, {//270 { 1, 0, 0, 0 }, { 1, 1, 0, 0 }, { 0, 1, 0, 0 }, { 0, 0, 0, 0 } } }, {//Z形状 {//zoro { 1, 1, 0, 0 }, { 0, 1, 1, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } }, {//90 { 0, 1, 0, 0 }, { 1, 1, 0, 0 }, { 1, 0, 0, 0 }, { 0, 0, 0, 0 } }, {//180 { 1, 1, 0, 0 }, { 0, 1, 1, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } }, {//270 { 0, 1, 0, 0 }, { 1, 1, 0, 0 }, { 1, 0, 0, 0 }, { 0, 0, 0, 0 } } } }; //成员定义 /** * 当前的形状 **/ private int shape; /** * 当前砖块的颜色 **/ public java.awt.Color color; /** * 当前砖块的起始坐标,该坐标是相对于 * BoarddInfo数组坐标 * 用于绘制砖块时,需要计算实际的XY位置 **/ public int X,Y; /** * 当前颜色的颜色索引,在Board的colors数组中定义的索引 * 该索引值对应的颜色应当和Color一致。 **/ public int color_index; /** * 当前的角度 **/ private int angle; // 成员函数 /** * * 构造函数,创建一个砖块形状对象 * <p> * @param shape 砖块的形状,其值应当为0-MAX_SHAPE_NUM-1, * 如果其超过MAX_SHAPE_NUM,则取其与MAX_SHAPE_NUM的余数 * <p> * @param angle 砖块当前旋转角度,范围为0-3,如果其超过3,则取其3的余数 * <p> * @param color */ public Brick3D(int shape, int angle, java.awt.Color color) { this.shape = shape % MAX_SHAPE_NUM; this.color = color; this.angle = angle % 4; X = -1; Y = -1; } /** * 重新设置各个参数 */ public void reset(int shape, int angle, java.awt.Color color) { this.shape = shape % MAX_SHAPE_NUM; this.color = color; this.angle = angle % 4; } /** * 返回向前砖块的信息矩阵 * @return 砖块的信息矩阵 */ public int[][] getShapeInfo() { return BRICK_INFO[shape][angle]; } /** * 返回当前的角度 * @return 当前的角度值,范围为0-3 */ public int getAngle() { return angle % 4; } /** * 返回当前的形状 * @return 当前的形状 */ public int getShape() { return shape; } /** * 按照指定的角度旋转砖块 * @param angle 旋转的角度,其定义只能为下列值,否则将不执行 * */ public void rotate(int angle) { if ((angle>=ROTATION_0)&&(angle<=ROTATION_270)) { this.angle+=angle; this.angle %= 4; } } /** * 在指定的Grahpics对象上绘制砖块 * <p> * @param g Graphics对象,砖块要画在其上 * @param startX 砖块相对于Graphics的起始位置X坐标 * @param startY 砖块相对于Graphics的起始位置X坐标 */ public void paint(java.awt.Graphics g, int startX, int startY) { g.setColor(color); for (int i=0;i<4;i++) { for(int j=0;j<4;j++) { if (BRICK_INFO[shape][angle][i][j] == 1) { g.fill3DRect(startX + j*CELL_WIDTH, startY + i*CELL_HEIGHT, CELL_WIDTH, CELL_HEIGHT, true); } } } } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -