From 431154e5ddd542181de597f5f0e847498c1fba81 Mon Sep 17 00:00:00 2001 From: nxist2202005029 <895791880@qq.com> Date: Thu, 20 Jun 2024 00:17:10 +0800 Subject: [PATCH] ADD file via upload --- MyFrame.java | 583 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 583 insertions(+) create mode 100644 MyFrame.java diff --git a/MyFrame.java b/MyFrame.java new file mode 100644 index 0000000..8b3e676 --- /dev/null +++ b/MyFrame.java @@ -0,0 +1,583 @@ +package view; + +import javax.swing.*; +import javax.swing.border.EtchedBorder; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; + +import util.Constant; +import java.util.TimerTask; +import java.util.Timer; +import javax.management.*; +import control.MusicPlayer; +import control.PreView; + +import model.Block; +import model.Box; + +import java.awt.*; +import java.awt.event.*; + +import java.awt.Toolkit; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import javax.swing.JFrame; + +public class MyFrame extends JFrame { + JPanel jp_pan = new JPanel(); + JPanel jp_pre = new JPanel(); + JPanel jp_ctrl = new JPanel(); + JPanel jp_scor = new JPanel(); + Zidingyi zi; + JRadioButtonMenuItem jr1 = new JRadioButtonMenuItem("初级", true); + JRadioButtonMenuItem jr2 = new JRadioButtonMenuItem("中级"); + JRadioButtonMenuItem jr3 = new JRadioButtonMenuItem("高级"); + JLabel jt9 = new JLabel("得分:0"); + static JLabel jt10 = new JLabel("等级:1"); + JMenu m1 = new JMenu("游戏"); + JMenu m2 = new JMenu("帮助"); + JCheckBox jc1; + JSlider jsl; + // 创建对话框 + static ImageIcon background = new ImageIcon(Constant.backGround1); + // 把背景图片加到 label + static JLabel label = new JLabel(background); + + int scor = 0; // 初始化分数为 0 + static int rank = 0; // 初始化等级为 0 + int highC = 0; + boolean upspeed = false; + boolean isTime = true;//布尔变量,用于控制游戏速度 + boolean runstop;//布尔变量,控制游戏是否停止 + static boolean isRank = false; + static boolean changeBack = false; + public static boolean playing = false;//游戏是否进行 + static boolean isMusic = true;//是否播放音乐 + static boolean high = false;//是否处于高分模式 + PreView pv = new PreView();//用于预览下一个方块 + JMenuItem ji1 = new JMenuItem("开局"); + GameCanvas gc = new GameCanvas(20, 12); // 画出 20 行 12 列 + private Block block = new Block(); // 当前块 + private int newspeed = 1000; // 默认当前等级为 1 + MusicPlayer mp = new MusicPlayer(); + Timer time = new Timer(); + MyTask mytask; + int temp = 1; + + // 游戏主构造函数 + public MyFrame(String str) { + super(str);// 调用父类JFrame的构造函数,设置窗口标题 + this.setSize(450, 570);// 设置窗口大小为450x570像素 + Dimension scrSize = Toolkit.getDefaultToolkit().getScreenSize(); // 获取屏幕尺寸 + setLocation((scrSize.width - getSize().width) / 2, (scrSize.height - getSize().height) / 2); // 设置屏幕居中 + this.setLayout(null); + // label 的大小为 jframe 的大小 + label.setBounds(0, 0, this.getWidth(), this.getHeight()); + // 把 label 加到 jframe 的最底层,比 jframe 上的那个 panel还下面 + this.getLayeredPane().add(label, new Integer(Integer.MIN_VALUE)); + // label 比 jframe 上的那个 panel还下面,那需要把那个 panel设为透明的,不然就盖住背景了 + JPanel imagePanel = (JPanel) this.getContentPane(); + imagePanel.setOpaque(false); + addMenu(); + // 游戏开始按钮 + ji1.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + // TODO Auto-generated method stub + // 如果游戏已经开始,再按一次即显示游戏结束 + + if (playing == true) { + ji1.setText("开局"); + if (isMusic == true) { + mp.playStart(); + } + gc.setGameOver(true); + gc.repaint(); + MyFrame.rank = 11 - Constant.step; + MyFrame.jt10.setText("等级:" + MyFrame.rank); + runstop = true; + block.isAlive = false; + block = new Block(); + mytask.cancel(); + + playing = false; + } else { + reset(); + if (isMusic == true) { + mp.playStart(); + } + MyFrame.rank = 11 - Constant.step; + MyFrame.jt10.setText("等级:" + MyFrame.rank); + ji1.setText("结束游戏"); + playing = true; + mytask = new MyTask(); + time.schedule(mytask, 0, 100); // 100 毫秒执行一次 + Thread thread = new Thread(new play()); // 调用开始游戏的方法 + thread.start(); + + } + } + }); + this.add(gc); // 添加游戏画布 + + addRight(); // 添加右边 + this.setFocusable(true); // 设置可获得焦点 + this.requestFocus(); // 设置焦点 + this.addKeyListener(new MyListener()); + this.setVisible(true); + this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + } + private double screenWidth=Toolkit.getDefaultToolkit().getScreenSize().getWidth(); + private double screenHeight=Toolkit.getDefaultToolkit().getScreenSize().getHeight(); + public MyFrame(String title, int width, int height) { + super(title); + setSize(width,height); + int x=(int)(screenWidth-width)/2; + int y=(int)(screenHeight-height)/2; + setLocation(x,y); + addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent e) { + System.exit(0); + } + }); + } + // TODO 自动生成的构造函数存根 + + public static void setBackGround() { + label.setIcon(background); + } + + /** + * 定时下落,用计数方式来实现速度的改变 + * + */ + private class MyTask extends TimerTask { + + @Override + public void run() { + temp++; + if (temp % Constant.step == 0) { + block.newL = block.x; + block.newH = block.y + 1; + // block.yy(); + if (block.pausing == true) + return; + if (high == true) { + block.earse(); + highC++; + if (highC == 4) { + gc.addRow(); + highC = 0; + } + } + if (block.isMoveAble(block.newH, block.newL)) { + block.earse(); + block.y++; + block.display(); + gc.repaint(); + + } else { + block.isAlive = false; + gc.repaint(); + // cancel(); + } // 取消定时器任务 + temp = 1; + } + } + } + + private class play implements Runnable { + public void run() { + // if(killThread==true) + // return; + int col = (int) (Math.random() * (gc.getCols() - 3)); // 随即位置生成列 + int style = Constant.STYLES[(int) (Math.random() * Block.get_addl())][(int) (Math + .random() * 4)]; + while (playing) { + if (block!= null) { + // 判断当前方块是否死亡 + if (block.isAlive) { + try { + Thread.currentThread().sleep(100); + } catch (InterruptedException ie) { + ie.printStackTrace(); + } + continue; + } + } + isFullLine(); + // if(upspeed)//判断是否加速,是的话则进行调用 + // upLevel(); + if (isGameOver()) { + if (isMusic == true) { + mp.playGameOver(); + } + gc.setGameOver(true); + gc.repaint(); + ji1.setText("开局"); + mytask.cancel(); + playing = false; + return; + } + block = new Block(style, -1, col, gc); + block.jixu(); // 防止在暂停时候重新开始游戏,暂停字还不消失 + gc.repaint(); // 将创建出来的方块显示出来 + block.isAlive = true; + col = (int) (Math.random() * (gc.getCols() - 3)); // 随即位置生成列 + style = Constant.STYLES[(int) (Math.random() * Block.get_addl())][(int) (Math + .random() * 4)]; + pv.setStyle(style); + } + } + } + + /** + * 增加速度 + */ + private void upLevel() { + if (Constant.step - 1 < 1) { + return; + } + Constant.step = Constant.step - 1; // 速度增加一级 + rank++; + jt10.setText("等级:" + rank); + upspeed = false; // 将标志位至为 false + } + + /** + * 判断是否满行,满行则调用消行方法。 + */ + private void isFullLine() { + // TODO Auto-generated method stub + + for (int i = 0; i < 20; i++) { + int row = 0; + boolean flag = true; + for (int j = 0; j < 12; j++) { + if (!gc.getBox(i, j).isColorBox()) { + flag = false; + break; + } + } + + if (flag == true) { + row = i; + gc.delete(row); // 删除行 + if (isMusic == true) { + mp.playEraseSound(); + } + addScor(); // 增加分数 + if (scor % 100 == 0) { // 设置为 100 分增加一个等级 + upspeed = true; // 将速度增加标志位至为 true + if (upspeed == true) + upLevel(); + } + } + } + } + + /** + * 得分的计算方法 + */ + private void addScor() { + scor += 10; + System.out.println("得分:" + scor); + jt9.setText("得分:" + scor); + } + /** + * 判断最顶层是否有被占用,游戏是否结束 + */ + private boolean isGameOver() { + for (int i = 0; i < 12; i++) { + Box box = gc.getBox(0, i); + if (box.isColorBox()) + return true; + } + return false; + } + + private void reset() { + scor = 0; + rank = 0; + jt10.setText("等级:" + rank); + jt9.setText("得分:" + scor); + upspeed = false; + playing = true; + runstop = false; + // block.pausing = false; + // isTime = true; + // block = new Block(); + // block.isAlive = false; + gc.setGameOver(false); + gc.repaint(); + gc.reset(); + } + + /* + private class MenuKeyListener extends KeyAdapter { + public void keyPressed(KeyEvent e) { + int i = e.getKeyCode(); + switch (i) { + case KeyEvent.VK_C: + System.out.println("111");; + break; + case KeyEvent.VK_DOWN: + block.moveDown(); + break; + case KeyEvent.VK_LEFT: + block.moveLeft(); + break; + } + } + } + */ + + /** + * + * 按键监听,上下左右。 + */ + private class MyListener extends KeyAdapter { + + @Override + public void keyPressed(KeyEvent e) { + // TODO Auto-generated method stub + int i = e.getKeyCode(); + switch (i) { + case KeyEvent.VK_UP: + block.moveUp(); + break; + case KeyEvent.VK_DOWN: + block.moveDown(); + break; + case KeyEvent.VK_LEFT: + block.moveLeft(); + break; + case KeyEvent.VK_RIGHT: + block.moveRight(); + break; + case KeyEvent.VK_SPACE: + block.quickDown(); + break; + case KeyEvent.VK_P: + block.pause(); + break; + case KeyEvent.VK_C: + block.jixu(); + break; + + } + } + + } + + /** + * 菜单添加方法 + */ + private void addMenu() { + // TODO Auto-generated method stub + JMenuBar jb1 = new JMenuBar(); + // m1.addKeyListener(new MenuKeyListener()); + // 监听 Dialog 对话框,如果有等级改变则改变选择 + m1.addChangeListener(new ChangeListener() { + + @Override + public void stateChanged(ChangeEvent e) { + // TODO Auto-generated method stub + int i = Block.get_addl(); + if (i == 7) + jr1.setSelected(true); + else if (i == 10) + jr2.setSelected(true); + else + jr3.setSelected(true); + } + }); + + jr1.addActionListener(new MenuActionListener()); + jr2.addActionListener(new MenuActionListener()); + jr3.addActionListener(new MenuActionListener()); + ButtonGroup bg = new ButtonGroup(); + bg.add(jr1); + bg.add(jr2); + bg.add(jr3); + + JMenuItem ji2 = new JMenuItem("自定义"); + + ji2.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent arg0) { + // TODO Auto-generated method stub + zi = new Zidingyi(MyFrame.this, "自定义", false, block, gc); + zi.setVisible(true); + if (playing == true) + block.pause(); + } + }); + JMenuItem ji3 = new JMenuItem("退出"); + ji3.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent arg0) { + // TODO Auto-generated method stub + System.exit(1); // 退出程序 + } + }); + JMenuItem ji4 = new JMenuItem("关于"); + ji4.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + // TODO Auto-generated method stub + JDialog dl = new Version(MyFrame.this, "版本信息", false); + + } + }); + // 调用颜色对话框设置方块颜色 + JMenuItem ji_color = new JMenuItem("方块颜色"); + ji_color.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + // TODO Auto-generated method stub + Color newFrontColor = JColorChooser.showDialog( + MyFrame.this, "设置方块颜色", + gc.getBlockColor()); + if (newFrontColor!= null) + gc.setBlockColor(newFrontColor); + } + }); + MyFrame.this.setJMenuBar(jb1); + jb1.add(m1); + jb1.add(m2); + m1.add(ji1); + m1.add(jr1); + m1.add(jr2); + m1.add(jr3); + m1.add(ji2); + m1.add(ji_color); + m1.add(ji3); + + m2.add(ji4); + } + + /** + * 右界面的添加 + */ + private void addRight() { + // TODO Auto-generated method stub + // JTextField jt1 = new JTextField("下一块"); + JLabel jt1 = new JLabel("下一块"); + jt1.setFont(new Font("华文行楷", Font.BOLD, 18)); + jt1.setOpaque(false); + // jt1.setEditable(false); + jp_pre.setLayout(null); + jt1.setBounds(5, 0, 80, 20); + jp_pre.add(jt1); + pv.setBounds(10, 20, 102, 102); + jp_pre.add(pv); // 添加预览窗口 + jp_pre.setBounds(308, 5, 120, 125); // 设置坐标 + jp_pre.setOpaque(false); // 设置背景为透明 + MyFrame.this.add(jp_pre); + // JTextField jt2 = new JTextField("功能键盘"); + JLabel jt2 = new JLabel("功能键盘"); + jt2.setFont(new Font("华文行楷", Font.BOLD, 23)); + // jt2.setEditable(false); + jt2.setOpaque(false); + // JTextField jt3 = new JTextField("快速向下:↓"); + JLabel jt3 = new JLabel("快速向下:↓"); + jt3.setFont(new Font("华文行楷", Font.BOLD, 15)); + // jt3.setEditable(false); + jt3.setOpaque(false); + // JTextField jt4 = new JTextField("旋转:↑"); + JLabel jt4 = new JLabel("旋转:↑"); + jt4.setFont(new Font("华文行楷", Font.BOLD, 15)); + // jt4.setEditable(false); + jt4.setOpaque(false); + // JTextField jt5 = new JTextField("向左:←"); + JLabel jt5 = new JLabel("向左:←"); + jt5.setFont(new Font("华文行楷", Font.BOLD, 15)); + // jt5.setEditable(false); + jt5.setOpaque(false); + // JTextField jt6 = new JTextField("向右:→"); + JLabel jt6 = new JLabel("向右:→"); + jt6.setFont(new Font("华文行楷", Font.BOLD, 15)); + // jt6.setEditable(false); + jt6.setOpaque(false); + JLabel jt11 = new JLabel("一键下落:空格"); + jt11.setFont(new Font("华文行楷", Font.BOLD, 15)); +// jt6.setEditable(false); + jt6.setOpaque(false); +// JTextField jt7=new JTextField("暂停:P" ); + JLabel jt7=new JLabel("暂停:P"); + jt7.setFont(new Font("华文行楷", Font.BOLD, 15)); +// jt7.setEditable(false); + jt7.setOpaque(false); +// JTextField jt8=new JTextField("继续:C" ); + JLabel jt8=new JLabel("继续:C"); + jt8.setFont(new Font("华文行楷", Font.BOLD, 15)); +// jt8.setEditable(false); + jt8.setOpaque(false); + jp_ctrl.setLayout(new GridLayout(8, 1, 0, 0)); +// jp_ctrl.setBorder(BorderFactory.createBevelBorder(EtchedBorder.LOWERED)); + jp_ctrl.add(jt2); + jp_ctrl.add(jt3); + jp_ctrl.add(jt4); + jp_ctrl.add(jt5); + jp_ctrl.add(jt6); + jp_ctrl.add(jt11); + jp_ctrl.add(jt7); + jp_ctrl.add(jt8); + jp_ctrl.setOpaque(false); + jp_ctrl.setBounds(310, 145, 120, 200); + MyFrame.this.add(jp_ctrl); +// jt9.setEditable(false); + jt9.setOpaque(false); + jt9.setForeground(Color.BLACK); +// jt10.setEditable(false); + jt10.setOpaque(false); + jt10.setForeground(Color.BLACK); + jp_scor.setLayout(new GridLayout(2, 1, 0, 20)); + jp_scor.add(jt9); + jt9.setFont(new Font("华文行楷", Font.BOLD, 26)); + jt10.setFont(new Font("华文行楷", Font.BOLD, 26)); + jp_scor.add(jt10); + jt9.setBackground(Color.LIGHT_GRAY); + jt10.setBackground(Color.LIGHT_GRAY); + jp_scor.setOpaque(false); + jp_scor.setBounds(320, 360, 100, 140); + MyFrame.this.add(jp_scor); + } + + /** + * 菜单等级的监听 + * + */ + private class MenuActionListener implements ActionListener { + + @Override + public void actionPerformed(ActionEvent e) { + //获取JMenuItem对象 + JMenuItem j=((JMenuItem)e.getSource()); + if(j==jr1){ +// newLevel=Constant.LEVEL_1; + Block.set_addl(7); + } + if(j==jr2){ + Block.set_addl(10); + } + if(j==jr3){ +// high=true; + Block.set_addl(13); + } + + } + + } + public static void main(String[] args) { + new MyFrame("俄罗斯方块"); + } + + + } \ No newline at end of file