// Play3D.java sssssssssssss // Part of Tetris3D.java, V1.0 // Sunday, Oct. 29, 2000, by Yamin Li, yamin@k.hosei.ac.jp // Free to use, modify, and distribute. import java.awt.*; class Play3D extends Canvas { // // | // +------+------+ // | | // O-----+-------------+-------> Z // eye | | // +------+------+ // 5 | 5 5 // view // plane // private static final int rows=5; private static final int cols=5; private static final int deps=10; private static final int ssize=30; private static final int lsize=90; // =ssize*3; focus=deps/2=5 private static final int window=450; // =lsize*5 private static final int half=225; // =window/2 private static final int thirdth=150; // =window/3 private static final Color mark=Color.lightGray; private static final Color shapeColor[]={ Color.green, Color.blue, Color.red, Color.magenta, Color.pink, Color.orange, Color.cyan, Color.yellow, Color.green, Color.red}; private static final int empty=0; private static final int occupied=1; private static final int moving=-1; private boolean leftOutSide=false, rightOutSide=false; private boolean upOutSide=false, downOutSide=false, frontOutSide=false; private boolean noPlace=false, drop=false, gameOver=false; private int score=0, level=0, layers=0, delay=2000, height=0; private int shapeType=0; private int tryPositionX=2, tryPositionY=1, tryPositionZ=0; private int tryX[], tryY[], tryZ[]; private int currentPositionX=2, currentPositionY=1, currentPositionZ=0; private int currentX[], currentY[], currentZ[]; private int tryStateX[], tryStateY[], tryStateZ[]; private int currentStateX[], currentStateY[], currentStateZ[]; private Image displayBuffer; private Graphics drawingBuffer; private int playArea[][][]; private Color myColor; private int rectPoint[]; private int rectLength[]; private int px[]; private int py[]; public void init(){ rectPoint=new int[deps+1]; rectLength=new int[deps+1]; for (int i=0; i<=deps; i++){ rectPoint[i]=half-half*window/(window+lsize*i); rectLength[i]=window*window/(window+lsize*i); } setSize(window+100, window+30); displayBuffer=createImage(window+100, window+30); drawingBuffer=displayBuffer.getGraphics(); playArea=new int[cols][rows][deps+1]; // XYZ tryX=new int[Shape3D.pieces]; tryY=new int[Shape3D.pieces]; tryZ=new int[Shape3D.pieces]; currentX=new int[Shape3D.pieces]; currentY=new int[Shape3D.pieces]; currentZ=new int[Shape3D.pieces]; tryStateX=new int[Shape3D.pieces]; tryStateY=new int[Shape3D.pieces]; tryStateZ=new int[Shape3D.pieces]; currentStateX=new int[Shape3D.pieces]; currentStateY=new int[Shape3D.pieces]; currentStateZ=new int[Shape3D.pieces]; drop=false; score=0; level=0; layers=0; height=0; clearPlayArea(); myColor=new Color(0x1f, 0xbf, 0xaf); px=new int[4]; py=new int[4]; generateNewBlock(); } public void paint(Graphics g){ drawBack(); drawBlocks(); drawMsg(); g.drawImage(displayBuffer,0,0,this); } public void drawBack(){ int i; drawingBuffer.setColor(Color.darkGray); drawingBuffer.fillRect(0, 0, window+1, window+1); drawingBuffer.setColor(mark); for (i=1; i=0; k--){ for (i=0; i2) if (playArea[i-1][j][k]==empty) drawLeft(i, j, k); if (i<2) if (playArea[i+1][j][k]==empty) drawRight(i, j, k); if (j>2) if (playArea[i][j-1][k]==empty) drawTop(i, j, k); if (j<2) if (playArea[i][j+1][k]==empty) drawBottom(i, j, k); } } } for (i=0; iheight) height=deps-currentZ[i]; } if (removeLayers()) repaint(); generateNewBlock(); drop=false; repaint(); return; } tryPositionX=currentPositionX; tryPositionY=currentPositionY; tryPositionZ=currentPositionZ; for (i=0; id) d=-tryX[i]; } if (leftOutSide){ for (i=0; i(cols-1)){ rightOutSide=true; if ((tryX[i]-(cols-1))>d) d=tryX[i]-(cols-1); } if (rightOutSide){ for (i=0; id) d=-tryY[i]; } if (upOutSide){ for (i=0; i(rows-1)){ downOutSide=true; if ((tryY[i]-(rows-1))>d) d=tryY[i]-(rows-1); } if (downOutSide){ for (i=0; id) d=-tryZ[i]; } if (frontOutSide){ for (i=0; i0; k--){ boolean removeThisLayer=true; for (i=0; i0; h--) for (i=0; i>4; return(removed); } public void clearPlayArea(){ int i, j, k; for (i=0; i