Last year has learned this technology, has not been to write, now take a time to write a Tetris game.
Only simple new game, pause, continue, integration function. The simple realization of the Russian classic function.
Not introduced, interested in their own run, the back posted a picture.
Package Cn.hncu;
Import Java.awt.Color;
Import Java.awt.Font;
Import Java.awt.Graphics;
Import java.awt.event.ActionEvent;
Import Java.awt.event.ActionListener;
Import Java.awt.event.KeyAdapter;
Import java.awt.event.KeyEvent;
Import Javax.swing.JFrame;
Import Javax.swing.JMenu;
Import Javax.swing.JMenuBar;
Import Javax.swing.JMenuItem;
Import Javax.swing.JOptionPane;
Import Javax.swing.JPanel;
Import Javax.swing.Timer;
public class Tetris extends jframe{public static void Main (string[] args) {Tetris te = new Tetris ();
Te.setvisible (TRUE);
If you add an edit box in the interface that will preempt the focus, you need to use the following code//te.requestfocus (TRUE);//Let the game panel get the focus--grab the keyboard monitor} private Tetrispanel TP;
JMenuItem Itempause;
JMenuItem itemcontinue;
Public Tetris () {this.setdefaultcloseoperation (exit_on_close);
This.setlocation (700, 200);
This.setsize (220, 275);
This.setresizable (FALSE);
TP = new Tetrispanel ();
This.getcontentpane (). Add (TP);
Add menu JMenuBar menubar = new JMenuBar ();
This.setjmenubar (menubar); JMenu MenuGame = new JMenu ("game");
Menubar.add (Menugame);
JMenuItem = Itemnew = new JMenuItem ("New Game");
Itemnew.setactioncommand ("new");
Itempause = new JMenuItem ("Paused");
Itempause.setactioncommand ("pause");
Itemcontinue = new JMenuItem ("continue");
Itemcontinue.setactioncommand ("continue");
Itemcontinue.setenabled (FALSE);
Menugame.add (itemnew);
Menugame.add (Itempause);
Menugame.add (itemcontinue);
Menulistener Menulistener = new Menulistener ();
Itemnew.addactionlistener (Menulistener);
Itempause.addactionlistener (Menulistener);
Itemcontinue.addactionlistener (Menulistener);
Let the whole jframe add keyboard monitor This.addkeylistener (Tp.listener); Class Menulistener implements actionlistener{@Override public void actionperformed (ActionEvent e) {//Play new game if (E.
Getactioncommand (). Equals ("new")) {tp.newgame ();
} if (E.getactioncommand (). Equals ("pause")) {timer.stop ();
Itemcontinue.setenabled (TRUE);
Itempause.setenabled (FALSE); } if (E.getactioncommand (). Equals ("continue")) {Timer.restaRT ();
Itemcontinue.setenabled (FALSE);
Itempause.setenabled (TRUE);
}} private timer timer; Class Tetrispanel extends jpanel{//Square Shape://The first dimension represents the type of block (including 7: S, Z, L, J, I, O, T)//The second dimension represents the number of rotations//The 34th dimension represents the square matrix//shapes [Type] [Turnstate] [i] i--> block[i/4][i%4] int shapes[][][] = new int[][][] {/* template {{0,0,0,0,0,0,0,0, 0,0,0,0, 0,0,0,0}, {0, 0,
0,0,0,0,0,0, 0,0,0,0, * 0,0,0,0}, {0,0,0,0,0,0,0,0, 0,0,0,0, 0,0,0,0}, {0,0,0,0,0,0,0,0, * 0,0,0,0, 0,0,0,0}} * * I (※ Change the horizontal bar in version 1 from line 1th to line 2nd) {0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0}, {0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, {0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0}},//S {0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, {0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0}, {0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0} },//Z {{1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0}, {1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0}},//J {0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0}, {1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0}, {1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}},//O {1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},//L {1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0}, {1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0}, {0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}},//T {{0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 1, 0,0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0}, {1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 1, 0, 0, 0, 1, 1
, 0, 0, 1, 0, 0, 0, 0, 0, 0}}; private int blocktype;//block type private int turnstate;//rotation State private int x;//square position x--column position--column number private int y;//square position y--row position --line number private int map[][]=new int[13][23];//map: 12 columns 22 rows.
To prevent the crossing, the array is opened: 13 columns, 23 rows, private int delay=1000;
Public Timerkeylister listener=new Timerkeylister ();
private int score=0;//score Public Tetrispanel () {newgame ();
Nextblock ();
Timer = new timer (delay,listener);
Timer.start ();
public void Newgame () {blocktype = (int) (Math.random () *1000)%7;
Turnstate = (int) (Math.random () *1000)%4;
x=4;
y=0; for (int i=0;i<12;i++) {//GO column for (int j=0;j<21;j++) {//Walk line if (i==0 | | i==11) {//3 is the lattice of the interface border map[i][j]=3;//is supposedly just 0 and 1 away.
integers, but there is a special effect here with 3-}else{map[i][j]=0;
} if (Timer!=null) {timer.stop () Map[i][21]=3;//3 for the interface border;
} delay=1000; Timer = new Timer (delay,Listener);
Timer.start ();
private void Nextblock () {blocktype = (int) (Math.random () *1000)%7;
Turnstate = (int) (Math.random () *1000)%4;
x=4;
y=0;
Game Over if (Crash (x,y,blocktype,turnstate) ==0) {timer.stop ();
int option = Joptionpane.showconfirmdialog (This, "Game over!!, dare to come ...");
if (option = = joptionpane.ok_option) {newgame ();
else if (option = = joptionpane.no_option) {system.exit (0); }} private void Down () {if (Crash (x,y+1,blocktype,turnstate) ==0) {//note, here with y+1, is the judgment block down a grid, whether the corresponding position in the map is a stacked block or frame ad
D (x,y,blocktype,turnstate);//To save the information of the current box to the map Nextblock ();
}else{y++;
} repaint ();
private void Left () {if (x>=0) {x-= Crash (x-1,y,blocktype,turnstate);
} repaint ();
private void Right () {if (x<8) {x + = crash (x+1,y,blocktype,turnstate);
} repaint ();
private void Turn () {if (Crash (X,y,blocktype, (turnstate+1)%4) ==1) {turnstate = (turnstate+1)%4;
} repaint (); } private void Add (int x, int y, int blocktype, int turnstate) {for (int a=0; a<4; a++) {for (int b=0; b<4; b++) {if (Shapes[blocktype][turn
STATE][A*4+B] ==1) {Map[x+b+1][y+a] = 1;
}} trydelline ();
}//Line private void Trydelline () {for (int b=0;b<21;b++) {int c=1; for (int a=0;a<12;a++) {c &= map[a][b];//all 1,c result is 1} if (c==1) {//one line needs to be deleted//to move down a row for (int d=b; d> 0;
d--) {for (int e=0;e<11;e++) {Map[e][d] = map[e][d-1];
}//Add-score +=100;
Delay/=1.05;
Timer.setdelay (delay); }}//Parameter example: 4,3,2,3//judgment there is no collision private int crash (int x, int y, int blocktype, int turnstate) {for (int a=0; a< ; 4; a++) {for (int b=0; b<4; b++) {//if (shapes[blocktype][turnstate][a*4+b]==1 && map[x+b+1][y+a] ==1) | |// (Shapes[blocktype][turnstate][a*4+b]==1 && Map[x+b+1][y+a] ==3)) {//} if ((Shapes[blocktype][turnstate][a*4+b] & Map[x+b+1][y+a]) ==1) {return 0;//collision}}
1;//didn't collide.@Override public void Paint (Graphics g) {//Blocktype =6;//turnstate = 3;//x=4;//y=6;
Super.paint (g);//Eliminate Residual shadow G.setcolor (new Color (153,51,205)); Draw the current box for (int j=0;j<16;j++) {if (shapes[blocktype][turnstate][j]==1) {g.fillrect (j%4+x+1) *10, (j/4+y) *10, 10,
10);
G.setcolor (Color.cyan);
G.drawrect ((j%4+x+1) *10, (j/4+y) *10, 10, 10);
G.setcolor (New Color (153,51,205));
}//Draw the interface frame as well as the stacked block---the entire map g.setcolor (color.red);
for (int i=0;i<12;i++) {//GO column for (int j=0;j<22;j++) {//Walk row if (map[i][j]==3) {g.drawrect (i*10, j*10, 10, 10);
}else if (map[i][j]==1) {g.fillrect (i*10, j*10, 10, 10);
G.setcolor (Color.green);
G.drawrect (i*10, j*10, 10, 10);
G.setcolor (color.red);
}}//Show score, at the same time for the layout is beautiful, add something in the interface/draw the right part of the square g.setcolor (color.red);
G.setfont (New Font ("AA", Font.Bold, 11));
g.DrawString ("score=" + score, 130, 20);
G.setfont (New Font ("AA", Font.plain, 13));
G.setcolor (Color.Blue); g.DrawString ("Deny piracy games,", 125, 70); g.DrawString ("Pay attention to self protection.")
", 125, 90); g.DrawString ("Beware of Being fooled.")
", 125, 110);
g.DrawString ("Moderate game benefit Brain,", 125, 130); g.DrawString ("Addicted to the game kills.")
", 125, 150);
g.DrawString ("Reasonable arrangement of time,", 125, 170); g.DrawString ("Enjoy a healthy life.")
", 125, 190); Class Timerkeylister extends Keyadapter implements actionlistener{@Override public void actionperformed (Actioneve
NT e) {down (); @Override public void keypressed (KeyEvent e) {switch (E.getkeycode ()) {case KeyEvent.VK_DOWN:down ();
;
Case KeyEvent.VK_LEFT:left ();
Case KeyEvent.VK_RIGHT:right ();
Case KeyEvent.VK_UP:turn ();
Case KeyEvent.VK_F1:plug ();
Case KeyEvent.VK_F2:time ();
}} public void plug () {score+=100;
public void time () {delay = 1000;
Timer.setdelay (delay);
}
}
}
The above is the entire content of this article, I hope to help you learn, but also hope that we support the cloud habitat community.