📄 eightnumber.java
字号:
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
public class eightNumber extends JFrame implements ActionListener
{
/**
*
*/
private static final long serialVersionUID = 1L;
private final int[][] current=new int[3][3];
private final int[][] target=new int[3][3];
private JTextField text1[];
private JTextField text2[];
JPanel cp1=new JPanel();
JPanel cp2=new JPanel();
JPanel cp3=new JPanel();
private JLabel label;
private JMenuItem search,play,help,open,save,about;
private final JMenuBar mainMenu = new JMenuBar();
private ArrayList<Node> next=new ArrayList<Node>();
private Container container;
public eightNumber()
{
super("八数码");
text1 = new JTextField[9];
text2 = new JTextField[9];
container = getContentPane();
container.setLayout(new BorderLayout(2,2));
container.add(cp1,"West");
container.add(cp2,"Center");
container.add(cp3,"East");
cp1.setLayout(new GridLayout(3,3,5,5));
cp2.setLayout(new GridLayout(1,1,5,5));
cp3.setLayout(new GridLayout(3,3,5,5));
for ( int count = 0; count <=8; count++ )
{
text1[ count ] = new JTextField(3);
cp1.add( text1[ count ] );
}
for ( int count = 0; count <=8; count++ )
{
text2[ count ] = new JTextField(3);
cp3.add( text2[ count ] );
}
final Icon bug = new ImageIcon(Resource.getImgResource( "/images/53078.gif"));
label = new JLabel(bug);
cp2.add(label);
final JMenu editMenu = new JMenu( "程序(F)" );
editMenu.setMnemonic( 'F' );
final JMenu viewMenu = new JMenu( "功能(V)" );
viewMenu.setMnemonic( 'V' );
final JMenu helpMenu = new JMenu( "帮助(H)" );
helpMenu.setMnemonic( 'H' );
setJMenuBar(mainMenu);
mainMenu.add(editMenu);
mainMenu.add(viewMenu);
mainMenu.add(helpMenu);
open = new JMenuItem("重新输入");
open.setMnemonic('C');
editMenu.add(open);
open.addActionListener(this);
save = new JMenuItem("退出");
save.setMnemonic('S');
editMenu.add(save);
save.addActionListener(this);
play = new JMenuItem(" 演 示 过 程");
play.addActionListener(this);
play.setMnemonic('G');
viewMenu.add(play);
search = new JMenuItem("搜 索");
search.addActionListener(this);
search.setMnemonic('X');
viewMenu.add(search);
help = new JMenuItem(" 游戏说明(H)");
help.setMnemonic('H');
helpMenu.add(help);
help.addActionListener(this);
about = new JMenuItem(" 关于作品(A)");
about.setMnemonic('A');
helpMenu.add(about);
about.addActionListener(this);
setSize(350,190);
setResizable(false);
setLocation(250,160);
setVisible( true );
setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
private void init()
{
int m=0;
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
current[i][j]=Integer.parseInt(text1[m].getText());
m++;
}
}
int n=0;
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
target[i][j]=Integer.parseInt(text2[n].getText());
n++;
}
}
}
public void start()
{
init();
final Node s=new Node(); //开始节点
final Node g=new Node(); //目标节点
Node n=new Node(); //待扩展结点
final eight manager = new eight();
manager.chushihua(current);
manager.chushihua2(target);
if(manager.HaveSolution()==false)
{
JOptionPane.showMessageDialog( eightNumber.this, "该初始状态无法到达目标状态,请重新输入.");
return;
}
final ShowResult sr=new ShowResult();
s.setF(manager.getG()+manager.p(current,target));
s.setArray(current);
s.setParNode(null);
g.setArray(target);
manager.insterOpen(s);
sr.getTextArea().append("\n当前节点是\n"+printArray(current));
sr.getTextArea().append("\n目标节点是\n"+printArray(target));
sr.getTextArea().append("\n经过的最短路径是\n");
while(1==1)
{
if(manager.open.isEmpty()==true)
{
sr.getTextArea().append("搜索失败");
break;
}
n=manager.pushOpenFirst();//取出open表的第一个节点
//如果匹配成功则退出否则继续扩展
if(manager.equal(n,g)==true)
{
sr.getTextArea().append("经过了"+manager.close.size()+"步,到达了目标节点\n");//成功了,并输出经过了几步到达目标节点
break;
}
else
{
manager.insertClose(n);
manager.insterNext(n);
next=manager.next;
manager.deleteOpenFirst();
ArrayList<Node> temp=new ArrayList<Node>();
temp=manager.extendNum(n);
for(int k=0;k<temp.size();k++)//判断是否在open表中出现过如果出现过比较f(n),大的删除,
{
for(int m=0;m<manager.open.size();m++)
{
if(temp.get(k).getArray()==manager.open.get(m).getArray())
{
if(manager.open.get(m).getF()<=temp.get(k).getF())
temp.remove(k);
else
manager.open.remove(m);
}
}
}
for(int m=0;m<temp.size();m++)
{
final Node tempNode=new Node();
tempNode.setF(manager.getG()+manager.p(temp.get(m).getArray(),target));
tempNode.setArray(temp.get(m).getArray());
manager.insterOpen(tempNode);
}
Collections.sort(manager.open,new Mycomparator());//对open列表进行排序
}
}
manager.insterNext(g);
next=manager.next;
for(int k=0;k<next.size();k++)
{
sr.getTextArea().append(printArray(next.get(k).getArray()));//输出经过的节点
}
}
public class Mycomparator implements Comparator<Object>
{//规定排序方法为升序
public int compare(final Object o1,final Object o2)
{
final Node n1=(Node)o1;
final Node n2=(Node)o2;
if(n1.getF()>=n2.getF())//根据估价函数f(n)大小来排序
return 1;
else
return 0;
}
}
public void actionPerformed(final ActionEvent e)
{
if(e.getSource()==open)
{
for ( int count=0;count<=8;count++)
{
text1[ count ].setText("");
text2[ count ].setText("");
}
}
if(e.getSource()==save)
{
System.exit(0);
}
if(e.getSource()==search)
{
start();
}
if(e.getSource()==play)
{
final buttonsTest slove = new buttonsTest();
slove.start();
}
if(e.getSource()==help)
{
JOptionPane.showMessageDialog(
eightNumber.this,
"在左边和右边的文本框中分别\n输入初始状态和目标状态!然后\n点击搜索,即可观看演示过程");
}
if(e.getSource()==about)
{
JOptionPane.showMessageDialog( eightNumber.this, "如有对本程序的意见及问题请咨询本人.\n联系电话:15892027062");
}
}
public static void main(final String arg[])//产生窗口
{
new eightNumber();
}
private String printArray(final int[][] n)
{
int l=0;
String s = "";
for(int o=0;o<3;o++)
{
for(int p=0;p<3;p++)
{
l++;
s=s+n[o][p]+" ";
if(l%3==0)
s=s+"\n";
}
}
return s+"\r\n";
}
private class buttonsTest extends Thread
{
private final ENumber a=new ENumber();
public buttonsTest()
{
}
public void run( )
{
for( int i=0;i<next.size(); i++ )
{
try
{
Thread.sleep(1000);
}
catch( final InterruptedException exception )
{
}
final Node n=next.get(i);
a.zhuanhuan(n);
a.reInitButtons();
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -