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

源代码:

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();

}

}

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

  1. java dijkstra算法代码_[转载]Java实现dijkstra算法: 地图中任意起点寻找最佳路径...

    最近在复习java,下学期要用,写这个练手.  技术较粗糙,见谅. 代码里用的是这幅地图,根据实际情况更改,在addNode方法中 这个是运行结果,起点和终点在 运行wrap(String qidia ...

  2. java string()函数_转载java String.split()函数的用法详解

    转载java String.split()函数的用法详解 如果您发现本文排版有问题,可以先点击下面的链接切换至老版进行查看!!!在java.lang包中有String.split()方法的原型是: p ...

  3. java服务器代码_简单java服务器

    [java]代码库import java.io.InputStream; import java.io.OutputStream; import java.net.*; public class Ch ...

  4. java华容道代码_华容道Java游戏源代码JAVA游戏源码下载

    鉴于JAVA的华容道游戏源码,希望对研讨JAVA游戏的朋友有所帮助.最初运行于西门子是非屏手机上. 华容道Java游戏源代码 (1 folders, 2 files, 1.38 KB, 76.13 K ...

  5. java 云 代码_云端如何编写Java代码

    [IT168 技术]正如云厂商和虚拟计算提供商所宣传的转移到云端是一个无缝的流程,经验却告诉我们过于猛烈地脱离内部数据中心,部署到云端是一种复杂的方式.从部署流程到方式的所有事情,应用的监控.调试并性 ...

  6. 乐高机器人java程序代码_用JAVA编写一个乐高机器人躲避障碍物运动到目标点的程序....

    写出一个可以控制机器人的小程序,使机器人从一边到一个相对面,并至少跨越一个障碍物.规则如下:1,障碍物必须设置在机器人行走的路线上.2,空间的基本配置如插图3,不能用轨道之类的东西... 写出一个可以 ...

  7. java愤怒的小鸟代码_用java实现小游戏“愤怒的小鸟”附源码和效果演示

    推荐下我自己的群:6915 72518,不管你是小白还是大牛,小编我都挺欢迎,不定期分享干货,包括我自己整理的一份最新资料和零基础入门教程!,欢迎初学和进阶中的小伙伴 今天跟大家分享一个用纯Java代 ...

  8. java求约数_[转载]Java求最大公约数与最小公倍数

    (看到一份不错的总结,拿来收着) 如果数a能被数b整除,a就叫做b的倍数,b就叫做作a的约数.约数和倍数都表示一个数与另一个数的关系,不能单独存在.如只能说16是某数的倍数,2是某数的约数,而不能孤立 ...

  9. java斗地主代码_基于java实现斗地主代码实例解析

    斗地主 规则: 1. 组装54张扑克牌 2. 将54张牌顺序打乱 3. 三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌. 4. 查看三人各自手中的牌(按照牌的大小排序).底牌 手中扑克 ...

  10. java秒表代码_秒表 - java代码库 - 云代码

    [java]代码库package Day0822; import java.awt.event.*; import javax.swing.*; import java.awt.*; public c ...

最新文章

  1. k8s master ping不通node_搭建k8s可用集群
  2. 皮一皮:据说金庸老爷子的凌波微步已被证实存在并已经广为流传...
  3. android 控件遮盖,Android手机软键盘遮挡布局控件
  4. python自动化干什么-python已经自动化了,大家一般用什么测试框架?
  5. 基于python的游戏设计与实现-python五子棋游戏的设计与实现
  6. WinForm应用只运行一次
  7. IIS6+asp.net 2.0+HTTP 错误 404 - 文件或目录未找到:您正在搜索的页面可能已经删除、更名或暂时不可用。...
  8. 沃土云创首批方案认证伙伴授牌,华为云与伙伴共创云原生产业新价值
  9. c/s架构nginx+php-fpm通信原理
  10. SharePoint 创建 Lookup 类型的Site Column解决跨站问题
  11. python 遗传算法书籍推荐_遗传算法(1) - Python实现
  12. Oracle数据库的数据类型
  13. DSP开发,使用CCS软件建立工程以及烧录
  14. JAVA刺客信条大革命_黑色沙漠单机版
  15. 代写python代码一般多少钱_代写代码一般多少钱(专业解读)
  16. 凹点匹配分割 matlab,基于凹点和重心检测的粘连类圆形目标图像分割
  17. [状压DP]帮助Bubu
  18. 马云在大学学计算机,IT大佬高考成绩单:李彦宏是状元 马云数学仅1分
  19. java学习笔记(22)java输入标签,单选框,复选框,添加文件,文本域,下拉框
  20. manager objects is not callable(管理器对象不可调用)

热门文章

  1. JS版的bin2hex和hex2bin,支持汉字
  2. 初学Python选什么版本?
  3. 手机抓直播源工具app_东方卫视 手机在线直播 央视源
  4. win7计算机里没有网络图标,Win7网络图标不见了?找回网络图标的方法
  5. sql服务器密码如何显示,如何查看sql数据库密码
  6. 2003系统企业版镜像服务器,Windows Server 2003 R2/SP2简体中文企业版原版镜像
  7. 编码格式详解:多字节字符集和Unicode字符集
  8. [高级操作系统课程] 各大名校 ppt,pdf 课件整理(course materials)
  9. java对音频文件的频谱分析
  10. linux使用命令修改端口映射,linux端口映射命令是什么?使用iptables做端口映射shell的方法...