这个版本加入了广度搜索人工智能,可以提示步骤,要是愿意的话,一直点提示,他会帮助走完拼图。基础的设计步骤在上一篇文章中。
具体思路是:在上个版本中实现算出最短步数,但是并没有加以应用。此版本利用算出步数的广度搜索,在找到白块,模拟有效移动一次,再判断这次的局面,相比较之前最短步数是否减1。若是,则为最佳走法,若不是,则还原,再模拟一次另一个走法。其中必然有正解。伪代码如下:
数组c记录移动之前的局面;
while (true) {
while(不是有效白块移动) {
移动白块
}
获得表示当前局面的字符串;
计算最短路径d;
if(最短路径d相比较之前最短步数d0减1)
{
用记录数组c还原移动之前局面;
break;
}
if(模拟之前局面最短步数d0==1)
{
用记录数组c还原移动之前局面;
break;
}
else
{
用记录数组c还原移动之前局面;
}
}
具体代码如下(改下图片的位置后可以直接执行)
package 拼图;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.awt.image.CropImageFilter;
import java.awt.image.FilteredImageSource;
import java.awt.image.ImageFilter;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import javax.imageio.ImageIO;
import javax.swing.*;
class Palace{ //算出最短步数
String start;//初始字符串
String end;//目标字符串
int result=-1;//最终结果
public int Palacea(String shuju){
this.start = shuju;
end = "12345678.";
HashMap<String, Integer> memery = new HashMap<>(100000);//用于保存之前状态,key代表状态字符串,value代表到key状态所用的最小步数
Queue<String> process = new LinkedList<String>();//bfs用到的队列
memery.put(start,0);//放入初始字符串
process.offer(start);//放入初始字符串
while(result==-1){//当没有搜索到结果是继续搜索
String cur = process.poll();
char[] a=cur.toCharArray();
/* int count=0;
for(int b=0;b<a.length;b++) {
count++;
System.out.print(a[b]+" ");
if(count%3==0)System.out.println();
}*/
System.out.println("搜索中....");
int tmp = 0;
while(cur.charAt(tmp)!='.'){
tmp++;
}
int[] d = {-3,3,-1,1};//方向数组,分别表示上下左右
for(int i=0;i<4;i++){
int p = tmp+d[i];
int chengji = tmp*p;
if(p>-1&&p<9&&chengji!=6&&chengji!=30){ //2-->3,3-->2,5-->6,6-->5跨行了,要去掉
String change = cur;
char c = cur.charAt(p);
change = cur.replace('.', '*');//交换String中的两个字符,借助中间字符‘*’
change = change.replace(c,'.');
change = change.replace('*',c);
if(change.equals(end)){//找到了目标状态
result = memery.get(cur)+1;
}
if(!memery.containsKey(change)){//如果之前没有这种状态
memery.put(change,memery.get(cur)+1);
process.add(change);//存入队列
}
}
}
}
System.out.println("搜索成功");
return result;
}
}
class tu extends JButton {
int ID;
int nowID;
int IMAGEWIDTH;
int IMAGEHEIGHT;
int nowx;
int nowy;
Icon icon;
public tu(Icon icon) {
this.setIcon(icon);
}
public tu(Icon icon, int id, int imagewidth, int height,int nowx,int nowy,int nowid)//构造函数初始化,传入两个参数,一个是图像的图标,一个是该按钮的数组ID
{
this.setIcon(icon);
this.ID = id;
this.nowID = nowid;
this.IMAGEWIDTH = imagewidth;
this.IMAGEHEIGHT = height;
this.setSize(IMAGEWIDTH, IMAGEHEIGHT);
this.nowx=nowx;
this.nowy=nowy;
this.icon=icon;
}
public Icon geticon() {
return icon;
}
public int getID() {
return ID;
}
public int getnowID() {
return nowID;
}
public int getx()
{
return this.getBounds().x;
}
public int gety()
{
return this.getBounds().y;
}
public int