题目名称:连连看(游戏)
题目要求:单色正方形有7种不同颜色,每种颜色正方形有偶数个,堆成6×6的大正方形,需要选择一对相同颜色的正方形连线,但此连线是在避开其他图案后,呈现的路径以不超过两次转弯,如符合规定则消除此对图案而得分。每一局里玩家需要在规定的时间内消除所有的图案,当完成任务后,方能进行下一关。程序语言不限。游戏图案如下所示:
题目要求:单色正方形有7种不同颜色,每种颜色正方形有偶数个,堆成6×6的大正方形,需要选择一对相同颜色的正方形连线,但此连线是在避开其他图案后,呈现的路径以不超过两次转弯,如符合规定则消除此对图案而得分。每一局里玩家需要在规定的时间内消除所有的图案,当完成任务后,方能进行下一关。程序语言不限。游戏图案如下所示:
[email protected]
分不够我在给的
我回去找一下
首先判断两个正方形能否用一条线段相连
如果不能,则判断是否可以用两条线段相连
如果还不能,再判断是否可以用三条线段相连判断是否可以用一条线段相连:
public boolean canLined(int i1, int j1, int i2, int j2) {
if ((i1 != i2) && (j1 != j2)) { //不在同一水平线或垂直线上
return false;
} int i, j, maxI, minI, maxJ, minJ;
if (i1 == i2) { //在同一水平线上
if (j1 < j2) {
maxJ = j2;
minJ = j1;
} else {
maxJ = j1;
minJ = j2;
}
//判断两图连线中间是否有其他的障碍物
for (j = minJ + 1; j < maxJ; j++) {
if (picture[i1][j] != null && picture[i1][j].isVisible()) { //有障碍物
return false;
}
} return true;
} else { //j1==j2,在同一垂直线上
if (i1 < i2) {
maxI = i2;
minI = i1;
} else {
maxI = i1;
minI = i2;
}
//判断两图连线中间是否有其他的障碍物
for (i = minI + 1; i < maxI; i++) {
if (picture[i][j1] != null && picture[i][j1].isVisible()) {
return false;
}
} return true;
} }
* 判断两个图片之间是否可以用两条直线相连
* @param p1 Picture
* @param p2 Picture
* @return Couple
*/
public Couple can2Lined(Picture p1, Picture p2) {
if (p1 == null || p2 == null || p1 == p2) { //检查参数合法性
return null;
} int up1, up2, down1, down2;
int left1, left2, right1, right2;
int i, j; //求通过p1的水平线的最右端
j = p1.getJ() + 1;
i = p1.getI();
while ((j < COLUMN) &&
((picture[i][j] == null) || (!picture[i][j].isVisible()))) {
j++;
}
right1 = j - 1; //求通过p1的水平线的最左端
j = p1.getJ() - 1;
i = p1.getI();
while ((j >= 0) &&
((picture[i][j] == null) || (!picture[i][j].isVisible()))) {
j--;
}
left1 = j + 1; //求通过p1的垂直线的最高端(根据点在数组中位置来确定,与显示无关)
j = p1.getJ();
i = p1.getI() + 1;
while ((i < ROW) &&
((picture[i][j] == null) || (!picture[i][j].isVisible()))) {
i++;
}
up1 = i - 1; //求通过p1的垂直线的最底端
j = p1.getJ();
i = p1.getI() - 1;
while ((i >= 0) &&
((picture[i][j] == null) || (!picture[i][j].isVisible()))) {
i--;
}
down1 = i + 1; //求通过p2的水平线的最右端
j = p2.getJ() + 1;
i = p2.getI();
while ((j < COLUMN) &&
((picture[i][j] == null) || (!picture[i][j].isVisible()))) {
j++;
}
right2 = j - 1; //求通过p2的水平线的最左端
j = p2.getJ() - 1;
i = p2.getI();
while ((j >= 0) &&
((picture[i][j] == null) || (!picture[i][j].isVisible()))) {
j--;
}
left2 = j + 1; //求通过p2的垂直线的最高端(根据点在数组中位置来确定,与显示无关)
j = p2.getJ();
i = p2.getI() + 1;
while ((i < ROW) &&
((picture[i][j] == null) || (!picture[i][j].isVisible()))) {
i++;
}
up2 = i - 1; //求通过p2的垂直线的最底端
j = p2.getJ();
i = p2.getI() - 1;
while ((i >= 0) &&
((picture[i][j] == null) || (!picture[i][j].isVisible()))) {
i--;
}
down2 = i + 1; //首先判断通过p1的水平线是否和通过p2的垂直线有交点
i = p1.getI();
j = p2.getJ();
if ((i >= down2) && (i <= up2) && (j >= left1) && (j <= right1)) {
return new Couple(i, j);
} //然后判断通过p1的垂直线是否和通过p2的水平线有交点
i = p2.getI();
j = p1.getJ();
if ((i >= down1) && (i <= up1) && (j >= left2) && (j <= right2)) {
return new Couple(i, j);
} //否则
return null;
}
* 判断是否可以用三条线断连接两张图片
* @param p1 Picture
* @param p2 Picture
* @return Couple[]
*/
public Couple[] can3Lined(Picture p1, Picture p2) {
if (p1 == null || p2 == null || p1 == p2) { //检查参数合法性
return null;
} int up1, up2, down1, down2;
int left1, left2, right1, right2;
int i, j; //求通过p1的水平线的最右端
j = p1.getJ() + 1;
i = p1.getI();
while ((j < COLUMN) &&
((picture[i][j] == null) || (!picture[i][j].isVisible()))) {
j++;
}
right1 = j - 1; //求通过p1的水平线的最左端
j = p1.getJ() - 1;
i = p1.getI();
while ((j >= 0) &&
((picture[i][j] == null) || (!picture[i][j].isVisible()))) {
j--;
}
left1 = j + 1; //求通过p1的垂直线的最高端(根据点在数组中位置来确定,与显示无关)
j = p1.getJ();
i = p1.getI() + 1;
while ((i < ROW) &&
((picture[i][j] == null) || (!picture[i][j].isVisible()))) {
i++;
}
up1 = i - 1; //求通过p1的垂直线的最底端
j = p1.getJ();
i = p1.getI() - 1;
while ((i >= 0) &&
((picture[i][j] == null) || (!picture[i][j].isVisible()))) {
i--;
}
down1 = i + 1; //求通过p2的水平线的最右端
j = p2.getJ() + 1;
i = p2.getI();
while ((j < COLUMN) &&
((picture[i][j] == null) || (!picture[i][j].isVisible()))) {
j++;
}
right2 = j - 1; //求通过p2的水平线的最左端
j = p2.getJ() - 1;
i = p2.getI();
while ((j >= 0) &&
((picture[i][j] == null) || (!picture[i][j].isVisible()))) {
j--;
}
left2 = j + 1; //求通过p2的垂直线的最高端(根据点在数组中位置来确定,与显示无关)
j = p2.getJ();
i = p2.getI() + 1;
while ((i < ROW) &&
((picture[i][j] == null) || (!picture[i][j].isVisible()))) {
i++;
}
up2 = i - 1; //求通过p2的垂直线的最底端
j = p2.getJ();
i = p2.getI() - 1;
while ((i >= 0) &&
((picture[i][j] == null) || (!picture[i][j].isVisible()))) {
i--;
}
down2 = i + 1; Couple[] couple = new Couple[2];
//首先找两条水平线之间是否存在一条垂直线连接他们
int left = (left1 > left2) ? left1 : left2; //left取较大值
int right = (right1 < right2) ? right1 : right2; //right取小值
int i1 = p1.getI();
int i2 = p2.getI(); for (int k = left; k <= right; k++) {
if (canLined(i1, k, i2, k)) {
couple[0] = new Couple(i1, k);
couple[1] = new Couple(i2, k);
return couple;
}
} //然后找两条垂直线之间是否存在一条垂直线连接他们
int down = (down1 > down2) ? down1 : down2; //down取大值
int up = (up1 < up2) ? up1 : up2; //up取小值
int j1 = p1.getJ();
int j2 = p2.getJ();
for (int k = down; k <= up; k++) {
if (canLined(k, j1, k, j2)) {
couple[0] = new Couple(k, j1);
couple[1] = new Couple(k, j2);
return couple;
}
} //没有找到
return null;
}