⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 frame1.java

📁 JAVA俄罗斯方块源码,复制到java即可运行
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
package diamond;

import java.util.*;
import java.awt.*;
import java.awt.event.*;
import java.net.URL;
import javax.swing.*;
/**
    主窗体类,
 */
public class Frame1 extends JFrame {
    customThread thread = new customThread(this);    //自定义线程类
    Thread t2;     //线程
    Graphic graphic = new Graphic(this);   //自定义绘图类
    Action rol = new Action(this);   //自定义旋转类
    JPanel contentPane;              //窗体中的主面板
    JLabel backGround = new JLabel();//窗体中的背景图
    JLabel GameOver = new JLabel();  //显示“游戏结束!”字样
    JLabel[] backShape = new JLabel[200];  //游戏区面板中的小图形块,为10列20行
    JLabel[] shape = new JLabel[4];     //可以移动的图形,由4个小块组成
    JLabel[] shapeView = new JLabel[4]; //预览区的图形,由4个小块组成
    ImageIcon imgicon;                 //图片类,用来加载图片
    JPanel GameAreaPanel = new JPanel();   //游戏区面板
    JLabel PanelBG = new JLabel();   //游戏区面板的背景
    JLabel begin = new JLabel();     //开始按钮
    JLabel mark = new JLabel();      //分数标签
    JLabel level = new JLabel();      //分数标签
    JTextField jTextField1 = new JTextField();  //文本框,用来接收键盘的输入
    int graphicNum;  //形状的编号
    int viewGraphicNum; //预览窗口中的形状编号
    int[] state = new int[7]; //存储7种形状的旋转状态
    int[] shapeLocation = new int[4]; //存储一个图形的4个小块的位置,作删行时用

    //构造方法
    public Frame1() {
        try {
            setDefaultCloseOperation(EXIT_ON_CLOSE);  //点窗口的关闭按钮时直接关闭程序
            jbInit();
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }

    //初始化方法
    private void jbInit() throws Exception {
        //主窗体的初始化
        contentPane = (JPanel) getContentPane();
        contentPane.setLayout(null);
        imgicon = createImageIcon("background.jpg");  //createImageIcon为自定义方法,用来加载图片
        backGround.setIcon(imgicon);
        backGround.setBounds(new Rectangle(0, 0, 576, 444));

        //游戏区面板的初始化
        GameAreaPanel.setBackground(new Color(110, 66, 15));
        GameAreaPanel.setBorder(null);
        GameAreaPanel.setBounds(new Rectangle(236, 41, 180, 360));
        GameAreaPanel.setLayout(null);
        imgicon = createImageIcon("panelBG.jpg");
        PanelBG.setBounds(new Rectangle(0, 0, 180, 360));
        PanelBG.setIcon(imgicon);


        //开始按钮的初始化
        begin.setFont(new java.awt.Font("宋体", Font.BOLD, 20));
        begin.setForeground(Color.yellow);
        begin.setBorder(BorderFactory.createRaisedBevelBorder());
        begin.setText("  开始 ");
        begin.setBounds(new Rectangle(80, 350, 86, 43));
        begin.addMouseListener(new Frame1_begin_mouseAdapter(this));

        //分数标签的初始化
        mark.setFont(new java.awt.Font("宋体", Font.BOLD, 30));
        mark.setForeground(Color.orange);
        mark.setText("00000");
        mark.setBounds(new Rectangle(75, 230, 180, 43));

        //级别标签的初始化
        level.setFont(new java.awt.Font("宋体", Font.BOLD, 30));
        level.setForeground(Color.black);
        level.setText("1");
        level.setBounds(new Rectangle(490, 300, 180, 43));

        //游戏结束标签的初始化
        GameOver.setFont(new java.awt.Font("宋体", Font.BOLD, 35));
        GameOver.setForeground(Color.yellow);
        GameOver.setText("游戏结束!");
        GameOver.setBounds(new Rectangle(250, 140, 250, 100));
        GameOver.setVisible(false);

        //文本框的初始化
        jTextField1.setBorder(null);
        jTextField1.setBounds(new Rectangle(-10, -10, 5, 5)); //位置到窗体以外
        jTextField1.addKeyListener(new Frame1_jTextField1_keyAdapter(this)); //键盘监听

        //游戏区背景的初始化
        for (int i=0; i<20; i++){
            for (int j=0; j<10; j++){
                backShape[i*10+j] = new JLabel("");
                backShape[i*10+j].setBounds(new Rectangle(j*18, i*18, 18, 18));
                GameAreaPanel.add(backShape[i*10+j]);
            }
        }

        //可移动方块和预览区方块的初始化
        for (int i=0; i<4; i++){
           shape[i] = new JLabel("");
           shapeView[i] = new JLabel("");
           GameAreaPanel.add(shape[i]);
           contentPane.add(shapeView[i]);
        }

        GameAreaPanel.add(PanelBG);  //把背景标签到游戏区面板
        //所有控件加到主面板上
        contentPane.add(GameOver);
        contentPane.add(begin);
        contentPane.add(mark);
        contentPane.add(level);
        contentPane.add(jTextField1);
        contentPane.add(GameAreaPanel);
        contentPane.add(backGround);
    }

    //加载图片的方法,返回一个ImageIcon类型
    protected static ImageIcon createImageIcon(String path){
                    java.net.URL imgURL = Frame1.class.getResource(path);
            if (imgURL != null) {
                     return new ImageIcon(imgURL);
                    } else {
                     System.err.println("Couldn't find file: " + path);
                    return null;
            }
   }

   //初始化要预览窗口和准备下落的图形的方法
    private void paintGraphic(){
        //把预览窗口的图形的类型、背景和坐标赋给准备下落的图形
        graphicNum = viewGraphicNum;
        for(int i=0; i<4; i++){
            shape[i].setIcon(shapeView[i].getIcon());
            shape[i].setBounds(new Rectangle(shapeView[i].getX()-412, shapeView[i].getY()-85, 18, 18));
        }
        //初始化预览窗口的形状
        Random ran = new Random();
        int imgNum = ran.nextInt(5);  //图片文件名的编号,随机取一个
        imgicon = createImageIcon(imgNum + ".jpg");
        shapeView[0].setIcon(imgicon);
        shapeView[1].setIcon(imgicon);
        shapeView[2].setIcon(imgicon);
        shapeView[3].setIcon(imgicon);
        viewGraphicNum = ran.nextInt(7);  //随机取一个形状的编号,有7种形状
        graphic.paint();  //绘制图形
        state[graphicNum] = 0; //形状的旋转状态
    }

    //把定位好的形状复制到背景上的方法
    public void copy(){  //把下落已经停止的图形背景赋给游戏区相应的图形块
        backShape[(shape[0].getX()/18) + (shape[0].getY()/18)*10].setIcon(shape[0].getIcon());
        backShape[(shape[1].getX()/18) + (shape[1].getY()/18)*10].setIcon(shape[1].getIcon());
        backShape[(shape[2].getX()/18) + (shape[2].getY()/18)*10].setIcon(shape[2].getIcon());
        backShape[(shape[3].getX()/18) + (shape[3].getY()/18)*10].setIcon(shape[3].getIcon());
        fullLine();  //自定义方法,用来判断是否存在满行
        paintGraphic(); //自定义方法,绘制下个图形
        t2 = new Thread(thread);//线程开始
        t2.start();
    }

    //判断是否满行的方法
    private void fullLine(){
        for (int i=0; i<4; i++){   //四个小块
            for (int j=0; j<10; j++){
                if ( ((shape[i].getY()/18)*10+j) < 10 ){  //判断是否到了顶行
                    gameOver(); //游戏结束;
                }
                //if ( ((shape[i].getY()/18)*10+j)>199 ) continue; //如果超出最低行则不执行后面判断;
                if (backShape[(shape[i].getY()/18)*10+j].getIcon() == null){ //如果有空格就跳出
                    break;
                }else if ( j==9 ){   //如果是满行
                    shapeLocation[i] = (shape[i].getY()/18)*10;
                }
            }
        }
        DeleteFullLine();//删除满行
    }

    //删除满行的方法
    private void DeleteFullLine(){
        int tempMark ;  //保存分数的临时变量
        int accumulativeMark = 0; //累计分数的临时变量
        int tempLevel;  //保存级别的临时变量
        //下面循环是去除数组中重复的数并按升序排序,指要删除水平坐标相同块的坐标;
        for (int i=0; i<3; i++){
            for (int j=i+1; j<4; j++){
                if (shapeLocation[i] > shapeLocation[j]){
                    int tempNum = shapeLocation[i];
                    shapeLocation[i] = shapeLocation[j];
                    shapeLocation[j] = tempNum;
                }else if (shapeLocation[i] == shapeLocation[j]){
                    shapeLocation[i] = 0;
                }
            }
        }

        for (int i=0; i<4; i++){
            if ( shapeLocation[i] == 0 ) continue;  //如果碰不是满行或重复要删除的行则后面的不执行
            for (int j=shapeLocation[i]+9; j>10; j--){  //删除满行以后上面所有的图形块往下移一格
                backShape[j].setIcon( backShape[j-10].getIcon());
            }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -