📄 myrobot.java
字号:
package com.bokee.nicend.boxgame.main;
import com.bokee.nicend.boxgame.game.Box;
import com.bokee.nicend.boxgame.gui.GamePanel;
import com.bokee.nicend.boxgame.robot.AbstractGamePanel;
import com.bokee.nicend.boxgame.robot.Step;
public class MyRobot extends Robot {
public MyRobot(GamePanel panel) {
super(panel);
}
@Override
public void doBox(Box box) {
方案1(getData(), box, true);
}
/**
* @param data
* 环境数据
* @param box
* 当前要处理的方块
* @param canDepth 是否允许递归判断下一个方块信息
*/
private Step 方案1(boolean[][] data, Box box, boolean canDepth) {
Box boxBack = box.copy();// 备份原方块信息
Box minBox = box.copy();// 最少空格时的方块信息
/**
* 最优化方法
*/
Step bestStep = new Step(data.length,data[0].length);
/**
* 综合两次的最优方法
*/
Step bestTwoStep = new Step(data.length,data[0].length);
boolean[][] dataBack = copyData(data);// 备份环境数据
// 虚拟游戏
AbstractGamePanel abstractGamePanel = new AbstractGamePanel();
// 此方块的 每种变形 遍历
for (int j = 0; j < 4; j++) {
// 按每个X坐标 遍历
for (int i = 0; i <= getGamePanelWidth() - box.getBoxWidth(); i++) {
// 设置方块位置
box.setPoint(i, /* 0-box.getBoxHeight() */0);
// 设置虚拟游戏环境
abstractGamePanel.setData(data);
abstractGamePanel.setBox(box);
while (abstractGamePanel.moveDown())
;
Step currentStep = new Step(data.length,data[0].length);
currentStep.setChage(j);
currentStep.setX(box.getX());
currentStep.setLine(abstractGamePanel.getDisponseLineNumber());
currentStep.setRectCount(abstractGamePanel.getSpaceRectInBoxsHeight());
currentStep.setHeight(data.length - abstractGamePanel.getRectHeight() - currentStep.getLine());
currentStep.setSpaceCount(abstractGamePanel.getSpaceCountInBoxsHeight());
currentStep.setSpaceNumber(abstractGamePanel.getLineSpaceNumber());
if (canDepth) {
Box nextBox = box.willNext();
Step currnetNextBestStep = 方案1(copyData(data), nextBox, false);
// 两步总共消去的行数
currnetNextBestStep.setLine(currnetNextBestStep.getLine() + currentStep.getLine());
if (currnetNextBestStep.compareTo(bestTwoStep) > 0) {
bestTwoStep = currnetNextBestStep;
bestStep = currentStep;
minBox = box.copy();
}
} else {
if (currentStep.compareTo(bestStep) > 0) {
bestStep = currentStep;
bestTwoStep = currentStep;
minBox = box.copy();
}
}
data = copyData(dataBack);
}
// 方块变形 进入下一个循环
box.chang();
}
if (canDepth) {
int x = minBox.getX();
for (int i = 0; i < bestStep.getChage(); i++)
moveUp();
for (int i = 0; x < boxBack.getX() - i; i++)
moveLeft();
for (int i = 0; boxBack.getX() + i < x; i++)
moveRight();
}
return bestStep;
}
private boolean[][] copyData(boolean[][] data) {
return GamePanel.copyData(data);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -