俄罗斯方块带背景音乐

很简单,一个主类运行基本操作,一个音乐类播放背景音乐。

一、运行结果

二、程序结构


g)

三、Block类

package 俄罗斯方块;import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import 俄罗斯方块.Music;import java.applet.*;
import java.lang.String.*;
import java.util.concurrent.TimeUnit;
import java.lang.*;
import java.io.*;public class Block extends JPanel implements ActionListener,KeyListener//继承JPanel
{static Button but[] = new Button[6];//设置按钮数组static Button noStop = new Button("取 消 暂 停");static Label scoreLab = new Label("分数:");//静态标记static Label infoLab = new Label("提示:");static Label speedLab = new Label("级数:");static Label scoreTex = new Label("0");static Label infoTex = new Label(" ");static Label speedTex = new Label("1");//创建窗体对象static JFrame jf = new JFrame();static MyTimer timer; //静态定时static ImageIcon icon=new ImageIcon("image/Block.jpg");//创建菜单栏对象static JMenuBar mb = new JMenuBar();//创建菜单栏监听项static JMenu menu0 = new JMenu("游  戏 ");static JMenu menu1 = new JMenu("帮  助 ");//创建下拉菜单static JMenuItem mi0 = new JMenuItem("新 游 戏");static JMenuItem mi1 = new JMenuItem("退  出");static JMenuItem mi1_0 = new JMenuItem("关  于");static JDialog dlg_1;//创建非模式对话框static JTextArea dlg_1_text = new JTextArea();//创建多行文本容器,可实现对文本的自动换行static int startSign = 0;//游戏开始标志 0 未开始 1 开始 2 暂停static String butLab[] = {"开 始 游 戏","重 新 开 始","降 低 级 数","提 高 级 数","游 戏 暂 停","退 出 游 戏"};static int game_body[][] = new int[19][10];//创建游戏主界面static int game_sign_x[] = new int[4];//用于记录4个方格的水平位置static int game_sign_y[] = new int[4];//用于记录4个方格的垂直位置static boolean downSign = false;//是否落下static int blockNumber = 1;//砖块的编号static int gameScore = 0;//游戏分数static int speedMark = 1;//速度标志public static void main(String args[]) throws InterruptedException {Block myBlock = new Block();//添加菜单栏监听项mb.add(menu0);//:游戏mb.add(menu1);//:帮助//添加菜单栏监听对象下拉菜单menu0.add(mi0);//:新游戏menu0.add(mi1);//:退出menu1.add(mi1_0);//:关于jf.setJMenuBar(mb);//设置容器mb.getComponent().setBackground(Color.orange);//设置菜单栏背景颜色为橘色myBlock.init();//初始化方法jf.add(myBlock);jf.setSize(565,501);jf.setResizable(false);//窗体大小不可被用户改变jf.setTitle("俄罗斯方块");jf.setIconImage(icon.getImage());//设置JFrame窗口标题图标jf.setLocation(200,100);//窗体大小jf.show();timer = new MyTimer(myBlock); //启动线程timer.setDaemon(true); timer.start();timer.suspend();//定时睡眠Music player = new Music("E:/file/debug/俄罗斯方块/src/image/俄罗斯方块游戏音乐.wav");//创建音乐播放器player.start(true);//以开始以循环的形式播放,player(false)为不循环播放TimeUnit.SECONDS.sleep(5);player.stop();//暂停播放音频  TimeUnit.SECONDS.sleep(4);player.continues();//继续开始播放音频}//初始化数据public void init(){setLayout(null);for(int i = 0;i < 6;i++){but[i] = new Button(butLab[i]);//创建新按钮add(but[i]);but[i].addActionListener(this);//鼠标监听器but[i].addKeyListener(this);//键盘监听器but[i].setBounds(360,(240 + 30 * i),160,25);//对组件进行自定义大小和位置设置//修改组件x坐标,y坐标,宽度,长度}//添加侧方标记add(scoreLab);//分数add(scoreTex);add(speedLab);//级数add(speedTex);add(infoLab);//提示add(infoTex);add(scoreLab);//设置标记位置scoreLab.setBounds(320,15,30,20);//“分数标记”的x坐标,y坐标,宽度,长度scoreTex.setBounds(360,15,160,20);//“分数标记文本框”的x坐标,y坐标,宽度,长度scoreTex.setBackground(Color.CYAN);//设青色文本框speedLab.setBounds(320,45,30,20);//“级数标记”的x坐标,y坐标,宽度,长度speedTex.setBounds(360,45,160,20);//“级数标记文本框”的x坐标,y坐标,宽度,长度speedTex.setBackground(Color.CYAN);//青色文本框//冻结按钮1,4but[1].setEnabled(false);but[4].setEnabled(false);infoLab.setBounds(320,75,30,20);//“提示标记”的x坐标,y坐标,宽度,长度infoTex.setBounds(360,75,160,20);//“提示标记文本框”的x坐标,y坐标,宽度,长度infoTex.setBackground(Color.CYAN);//青色文本框noStop.setBounds(360,360,160,25);//游戏暂停按钮的x坐标,y坐标,宽度,长度//添加按钮监听器noStop.addActionListener(this);noStop.addKeyListener(this);//添加下拉菜单栏监听器mi0.addActionListener(this);mi1.addActionListener(this);mi1_0.addActionListener(this);num_csh_game();rand_block();}public void actionPerformed(ActionEvent e)//游戏行为{if(e.getSource() == but[0])//开始游戏{startSign = 1;//开始标志1infoTex.setText("游戏已经开始!");but[0].setEnabled(false);//冻结开始游戏按钮but[1].setEnabled(true);//激活重新开始按钮but[4].setEnabled(true);//激活暂停按钮timer.resume(); }if(e.getSource() == but[1]||e.getSource() == mi0)//重新开始游戏{startSign = 0;//标志设0,游戏未开始gameScore = 0;//游戏分数清零timer.suspend();//定时睡眠num_csh_restart();repaint();rand_block();scoreTex.setText("0");//得分设0infoTex.setText("新游戏!");//提示框显示:新游戏but[0].setEnabled(true);//激活开始游戏按钮but[1].setEnabled(false);//冻结重新开始按钮but[4].setEnabled(false);//冻结暂停按钮}if(e.getSource() == but[2])//降低级数{infoTex.setText("降低级数!");speedMark--;//级数减if(speedMark <= 1){speedMark = 1;infoTex.setText("已经是最低级数!");//提示框输出}speedTex.setText(speedMark + "");//输出当前正确级数}if(e.getSource() == but[3])//提高级数{infoTex.setText("提高级数!");//提示框输出speedMark++;//级数加if(speedMark >= 9){speedMark = 9;infoTex.setText("已经是最高级数!");//提示框输出}speedTex.setText(speedMark + "");//输出当前级数}if(e.getSource() == but[4])//游戏暂停{this.add(noStop);this.remove(but[4]);infoTex.setText("游戏暂停!");timer.suspend();//定时睡眠}if(e.getSource() == noStop)//取消暂停{this.remove(noStop);this.add(but[4]);infoTex.setText("继续游戏!");timer.resume();}if(e.getSource() == but[5]||e.getSource() == mi1)//退出游戏{jf.dispose();//关闭游戏窗口}if(e.getSource() == mi1_0)//退出游戏{dlg_1 = new JDialog(jf,"关 于");try{FileInputStream io = new FileInputStream("E:\\file\\debug\\俄罗斯方块\\src\\image");//得到路径byte a[] = new byte[io.available()];io.read(a);io.close();String str = new String(a);dlg_1_text.setText(str);}catch(Exception g){}dlg_1_text.setEditable(false);dlg_1.add(dlg_1_text);dlg_1.pack();dlg_1.setResizable(false);dlg_1.setSize(200, 120);dlg_1.setLocation(400, 240);dlg_1.show();}}public void rand_block()//随机产生砖块{int num;num = (int)(Math.random() * 6) + 1;//产生0~6之间的随机数blockNumber = num;switch(blockNumber)//砖块编号{case 1: block1(); blockNumber = 1; break;case 2: block2(); blockNumber = 2; break;case 3: block3(); blockNumber = 3; break;case 4: block4(); blockNumber = 4; break;case 5: block5(); blockNumber = 5; break;case 6: block6(); blockNumber = 6; break;case 7: block7(); blockNumber = 7; break;}} public void change_body(int blockNumber)//改变砖块状态{dingwei();if(blockNumber == 1&&downSign == false)//变换长条2种情况{if(game_sign_y[0] == game_sign_y[1]&&game_sign_y[3] <= 16)//长条是横着的,1和2方格垂直位置相同且4方格垂直位置小于等于16{if(game_body[game_sign_y[0] - 1][game_sign_x[0] + 1] != 2&&game_body[game_sign_y[3] + 2][game_sign_x[3] - 2] != 2){num_csh_game();//数组清零game_body[game_sign_y[0] - 1][game_sign_x[0] + 1] = 1;game_body[game_sign_y[1]][game_sign_x[1]] = 1;game_body[game_sign_y[2] + 1][game_sign_x[2] - 1] = 1;game_body[game_sign_y[3] + 2][game_sign_x[3] - 2] = 1;infoTex.setText("游戏进行中!");repaint();//重新绘图}}if(game_sign_x[0] == game_sign_x[1]&&game_sign_x[0] >= 1&&game_sign_x[3] <= 7)//长条是竖着的{if(game_body[game_sign_y[0] + 1][game_sign_x[0]-1] != 2&&game_body[game_sign_y[3] - 2][game_sign_x[3] + 2] != 2){num_csh_game();//数组清零game_body[game_sign_y[0] + 1][game_sign_x[0] - 1] = 1;game_body[game_sign_y[1]][game_sign_x[1]]=1;game_body[game_sign_y[2] - 1][game_sign_x[2] + 1] = 1;game_body[game_sign_y[3] - 2][game_sign_x[3] + 2] = 1;infoTex.setText("游戏进行中!");repaint();}}}if(blockNumber == 3&&downSign == false)//变换转弯1有4种情况{   //第一种if(game_sign_x[0] == game_sign_x[1]&&game_sign_x[0] == game_sign_x[2]&&game_sign_y[2] == game_sign_y[3]&&game_sign_x[0] >= 1){if(game_body[game_sign_y[0] + 1][game_sign_x[0] - 1] != 2&&game_body[game_sign_y[2] - 1][game_sign_x[2] + 1] != 2&&game_body[game_sign_y[3] - 2][game_sign_x[3]] != 2){num_csh_game();//数组清零game_body[game_sign_y[0] + 1][game_sign_x[0] - 1] = 1;game_body[game_sign_y[1]][game_sign_x[1]] = 1;game_body[game_sign_y[2] - 1][game_sign_x[2] + 1] = 1;game_body[game_sign_y[3] - 2][game_sign_x[3]] = 1;infoTex.setText("游戏进行中!");repaint();} }//第二种if(game_sign_y[1] == game_sign_y[2]&&game_sign_y[2] == game_sign_y[3]&&game_sign_x[0] == game_sign_x[3]&&game_sign_y[1] <= 17){if(game_body[game_sign_y[0]][game_sign_x[0] - 2] != 2&&game_body[game_sign_y[1] + 1][game_sign_x[1] + 1] != 2&&game_body[game_sign_y[3] - 1][game_sign_x[3] - 1] != 2){num_csh_game();//数组清零game_body[game_sign_y[0]][game_sign_x[0] - 2] = 1; game_body[game_sign_y[1] + 1][game_sign_x[1] + 1] = 1;game_body[game_sign_y[2]][game_sign_x[2]] = 1;game_body[game_sign_y[3] - 1][game_sign_x[3] - 1] = 1;infoTex.setText("游戏进行中!");repaint();}  }//第三种if(game_sign_x[1] == game_sign_x[2]&&game_sign_x[1] == game_sign_x[3]&&game_sign_y[0] == game_sign_y[1]&&game_sign_x[3] <= 8){if(game_body[game_sign_y[0] + 2][game_sign_x[0]] != 2&&game_body[game_sign_y[1] + 1][game_sign_x[1] - 1] != 2&&game_body[game_sign_y[3] - 1][game_sign_x[3] + 1] != 2){num_csh_game();//数组清零game_body[game_sign_y[0] + 2][game_sign_x[0]] = 1;    game_body[game_sign_y[1] + 1][game_sign_x[1] - 1] = 1;game_body[game_sign_y[2]][game_sign_x[2]] = 1;game_body[game_sign_y[3] - 1][game_sign_x[3] + 1] = 1;infoTex.setText("游戏进行中!");repaint();}  }//第四种if(game_sign_y[0] == game_sign_y[1]&&game_sign_y[1] == game_sign_y[2]&&game_sign_x[0] == game_sign_x[3]){if(game_body[game_sign_y[0] + 1][game_sign_x[0] + 1] != 2&&game_body[game_sign_y[2] - 1][game_sign_x[2] - 1] != 2&&game_body[game_sign_y[3]][game_sign_x[3] + 2] != 2){num_csh_game();//数组清零game_body[game_sign_y[0] + 1][game_sign_x[0] + 1] = 1;game_body[game_sign_y[1]][game_sign_x[1]] = 1;game_body[game_sign_y[2] - 1][game_sign_x[2] - 1] = 1;game_body[game_sign_y[3]][game_sign_x[3] + 2] = 1;infoTex.setText("游戏进行中!");repaint();}   }}if(blockNumber == 4&&downSign == false)//变换转弯2有4种情况{//第一种if(game_sign_x[0] == game_sign_x[1]&&game_sign_x[0] == game_sign_x[3]&&game_sign_y[1] == game_sign_y[2]&&game_sign_x[3] <= 7){if(game_body[game_sign_y[0] + 2][game_sign_x[0]] != 2&&game_body[game_sign_y[1] + 1][game_sign_x[1] + 1] != 2&&game_body[game_sign_y[3]][game_sign_x[3] + 2] != 2){num_csh_game();//数组清零game_body[game_sign_y[0] + 2][game_sign_x[0]] = 1;game_body[game_sign_y[1] + 1][game_sign_x[1] + 1] = 1;game_body[game_sign_y[2]][game_sign_x[2]] = 1;game_body[game_sign_y[3]][game_sign_x[3] + 2] = 1;infoTex.setText("游戏进行中!");repaint();}   }//第二种if(game_sign_y[1] == game_sign_y[2]&&game_sign_y[1] == game_sign_y[3]&&game_sign_x[0] == game_sign_x[2]){if(game_body[game_sign_y[1]][game_sign_x[1] + 2] != 2&&game_body[game_sign_y[2] - 1][game_sign_x[2] + 1] != 2&&game_body[game_sign_y[3] - 2][game_sign_x[3]] != 2){num_csh_game();//数组清零game_body[game_sign_y[0]][game_sign_x[0]] = 1;game_body[game_sign_y[1]][game_sign_x[1] + 2] = 1;game_body[game_sign_y[2] - 1][game_sign_x[2] + 1] = 1;game_body[game_sign_y[3] - 2][game_sign_x[3]] = 1;infoTex.setText("游戏进行中!");repaint();} }//第三种if(game_sign_x[0] == game_sign_x[2]&&game_sign_x[0] == game_sign_x[3]&&game_sign_y[1] == game_sign_y[2]&&game_sign_x[0] >= 2){if(game_body[game_sign_y[0]][game_sign_x[0] - 2] != 2&&game_body[game_sign_y[2] - 1][game_sign_x[2] - 1] != 2&&game_body[game_sign_y[3] - 2][game_sign_x[3]] != 2){num_csh_game();//数组清零game_body[game_sign_y[0]][game_sign_x[0] - 2] = 1;game_body[game_sign_y[1]][game_sign_x[1]] = 1;game_body[game_sign_y[2] - 1][game_sign_x[2] - 1] = 1;game_body[game_sign_y[3] - 2][game_sign_x[3]] = 1;infoTex.setText("游戏进行中!");repaint();}    }//第四种if(game_sign_y[0] == game_sign_y[1]&&game_sign_y[0] == game_sign_y[2]&&game_sign_x[1] == game_sign_x[3]&&game_sign_y[0] <= 16){if(game_body[game_sign_y[0] + 2][game_sign_x[0]] != 2&&game_body[game_sign_y[1] + 1][game_sign_x[1] - 1] != 2&&game_body[game_sign_y[2]][game_sign_x[2] - 2] != 2){num_csh_game();//数组清零game_body[game_sign_y[0] + 2][game_sign_x[0]] = 1;game_body[game_sign_y[1] + 1][game_sign_x[1] - 1] = 1;game_body[game_sign_y[2]][game_sign_x[2] - 2] = 1;game_body[game_sign_y[3]][game_sign_x[3]] = 1;infoTex.setText("游戏进行中!");repaint();}   }}if(blockNumber == 5&&downSign == false)//变换转弯3有4种情况{//第一种if(game_sign_x[0] == game_sign_x[2]&&game_sign_x[2] == game_sign_x[3]&&game_sign_y[0] == game_sign_y[1]&&game_sign_x[1] >= 2){if(game_body[game_sign_y[0] + 1][game_sign_x[0] - 1] != 2&&game_body[game_sign_y[1]][game_sign_x[1] - 2] != 2&&game_body[game_sign_y[3] - 1][game_sign_x[3] + 1] != 2){num_csh_game();//数组清零game_body[game_sign_y[0] + 1][game_sign_x[0] - 1] = 1;game_body[game_sign_y[1]][game_sign_x[1] - 2] = 1;game_body[game_sign_y[2]][game_sign_x[2]] = 1;game_body[game_sign_y[3] - 1][game_sign_x[3] + 1] = 1;infoTex.setText("游戏进行中!");repaint();}}//第二种if(game_sign_y[1] == game_sign_y[2]&&game_sign_y[2] == game_sign_y[3]&&game_sign_x[0] == game_sign_x[1]&&game_sign_y[0] <= 16){if(game_body[game_sign_y[0] + 2][game_sign_x[0]] != 2&&game_body[game_sign_y[1] + 1][game_sign_x[1] + 1] != 2&&game_body[game_sign_y[3] - 1][game_sign_x[3] - 1] != 2){num_csh_game();//数组清零game_body[game_sign_y[0] + 2][game_sign_x[0]] = 1;game_body[game_sign_y[1] + 1][game_sign_x[1] + 1] = 1;game_body[game_sign_y[2]][game_sign_x[2]] = 1;game_body[game_sign_y[3] - 1][game_sign_x[3] - 1] = 1;infoTex.setText("游戏进行中!");repaint();}}//第三种if(game_sign_x[0] == game_sign_x[1]&&game_sign_x[1] == game_sign_x[3]&&game_sign_y[2] == game_sign_y[3]){if(game_body[game_sign_y[0] + 1][game_sign_x[0] - 1] != 2&&game_body[game_sign_y[2]][game_sign_x[2] + 2] != 2&&game_body[game_sign_y[3] - 1][game_sign_x[3] + 1] != 2){num_csh_game();//数组清零game_body[game_sign_y[0] + 1][game_sign_x[0] - 1] = 1;game_body[game_sign_y[1]][game_sign_x[1]] = 1;game_body[game_sign_y[2]][game_sign_x[2] + 2] = 1;game_body[game_sign_y[3] - 1][game_sign_x[3] + 1] = 1;infoTex.setText("游戏进行中!");repaint();}}//第四种if(game_sign_y[0] == game_sign_y[1]&&game_sign_y[1] == game_sign_y[2]&&game_sign_x[2] == game_sign_x[3]){if(game_body[game_sign_y[0] + 1][game_sign_x[0] + 1] != 2&&game_body[game_sign_y[2] - 1][game_sign_x[2] - 1] != 2&&game_body[game_sign_y[3] - 2][game_sign_x[3]] != 2){num_csh_game();//数组清零game_body[game_sign_y[0] + 1][game_sign_x[0] + 1] = 1;game_body[game_sign_y[1]][game_sign_x[1]] = 1;game_body[game_sign_y[2] - 1][game_sign_x[2] - 1] = 1;game_body[game_sign_y[3] - 2][game_sign_x[3]] = 1;infoTex.setText("游戏进行中!");repaint();}}}if(blockNumber == 6&&downSign == false)//变换两层砖块1的2种情况{//第一种if(game_sign_x[0] == game_sign_x[2]&&game_sign_x[0] >= 2){if(game_body[game_sign_y[0]][game_sign_x[0] - 2] != 2&&game_body[game_sign_y[2] - 1][game_sign_x[2] -1 ] != 2&&game_body[game_sign_y[3] - 1][game_sign_x[3] + 1] != 2){num_csh_game();//数组清零game_body[game_sign_y[0]][game_sign_x[0] - 2] = 1;game_body[game_sign_y[1]][game_sign_x[1]] = 1;game_body[game_sign_y[2] - 1][game_sign_x[2] - 1] = 1;game_body[game_sign_y[3] - 1][game_sign_x[3] + 1] = 1;infoTex.setText("游戏进行中!");repaint();}}//第二种if(game_sign_y[0] == game_sign_y[1]&&game_sign_y[3] <= 17){if(game_body[game_sign_y[0]][game_sign_x[0] + 2] != 2&&game_body[game_sign_y[1] + 1][game_sign_x[1] + 1] != 2&&game_body[game_sign_y[3] + 1][game_sign_x[3] - 1] != 2){num_csh_game();//数组清零game_body[game_sign_y[0]][game_sign_x[0] + 2] = 1;game_body[game_sign_y[1] + 1][game_sign_x[1] + 1] = 1;game_body[game_sign_y[2]][game_sign_x[2]] = 1;game_body[game_sign_y[3] + 1][game_sign_x[3] - 1] = 1;infoTex.setText("游戏进行中!");repaint();}}}if(blockNumber == 7&&downSign == false)//变换两层砖块2的2种情况{//第一种if(game_sign_x[0] == game_sign_x[1]&&game_sign_x[0] <= 16){if(game_body[game_sign_y[0]][game_sign_x[0] + 2] != 2&&game_body[game_sign_y[1] - 1][game_sign_x[1] + 1] != 2&&game_body[game_sign_y[3] - 1][game_sign_x[3] - 1] != 2){num_csh_game();//数组清零game_body[game_sign_y[0]][game_sign_x[0] + 2] = 1;game_body[game_sign_y[1] - 1][game_sign_x[1] + 1] = 1;game_body[game_sign_y[2]][game_sign_x[2]] = 1;game_body[game_sign_y[3] - 1][game_sign_x[3] - 1] = 1;infoTex.setText("游戏进行中!");repaint();}}//第二种if(game_sign_y[0] == game_sign_y[1]&&game_sign_y[2] <= 17){if(game_body[game_sign_y[0] + 1][game_sign_x[0] - 1] != 2&&game_body[game_sign_y[1]][game_sign_x[1] - 2] != 2&&game_body[game_sign_y[2] + 1][game_sign_x[2] + 1] != 2){num_csh_game();//数组清零game_body[game_sign_y[0] + 1][game_sign_x[0] - 1] = 1;game_body[game_sign_y[1]][game_sign_x[1] - 2] = 1;game_body[game_sign_y[2] + 1][game_sign_x[2] + 1] = 1;game_body[game_sign_y[3]][game_sign_x[3]] = 1;infoTex.setText("游戏进行中!");repaint();}}}}public void num_csh_game()//数组清零{for(int i = 0;i < 19;i++){for(int j = 0;j < 10;j++){if(game_body[i][j] == 2){game_body[i][j] = 2;}else{game_body[i][j] = 0;//界面清零}}}}public void num_csh_restart()//重新开始时数组清零{for(int i = 0;i < 19;i++){for(int j = 0;j < 10;j++){game_body[i][j] = 0;//界面清零}}}public void keyTyped(KeyEvent e){}//敲击键盘,发生在按键按下后放开前    public void keyPressed(KeyEvent e)//按下按键时发生{if(e.getKeyCode() == KeyEvent.VK_DOWN&&startSign == 1)//处理下键{this.down();}if(e.getKeyCode() == KeyEvent.VK_LEFT&&startSign == 1)//处理左键{this.left();}if(e.getKeyCode() == KeyEvent.VK_RIGHT&&startSign == 1)//处理右键{this.right();}if(e.getKeyCode() == KeyEvent.VK_UP&&startSign == 1)//处理上键转换{this.change_body(blockNumber);}if(startSign == 0){infoTex.setText("游戏未开始或已结束!");}}public void keyReleased(KeyEvent e){}//松开按键时发生public void paint(Graphics g)//绘图{g.setColor(Color.PINK);//游戏界面粉色g.fill3DRect(0,0,300,450,true);//画一个游戏主界面着色块//x坐标,y坐标,宽度,长度,显示for(int i = 0;i < 19;i++){for(int j = 0;j < 10;j++){if(game_body[i][j] == 1)//未落下{g.setColor(Color.BLACK);g.fill3DRect(30*j,30*(i-4),30,30,true);//画一个黑色方块}if(game_body[i][j] == 2)//已落下{g.setColor(Color.GREEN);g.fill3DRect(30*j,30*(i-4),30,30,true);//画一个绿色方块}}}    }public void left()//向左移动{int sign = 0;dingwei();for(int k = 0;k < 4;k++)//循环遍历16个方格(4*4){if(game_sign_x[k] == 0||game_body[game_sign_y[k]][game_sign_x[k] - 1] == 2)//如果左移一格没有方块时{sign = 1;//左移}}if(sign == 0&&downSign == false)//已经落下且占满{num_csh_game();//数组清零for(int k = 0;k < 4;k++){game_body[game_sign_y[k]][game_sign_x[k] - 1] = 1;}infoTex.setText("向左移动!");repaint();}}public void right()//向右移动{int sign = 0;dingwei();for(int k = 0;k < 4;k++){if(game_sign_x[k] == 9||game_body[game_sign_y[k]][game_sign_x[k] + 1] == 2){sign = 1;}}if(sign == 0&&downSign == false){num_csh_game();//数组清零for(int k = 0;k < 4;k++){game_body[game_sign_y[k]][game_sign_x[k] + 1] = 1;}infoTex.setText("向右移动!");repaint();}}public void down()//下落{int sign = 0;dingwei();for(int k = 0;k < 4;k++){if(game_sign_y[k] == 18||game_body[game_sign_y[k] + 1][game_sign_x[k]] == 2){sign = 1;downSign = true;//落下changeColor();cancelDW();getScore();if(game_over() == false)//游戏未结束{rand_block();repaint();}}}if(sign == 0){num_csh_game();//数组清零for(int k = 0;k < 4;k++){game_body[game_sign_y[k] + 1][game_sign_x[k]] = 1;}infoTex.setText("游戏进行中!");repaint();}}public boolean game_over()//判断游戏是否结束{int sign=0;for(int i = 0;i < 10;i++){if(game_body[4][i] == 2){sign = 1;}}if(sign == 1){infoTex.setText("游戏结束!");changeColor();repaint();startSign = 0;timer.suspend();//定时睡眠return true;}elsereturn false;}public void getScore()//满行消除方法{for(int i = 0;i < 19;i++){int sign = 0;for(int j = 0;j < 10;j++){if(game_body[i][j] == 2){sign++;}}if(sign == 10){gameScore += 100;scoreTex.setText(gameScore+"");infoTex.setText("恭喜得分!");for(int j = i;j >= 1;j--){for(int k = 0;k < 10;k++){game_body[j][k] = game_body[j - 1][k];}}}}}public void changeColor()//给已经落下的块换色{downSign = false;for(int k = 0;k < 4;k++){game_body[game_sign_y[k]][game_sign_x[k]] = 2;}}public void dingwei()//确定其位置{int k = 0;cancelDW();for(int i = 0;i < 19;i++){for(int j = 0;j < 10;j++){if(game_body[i][j] == 1){game_sign_x[k] = j;game_sign_y[k] = i;k++;}}}}public void cancelDW()//将定位数组初始化{for(int k = 0;k < 4;k++){game_sign_x[k] = 0;game_sign_y[k] = 0;}}public void block1()//长条{game_body[0][4] = 1;//█game_body[1][4] = 1;//█game_body[2][4] = 1;//█game_body[3][4] = 1;//█}public void block2()//正方形{game_body[3][4] = 1;//game_body[2][4] = 1;//██game_body[3][5] = 1;//██game_body[2][5] = 1;//}public void block3()//3加1(下){game_body[1][4] = 1;//█game_body[2][4] = 1;//█game_body[3][4] = 1;//██game_body[3][5] = 1;//}public void block4()//3加1(中){game_body[1][4] = 1;//█game_body[2][4] = 1;//██game_body[3][4] = 1;//█game_body[2][5] = 1;//}public void block5()//3加1(上){game_body[1][4] = 1;//██game_body[2][4] = 1;//█game_body[3][4] = 1;//█game_body[1][5] = 1;//}public void block6()//转折1{game_body[1][5] = 1;// █game_body[2][5] = 1;// █game_body[2][4] = 1;//█game_body[3][4] = 1;//█}public void block7()//转折2{game_body[1][4] = 1;//█game_body[2][4] = 1;//█ game_body[2][5] = 1;// █game_body[3][5] = 1;// █}//其余形状自行设计
}//定时线程
class MyTimer extends Thread
{Block myBlock; public MyTimer(Block myBlock){this.myBlock = myBlock;}public void run(){while(myBlock.startSign == 1){try{sleep((10-myBlock.speedMark + 1)*100); myBlock.down();}catch(InterruptedException e){}} }
} 

