📄 abstractgamepanel.java
字号:
package com.bokee.nicend.boxgame.robot;
import java.awt.Point;
import java.util.LinkedList;
import java.util.List;
import com.bokee.nicend.boxgame.game.Box;
/**
* 虚拟游戏
* @author Butnet
*/
public class AbstractGamePanel {
/**
* 游戏环境数据
*/
private boolean[][] space = null;
/**
* 当前的方块
*/
private Box box = null;
public Box getBox() {
return box;
}
public void setBox(Box box) {
this.box = box;
}
public void setData(boolean[][] data) {
this.space = data;
}
public boolean[][] getData() {
return space;
}
/**
* 将方块b设置为不能移动
* @param b
*/
public void setNoMove(Box b) {
if (b.getY() + b.getBoxHeight() > space.length)
return;
int[][] d = b.getPoints();
for (int i = 0; i < d.length; i++) {
if (b.getY() + d[i][1] < 0 || b.getX() + d[i][0] < 0)
continue;
space[b.getY() + d[i][1]][b.getX() + d[i][0]] = false;
}
}
/**
* 在虚拟游戏中把当前方块向下移动
* @return 返回移动成功返回true,不能移动返回false
*/
public boolean moveDown() {
if (!canDown()) {
setNoMove(box);
return false;
}
if (box.getY() + box.getBoxHeight() == space.length) {
setNoMove(box);
return false;
}
box.setY(box.getY() + 1);
return true;
}
/**
* 判断当前方块是否能下移
* @return
*/
private boolean canDown() {
int[][] ps = box.getPoints();
for (int i = 0; i < ps.length; i++) {
if (box.getY() + 1 + ps[i][1] >= space.length)
return false;
if (!space[box.getY() + 1 + ps[i][1]][box.getX() + ps[i][0]])
return false;
}
return true;
}
/**
* 用每行的空格生成一个数值,用于优化判断
* @return 数值
*/
public int getLineSpaceNumber() {
int index = getRectHeight() - 1;
if (index == -1)
return 0;
int re = 0;
for (int i = index; i < space.length; i++) {
int line = 0;
boolean start = false;
for (int j = 0; j < space[i].length; j++)
if (space[i][j]){
if(!start){
line++;
start = true;
}
}else{
start=false;
}
re = re * 10 + line;
}
return re;
}
/**
* 取得消取的行数
* @return 行数
*/
public int getDisponseLineNumber() {
int index = getRectHeight() - 1;
if (index == -1)
return 0;
int line = 0;
for (int i = index; i < space.length; i++) {
boolean is = true;
for (int j = 0; j < space[i].length; j++) {
if (space[i][j]) {
is = false;
break;
}
}
if (is)
line++;
}
return line;
}
/**
* 点数 下边的方块矩形中为空的空格个数
* @return 空格数
*/
public int getSpaceCountInBoxsHeight() {
// TEST CASE 2
int allSpaceCount = 0;
for (int col = 0; col < space[0].length; col++) {
boolean start = false;
for (int row = 0; row < space.length; row++) {
if (!start) {
if (!space[row][col])
start = true;
continue;
}
if (space[row][col])
allSpaceCount++;
}
}
if (1 == 1)
return allSpaceCount;
// TEST CASE 1
int topIndex = -1;
for (int i = 0; i < space.length; i++) {
for (int j = 0; j < space[i].length; j++) {
if (!space[i][j]) {
topIndex = i;
break;
}
}
if (topIndex != -1)
break;
}
if (topIndex == -1)
return 0;
int count = 0;
for (int i = topIndex; i < space.length; i++) {
for (int j = 0; j < space[i].length; j++) {
if (space[i][j])
count++;
}
}
return count;
}
/**
* 返回 下边方块形成的空格区域个数
* @return 区域个数
*/
public int getSpaceRectInBoxsHeight() {
int topIndex = -1;
for (int i = 0; i < space.length; i++) {
for (int j = 0; j < space[i].length; j++) {
if (!space[i][j]) {
// System.out.println("i="+i+", j="+j);
// System.out.println("Box.X="+box.getX()+"
// Box.Y="+box.getY());
topIndex = i;
break;
}
}
if (topIndex != -1)
break;
}
if (topIndex == -1)
return 0;
List<Point> ps = new LinkedList<Point>();
for (int i = topIndex; i < space.length; i++) {
for (int j = 0; j < space[i].length; j++) {
if (space[i][j]) {
ps.add(new Point(i, j));
}
}
}
// TODO: 返回 下边方块形成的空格区域个数
List<List<Point>> rects = new LinkedList<List<Point>>();
for (int i = 0; i < ps.size(); i++) {
Point p = ps.get(i);
List<Point> rect = null;
boolean add = false;
for (List<Point> r : rects) {
if (r.contains(new Point(p.x - 1, p.y)))
r.add(p);
else if (r.contains(new Point(p.x + 1, p.y)))
r.add(p);
else if (r.contains(new Point(p.x, p.y - 1)))
r.add(p);
else if (r.contains(new Point(p.x, p.y + 1)))
r.add(p);
else if (r.contains(p))
;
else
continue;
add = true;
break;
}
if (add)
continue;
rect = new LinkedList<Point>();
rects.add(rect);
rect.add(p);
}
// 返回区域个数
return rects.size();
}
/**
* 判断不能移动的方块组成的高度
* @return 高度
*/
public int getRectHeight() {
int topIndex = -1;
for (int i = 0; i < space.length; i++) {
for (int j = 0; j < space[i].length; j++) {
if (!space[i][j]) {
topIndex = i;
break;
}
}
if (topIndex != -1)
break;
}
return topIndex + 1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -