?? 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 + -