四、Music类

背景音乐必须转为wav格式,且复制完代码必须修改背景音乐的地址和图片地址

package 俄罗斯方块;import javax.sound.sampled.*;
import java.io.*;
import java.util.concurrent.TimeUnit;public class Music {private String musicPath; //音频文件private volatile boolean run = true;  //记录音频是否播放private Thread mainThread;   //播放音频的任务线程private AudioInputStream audioStream;private AudioFormat audioFormat;private SourceDataLine sourceDataLine;public Music(String musicPath) {this.musicPath = musicPath;prefetch();}//数据准备private void prefetch(){try{//获取音频输入流audioStream = AudioSystem.getAudioInputStream(new File(musicPath));//获取音频的编码对象audioFormat = audioStream.getFormat();//包装音频信息DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class,audioFormat,AudioSystem.NOT_SPECIFIED);//使用包装音频信息后的Info类创建源数据行,充当混频器的源sourceDataLine = (SourceDataLine)AudioSystem.getLine(dataLineInfo);sourceDataLine.open(audioFormat);sourceDataLine.start();}catch(UnsupportedAudioFileException ex){ex.printStackTrace();}catch(LineUnavailableException ex){ex.printStackTrace();}catch(IOException ex){ex.printStackTrace();}}//析构函数:关闭音频读取流和数据行protected void finalize() throws Throwable{super.finalize();sourceDataLine.drain();sourceDataLine.close();audioStream.close();}//播放音频:通过loop参数设置是否循环播放private void playMusic(boolean loop)throws InterruptedException {try{if(loop){while(true){playMusic();}}else{playMusic();//清空数据行并关闭sourceDataLine.drain();sourceDataLine.close();audioStream.close();}}catch(IOException ex){ex.printStackTrace();}}private void playMusic(){try{synchronized(this){run = true;}//通过数据行读取音频数据流,发送到混音器;//数据流传输过程:AudioInputStream -> SourceDataLine;audioStream = AudioSystem.getAudioInputStream(new File(musicPath));int count;byte tempBuff[] = new byte[1024];while((count = audioStream.read(tempBuff,0,tempBuff.length)) != -1){synchronized(this){while(!run)wait();}sourceDataLine.write(tempBuff,0,count);}}catch(UnsupportedAudioFileException ex){ex.printStackTrace();}catch(IOException ex){ex.printStackTrace();}catch(InterruptedException ex){ex.printStackTrace();}}//暂停播放音频private void stopMusic(){synchronized(this){run = false;notifyAll();}}//继续播放音乐private void continueMusic(){synchronized(this){run = true;notifyAll();}}//外部调用控制方法:生成音频主线程;public void start(boolean loop){mainThread = new Thread(new Runnable(){public void run(){try {playMusic(loop);} catch (InterruptedException e) {e.printStackTrace();}}});mainThread.start();}//外部调用控制方法:暂停音频线程public void stop(){new Thread(new Runnable(){public void run(){stopMusic();}}).start();}//外部调用控制方法:继续音频线程public void continues(){new Thread(new Runnable(){public void run(){continueMusic();}}).start();}  }

源码链接: https://pan.baidu.com/s/1eK86Anxv4t2khgilp0x0aA .
提取码:854T

【Java】俄罗斯方块带背景音乐相关推荐

  1. Java俄罗斯方块,老程序员花了一个周末,连接中学年代!

    Java俄罗斯方块,老程序员花了一个周末,连接中学年代! 热门专栏推荐 [1]Java小游戏(俄罗斯方块.飞机大战.植物大战僵尸等) [2]JavaWeb项目实战(图书管理.在线考试.宿舍管理等) [ ...

  2. 【java】java自带的java.util.logging.Logger日志功能

    偶然翻阅到一篇文章,注意到Java自带的Logger日志功能,特地来细细的看一看,记录一下. 1.Java自带的日志功能,默认的配置 ①Logger的默认配置,位置在JRE安装目录下lib中的logg ...

  3. java 参数返回_Java基础---Java中带参数返回值方法的使用(四十)

    Java 中带参带返回值方法的使用 如果方法既包含参数,又带有返回值,我们称为带参带返回值的方法. 例如:下面的代码,定义了一个 show 方法,带有一个参数 name ,方法执行后返回一个 Stri ...

  4. java方法带参数返回值_Java方法中的参数太多,第6部分:方法返回

    java方法带参数返回值 在当前的系列文章中,我正在致力于减少调用Java方法和构造函数所需的参数数量,到目前为止,我一直专注于直接影响参数本身的方法( 自定义类型 , 参数对象 , 构建器模式 , ...

  5. sha256---利用java自带的实现加密

    利用java自带的实现加密:参考https://jingyan.baidu.com/article/2fb0ba40a2ef2b00f3ec5f74.html /*** 利用java原生的摘要实现SH ...

  6. 视频教程-微信公众号实战(Java版本,带前后台)-微信开发

    微信公众号实战(Java版本,带前后台) 2018年5月创办 威海科进网络科技有限公司,这里的视频主要是为了做个记录,方便员工提升自己的水平 陈健 ¥29.00 立即订阅 扫码下载「CSDN程序员学院 ...

  7. 小程序源码:端午送粽子祝福微信小程序源码下载支持打赏模式带背景音乐

    端午节的时候很火的一款小程序 给亲朋好友送祝福也是一款引流非常不错的一款小程序 支持打赏小程序模式实现盈利模式 当然了,有能力的小伙伴也可以魔改一下做成别的小程序也是可以的 该小程序无需服务器和域名, ...

  8. java俄罗斯方块消除算法_Java 俄罗斯方块消行算法

    Java 俄罗斯方块消行算法 2020-08-12 11:02 阅读数 9 /** * 消行得分 */ private int plusExp() { //获取地图信息 boolean[][] gam ...

  9. java 打开url连接访问不了,android 应用Java自带的HttpURLConnection 连接网络 读取返回数据...

    android 使用Java自带的HttpURLConnection 连接网络 读取返回数据 @Override protected void onCreate(Bundle savedInstanc ...

  10. java 发送邮件添加附件,Java实现带附件的邮件发送功能

    这篇文章主要为大家详细介绍了Java实现带附件的邮件发送功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文实例为大家分享了Java实现邮件发送功能的具体代码,供大 ...

最新文章

  1. JForum 的 SSO集成
  2. c++中类的定义与头文件的关系
  3. (NO.00001)iOS游戏SpeedBoy Lite成形记(二十二)
  4. 退役笔记一#MySQL = lambda sql : sql + #39; Source Code 4 Explain Plan #39;
  5. 代码编译delphi条件编译
  6. std输入参数太多matlab,错误使用函数,输入参数太多怎么解决
  7. gRPC学习记录(四)--官方Demo
  8. api可以主动采集用户数据吗_模拟量数字量采集卡之EC-8001篇
  9. oauth2.0授权码_OAUTH 2.0授权码授予
  10. 研发中会使用到的工具
  11. 江诗丹顿geneve系列_南京江诗丹顿维修保养多少钱石英手表清洗
  12. 诺基亚宣布与博通合作开发5G芯片 包括定制处理器
  13. Eclipse编辑python时的快捷键
  14. Mysq 5.7l服务无法启动,没有报告任何错误
  15. 贤鱼的刷题日常-【c++】P7909 [CSP-J 2021] 分糖果
  16. DSP 6678的中断系统
  17. Google搜索引擎设置百度搜索
  18. 武汉理工大学计算机转专业名单,武汉理工大学转专业的限制
  19. 一衣带水 守望相助:中日夫妻七七再行慈善之旅
  20. 外贸常用术语_常用贸易术语大全

热门文章

  1. pycharm 连接数据库报错
  2. 腾科张老师教你如何在cisco路由器上部署和使用FTP/TFTP
  3. int类型和String类型相互转换
  4. 50个最受欢迎的大数据面试问题
  5. javascript之Math
  6. 深夜加油站遇到苏格拉底
  7. 计算机专业的英语六级很难过,英语六级多少分算过 通过率高吗
  8. 个人信用报告,有这五种方式可查!
  9. Dubbo——服务暴露的实现原理
  10. matlab精度高保存图片