对对碰游戏规则说明:
一. 概述
游戏在 8 × 8 格子的游戏池中进行。每个格子中有一个图标。鼠标连续选中两个相邻的图标,它们的位置会互换,互换后如果横排或竖排有 3 个以上相同的图标,则可以消去该图标,并得分。
二. 基本规则
交换
玩家选中相邻(横、竖)的两个图标,则这两个图标的位置发生互换,如果互换成功则消去图标,否则取消位置交换。
消去
玩家选择两个图标进行位置互换,互换后如果横排或竖排有 3 个以上相同的图标,则消去这几个相同的图标,如果互换后没有可以消去的图标,则选中的两个图标换回原来的位置。消去后的空格由上面的图标掉下来补齐。每次消去图标玩家都能得到一定的分数。
连锁
玩家消去图标后,上面的图标掉下来补充空格。如果这时游戏池中有连续摆放(横、竖)的 3 个或 3 个以上相同的图标,则可以消去这些图标,这就是一次连锁。空格被新的图标填充,又可以进行下一次连锁。每次连锁会有加分。
重排
玩家已经不能消去任何图标时,将清空游戏池,用新的图标填充。
对对碰游戏算法分析:
分析一下,交换一般分为三种情况:
情况1:交换后,消除的头像是竖排的。
情况2:交换后,消除的头像是横排的。
情况3:交换后,消除的头像横竖排都存在
过程就是点击两个图样,先检查是否是同一图样,再检查是否在同一直线,再检查是否是一个折点,再是两个折点,如果都不是则返回无解,如果是,返回TRUE,记录折点,用直线连接折点和连接点并消除两个图样,这个点的值变为0
[img]http://programming.iteye.com/upload/picture/pic/92785/6e88bf75-3dbe-3b74-bfa6-9e93c00f4656.jpg[/img]
交换、消除、填补算法
一. 概述
游戏在 8 × 8 格子的游戏池中进行。每个格子中有一个图标。鼠标连续选中两个相邻的图标,它们的位置会互换,互换后如果横排或竖排有 3 个以上相同的图标,则可以消去该图标,并得分。
二. 基本规则
交换
玩家选中相邻(横、竖)的两个图标,则这两个图标的位置发生互换,如果互换成功则消去图标,否则取消位置交换。
消去
玩家选择两个图标进行位置互换,互换后如果横排或竖排有 3 个以上相同的图标,则消去这几个相同的图标,如果互换后没有可以消去的图标,则选中的两个图标换回原来的位置。消去后的空格由上面的图标掉下来补齐。每次消去图标玩家都能得到一定的分数。
连锁
玩家消去图标后,上面的图标掉下来补充空格。如果这时游戏池中有连续摆放(横、竖)的 3 个或 3 个以上相同的图标,则可以消去这些图标,这就是一次连锁。空格被新的图标填充,又可以进行下一次连锁。每次连锁会有加分。
重排
玩家已经不能消去任何图标时,将清空游戏池,用新的图标填充。
对对碰游戏算法分析:
分析一下,交换一般分为三种情况:
情况1:交换后,消除的头像是竖排的。
情况2:交换后,消除的头像是横排的。
情况3:交换后,消除的头像横竖排都存在
过程就是点击两个图样,先检查是否是同一图样,再检查是否在同一直线,再检查是否是一个折点,再是两个折点,如果都不是则返回无解,如果是,返回TRUE,记录折点,用直线连接折点和连接点并消除两个图样,这个点的值变为0
[img]http://programming.iteye.com/upload/picture/pic/92785/6e88bf75-3dbe-3b74-bfa6-9e93c00f4656.jpg[/img]
交换、消除、填补算法
public void setExchange() {
if (isSelected) {
isExchange = true;
isSelected = false;
doExchange();
}
}
private void moveRightDown() {
if (currentX == BODY_W - 1 || currentY == BODY_H - 1) {
isSelected = false;
}
currentX = ++currentX % BODY_W;
currentY = ++currentY % BODY_H;
setExchange();
}
private void moveLeftDown() {
if (currentX == 0 || currentY == BODY_H - 1) {
isSelected = false;
}
currentX = (--currentX + BODY_W) % BODY_W;
currentY = ++currentY % BODY_H;
setExchange();
}
private void moveRightUp() {
if (currentY == 0 || currentX == BODY_W - 1) {
isSelected = false;
}
currentX = ++currentX % BODY_W;
currentY = (--currentY + BODY_H) % BODY_H;
setExchange();
}
private void moveLeftUp() {
if (currentX == 0 || currentY == 0) {
isSelected = false;
}
currentX = (--currentX + BODY_W) % BODY_W;
currentY = (--currentY + BODY_H) % BODY_H;
setExchange();
}
private void moveUp() {
if (currentY == 0) {
isSelected = false;
}
currentY = (--currentY + BODY_H) % BODY_H;
setExchange();
}
private void moveDown() {
if (currentY == BODY_H - 1) {
isSelected = false;
}
currentY = ++currentY % BODY_H;
setExchange();
}
private void moveLeft() {
if (currentX == 0) {
isSelected = false;
}
currentX = (--currentX + BODY_W) % BODY_W;
setExchange();
}
private void moveRight() {
if (currentX == BODY_W - 1) {
isSelected = false;
}
currentX = ++currentX % BODY_W;
setExchange();
}
private void doExchange() {
if (currentX - selectedX == -1) {
if (currentY - selectedY == -1) {
tempMove[currentX][currentY] = 9;
tempMove[selectedX][selectedY] = 1;
} else if (currentY - selectedY == 0) {
tempMove[currentX][currentY] = 6;
tempMove[selectedX][selectedY] = 4;
} else if (currentY - selectedY == 1) {
tempMove[currentX][currentY] = 3;
tempMove[selectedX][selectedY] = 7;
}
} else if (currentX - selectedX == 0) {
if (currentY - selectedY == -1) {
tempMove[currentX][currentY] = 8;
tempMove[selectedX][selectedY] = 2;
} else if (currentY - selectedY == 1) {
tempMove[currentX][currentY] = 2;
tempMove[selectedX][selectedY] = 8;
}
} else if (currentX - selectedX == 1) {
if (currentY - selectedY == -1) {
tempMove[currentX][currentY] = 7;
tempMove[selectedX][selectedY] = 3;
} else if (currentY - selectedY == 0) {
tempMove[currentX][currentY] = 4;
tempMove[selectedX][selectedY] = 6;
} else if (currentY - selectedY == 1) {
tempMove[currentX][currentY] = 1;
tempMove[selectedX][selectedY] = 9;
}
}
int temp = body[selectedX][selectedY];
body[selectedX][selectedY] = body[currentX][currentY];
body[currentX][currentY] = temp;
}