📄 game2.txt
字号:
public class Game extends java.awt.Frame
{
public Game()
{
setTitle("俄罗斯方块游戏 - Ghost Valley");
addWindowListener(new java.awt.event.WindowAdapter(){
public void windowClosing(java.awt.event.WindowEvent e){
dispose();
System.exit(0);
}
});
GameCanvas gameCanvas = new GameCanvas();
setLayout(new java.awt.BorderLayout());
add(gameCanvas,"Center");
setResizable(false);
setLocation((java.awt.Toolkit.getDefaultToolkit().getScreenSize().width-gameCanvas.getPreferredSize().width)/2,(java.awt.Toolkit.getDefaultToolkit().getScreenSize().height-gameCanvas.getPreferredSize().height)/2);
pack();
show();
}
public static void main(String args[]){ new Game(); }
}
class GameCanvas extends java.awt.Canvas implements Runnable
{
public static final int BKSIZE = 5;
public static final int BDWIDTH = 20;
public static final int BDHEIGHT = 30;
////// Inner class Block////////
private class Block
{
public boolean bkdata[][] = new boolean[BKSIZE][BKSIZE];
public int rpos,cpos;
public Block(final boolean bkdata1[][],int rpos,int cpos)
{
//this.bkdata = (boolean[][])bkdata1.clone();
for(int i=0; i<BKSIZE; i++)
for(int j=0; j<BKSIZE; j++)
this.bkdata[i][j] = bkdata1[i][j];
this.rpos = rpos;
this.cpos = cpos;
}
public Block(final Block bk)
{
//this.bkdata = (boolean[][])bk.bkdata.clone();
for(int i=0; i<BKSIZE; i++)
for(int j=0; j<BKSIZE; j++)
this.bkdata[i][j] = bk.bkdata[i][j];
this.rpos = bk.rpos;
this.cpos = bk.cpos;
}
public void doAction(int action)
{
switch(action)
{
case Message.MOVE_UP:
this.rpos--;
break;
case Message.MOVE_DOWN:
this.rpos++;
break;
case Message.MOVE_LEFT:
this.cpos--;
break;
case Message.MOVE_RIGHT:
this.cpos++;
break;
case Message.ROTATE_CLOCK:
{
final int x0 = BKSIZE/2;
final int y0 = BKSIZE/2;
//boolean bkdata1[][] = (boolean[][])this.bkdata.clone();
boolean bkdata1[][] = new boolean[BKSIZE][BKSIZE];
for(int i=0; i<BKSIZE; i++)
for(int j=0; j<BKSIZE; j++)
bkdata1[i][j] = this.bkdata[i][j];
for(int x=0; x<BKSIZE; x++)
for(int y=0; y<BKSIZE; y++)
this.bkdata[y][-x+2*y0] = bkdata1[x][y];
break;
}
case Message.ROTATE_ANTICLOCK:
{
final int x0 = BKSIZE/2;
final int y0 = BKSIZE/2;
//boolean bkdata1[][] = (boolean[][])this.bkdata.clone();
boolean bkdata1[][] = new boolean[BKSIZE][BKSIZE];
for(int i=0; i<BKSIZE; i++)
for(int j=0; j<BKSIZE; j++)
bkdata1[i][j] = this.bkdata[i][j];
for(int x=0; x<BKSIZE; x++)
for(int y=0; y<BKSIZE; y++)
this.bkdata[-y+2*x0][x] = bkdata1[x][y];
break;
}
}
}
}
private class Board
{
public boolean bddata[][] = new boolean[BDHEIGHT][BDWIDTH];
public Board()
{
clear();
}
public Board(final Board board)
{
//this.bddata = (boolean[][])board.bddata.clone();
for(int i=0; i<BDHEIGHT; i++)
for(int j=0; j<BDWIDTH; j++)
this.bddata[i][j] = board.bddata[i][j];
}
public void clear()
{
for(int i=0; i<BDHEIGHT; i++)
for(int j=0; j<BDWIDTH; j++)
bddata[i][j] = false;
}
}
////// Inner class Message /////////
private class Message
{
public static final int MOVE_UP = 1;
public static final int MOVE_DOWN = 2;
public static final int MOVE_LEFT = 3;
public static final int MOVE_RIGHT = 4;
public static final int ROTATE_CLOCK = 5; //rotate clock-wise
public static final int ROTATE_ANTICLOCK = 6;//rotate anticlock-wise
public Message(int action)
{
this.action = action;
}
public int getAction()
{
return this.action;
}
private int action;
}
////// Inner class Queue ///////
//////////// fields of class Game ////////////////
private Board m_board = new Board(); //仅由消息处理器线程访问
private Block m_block = null; //当前存在的块
private MessageQueue m_msgQueue = new MessageQueue(); //由消息处理器和awt线程访问
private BlockDataPoolQueue m_blockDataPoolQueue = new BlockDataPoolQueue();
private int m_S = 0;
///// method run 主消息处理处理线程
public void run()
{
boolean bkdataPool[][][] ={
{{false,false,true,false,false},
{false,false,true,false,false},
{false,false,true,false,false},
{false,false,true,false,false},
{false,false,true,false,false}},
{{false,false,false,false,false},
{false,true,true,true,false},
{false,false,true,false,false},
{false,false,true,false,false},
{false,false,true,false,false},
{false,false,false,false,false}},
{{false,false,false,false,false},
{false,false,true,false,false},
{false,true,true,true,false},
{false,false,true,false,false},
{false,false,false,false,false}},
{{false,false,false,false,false},
{false,false,false,false,false},
{false,true,true,true,false},
{false,true,false,true,false},
{false,false,false,false,false}},
{{false,false,false,false,false},
{false,false,false,false,false},
{false,true,true,true,false},
{false,false,true,false,false},
{false,false,false,false,false}}};
repaintRequest();
while(true)
{
switch(m_S)
{
case 0:
try
{
Thread.currentThread().sleep(50);
}
catch (InterruptedException ex)
{
}
break;
case 1:
Block bk1 = new Block(m_blockDataPoolQueue.getNextBlockData(),0,(BDWIDTH-BKSIZE)/2);
if( ! isCollided(m_board,bk1)){
m_block = bk1;
m_S = 2;
}else
m_S = 3;
repaintRequest();
break;
case 2:
Message msg;
synchronized(m_msgQueue) //等待新的消息
{
while(m_msgQueue.empty()){
try{
m_msgQueue.wait();
}catch(InterruptedException e){
}
}
msg = (Message)m_msgQueue.dl();
}
Block bk2 = new Block(m_block);
bk2.doAction(msg.getAction());
if(! isCollided(m_board,bk2)){ //动作可以执行
m_block.doAction(msg.getAction());
m_S = 2;
repaintRequest();
}else if(msg.getAction()==Message.MOVE_DOWN){ //向下移动的动作不能执行
merge(m_board,m_block);
m_block = null;
packUpBoard(m_board);
m_S = 1;
repaintRequest();
}
break;
case 3:
try
{
Thread.currentThread().sleep(50);
}
catch (Exception ex)
{
}
break;
}
}
}
private boolean isCollided(final Block bk1,final Block bk2) //判断两方块是否重叠
{
for(int r1=0; r1<BKSIZE; r1++)
{
int r2 = r1+bk1.rpos-bk2.rpos;
if(r2>=0 && r2<BKSIZE)
{
for(int c1=0; c1<BKSIZE; c1++)
{
int c2 = c1+bk1.cpos-bk2.cpos;
if(c2>=0 && c2<BKSIZE)
if(bk1.bkdata[r1][c1] && bk2.bkdata[r2][c2])
return true;
}
}
}
return false;
}
private boolean isCollided(final Board board,final Block block) //判断某方块与某底板是否重叠
{
for(int i=0; i<BKSIZE; i++){
for(int j=0; j<BKSIZE; j++){
if(block.rpos+i>=0 && block.rpos+i<BDHEIGHT && block.cpos+j>=0 && block.cpos+j<BDWIDTH){
if(block.bkdata[i][j] && board.bddata[i+block.rpos][j+block.cpos])
return true;
}else if(block.bkdata[i][j])
return true;
}
}
return false;
}
private void merge(Board board,final Block block) //合并board <=== block
{
for(int i=0; i<BKSIZE; i++)
for(int j=0; j<BKSIZE; j++)
if(block.rpos+i>=0 && block.rpos+i<=BDHEIGHT-1 && block.cpos+j>=0 && block.cpos+j<=BDWIDTH-1)
board.bddata[block.rpos+i][block.cpos+j] |= block.bkdata[i][j];
}
private int packUpBoard(Board board) //消去满行
{
int linesDeleted = 0;
for(int i=BDHEIGHT-1; i>=0;){ //检测第i行
boolean full = true;
for(int j=0; j<BDWIDTH; j++){
if(! board.bddata[i][j]){
full = false;
break;
}
}
if(full){ //第i行为满行
for(int k=i-1; k>=0; k--){
for(int c=0; c<BDWIDTH; c++)
board.bddata[k+1][c] = board.bddata[k][c];
}
for(int c=0; c<BDWIDTH; c++)
board.bddata[0][c] = false;
linesDeleted++;
}else
i--;
}
return linesDeleted;
}
//Constructor
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -