java俄罗斯方块代码_[转载]java编写的一个俄罗斯方块(源代码)

这是一个Java编写的俄罗斯方块程序,具备开始、暂停和重来功能,且根据等级调整下落速度。程序包含游戏控制菜单、预览框,并提供了详细的操作帮助和作者信息。
摘要由CSDN通过智能技术生成

用java写的一个俄罗斯方块程序,实现了开始、暂停、重来,提供预览框,可根据等级加快下落速度。(下附程序运行时截图)。

a4c26d1e5885305701be709a3d33442f.png

源代码:

import

java.awt.BorderLayout;

import

java.awt.Graphics;

import

java.awt.event.ActionEvent;

import

java.awt.event.ActionListener;

import

java.awt.event.KeyEvent;

import

java.awt.event.KeyListener;

import

java.util.Random;

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 Test3 extends JFrame implements ActionListener{

JMenu control=new JMenu("控制");

JMenuItem start=new

JMenuItem("开始");

JMenuItem pause=new

JMenuItem("暂停");

JMenuItem restart=new

JMenuItem("重来");

JMenu explain=new JMenu("说明");

JMenuItem help=new JMenuItem("帮助");

JMenuItem about=new

JMenuItem("关于");

JMenuBar menu=new JMenuBar();

Block2 block;

Thread main;

public Test3(){

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

control=new JMenu("控制");

start=new JMenuItem("开始");

start.addActionListener(this);

pause=new JMenuItem("暂停");

pause.addActionListener(this);

restart=new JMenuItem("重来");

restart.addActionListener(this);

explain=new JMenu("说明");

help=new JMenuItem("帮助");

help.addActionListener(

new ActionListener(){

public void actionPerformed(ActionEvent arg0)

{

JOptionPane.showMessageDialog(null,

"左右键挪动,n空格健翻转,n每一千分为一级","帮助",JOptionPane.INFORMATION_MESSAGE );

// TODO Auto-generated method stub

}

});

about=new JMenuItem("关于");

about.addActionListener(

new ActionListener(){

public void actionPerformed(ActionEvent arg0)

{

JOptionPane.showMessageDialog(null,"本俄罗斯方块由汤孟峥同学实验编写,n qq:1254074275,欢迎交流","关于",JOptionPane.INFORMATION_MESSAGE);

// TODO Auto-generated method stub

}

});

menu=new JMenuBar();

block=new Block2();

main=new Thread(block);

control.add(start);

control.add(pause);

control.add(restart);

explain.add(help);

explain.add(about);

menu.add(control);

menu.add(explain);

;

add(block);

setJMenuBar(menu);

this.addKeyListener(block);

setSize(260,300);

setVisible(true);

}

public static void main(String [] args){

Test3 test=new Test3();

}

@Override

public void actionPerformed(ActionEvent e) {

if(e.getSource()==start)

{ if(block.getPause()==0)

main.start();

else

block.getTimer().start();

}

else if(e.getSource()==pause)

{

block.pause();

}

else if(e.getSource()==restart)

{

block.inite();

block.getTimer().restart();

}

}

}

class

Block2 extends JPanel implements

KeyListener,Runnable{

ActionListener listener=new

ActionListener(){

public void actionPerformed(ActionEvent

e){

repaint();

fall();

}

};

private static final long serialVersionUID = 1L;

int map [][] =new int[12][22];

int map2[][]={{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}};

int time=1000;

private Timer timer=new Timer(time,listener);

int start;

private int pause;

int stap; //第几级

int x=4;

int y=1;

long score;

int gameover;

int candown,cannew; //两把锁

int type=0,state=0;

int nexttype,nextstate;

public Timer getTimer() {

return timer;

}

public void setTimer(Timer timer) {

this.timer = timer;

}

public int getX() {

return x;

}

public void setX(int x) {

this.x = x;

}

public int getY() {

return y;

}

public void setY(int y) {

this.y = y;

}

public int getPause() {

return pause;

}

public void setPause(int pause) {

this.pause = pause;

}

int shapes[][][]=

{

//方块

{

{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,1,1,0, 0,1,1,0 ,0,0,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},

{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}

},

//L形

{

{0,1,0,0, 0,1,0,0, 0,1,1,0, 0,0,0,0},

{0,0,0,0, 0,0,1,0, 1,1,1,0, 0,0,0,0},

{0,1,1,0, 0,0,1,0, 0,0,1,0, 0,0,0,0},

{0,0,0,0, 1,1,1,0, 1,0,0,0, 0,0,0,0}

},

//反L形

{

{0,0,1,0, 0,0,1,0, 0,1,1,0, 0,0,0,0},

{0,0,0,0, 1,1,1,0, 0,0,1,0, 0,0,0,0},

{0,1,1,0, 0,1,0,0, 0,1,0,0, 0,0,0,0},

{0,0,0,0, 1,0,0,0, 1,1,1,0, 0,0,0,0}

},

//左高右低

{

{0,1,0,0, 0,1,1,0, 0,0,1,0, 0,0,0,0},

{0,0,0,0, 0,0,1,1, 0,1,1,0, 0,0,0,0},

{0,1,0,0, 0,1,1,0, 0,0,1,0, 0,0,0,0},

{0,0,0,0, 0,0,1,1, 0,1,1,0, 0,0,0,0}

},

//右高左低

{

{0,0,1,0, 0,1,1,0, 0,1,0,0, 0,0,0,0},

{0,0,0,0, 1,1,0,0, 0,1,1,0, 0,0,0,0},

{0,0,1,0, 0,1,1,0, 0,1,0,0, 0,0,0,0},

{0,0,0,0, 1,1,0,0, 0,1,1,0, 0,0,0,0}

},

//T形

{

{0,0,0,0, 0,1,0,0, 1,1,1,0, 0,0,0,0},

{0,0,1,0, 0,1,1,0, 0,0,1,0, 0,0,0,0},

{0,0,0,0, 1,1,1,0, 0,1,0,0, 0,0,0,0},

{ 0,1,0,0, 0,1,1,0, 0,1,0,0, 0,0,0,0}

}

};

void inite(){

start=0;

pause=0;

time=1000;

stap=1;

x=4;

y=1;

score=0;

gameover=0;

candown=0;

cannew=1; //两把锁

type=0;

state=0;

//状态0作为边界,状态1为底板,状态2为可动,状态3固定

for(int i=0;i<12;i++)

{

map[i][21]=0;

map[i][0]=1;

}

for(int j=0;j<22;j++)

{map[0][j]=0;

map[11][j]=0;

}

for(int a=1;a<11;a++)

for(int b=1;b<21;b++)

map[a][b]=1;

}

public void newblock(){

if(start==0)

{

type=new

Random().nextInt(7);

state=new Random().nextInt(4);

start=1;

}

else{

type=nexttype ;

state=nextstate;

}

nexttype=new Random().nextInt(7);

nextstate=new Random().nextInt(4);

x=4;

y=1;

for(int k=0;k<16;k++)

if(shapes[type][state][k]==1)

map[x+k%4][y+k/4]=2;

candown=1;

}

public void paint(Graphics g){

super.paint(g); //清除缓存

for(int i=0;i<12;i++)

for(int j=1;j<22;j++)

{ if(map[i][j]==0)

{

g.drawRect(20+10*i,10*j-10,10,10);

}

if(map[i][j]==2||map[i][j]==3)

g.fillRect(20+10*i,10*j-10,10,10);

}

if(start==1)

{

preview(g);

}

g.drawString("分数

: "+score,150, 50);

g.drawString("第"+stap+"级", 150, 30);

}

public void fall(){

if(candown==1)

down();

if(cannew==1)

{newblock();

cannew=0;

}

}

public void down(){

for(int a=1;a<11;a++)

for(int

b=1;b<21;b++)

if(map[a][b]==2&&(map[a][b+1]==0||map[a][b+1]==3))

{

candown=0;

}

if(candown==1)

y++;

if(candown==0)

{for(int a=1;a<11;a++)

for(int

b=1;b<21;b++)

if(map[a][b]==2)

{

map[a][b]=3;

candown=0;

cannew=1;

}

//已经触底,判断是否有满行

fulllinejudge();

for(int i=1;i<11;i++)

for(int

j=1;j<21;j++)

if(map[i][j]==3&&j<=2)

{ cannew=0;

gameover=1;

JOptionPane.showMessageDialog(null, "Game Over !");

System.exit(0);

}

}

if(candown==1)

{for(int i=10;i>0;i--)

for(int j=20;j>0;j--)//很有意思的一个逻辑啊,如果是j递增效果则完全不同

{

if(map[i][j]==2&&(map[i][j+1]==1||map[i][j+1]==2))

{ if(map[i][j-1]==3)

{

map[i][j+1]=map[i][j];

map[i][j]=1;

}

else

{

map[i][j+1]=map[i][j];

map[i][j]=map[i][j-1];

}

// y++;

//为什么不能够在这里y++

// System.out.println(y);

}

}

repaint();

}

}

public void fulllinejudge(){

for(int j=20;j>1;j--)

{

int i=1;

while(map[i][j]==3)

i++;

// System.out.printf("at the %d line have %d blockn",j,i);

if(i==11)//满行

{

// for(int k=1;k<11;k++)

// map[k][j]=1;

for(int

a=1;a<11;a++)

for(int b=j;b>1;b--)

map[a][b]=map[a][b-1];

score=score+100;

if(score!=0&&score00==0)

{

time=time-100;

stap++;

timer.setDelay(time);

}

j++;

}

repaint();

}

}

public Block2(){

inite();

}

public

void turn(){

// System.out.printf("x=%d,y=%dn",x,y);

int k=0;

int flag=0;

while(k<16)

{ if(shapes[type][state][k]==1)

if(x+k%4>=1&&x+k%4<=10&&y+k/4<=20&&map[x+k%4][y+k/4]!=3)

{

//System.out.println(x+k%4);

flag++;

}

k++;

}

if(flag==4)

{for(int i=1;i<11;i++)

for(int j=1;j<21;j++)

if(map[i][j]==2)

{

map[i][j]=1;

}

for(k=0;k<16;k++)

if(shapes[type][state][k]==1)

{map[x+k%4][y+k/4]=2;

}

state=(state+1)%4;

repaint();

}

}

public

void keyPressed(KeyEvent e) {

switch(e.getKeyCode())

{ case KeyEvent.VK_SPACE:

turn();

break;

case KeyEvent.VK_LEFT:

tryleft();

break;

case KeyEvent.VK_RIGHT :

tryright();

break;

case KeyEvent.VK_DOWN:

down();

break;

}

// TODO Auto-generated method stub

}

public

void tryleft(){

int flag=1;

for(int i=1;i<11;i++)

for(int j=1;j<21;j++)

if(map[i][j]==2&&(map[i-1][j]==0||map[i-1][j]==3))

flag=0;

if(flag==1)

{for(int i=1;i<11;i++)

for(int j=1;j<21;j++)

if(map[i][j]==2&&(map[i+1][j]==1||map[i+1][j]==2))

{

map[i-1][j]=map[i][j];

map[i][j]=map[i+1][j];

}

else if(map[i][j]==2)

{

map[i-1][j]=map[i][j];

map[i][j]=1;

}

x--;

repaint();

}

}

public

void tryright(){

int flag=1;

for(int i=1;i<11;i++)

for(int j=1;j<21;j++)

if(map[i][j]==2&&(map[i+1][j]==0||map[i+1][j]==3))

flag=0;

if(flag==1)

{for(int i=10;i>0;i--)

for(int j=1;j<21;j++)

if(map[i][j]==2&&(map[i-1][j]==1||map[i-1][j]==2))

{

map[i+1][j]=map[i][j];

map[i][j]=map[i-1][j];

}

else if(map[i][j]==2)

{

map[i+1][j]=map[i][j];

map[i][j]=1;

}

x++;

repaint();

}

}

public

void preview(Graphics g){

for(int i=0;i<4;i++)

for(int j=0;j<4;j++)

map2[i][j]=0;

for(int k=0;k<16;k++)

if(shapes[nexttype][nextstate][k]==1)

map2[k%4][k/4]=1;

for(int i=0;i<4;i++)

for(int j=0;j<4;j++)

if(map2[i][j]==1)

g.fillRect(160+10*i,70+10*j,10,10);

}

@Override

public

void keyReleased(KeyEvent arg0) {

// TODO Auto-generated method stub

}

@Override

public

void keyTyped(KeyEvent arg0) {

}

@Override

public

void run() {

// for(int i=0;

;i++)

// System.out.println("hello

world

!");

timer.start();

}

// TODO Auto-generated method stub

public

void pause(){

pause=1;

timer.stop();

}

}

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值