java 对对碰游戏

对对碰游戏规则说明:

一. 概述

游戏在 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;
}

Java对对碰游戏可以使用Swing或JavaFX进行开发。以下是一个简单的示例代码: ```java import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class MatchGame extends JFrame implements ActionListener { private JButton[] buttons = new JButton[16]; private int[] buttonValues = new int[16]; private int counter = 0; private int firstButtonIndex = -1; private int secondButtonIndex = -1; private int pairsFound = 0; public MatchGame() { super("Match Game"); setSize(300, 300); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLayout(new GridLayout(4, 4)); initButtons(); setVisible(true); } public void initButtons() { for (int i = 0; i < 16; i++) { buttons[i] = new JButton(); buttons[i].addActionListener(this); add(buttons[i]); } initButtonValues(); } public void initButtonValues() { int[] values = new int[8]; for (int i = 0; i < 8; i++) { values[i] = i + 1; } for (int i = 0; i < 16; i++) { if (buttonValues[i] == 0) { int index = (int) (Math.random() * 8); if (values[index] == 0) { i--; } else { buttonValues[i] = values[index]; values[index] = 0; } } } } public void actionPerformed(ActionEvent e) { counter++; JButton button = (JButton) e.getSource(); int index = getButtonIndex(button); button.setText(Integer.toString(buttonValues[index])); if (counter % 2 != 0) { firstButtonIndex = index; } else { secondButtonIndex = index; checkPair(); } } public int getButtonIndex(JButton button) { for (int i = 0; i < 16; i++) { if (buttons[i] == button) { return i; } } return -1; } public void checkPair() { if (buttonValues[firstButtonIndex] == buttonValues[secondButtonIndex]) { buttons[firstButtonIndex].setEnabled(false); buttons[secondButtonIndex].setEnabled(false); pairsFound++; if (pairsFound == 8) { JOptionPane.showMessageDialog(this, "Congratulations! You won!"); System.exit(0); } } else { buttons[firstButtonIndex].setText(""); buttons[secondButtonIndex].setText(""); } } public static void main(String[] args) { new MatchGame(); } } ``` 这个对对碰游戏使用了一个16个按钮的4x4网格来显示牌。每个按钮都有一个数字,玩家需要翻转两个相同的数字的按钮,以找到所有的配对。如果找到了一个配对,这两个按钮将被禁用,否则它们将被翻转回去。游戏将在找到所有的配对时结束。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值