?? gamecanvas.java
字號:
/**
* File: GameCanvas.java
* User: Administrator
* Date: Jan 15, 2003
* Describe: 俄羅斯方塊的 Java 實現
*/
import javax.swing.*;
import javax.swing.border.EtchedBorder;
import java.awt.*;
/**
* 畫布類,內有<行數> * <列數>個方格類實例。
* 繼承自JPanel類。
* ErsBlock線程類動態改變畫布類的方格顏色,畫布類通過
* 檢查方格顏色來體現ErsBlock塊的移動情況。
*/
class GameCanvas extends JPanel {
private Color backColor = Color.black, frontColor = Color.orange;
private int rows, cols, score = 0, scoreForLevelUpdate = 0;
private ErsBox[][] boxes;
private int boxWidth, boxHeight;
/**
* 畫布類的構造函數
* @param rows int, 畫布的行數
* @param cols int, 畫布的列數
* 行數和列數決定著畫布擁有方格的數目
*/
public GameCanvas(int rows, int cols) {
this.rows = rows;
this.cols = cols;
boxes = new ErsBox[rows][cols];
for (int i = 0; i < boxes.length; i++) {
for (int j = 0; j < boxes[i].length; j++) {
boxes[i][j] = new ErsBox(false);
}
}
setBorder(new EtchedBorder(
EtchedBorder.RAISED, Color.white, new Color(148, 145, 140)));
}
/**
* 畫布類的構造函數
* @param rows 與public GameCanvas(int rows, int cols)同
* @param cols 與public GameCanvas(int rows, int cols)同
* @param backColor Color, 背景色
* @param frontColor Color, 前景色
*/
public GameCanvas(int rows, int cols,
Color backColor, Color frontColor) {
this(rows, cols);
this.backColor = backColor;
this.frontColor = frontColor;
}
/**
* 設置游戲背景色彩
* @param backColor Color, 背景色彩
*/
public void setBackgroundColor(Color backColor) {
this.backColor = backColor;
}
/**
* 取得游戲背景色彩
* @return Color, 背景色彩
*/
public Color getBackgroundColor() {
return backColor;
}
/**
* 設置游戲方塊色彩
* @param frontColor Color, 方塊色彩
*/
public void setBlockColor(Color frontColor) {
this.frontColor = frontColor;
}
/**
* 取得游戲方塊色彩
* @return Color, 方塊色彩
*/
public Color getBlockColor() {
return frontColor;
}
/**
* 取得畫布中方格的行數
* @return int, 方格的行數
*/
public int getRows() {
return rows;
}
/**
* 取得畫布中方格的列數
* @return int, 方格的列數
*/
public int getCols() {
return cols;
}
/**
* 取得游戲成績
* @return int, 分數
*/
public int getScore() {
return score;
}
/**
* 取得自上一次升級后的積分
* @return int, 上一次升級后的積分
*/
public int getScoreForLevelUpdate() {
return scoreForLevelUpdate;
}
/**
* 升級后,將上一次升級以來的積分清0
*/
public void resetScoreForLevelUpdate() {
scoreForLevelUpdate -= ErsBlocksGame.PER_LEVEL_SCORE;
}
/**
* 得到某一行某一列的方格引用。
* @param row int, 要引用的方格所在的行
* @param col int, 要引用的方格所在的列
* @return ErsBox, 在row行col列的方格的引用
*/
public ErsBox getBox(int row, int col) {
if (row < 0 || row > boxes.length - 1
|| col < 0 || col > boxes[0].length - 1)
return null;
return (boxes[row][col]);
}
/**
* 覆蓋JComponent類的函數,畫組件。
* @param g 圖形設備環境
*/
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(frontColor);
for (int i = 0; i < boxes.length; i++) {
for (int j = 0; j < boxes[i].length; j++) {
g.setColor(boxes[i][j].isColorBox() ? frontColor : backColor);
g.fill3DRect(j * boxWidth, i * boxHeight,
boxWidth, boxHeight, true);
}
}
}
/**
* 根據窗口的大小,自動調整方格的尺寸
*/
public void fanning() {
boxWidth = getSize().width / cols;
boxHeight = getSize().height / rows;
}
/**
* 當一行被游戲者疊滿后,將此行清除,并為游戲者加分
* @param row int, 要清除的行,是由ErsBoxesGame類計算的
*/
public synchronized void removeLine(int row) {
for (int i = row; i > 0; i--) {
for (int j = 0; j < cols; j++)
boxes[i][j] = (ErsBox) boxes[i - 1][j].clone();
}
score += ErsBlocksGame.PER_LINE_SCORE;
scoreForLevelUpdate += ErsBlocksGame.PER_LINE_SCORE;
repaint();
}
/**
* 重置畫布,置積分為0
*/
public void reset() {
score = 0;
scoreForLevelUpdate = 0;
for (int i = 0; i < boxes.length; i++) {
for (int j = 0; j < boxes[i].length; j++)
boxes[i][j].setColor(false);
}
repaint();
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -