⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eightnumber.java

📁 本程序实现八数码的实现
💻 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 + -