Java 对对碰游戏
Java 对对碰游戏
对对碰游戏规则说明:
一. 概述
游戏在 8 × 8 格子的游戏池中进行。每个格子中有一个图标。鼠标连续选中两个相邻的图标,它们的位置会互换,互换后如果横排或竖排有 3 个以上相同的图标,则可以消去该图标,并得分。
二. 基本规则
交换
玩家选中相邻(横、竖)的两个图标,则这两个图标的位置发生互换,如果互换成功则消去图标,否则取消位置交换。
消去
玩家选择两个图标进行位置互换,互换后如果横排或竖排有 3 个以上相同的图标,则消去这几个相同的图标,如果互换后没有可以消去的图标,则选中的两个图标换回原来的位置。消去后的空格由上面的图标掉下来补齐。每次消去图标玩家都能得到一定的分数。
连锁
玩家消去图标后,上面的图标掉下来补充空格。如果这时游戏池中有连续摆放(横、竖)的 3 个或 3 个以上相同的图标,则可以消去这些图标,这就是一次连锁。空格被新的图标填充,又可以进行下一次连锁。每次连锁会有加分。
重排
玩家已经不能消去任何图标时,将清空游戏池,用新的图标填充。
对对碰游戏算法分析:
分析一下,交换一般分为三种情况:
情况1:交换后,消除的头像是竖排的。
情况2:交换后,消除的头像是横排的。
情况3:交换后,消除的头像横竖排都存在
过程就是点击两个图样,先检查是否是同一图样,再检查是否在同一直线,再检查是否是一个折点,再是两个折点,如果都不是则返回无解,如果是,返回TRUE,记录折点,用直线连接折点和连接点并消除两个图样,这个点的值变为0
交换、消除、填补算法
- 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;
- }
评论暂时关闭