public boolean canMove(Block b) {
return b.getY()+blockHeight < b.getRegard();
}
public void paint(Graphics g) {
g.setColor(Color.black);
g.fillRect(0, 0, width, height);
setRegard();
for(int i=0; i<blocks.size(); i++) {
Block b = (Block) blocks.get(i);
g.setColor(colors[b.getColorNum()]);
int xx = b.getY();
int yy = blockHeight;
int zz = b.getRegard();
if(b.getY()+blockHeight > b.getRegard())
b.setY(b.getRegard() - blockHeight);
g.fillRect(b.getX()*blockWidth+1, b.getY()+1, blockWidth-1, blockHeight-1);
if(canMove(b)) {
board[b.getY()/blockHeight][b.getX()] = 0;
b.move();
}
else {
board[(int)(b.getY()/blockHeight)][b.getX()] = b.getColorNum();
deleteSuccess();
}
}
} //end paint
public int findBlock(int r, int c) {
int yval = r*blockHeight;
for(int i=0; i<blocks.size(); i++) {
Block b = (Block) blocks.get(i);
if(b.getX()==c && Math.abs(yval - b.getY())<3)
return i;
}
return -1;
}
private int tempR, tempC;
public void mousePressed(MouseEvent e) {
tempC = e.getX()/blockWidth;
tempR = e.getY()/blockHeight;
} public void mouseReleased(MouseEvent e) {
int i = findBlock(tempR, tempC);
if(i == -1)
return;
Block b = (Block) blocks.get(i);
if(e.getX() >= width || e.getX() <=0 ) return;
if(e.getY() >= height || e.getY() <=0 ) return;
int c = e.getX()/blockWidth;
int r = e.getY()/blockHeight; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if(isLegalSwap(tempR, tempC, r, c)) {
int j = findBlock(r, c);
if(j==-1) {
b.setX(c);
b.setY(r*blockHeight);
board[tempR][tempC] = 0;
return;
} Block b2 = (Block) blocks.get(j);
int colorN = b.getColorNum();
b.setColorNum(b2.getColorNum());
b2.setColorNum(colorN);
int temp = board[r][c];
board[r][c] = board[tempR][tempC];
board[tempR][tempC] = temp;
}
} //end mouse released public boolean isLegalSwap(int r1, int c1, int r2, int c2) {
if(board[r1][c1]==0) return false;
if(r1!=r2) return false;
if(board[r2][c2]!=0) return true;
if(c2 > c1) {
int i = c1 + 1;
for(; i < c2 && r1!=19; i++)
if(board[r1+1][i]==0)
return false;
}
else if(c2 < c1) {
int i = c1 - 1;
for(; i > c2 && r1!=19; i--)
if(board[r1+1][i]==0)
return false;
}
return true;
} public void mouseClicked(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void deleteSuccess() {
int count = 0, val;
int[] records = new int[3000];
int size = 0; // row check
for(int r = 0; r < row; r++)
for(int c = 0; c < col-1; c++)
if(board[r][c]!=0 && board[r][c]==board[r][c+1]) {
records[size++] = r;
records[size++] = c;
count++;
if(c == col-2 && count>=2) {
records[size++] = r;
records[size++] = c+1;
count = 0;
}
if(c == col-2 && count == 1) {
count = 0;
size -= 2;
}
}
else if(count >= 2) {
records[size++] = r;
records[size++] = c;
count = 0;
}
else {
size -= 2*count;
count = 0;
}
// col check
for(int c = 0; c < col; c++)
for(int r = 0; r < row-1; r++)
if(board[r][c]!=0 && board[r][c]==board[r+1][c]) {
records[size++] = r;
records[size++] = c;
count++;
if(r == row-2 && count>=2) {
records[size++] = r+1;
records[size++] = c;
count = 0;
}
if(r == row-2 && count == 1) {
count = 0;
size -= 2;
}
}
else if(count >= 2) {
records[size++] = r;
records[size++] = c;
count = 0;
}
else {
size -= 2*count;
count = 0;
}
for(int i=0; i<size; ) {
int r = records[i];
int c = records[i+1];
board[r][c] = 0;
int index = findBlock(r, c);
if(index!=-1)
blocks.remove(index);
i += 2;
}
if(size >= 6) {
score += calculateScore(size/2-2);
scoreField.setText(""+score);
int l = score/100;
if(l > level) {
for(int i=level; i<l; i++)
upSpeed();
level = l;
levelField.setText(""+level);
}
}
size = 0;
} // end delete Success
public int calculateScore(int k) {
if(k < 1) return 0;
int result = 2;
for(int i=1; i<k; i++)
result *= 2;
return result + 10;
} // end calculate score
public void newGame() {
blocks.clear();
for(int i=0; i<row; i++)
for(int j=0; j<col; j++)
board[i][j] = 0;
score = 0;
scoreField.setText("0");
level = 0;
levelField.setText("0");
speed = 25;
count = 200;
aCount = 200;
gameover = false;
} // end n
} //end board class
class Block {
private int x, y;
private int colorNum;
private int regard = 500; //~~~~~~~~~~~~~~~~~ public Block(int x, int y , int c) {
this.x = x;
this.y = y;
colorNum = c;
} public void move() { y += 2; }
public int getX() { return x; }
public int getY() { return y; }
public int getColorNum() { return colorNum; }
public int getRegard() { return regard; }
public void setColorNum(int n) { colorNum = n; }
public void setRegard(int r) { regard = r; }
public void setX(int val) { x = val; }
public void setY(int val) { y = val; }
}
return b.getY()+blockHeight < b.getRegard();
}
public void paint(Graphics g) {
g.setColor(Color.black);
g.fillRect(0, 0, width, height);
setRegard();
for(int i=0; i<blocks.size(); i++) {
Block b = (Block) blocks.get(i);
g.setColor(colors[b.getColorNum()]);
int xx = b.getY();
int yy = blockHeight;
int zz = b.getRegard();
if(b.getY()+blockHeight > b.getRegard())
b.setY(b.getRegard() - blockHeight);
g.fillRect(b.getX()*blockWidth+1, b.getY()+1, blockWidth-1, blockHeight-1);
if(canMove(b)) {
board[b.getY()/blockHeight][b.getX()] = 0;
b.move();
}
else {
board[(int)(b.getY()/blockHeight)][b.getX()] = b.getColorNum();
deleteSuccess();
}
}
} //end paint
public int findBlock(int r, int c) {
int yval = r*blockHeight;
for(int i=0; i<blocks.size(); i++) {
Block b = (Block) blocks.get(i);
if(b.getX()==c && Math.abs(yval - b.getY())<3)
return i;
}
return -1;
}
private int tempR, tempC;
public void mousePressed(MouseEvent e) {
tempC = e.getX()/blockWidth;
tempR = e.getY()/blockHeight;
} public void mouseReleased(MouseEvent e) {
int i = findBlock(tempR, tempC);
if(i == -1)
return;
Block b = (Block) blocks.get(i);
if(e.getX() >= width || e.getX() <=0 ) return;
if(e.getY() >= height || e.getY() <=0 ) return;
int c = e.getX()/blockWidth;
int r = e.getY()/blockHeight; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if(isLegalSwap(tempR, tempC, r, c)) {
int j = findBlock(r, c);
if(j==-1) {
b.setX(c);
b.setY(r*blockHeight);
board[tempR][tempC] = 0;
return;
} Block b2 = (Block) blocks.get(j);
int colorN = b.getColorNum();
b.setColorNum(b2.getColorNum());
b2.setColorNum(colorN);
int temp = board[r][c];
board[r][c] = board[tempR][tempC];
board[tempR][tempC] = temp;
}
} //end mouse released public boolean isLegalSwap(int r1, int c1, int r2, int c2) {
if(board[r1][c1]==0) return false;
if(r1!=r2) return false;
if(board[r2][c2]!=0) return true;
if(c2 > c1) {
int i = c1 + 1;
for(; i < c2 && r1!=19; i++)
if(board[r1+1][i]==0)
return false;
}
else if(c2 < c1) {
int i = c1 - 1;
for(; i > c2 && r1!=19; i--)
if(board[r1+1][i]==0)
return false;
}
return true;
} public void mouseClicked(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void deleteSuccess() {
int count = 0, val;
int[] records = new int[3000];
int size = 0; // row check
for(int r = 0; r < row; r++)
for(int c = 0; c < col-1; c++)
if(board[r][c]!=0 && board[r][c]==board[r][c+1]) {
records[size++] = r;
records[size++] = c;
count++;
if(c == col-2 && count>=2) {
records[size++] = r;
records[size++] = c+1;
count = 0;
}
if(c == col-2 && count == 1) {
count = 0;
size -= 2;
}
}
else if(count >= 2) {
records[size++] = r;
records[size++] = c;
count = 0;
}
else {
size -= 2*count;
count = 0;
}
// col check
for(int c = 0; c < col; c++)
for(int r = 0; r < row-1; r++)
if(board[r][c]!=0 && board[r][c]==board[r+1][c]) {
records[size++] = r;
records[size++] = c;
count++;
if(r == row-2 && count>=2) {
records[size++] = r+1;
records[size++] = c;
count = 0;
}
if(r == row-2 && count == 1) {
count = 0;
size -= 2;
}
}
else if(count >= 2) {
records[size++] = r;
records[size++] = c;
count = 0;
}
else {
size -= 2*count;
count = 0;
}
for(int i=0; i<size; ) {
int r = records[i];
int c = records[i+1];
board[r][c] = 0;
int index = findBlock(r, c);
if(index!=-1)
blocks.remove(index);
i += 2;
}
if(size >= 6) {
score += calculateScore(size/2-2);
scoreField.setText(""+score);
int l = score/100;
if(l > level) {
for(int i=level; i<l; i++)
upSpeed();
level = l;
levelField.setText(""+level);
}
}
size = 0;
} // end delete Success
public int calculateScore(int k) {
if(k < 1) return 0;
int result = 2;
for(int i=1; i<k; i++)
result *= 2;
return result + 10;
} // end calculate score
public void newGame() {
blocks.clear();
for(int i=0; i<row; i++)
for(int j=0; j<col; j++)
board[i][j] = 0;
score = 0;
scoreField.setText("0");
level = 0;
levelField.setText("0");
speed = 25;
count = 200;
aCount = 200;
gameover = false;
} // end n
} //end board class
class Block {
private int x, y;
private int colorNum;
private int regard = 500; //~~~~~~~~~~~~~~~~~ public Block(int x, int y , int c) {
this.x = x;
this.y = y;
colorNum = c;
} public void move() { y += 2; }
public int getX() { return x; }
public int getY() { return y; }
public int getColorNum() { return colorNum; }
public int getRegard() { return regard; }
public void setColorNum(int n) { colorNum = n; }
public void setRegard(int r) { regard = r; }
public void setX(int val) { x = val; }
public void setY(int val) { y = val; }
}
解决方案 »
- 大过年的,多撒些分,参与就有分,呵,请教一个有点怪的问题。。。。
- java 如何调用一个输入密码的对话框
- 为什么用Java ZIP API 写的程序不能 解压Winzip 打包的ZIP文件啊?
- java字符串难题
- 请教ireport的问题!
- 求代码!!!
- 我想学JAVA可以告诉我该用什么编译器吗?SUN的SDK还是的VJ,
- 怎样才能判断他的返回值JOptionPane.showConfirmDialog?
- 诚恳的请大家帮助,请问如何实现两个applet之间的通信?谢谢!
- 如何得到系统所有的盘符,并且判断是不是光区和软区(解决就给分)
- 如何能让同时运行的2个线程的LOG,记录在同一个文件里??而不是fileName.log和filaName.log1 谢谢!
- 怎么统计一个目录下的所有文件行数
Board ------- 里面有许多的 Block
RepaintThread -------- 过一会 repaint Board 一次, 就产生动画效果了。Block 应该知道是否自己还能下落,Board 可以为他 set RegardBoard is controled by 2D array, mouse swap blocks == swap two number in 2D array