📄 frame1.java
字号:
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 + -