俄羅斯方塊 (轉)
老早以前寫的一個俄羅斯方塊,不知有沒有bug。
/*
* 俄羅斯方塊(基本功能實現只需400行左右代碼)
* 程序主框架爲: gameInit()
* run() -----> paint() & update()
* |
* |new curBlock <- | need new block?
* | |
* KListener(moveLeft(), moveRight(),
* moveDown(), moveRotate())
*
* 顯示遊戲界面 paint() ,update()
* 初始化程序參數,創建遊戲線程進入遊戲循環{
* 響應用戶操作 KListener
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Tetrics {
JFrame mainF;
TetricsCanvas tCanvas = new TetricsCanvas();
public Tetrics() {
mainF = new JFrame();
mainF.getContentPane().add(tCanvas);
showFrame();
}
private void showFrame() {
mainF.setTitle("Tetrics");
mainF.setSize(320,550);
mainF.setResizable(false);
mainF.setLocation(300,100);
mainF.setVisible(true);
}
public static void main(String[] args) {
new Tetrics();
}
}
--------------------------------------------------------------------------------
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class TetricsCanvas extends Canvas implements Runnable {
boolean bGameOver = false;
int UNITSIZE = 15, ROWS = 32, COLUMNS = 18;
int[][] gameBoard = new int[ROWS + 1][COLUMNS];
int[][] blockBoard = new int[ROWS + 1][COLUMNS];
Block[] curBlock = new Block[4];
boolean bnewBlock = true;
Image bgImage;
Graphics bg;
public TetricsCanvas() {
setBackground(Color.white);
addKeyListener(new KListener());
gameInit();
}
public void gameInit() {
for(int i = 0; i < ROWS; i++)
for(int j = 0; j < COLUMNS; j++) {
gameBoard[i][j] = 0;
blockBoard[i][j] = 0;
}
Thread self = new Thread(this);
self.start();
}
public void paint(Graphics g) {
for(int i = 0; i < ROWS; i++) {
for(int j = 0; j < COLUMNS; j++) {
g.setColor(Color.white);
g.draw3DRect(20 + j * UNITSIZE, 20 + i * UNITSIZE ,
UNITSIZE, UNITSIZE, false);
if(gameBoard[i][j] == 1 || blockBoard[i][j] == 1) {
if(gameBoard[i][j] == 1)
g.setColor(Color.blue);
else if(blockBoard[i][j] == 1)
g.setColor(Color.green);
g.fill3DRect(20 + j * UNITSIZE, 20 + i * UNITSIZE ,
UNITSIZE, UNITSIZE, false);
}
else {
g.setColor(Color.BLACK);
g.fill3DRect(20 + j * UNITSIZE, 20 + i * UNITSIZE ,
UNITSIZE, UNITSIZE, false);
}
}
}
if(bGameOver) {
for(int i = 0; i < ROWS; i++) {
for(int j = 0; j < COLUMNS; j++) {
g.setColor(Color.black);
g.fill3DRect(20 + j * UNITSIZE, 20 + i * UNITSIZE,
UNITSIZE, UNITSIZE, false);
}
}
g.setColor(Color.white);
g.drawString("感謝您的測試", 120, 250);
}
}
public void update(Graphics g) {
if (bgImage == null) {
bgImage = createImage(this.getSize().width,this.getSize().height);
bg = bgImage.getGraphics();
}
bg.setColor(getBackground());
bg.fillRect(0 ,0 ,this.getSize().width ,this.getSize().height);
bg.setColor(getForeground());
paint (bg);
g.drawImage(bgImage ,0 ,0 ,this);
}
public void run() {
while(!bGameOver) {
try {
Thread.sleep(100);
}
catch(Exception e) {
e.printStackTrace();
}
if(bnewBlock) {
newBlock();
checkGameOver();
bnewBlock = false;
}
else {
bnewBlock = !moveDown();
}
repaint();
}
gameOverDlg();
}
public void gameOverDlg() {
JPanel msgP = new JPanel();
msgP.setLayout(new GridLayout(3, 1));
msgP.add(new JLabel("Author : pluto"));
msgP.add(new JLabel("Date : 2005.4"));
msgP.add(new JLabel("Site : BJTU15#"));
JOptionPane.showMessageDialog(null, msgP, "Info", JOptionPane.YES_OPTION);
}
public void checkGameOver() {
for(int i = 0 ;i < 4 ;i++)
if(gameBoard[curBlock[i].row][curBlock[i].column] == 1) {
bGameOver = true;
System.out.println(bGameOver);
}
}
class Block {
int row ,column;
public Block(int row ,int column) {
this.row = row;
this.column = column;
}
}
public void newBlock() {
int urow = 0;
int ucolumn = COLUMNS / 2;
switch((int)(Math.random() * 6)) {
case 0:
/* @@@@ */
curBlock[0] = new Block(urow ,ucolumn - 1);
curBlock[1] = new Block(urow,ucolumn - 2);
curBlock[2] = new Block(urow ,ucolumn);
curBlock[3] = new Block(urow ,ucolumn + 1);
break;
case 1:
/* @
@@@ */
curBlock[0] = new Block(urow + 1,ucolumn);
curBlock[1] = new Block(urow ,ucolumn);
curBlock[2] = new Block(urow + 1 ,ucolumn - 1);
curBlock[3] = new Block(urow + 1 ,ucolumn + 1);
break;
case 2:
/* @@
@@ */
curBlock[0] = new Block(urow + 1,ucolumn);
curBlock[1] = new Block(urow ,ucolumn - 1);
curBlock[2] = new Block(urow ,ucolumn);
curBlock[3] = new Block(urow + 1 ,ucolumn + 1);
break;
case 3:
/* @@
@@ */
curBlock[0] = new Block(urow + 1 ,ucolumn);
curBlock[1] = new Block(urow ,ucolumn + 1);
curBlock[2] = new Block(urow ,ucolumn);
curBlock[3] = new Block(urow + 1 ,ucolumn - 1);
break;
case 4:
/* @@
@@ */
curBlock[0] = new Block(urow ,ucolumn - 1);
curBlock[1] = new Block(urow ,ucolumn);
curBlock[2] = new Block(urow + 1 ,ucolumn - 1);
curBlock[3] = new Block(urow + 1 ,ucolumn);
break;
case 5:
/* @@@
@ */
curBlock[0] = new Block(urow ,ucolumn);
curBlock[1] = new Block(urow ,ucolumn - 1);
curBlock[2] = new Block(urow ,ucolumn + 1);
curBlock[3] = new Block(urow + 1 ,ucolumn + 1);
break;
case 6:
/* @@@
@ */
curBlock[0] = new Block(urow ,ucolumn);
curBlock[1] = new Block(urow ,ucolumn + 1);
curBlock[2] = new Block(urow ,ucolumn - 1);
curBlock[3] = new Block(urow + 1 ,ucolumn - 1);
break;
}
}
public void moveLeft() {
for(int i = 0 ;i < 4 ;i++) {
if(curBlock[i].column - 1 < 0 ||
gameBoard[curBlock[i].row][curBlock[i].column - 1] == 1)
return ;
}
for(int i = 0 ;i < 4 ;i++) {
blockBoard[curBlock[i].row][curBlock[i].column] = 0;
}
for(int i = 0 ;i < 4 ;i++) {
blockBoard[curBlock[i].row][curBlock[i].column - 1] = 1;
}
for(int i = 0 ;i < 4 ;i++) {
curBlock[i] = new Block(curBlock[i].row ,curBlock[i].column - 1);
}
}
public void moveRight() {
for(int i = 0 ;i < 4 ;i++) {
if(curBlock[i].column + 1 > COLUMNS - 1 ||
gameBoard[curBlock[i].row][curBlock[i].column + 1] == 1)
return ;
}
for(int i = 0 ;i < 4 ;i++) {
blockBoard[curBlock[i].row][curBlock[i].column] = 0;
}
for(int i = 0 ;i < 4 ;i++) {
blockBoard[curBlock[i].row][curBlock[i].column + 1] = 1;
}
for(int i = 0 ;i < 4 ;i++) {
curBlock[i] = new Block(curBlock[i].row ,curBlock[i].column + 1);
}
}
public boolean moveDown() {
for(int i = 0 ;i < 4 ;i++) {
if(curBlock[i].row == ROWS - 1 ||
gameBoard[curBlock[i].row + 1][curBlock[i].column] == 1) {
copyData();
return false;
}
}
for(int i = 0 ;i < 4 ;i++) {
blockBoard[curBlock[i].row][curBlock[i].column] = 0;
}
for(int i = 0 ;i < 4 ;i++) {
blockBoard[curBlock[i].row + 1][curBlock[i].column] = 1;
}
for(int i = 0 ;i < 4 ;i++) {
curBlock[i] = new Block(curBlock[i].row + 1 ,curBlock[i].column);
}
return true;
}
public void copyData() {
for(int i = 0 ;i < 4 ;i++) {
gameBoard[curBlock[i].row][curBlock[i].column] = 1;
}
checkFullRow();
}
public void checkFullRow() {
int num = 0;
for(int i = ROWS - 1 ;i >= 0 ;i--) {
for(int j = COLUMNS - 1 ;j >= 0 ;j--) {
if(gameBoard[i][j] == 1)
num++;
}
if(num == COLUMNS) {
for(int r = i ;r > 0 ;r--)
for(int c = COLUMNS - 1 ;c >= 0 ;c--) {
gameBoard[r][c] = gameBoard[r - 1][c];
blockBoard[r][c] = blockBoard[r - 1][c];
}
for(int top = COLUMNS - 1 ;top >= 0 ;top--) {
gameBoard[0][top] = 0;
blockBoard[0][top] = 0;
}
i++;
}
num = 0;
}
}
public boolean bRotate(Block[] tempBlock ,int i) {
if(tempBlock[i].row < 0 || tempBlock[i].row > ROWS - 1 ||
tempBlock[i].column < 0 || tempBlock[i].column > COLUMNS - 1)
return false;
if(gameBoard[tempBlock[i].row][tempBlock[i].column] == 1)
return false;
return true;
}
public void moveRotate() {
int[][] offset = new int[4][2];
for(int i = 0 ;i < 4 ;i++) {
offset[i][0] = curBlock[i].column - curBlock[0].column;
offset[i][1] = curBlock[i].row - curBlock[0].row;
}
Block[] tempBlock = new Block[4];
for(int i = 0 ;i < 4 ;i++) {
tempBlock[i] = new Block(curBlock[i].row ,curBlock[i].column);
}
int tempx ,tempy;
for(int i = 0 ;i < 4 ;i++) {
if(offset[i][0] > 0 && offset[i][1] == 0) {
tempx = offset[i][0];
tempy = offset[i][1];
tempBlock[i].column = 0 + tempBlock[0].column;
tempBlock[i].row = tempx + tempBlock[0].row;
if(!bRotate(tempBlock ,i)) {
return ;
}
}
else if(offset[i][0] > 0 && offset[i][1] > 0) {
tempx = offset[i][0];
tempy = offset[i][1];
tempBlock[i].column = -tempx + tempBlock[0].column;
tempBlock[i].row = tempy + tempBlock[0].row;
if(!bRotate(tempBlock ,i)) {
return ;
}
}
else if(offset[i][0] == 0 && offset[i][1] > 0) {
tempx = offset[i][0];
tempy = offset[i][1];
tempBlock[i].column = -tempy + tempBlock[0].column;
tempBlock[i].row = 0 + tempBlock[0].row;
if(!bRotate(tempBlock ,i)) {
return ;
}
}
else if(offset[i][0] < 0 && offset[i][1] > 0 ) {
tempx = offset[i][0];
tempy = offset[i][1];
tempBlock[i].column = tempx + tempBlock[0].column;
tempBlock[i].row = -tempy + tempBlock[0].row;
if(!bRotate(tempBlock ,i)) {
return ;
}
}
else if(offset[i][0] < 0 && offset[i][1] == 0 ) {
tempx = offset[i][0];
tempy = offset[i][1];
tempBlock[i].column = 0 + tempBlock[0].column;
tempBlock[i].row = tempx + tempBlock[0].row;
if(!bRotate(tempBlock ,i)) {
return ;
}
}
else if(offset[i][0] < 0 && offset[i][1] < 0 ) {
tempx = offset[i][0];
tempy = offset[i][1];
tempBlock[i].column = -tempx + tempBlock[0].column;
tempBlock[i].row = tempy + tempBlock[0].row;
if(!bRotate(tempBlock ,i)) {
return ;
}
}
else if(offset[i][0] == 0 && offset[i][1] < 0 ) {
tempx = offset[i][0];
tempy = offset[i][1];
tempBlock[i].column = -tempy + tempBlock[0].column;
tempBlock[i].row = 0 + tempBlock[0].row;
if(!bRotate(tempBlock ,i)) {
return ;
}
}
else if(offset[i][0] > 0 && offset[i][1] < 0 ) {
tempx = offset[i][0];
tempy = offset[i][1];
tempBlock[i].column = tempx + tempBlock[0].column;
tempBlock[i].row = -tempy + tempBlock[0].row;
if(!bRotate(tempBlock ,i)) {
return ;
}
}
}
for(int i = 0 ;i < 4 ;i++) {
blockBoard[curBlock[i].row][curBlock[i].column] = 0;
}
for(int i = 0 ;i < 4 ;i++) {
blockBoard[tempBlock[i].row][tempBlock[i].column] = 1;
}
for(int i = 0 ;i < 4 ;i++) {
curBlock[i] = new Block(tempBlock[i].row ,tempBlock[i].column);
}
}
class KListener extends KeyAdapter {
public void keyPressed(KeyEvent ke) {
if(!bGameOver) {
int command = ke.getKeyCode();
if(command == KeyEvent.VK_LEFT) {
moveLeft();
repaint();
}
if(command == KeyEvent.VK_RIGHT) {
moveRight();
repaint();
}
if(command == KeyEvent.VK_DOWN) {
moveDown();
repaint();
}
if(command == KeyEvent.VK_SPACE || command == KeyEvent.VK_UP) {
moveRotate();
repaint();
}
}
}
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.