From: http://topic.csdn.net/u/20100612/03/A8D7B257-4385-4BB8-82FF-4A51AC3BD810.html
Import Java. AWT. *; <br/> Import Java. AWT. event. actionevent; <br/> Import Java. AWT. event. actionlistener; <br/> Import Java. AWT. event. keyevent; <br/> Import Java. AWT. event. keylistener; <br/> Import javax. swing. *; <br/> Import javax. swing. timer; </P> <p> public class Tetris extends jframe {<br/> Public Tetris () {<br/> tetrisblok A = new tetrisblok (); <br/> addkeylistener (a); <br/> Add (a); <br/>}</P> <p> Publ IC static void main (string [] ARGs) {<br/> Tetris frame = new Tetris (); <br/> jmenubar menu = new jmenubar (); <br/> frame. setjmenubar (menu); <br/> jmenu game = new jmenu ("game"); <br/> jmenuitem newgame = game. add ("New Game"); <br/> jmenuitem pause = game. add ("Suspend"); <br/> jmenuitem goon = game. add ("continue"); <br/> jmenuitem exit = game. add ("exit"); <br/> jmenu help = new jmenu ("help"); <br/> jmenuitem about = He LP. add ("about"); <br/> menu. add (game); <br/> menu. add (HELP); <br/> frame. setlocationrelativeto (null); <br/> frame. setdefaclocloseoperation (jframe. exit_on_close); <br/> frame. setsize (220,275); <br/> frame. settitle (" RIS beta version"); <br/> // frame. setundecorated (true); <br/> frame. setvisible (true); <br/> frame. setresizable (false ); </P> <p >}< br/>}</P> <p> // create a Tetris class <br/> class tetrisblok extends jpanel im Plements keylistener {</P> <p> // blocktype indicates the block type <br/> // turnstate indicates the block status <br/> private int blocktype; <br/> private int score = 0; </P> <p> private int turnstate; </P> <p> private int X; </P> <p> private int y; </P> <p> private int I = 0; </P> <p> Int J = 0; <br/> int flag = 0; <br/> // defines the placed blocks x = 0-11, y = 0-21; <br/> int [] [] map = new int [13] [23]; </P> <p> // the first group of squares indicates the block type S, Z, L, J, I, O, and T. The second group indicates the number of times the third group is rotated. is Square Matrix <br/> private final int shapes [] [] [] = new int [] [] {<br/> // I <br/> {0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0}, <br/> {0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0}, <br/> {0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0}, <br/> {0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0 }}, <br/> // S <br/> {0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 },< br/> {1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0}, <br/> {0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, <br/> {1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }}, <br/> // z <br/> {1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0}, <br/> {0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0}, <br/> {1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0}, <br/> {0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0 }}, <Br/> // J <br/> {0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0 },< br/> {1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },< br/> {1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },< br/> {1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 }}, <br/> // o <br/> {1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, <br/> {1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },< br/> {1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, <br/> {1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }}, <br/> // L <br/> {1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0}, <br/> {1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, <br/> {1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0}, <br/> {0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 }}, <br/> // T <br/> {0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 },< br/> {0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0 },< br/> {1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 },< br/> {0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0 }}; </P> <p> // method for generating new blocks <br/> Public void newblock () {<br/> blocktype = (INT) (math. random () * 1000) % 7; <br/> turnstate = (INT) (math. random () * 1000) % 4; <br/> X = 4; <br/> Y = 0; <br/> If (gameover (x, y) = 1) {</P> <p> NEWMAP (); <br/> drawwall (); <br/> score = 0; <br/> joptionpane. showmessagedialog (null, "Game over"); <br/>}</P> <p> // draw a wall <br/> Public void drawwall () {<br/> for (I = 0; I <12; I ++) {<br/> map [I] [21] = 2; <br/>}< br/> for (j = 0; j <22; j ++) {<br/> map [11] [J] = 2; <br/> map [0] [J] = 2; <br/>}</P> <p> // initialize the map. <br/> Public void NEWMAP () {<br/> for (I = 0; I <12; I ++) {<br/> for (j = 0; j <22; j ++) {<br/> map [I] [J] = 0; <br/>}</P> <p> // initialization constructor <br/> tetrisblok () {<br/> newblock (); <br/> NEWMAP (); <br/> drawwall (); <br/> timer = new timer (1000, new timerlistener (); <br/> timer. start (); <br/>}</P> <p> // method of rotation <br/> Public void turn () {<br/> int tempturnstate = turnstate; <br/> turnstate = (turnstate + 1) % 4; <br/> If (blow (X, Y, blocktype, turnstate) = 1) {<br/>}< br/> If (blow (X, Y, blocktype, turnstate) = 0) {<br/> turnstate = tempturnstate; <br/>}< br/> repaint (); <br/>}</P> <p> // left shifting method <br/> Public void left () {<br/> If (blow (X-1, y, blocktype, turnstate) = 1) {<br/> X = x-1; <br/>}< br/>;< br/> repaint (); <br/>}</P> <p> // right shifting method <br/> Public void right () {<br/> If (blow (x + 1, y, blocktype, turnst Ate) = 1) {<br/> X = x + 1; <br/>}< br/> <br/> repaint (); <br/>}</P> <p> // method of dropping <br/> Public void down () {<br/> If (blow (X, Y + 1, blocktype, turnstate) = 1) {<br/> Y = Y + 1; <br/> delline (); <br/>}< br/>; <br/> If (blow (X, Y + 1, blocktype, turnstate) = 0) {<br/> Add (X, Y, blocktype, turnstate); <br/> newblock (); <br/> delline (); <br/>}< br/>; <br/> repaint (); <br/>}</P> <p> // Yes Valid method <br/> Public int blow (int x, int y, int blocktype, int turnstate) {<br/> for (int A = 0; A <4; A ++) {<br/> for (INT B = 0; B <4; B ++) {<br/> If (SHAPES [blocktype] [turnstate] [A * 4 + B] = 1) & (Map [x <br/> + B + 1] [Y + A] = 1 )) <br/> | (SHAPES [blocktype] [turnstate] [A * 4 + B] = 1) & (Map [x <br/> + B + 1] [Y + A] = 2) {</P> <p> return 0; <br/>}< br/> return 1; <BR/>}</P> <p> // Method for deleting rows <br/> Public void delline () {<br/> int C = 0; <br/> for (INT B = 0; B <22; B ++) {<br/> for (int A = 0; A <12; A ++) {<br/> If (Map [a] [B] = 1) {</P> <p> C = C + 1; <br/> If (C = 10) {<br/> score + = 10; <br/> for (INT d = B; D> 0; d --) {<br/> for (int e = 0; e <11; E ++) {<br/> map [E] [d] = map [E] [d-1]; </P> <p >}< br/> C = 0; <br/>}< B R/>}</P> <p> // determine the method you are using. <br/> Public int gameover (int x, int y) {<br/> If (blow (X, Y, blocktype, turnstate) = 0) {<br/> return 1; <br/>}< br/> return 0; <br/>}</P> <p> // Add the current Map <br/> Public void add (int x, int y, int blocktype, int turnstate) <br/> Int J = 0; <br/> for (int A = 0; A <4; A ++) {<br/> for (INT B = 0; B <4; B ++) {<br/> If (Map [x + B + 1] [Y + A] = 0) {<br/> map [x + B + 1] [Y + A] = shapes [blocktype] [turnstate] [J]; <br/>}< br/>;< br/> J ++; <br/>}</P> <p> // Method for drawing blocks <br/> Public void paintcomponent (Graphics g) {<br/> super. paintcomponent (g); <br/> // draw the current square <br/> for (j = 0; j <16; j ++) {<br/> If (SHAPES [blocktype] [turnstate] [J] = 1) {<br/> G. fillrect (J % 4 + x + 1) * 10, (J/4 + y) * 10, 10, 10 ); <br/>}< br/> // draw fixed blocks <br/> (J = 0; j <22; j ++) {<br/> for (I = 0; I <12; I ++) {<br/> If (Map [I] [J] = 1) {<br/> G. fillrect (I * 10, J * 10, 10, 10); </P> <p >}< br/> If (Map [I] [J] = 2) {<br/> G. drawrect (I * 10, J * 10, 10, 10); </P> <p >}< br/> G. drawstring ("score =" + score, 125, 10); <br/> G. drawstring ("Resist poor games,", 125, 50); <br/> G. drawstring ("reject pirated games. ", 125, 70); <br/> G. drawstring (" Pay attention to self-protection, ", 125, 90); <br/> G. drawstring (" Beware of fraud. ", 125,110); <br/> G. drawstring (" moderate game benefits brain, ", 125,130); <br/> G. drawstring (" indulge in game injury. ", 125,150); <br/> G. drawstring (" reasonably scheduled time, ", 125,170); <br/> G. drawstring (" enjoy a healthy life. ", 125,190); <br/>}</P> <p> // keyboard listener <br/> Public void keypressed (keyevent E) {<br/> switch (E. getkeycode () {<br/> case keyevent. vk_down: <br/> down (); <br/> break; <br/> case keyevent. vk_up: <br/> turn (); <br/> break; <br/> case keyevent. vk_right: <br/> right (); <br/> break; <br/> case keyevent. vk_left: <br/> left (); <br/> break; <br/>}</P> <p> // useless <br/> Public void keyreleased (keyevent E) {<br/>}</P> <p> // useless <br/> Public void keytyped (keyevent E) {<br/>}</P> <p> // timer listener <br/> class timerlistener implements actionlistener {<br/> Public void actionreceivmed (actionevent E) {</P> <p> repaint (); <br/> If (blow (X, Y + 1, blocktype, turnstate) = 1) {<br/> Y = Y + 1; <br/> delline (); <br/>}< br/>; <br/> If (blow (X, Y + 1, blocktype, turnstate) = 0) {</P> <p> If (flag = 1) {<br/> Add (X, Y, blocktype, turnstate); <br/> delline (); <br/> newblock (); <br/> flag = 0; <br/>}< br/> flag = 1; <br/>}< br/>; <br/>}< br/>}