java拼图游戏 怎么实现自动完成功能,请给指教???

kuno321 2011-12-16 11:37:59
/**
*
*/
package 后期分析;

/**
* @author
*
*/
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

import 大体移动.Cell;

public class MyCanvas extends JPanel implements MouseListener {
/**
*
*/
private static final long serialVersionUID = 1L;
boolean hasAddActionListener = false;// 设置方格的动作监听器的标志位,
//TRUE为已经添加上动作事件,FALSE是尚未添加动作事件
Cell cell[];// 定义方格
Rectangle cellNull;// 定义空方格区域
public static int pictureID = 1;// 当前选择的图片代号

public MyCanvas() {
this.setLayout(null);
this.setSize(400, 400);
cellNull = new Rectangle(200, 200, 100, 100);// 空方格区域在第三行每三列
cell = new Cell[9];
Icon icon;
for (int i = 0; i < 3; i++) {// 为9个方格加载图片,并初使化坐标,形成三行三列
for (int j = 0; j < 3; j++) {
icon = new ImageIcon("pictrue/pic_" + pictureID + "_"
+ (i * 3 + j + 1) + ".jpg");
cell[i * 3 + j] = new Cell(icon);
cell[i * 3 + j].setLocation(j * 100, i * 100);
this.add(cell[i * 3 + j]);
}
}
this.remove(cell[8]);// 移除最后一个多余的方格
}

public void reLoadPictrue() {// 当选择其它图形进行拼图时,需重新加载新图片
Icon icon;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
icon = new ImageIcon("pictrue/pic_" + pictureID + "_"
+ (i * 3 + j + 1) + ".jpg");
cell[i * 3 + j].setIcon(icon);
}
}
}

public boolean isFinish() {// 判断是否拼合成功
for (int i = 0; i < 8; i++) {
int x = cell[i].getBounds().x;
int y = cell[i].getBounds().y;
if (y / 100 * 3 + x / 100 != i)
return false;
}
return true;
}

//自动完成拼图
public void finish(){

}


public void Start() {// 对方格进行重新排列,打乱顺序

while (cell[0].getBounds().x <= 100 && cell[0].getBounds().y <= 100) {// 当第一个方格距左上角较近时
int x = cellNull.getBounds().x;
int y = cellNull.getBounds().y;
int direction = (int) (Math.random() * 4);// 产生0-4,对应空方格的上下左右移动
if (direction == 0) {// 空方格左移动,与左侧方格互换位置,左侧方格右移动
x -= 100;
if (test(x, y)) {
for (int j = 0; j < 8; j++) {
if ((cell[j].getBounds().x == x)
&& (cell[j].getBounds().y == y)) {// 依次寻找左侧的按钮
cell[j].move("RIGHT", 100);
cellNull.setLocation(x, y);
break;// 找到后跳出for循环
}
}
}
} else if (direction == 1) {// RIGHT
x += 100;
if (test(x, y)) {
for (int j = 0; j < 8; j++) {
if ((cell[j].getBounds().x == x)
&& (cell[j].getBounds().y == y)) {
cell[j].move("LEFT", 100);
cellNull.setLocation(x, y);
break;
}
}
}
} else if (direction == 2) {// UP
y -= 100;
if (test(x, y)) {
for (int j = 0; j < 8; j++) {
if ((cell[j].getBounds().x == x)
&& (cell[j].getBounds().y == y)) {
cell[j].move("DOWN", 100);
cellNull.setLocation(x, y);
break;
}
}
}
} else {// DOWN
y += 100;
if (test(x, y)) {
for (int j = 0; j < 8; j++) {
if ((cell[j].getBounds().x == x)
&& (cell[j].getBounds().y == y)) {
cell[j].move("UP", 100);
cellNull.setLocation(x, y);
break;
}
}
}
}

}

if (!hasAddActionListener)// 如果尚未添加动作事件,则添加
for (int i = 0; i < 8; i++)
// 为第个方格添加动作事件,这样单击按钮就能移动了
cell[i].addMouseListener(this);
hasAddActionListener = true;
}

private boolean test(int x, int y) {
if ((x >= 0 && x <= 200) || (y >= 0 && y <= 200))
return true;
else
return false;
}

public void mouseClicked(MouseEvent arg0) {
}

public void mouseEntered(MouseEvent arg0) {
}

public void mouseExited(MouseEvent arg0) {
}

public void mouseReleased(MouseEvent arg0) {
}

public void mousePressed(MouseEvent arg0) {// 方格的鼠标事件,
//因为用到了MyCanvas中的一些方法,因此没有在Cell类中处理鼠标事件
Cell button = (Cell) arg0.getSource();
int x1 = button.getBounds().x;// 得到所单击方格的坐标
int y1 = button.getBounds().y;

int x2 = cellNull.getBounds().x;// 得到空方格的坐标
int y2 = cellNull.getBounds().y;

if (x1 == x2 && y1 - y2 == 100)// 进行比较,如果满足条件则进行交换
button.move("UP", 100);
else if (x1 == x2 && y1 - y2 == -100)
button.move("DOWN", 100);
else if (x1 - x2 == 100 & y1 == y2)
button.move("LEFT", 100);
else if (x1 - x2 == -100 && y1 == y2)
button.move("RIGHT", 100);
else
return;// 不满足就不进行任何处理

cellNull.setLocation(x1, y1);
this.repaint();
if (this.isFinish()) {// 进行是否完成的判断
JOptionPane.showMessageDialog(this, "恭喜你完成拼图,加油!");
for (int i = 0; i < 8; i++)
cell[i].removeMouseListener(this);// 如果已完成,撤消鼠标事件,鼠标单击方格不在起作用
hasAddActionListener = false;
}
}

}
...全文
440 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Oo伍oO 2011-12-18
  • 打赏
  • 举报
回复
wangdong20 2011-12-18
  • 打赏
  • 举报
回复
我用C写了个拼图游戏可以自动完成拼图
http://blog.csdn.net/wangdong20/article/details/6849213
我最近在学GUI,来学习学习
kuno321 2011-12-18
  • 打赏
  • 举报
回复
谢了.但还是不知道怎么去实现
zqfddqr 2011-12-17
  • 打赏
  • 举报
回复
你这个典型的八数码问题A*啊打表啊什么的 有点难度的随机乱序后分两种情况其中一种和能解.你百度学习一下吧
kuno321 2011-12-16
  • 打赏
  • 举报
回复
怎么去完成自动 拼图?

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