我们正在为学校的一个项目制作一个幻灯片拼图。我们成功地制作了这个谜题,但现在我们想要制作一个“人工智能”。这意味着计算机可以计算出最短的解决方案并解决难题。
我们正在制作一棵树,这样他就可以寻找解决方案。我们总是得到“nosuchelement”的错误。
ArrayList positiesVoorHint = 这是随机排列的数组列表中碎片的位置,我们自己进行了随机排列。
oplossingsposities.add(i) = 这些是索引 0 上的片段名称,它是片段编号 1
我们还在另一个类中定义了 UP、DOWN、LEFT、RIGHT 方法,它们运行良好。
testPuzzelOpgelost = testpuzzlesolved
由于我们的方法 UP、DOWN、LEFT RIGHT,我们还必须克隆列表。别担心。
(我们的母语不是英语)。
这是我们单击按钮时使用的代码,因此他离最短解决方案更近了一步:
public ArrayList<Integer> HintUitvoeren()
{
ArrayList<Integer> positiesNaHint;
HintBerekenen2 hint = new HintBerekenen2(posities, dimensie);
ArrayList<ArrayList<Integer>> positieMatrix = hint.oplossingspad;
afbeeldingenPlaatsen();
positiesNaHint = positieMatrix.get(1);
return positiesNaHint;
}
这段代码应该很好
问题应该在这里:
这是代码;(由于某种原因,它不会显示为代码,也有 4 个空格)
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
import java.util.Set;
public class HintBerekenen2 extends Bewegingen
{
Queue<ArrayList<Integer>> wachtrij;
Map<ArrayList<Integer>, ArrayList<Integer>> boom;
int dimensie;
Bewegingen bew;
ArrayList<ArrayList<Integer>> oplossingspad;
ArrayList<Integer> meestRecentePosities, oplossingsposities;
public HintBerekenen2 (ArrayList<Integer> positiesVoorHint, int dimensie)
{
System.out.println("HINT START HIER");
this.dimensie = dimensie;
wachtrij = new LinkedList<ArrayList<Integer>>();
boom = new HashMap<ArrayList<Integer>,ArrayList<Integer>>();
bew = new Bewegingen();
//Oplossings ArrayList maken. ([1, 2, ..., (dimensie*dimensie) - 1, (dimensie*dimensie)]
oplossingsposities = new ArrayList<Integer>();
for (int i = 1; i < (dimensie*dimensie) + 1; i++)
{
oplossingsposities.add(i);
}
voegToeAanBoom(positiesVoorHint, null);
berekenen();
}
void voegToeAanBoom(ArrayList<Integer> nieuwePositie, ArrayList<Integer> oudePositie)
{
if (!boom.containsKey(nieuwePositie))
{
wachtrij.add(nieuwePositie);
boom.put(nieuwePositie, oudePositie);
}
}
void berekenen()
{
while (oplossingspad == null)
{
System.out.println(wachtrij + " voor remove");
ArrayList<Integer> lijst = this.wachtrij.remove();
System.out.println(wachtrij + " na remove");
this.UP (lijst);
this.DOWN (lijst);
this.LEFT (lijst);
this.RIGHT (lijst);
}
}
private void testPuzzelOpgelost(ArrayList<Integer> positiesVoorBeweging, ArrayList<Integer> positiesNaBeweging)
{
System.out.println("Test wordt uitgevoerd");
System.out.println(positiesVoorBeweging + " positiesVoorBeweging in de testPuzzel");
System.out.println(positiesNaBeweging + " positiesNaBeweging in de testPuzzel");
voegToeAanBoom (positiesNaBeweging, positiesVoorBeweging);
if (positiesNaBeweging.equals(oplossingsposities))
{
ArrayList<Integer> zoekPositie = positiesNaBeweging;
oplossingspad = new ArrayList<ArrayList<Integer>>();
while (zoekPositie != null)
{
oplossingspad.add(0, zoekPositie);
zoekPositie = boom.get(zoekPositie);
}
}
}
void UP (ArrayList<Integer> positiesVoorBeweging)
{
int indexLeegStukje = positiesVoorBeweging.indexOf(dimensie*dimensie);
ArrayList<Integer> cloneLijst = (ArrayList<Integer>) positiesVoorBeweging.clone();
meestRecentePosities = bew.UP(dimensie, positiesVoorBeweging, indexLeegStukje);
if(meestRecentePosities != cloneLijst)
{
testPuzzelOpgelost(cloneLijst, meestRecentePosities);
}
}
void DOWN (ArrayList<Integer> positiesVoorBeweging)
{
int indexLeegStukje = positiesVoorBeweging.indexOf(dimensie*dimensie);
ArrayList<Integer> cloneLijst = (ArrayList<Integer>) positiesVoorBeweging.clone();
meestRecentePosities = bew.DOWN(dimensie, positiesVoorBeweging, indexLeegStukje);
if(meestRecentePosities != cloneLijst)
{
testPuzzelOpgelost(cloneLijst, meestRecentePosities);
}
}
void LEFT (ArrayList<Integer> positiesVoorBeweging)
{
int indexLeegStukje = positiesVoorBeweging.indexOf(dimensie*dimensie);
ArrayList<Integer> cloneLijst = (ArrayList<Integer>) positiesVoorBeweging.clone();
meestRecentePosities = bew.LEFT(dimensie, positiesVoorBeweging, indexLeegStukje);
if(meestRecentePosities != cloneLijst)
{
testPuzzelOpgelost(cloneLijst, meestRecentePosities);
}
}
void RIGHT (ArrayList<Integer> positiesVoorBeweging)
{
int indexLeegStukje = positiesVoorBeweging.indexOf(dimensie*dimensie);
ArrayList<Integer> cloneLijst = (ArrayList<Integer>) positiesVoorBeweging.clone();
meestRecentePosities = bew.RIGHT(dimensie, positiesVoorBeweging, indexLeegStukje);
if(meestRecentePosities != cloneLijst)
{
testPuzzelOpgelost(cloneLijst, meestRecentePosities);
}
}
}
这是错误代码
Exception in thread "AWT-EventQueue-0" java.util.NoSuchElementException
at java.util.LinkedList.remove(LinkedList.java:788)
at java.util.LinkedList.removeFirst(LinkedList.java:134)
at java.util.LinkedList.remove(LinkedList.java:481)
at Mozaiq.HintBerekenen2.berekenen(HintBerekenen2.java:56)
at Mozaiq.HintBerekenen2.<init>(HintBerekenen2.java:39)
at Mozaiq.Schuifpuzzelpaneel.HintUitvoeren(Schuifpuzzelpaneel.java:74)
at Mozaiq.Gamepaneel.actionPerformed(Gamepaneel.java:126)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2028)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2351)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6382)