importjava.awt.*;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.awt.event.KeyEvent;importjava.awt.event.KeyListener;importjavax.swing.*;importjavax.swing.Timer;publicclassTetrisextendsJFrame {publicTetris() { Tetrisblok a=newTetrisblok();
addKeyListener(a);
add(a);
}publicstaticvoidmain(String[] args) {
Tetris frame=newTetris();
JMenuBar menu=newJMenuBar();
frame.setJMenuBar(menu);
JMenu game=newJMenu("游戏");
JMenuItem newgame=game.add("新游戏");
JMenuItem pause=game.add("暂停");
JMenuItem goon=game.add("继续");
JMenuItem exit=game.add("退出");
JMenu help=newJMenu("帮助");
JMenuItem about=help.add("关于");
menu.add(game);
menu.add(help);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(220,275);
frame.setTitle("Tetris内测版");//frame.setUndecorated(true);frame.setVisible(true);
frame.setResizable(false);
}
}//创建一个俄罗斯方块类classTetrisblokextendsJPanelimplementsKeyListener {//blockType 代表方块类型//turnState代表方块状态privateintblockType;privateintscore=0;privateintturnState;privateintx;privateinty;privateinti=0;intj=0;intflag=0;//定义已经放下的方块x=0-11,y=0-21;int[][] map=newint[13][23];//方块的形状 第一组代表方块类型有S、Z、L、J、I、O、T 7种 第二组 代表旋转几次 第三四组为 方块矩阵privatefinalintshapes[][][]=newint[][][] {//i{ {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,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,0,0,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} } };//生成新方块的方法publicvoidnewblock() {
blockType=(int) (Math.random()*1000)%7;
turnState=(int) (Math.random()*1000)%4;
x=4;
y=0;if(gameover(x, y)==1) {
newmap();
drawwall();
score=0;
JOptionPane.showMessageDialog(null,"GAME OVER");
}
}//画围墙publicvoiddrawwall() {for(i=0; i<12; i++) {
map[i][21]=2;
}for(j=0; j<22; j++) {
map[11][j]=2;
map[0][j]=2;
}
}//初始化地图publicvoidnewmap() {for(i=0; i<12; i++) {for(j=0; j<22; j++) {
map[i][j]=0;
}
}
}//初始化构造方法Tetrisblok() {
newblock();
newmap();
drawwall();
Timer timer=newTimer(1000,newTimerListener());
timer.start();
}//旋转的方法publicvoidturn() {inttempturnState=turnState;
turnState=(turnState+1)%4;if(blow(x, y, blockType, turnState)==1) {
}if(blow(x, y, blockType, turnState)==0) {
turnState=tempturnState;
}
repaint();
}//左移的方法publicvoidleft() {if(blow(x-1, y, blockType, turnState)==1) {
x=x-1;
}
;
repaint();
}//右移的方法publicvoidright() {if(blow(x+1, y, blockType, turnState)==1) {
x=x+1;
}
;
repaint();
}//下落的方法publicvoiddown() {if(blow(x, y+1, blockType, turnState)==1) {
y=y+1;
delline();
}
;if(blow(x, y+1, blockType, turnState)==0) {
add(x, y, blockType, turnState);
newblock();
delline();
}
;
repaint();
}//是否合法的方法publicintblow(intx,inty,intblockType,intturnState) {for(inta=0; a<4; a++) {for(intb=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]==2))) {return0;
}
}
}return1;
}//消行的方法publicvoiddelline() {intc=0;for(intb=0; b<22; b++) {for(inta=0; a<12; a++) {if(map[a][b]==1) {
c=c+1;if(c==10) {
score+=10;for(intd=b; d>0; d--) {for(inte=0; e<11; e++) {
map[e][d]=map[e][d-1];
}
}
}
}
}
c=0;
}
}//判断你挂的方法publicintgameover(intx,inty) {if(blow(x, y, blockType, turnState)==0) {return1;
}return0;
}//把当前添加mappublicvoidadd(intx,inty,intblockType,intturnState) {intj=0;for(inta=0; a<4; a++) {for(intb=0; b<4; b++) {if(map[x+b+1][y+a]==0) {
map[x+b+1][y+a]=shapes[blockType][turnState][j];
}
;
j++;
}
}
}//画方块的的方法publicvoidpaintComponent(Graphics g) {super.paintComponent(g);//画当前方块for(j=0; j<16; j++) {if(shapes[blockType][turnState][j]==1) {
g.fillRect((j%4+x+1)*10, (j/4+y)*10,10,10);
}
}//画已经固定的方块for(j=0; j<22; j++) {for(i=0; i<12; i++) {if(map[i][j]==1) {
g.fillRect(i*10, j*10,10,10);
}if(map[i][j]==2) {
g.drawRect(i*10, j*10,10,10);
}
}
}
g.drawString("score="+score,125,10);
g.drawString("抵制不良游戏,",125,50);
g.drawString("拒绝盗版游戏。",125,70);
g.drawString("注意自我保护,",125,90);
g.drawString("谨防受骗上当。",125,110);
g.drawString("适度游戏益脑,",125,130);
g.drawString("沉迷游戏伤身。",125,150);
g.drawString("合理安排时间,",125,170);
g.drawString("享受健康生活。",125,190);
}//键盘监听publicvoidkeyPressed(KeyEvent e) {switch(e.getKeyCode()) {caseKeyEvent.VK_DOWN:
down();break;caseKeyEvent.VK_UP:
turn();break;caseKeyEvent.VK_RIGHT:
right();break;caseKeyEvent.VK_LEFT:
left();break;
}
}//无用publicvoidkeyReleased(KeyEvent e) {
}//无用publicvoidkeyTyped(KeyEvent e) {
}//定时器监听classTimerListenerimplementsActionListener {publicvoidactionPerformed(ActionEvent e) {
repaint();if(blow(x, y+1, blockType, turnState)==1) {
y=y+1;
delline();
}
;if(blow(x, y+1, blockType, turnState)==0) {if(flag==1) {
add(x, y, blockType, turnState);
delline();
newblock();
flag=0;
}
flag=1; } ; } }}