📄 gamepanel.java
字号:
viewer.repaint();
}
drawBox(getGraphics());
return false;
}
Box b=box.copy();
b.setY(b.getY()+1);
if(!canAdd(b)){
setNoMove(box);
Box next=box.willNext();
next.setPoint(startPoint.x,startPoint.y-box.getBoxHeight());
if(!canAdd(next)){//Game Over
if(listener!=null)
listener.doGameOver(new BoxEvent(box.copy(),0));
clearBoxs(getGraphics());
init();
return false;
}
box.next();
box.setPoint(startPoint.x,startPoint.y-box.getBoxHeight());
if(listener!=null)
listener.doNewBox(new BoxEvent(box.copy(),0));
if(viewer!=null)viewer.repaint();
drawBox(getGraphics());
return false;
}
clearBox(getGraphics());
box.setY(box.getY()+1);
drawBox(getGraphics());
return true;
}
/**
* 处理空格降到底部
*/
private void actionSPACE(){
while(actionDOWN());
}
/**
* This method initializes this
*
* @return void
*/
private void initialize() {
this.setLayout(new GridBagLayout());
//this.addKeyListener(this);//添加事件处理器
}
//事件处理函数
public void keyPressed(java.awt.event.KeyEvent e) {
switch(e.getKeyCode()){
case java.awt.event.KeyEvent.VK_UP:
actionUP();
break;
case java.awt.event.KeyEvent.VK_LEFT:
actionLEFT();
break;
case java.awt.event.KeyEvent.VK_RIGHT:
actionRIGHT();
break;
case java.awt.event.KeyEvent.VK_DOWN:
actionDOWN();
break;
case java.awt.event.KeyEvent.VK_SPACE:
actionSPACE();
break;
}
}
public void keyTyped(java.awt.event.KeyEvent e) {
}
public void keyReleased(java.awt.event.KeyEvent e) {
}
/**
* 绘制网络
* @param g 图形
*/
private void drawLines(Graphics g){
if(g==null)return;
Color temp=g.getColor();//保存以前颜色
g.setColor(lineColor);
//将边框加粗 画两次
g.draw3DRect(point.x-1,point.y-1,boxWidth*boxCol+2,boxHeight*boxRow+2,true);//画边框
g.draw3DRect(point.x,point.y,boxWidth*boxCol,boxHeight*boxRow,true);//画边框
for(int i=1;i<boxCol;i++)
g.drawLine(point.x+i*boxWidth,point.y, point.x+i*boxWidth,point.y+boxRow*boxHeight);
for(int i=1;i<boxRow;i++)
g.drawLine(point.x,point.y+i*boxHeight,point.x+boxWidth*boxCol,point.y+i*boxHeight);
g.setColor(temp);//还原以前颜色
}
/**
* @param g 绘制不能移动的方块
*/
private void drawBoxs(Graphics g){
if(g==null)return;
Color c=g.getColor();
g.setColor(boxColor);
for(int i=0;i<boxRow;i++){
for(int j=0;j<boxCol;j++){
if(!space[i][j])
g.fill3DRect(point.x+j*boxWidth+1,point.y+i*boxHeight+1,boxWidth-1,boxHeight-1,true);
}
}
g.setColor(c);
}
/**
* @param g 清除不能移动的方块图形
*/
private void clearBoxs(Graphics g){
if(g==null)return;
Color c=g.getColor();
g.setColor(this.getBackground());
for(int i=0;i<boxRow;i++){
for(int j=0;j<boxCol;j++){
if(!space[i][j]){
g.clearRect(point.x+j*boxWidth+1,point.y+i*boxHeight+1,boxWidth-1,boxHeight-1);
}
}
}
g.setColor(c);
}
/**
* @param g 绘制当前移动的方块
*/
private void drawBox(Graphics g){
if(g==null)return;
if(view){//预览绘画
Color c=g.getColor();
g.setColor(boxColor);
if(up!=null)
clearBox(up,g);
drawBox(box.willNext(),g);
up=box.willNext();
g.setColor(c);
return;
}
Color c=g.getColor();
g.setColor(boxColor);
int[][] d=box.getPoints();
for(int i=0;i<d.length;i++){
if(box.getX()+d[i][0]<0||box.getY()+d[i][1]<0)continue;
g.fill3DRect(point.x+(box.getX()+d[i][0])*boxWidth+1,point.y+(box.getY()+d[i][1])*boxHeight+1,boxWidth-1,boxHeight-1,true);
}
g.setColor(c);
}
/**
* @param g 清除当前绘制的移动方块
*/
private void clearBox(Graphics g){
if(g==null)return;
int[][] d=box.getPoints();
for(int i=0;i<d.length;i++){
if(box.getX()+d[i][0]<0||box.getY()+d[i][1]<0)continue;
g.clearRect(point.x+(box.getX()+d[i][0])*boxWidth+1,point.y+(box.getY()+d[i][1])*boxHeight+1,boxWidth-1,boxHeight-1);
}
}
public void repaint(){
paint(getGraphics());
}
/**
* 消除当前绘制的移动方块
* @param box 需要清除的方块
* @param g 图形
*/
private void clearBox(Box box,Graphics g){
if(g==null)return;
int[][] d=box.getPoints();
for(int i=0;i<d.length;i++)
g.clearRect(point.x+(box.getX()+d[i][0])*boxWidth+1,point.y+(box.getY()+d[i][1])*boxHeight+1,boxWidth-1,boxHeight-1);
}
/**
* 绘制指定的方块
* @param box 方块
* @param g 图形
*/
private void drawBox(Box box,Graphics g){
if(g==null)return;
Color c=g.getColor();
g.setColor(boxColor);
int[][] d=box.getPoints();
for(int i=0;i<d.length;i++)
g.fill3DRect(point.x+(box.getX()+d[i][0])*boxWidth+1,point.y+(box.getY()+d[i][1])*boxHeight+1,boxWidth-1,boxHeight-1,true);
g.setColor(c);
}
//专为预览类面板定义的上一个方块变量
Box up=null;
//绘画
public void paint(Graphics g){
if(g==null)return;
//初始化大小
if((getWidth()-boxWidth*boxCol)<0){this.setSize(boxWidth*(boxCol+1),getHeight());}
if((getHeight()-boxHeight*boxRow)<0){this.setSize(getWidth(),boxHeight*(boxRow+2));}
//计算左上角的点
point=new Point((getWidth()-boxWidth*boxCol)/2,(getHeight()-boxHeight*boxRow)/2);
drawLines(g);
drawBoxs(g);
drawBox(g);
}
/**
* @param width 设置方块的宽度
*/
public void setBoxWidth(int width){
boxWidth=width;
}
/**
* @return 取得方块的宽度
*/
public int getBoxWidth(){
return boxWidth;
}
/**
* @param height 设置方块的高度
*/
public void setBoxHeight(int height){
boxHeight=height;
}
/**
* @return 取得方块的高度
*/
public int getBoxHeight(){
return boxHeight;
}
/**
* @param row 设置游戏中方块的行数
*/
public void setBoxRow(int row){
boxRow=row;
}
/**
* @return 取得游戏方块的行数
*/
public int getBoxRow(){
return boxRow;
}
/**
* @param col 设置游戏方块的列数
*/
public void setBoxCol(int col){
boxCol=col;
}
/**
* @return 取得游戏中方块的列数
*/
public int getBoxCol(){
return boxCol;
}
public void actionPerformed(ActionEvent e) {
actionDOWN();
}
/**
* 启动游戏
*/
public void start(){
if(!timer.isRunning())
timer.start();
}
/**
* 停止游戏
*/
public void stop(){
if(timer.isRunning())
timer.stop();
}
/**
* 根据命令字符,完成指定动作
* 'U','D','L','R','S' 分别是上下左右底
* @param key 命令字符
*/
public void action(char key){
switch(key){
case 'U':
case 'u':actionUP();break;
case 'L':
case 'l':actionLEFT();break;
case 'R':
case 'r':actionRIGHT();break;
case 'D':
case 'd':actionDOWN();break;
case 'S':
case 's':actionSPACE();break;
}
}
/**
* 判断游戏中指定位置是否为空
* @param x X轴位置
* @param y Y轴位置
* @return 为空返回true,否则返回false
*/
public boolean isSpace(int x,int y){
return space[y][x];
}
/**
* @return 复制游戏地图空间
*/
public static boolean[][] copyData(boolean [][]space){
boolean[][] re=new boolean[space.length][space[0].length];
for(int i=0;i<space.length;i++)
System.arraycopy(space[i],0,re[i],0,space[0].length);
return re;
}
public boolean[][] copyData(){
return copyData(space);
}
public Box getBox() {
return box;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -