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

📄 main.java

📁 使用启发式算法编写的推箱子游戏,有图形界面,可以自动演示最优步骤
💻 JAVA
字号:
/*
 * Author: ruanjue
 * Created: 06/08/2004 12:37:04
 * Modified: 06/08/2004 12:37:04
 */
package boxman;

import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Main extends JPanel implements ActionListener
{
	public static String title="推箱子";
	public static String logo="logo.gif";
	public static int Width=500;
	public static int Height=500;
	public static int location_x=200;
	public static int location_y=100;
	public static int TIME_PLAYBACK_INTERVAL=1000;
	public static int NONE_VALUE=-1;
	public static String ICON_NOT_FOUND="找不到图标";
	public static String INDEX_DISTRUBING="程序出现内部错误:数组下标混乱";
	public static String SUCCESS="gxgx,你已经成功地推完了箱子!";
	public static Color COLOR_BACK=Color.gray;
	public static Color COLOR_FORE=Color.white;
	public static Color COLOR_ACTIVED_BOX=Color.black;
	public static String CMD_PLAYBACK="[回放]";
	public static String CMD_START="[开始]";
	public static String CMD_HELP="[求助]";
	private JButton[] boxs=null;
	private int[] indexs=null;
	private Vector record=null;
	private JButton player=null;
	private JLabel msg=null;
	private int last_Zero=0;
	private boolean PLAYBACKING=false;
	private boolean HELPING=false;
	private Pot pot=null;
	public Main(int[] dat){
		super(new BorderLayout());
		JPanel boxPanel=new JPanel(new GridLayout(3,3));
		boxPanel.setPreferredSize(new Dimension(Width,Height));
		boxs=new JButton[9];
		indexs=new int[9];
		record=new Vector();
		for(int i=0;i<boxs.length;i++){
			if(dat==null||dat.length!=9){
				indexs[i]=i+1;
				if(i>=indexs.length-1){
					indexs[i]=0;
				}
			}
			else {
				indexs[i]=dat[i];
			}
			boxs[i]=new JButton(String.valueOf(indexs[i]));
			boxs[i].setForeground(COLOR_FORE);
			boxs[i].setBackground(COLOR_BACK);
			boxs[i].addActionListener(this);
			boxPanel.add(boxs[i]);
		}
		add(boxPanel,BorderLayout.CENTER);
		JPanel ctrlPanel=new JPanel(new GridLayout(1,3));
		JButton start=new JButton(CMD_START);
		JButton help=new JButton(CMD_HELP);
		player=new JButton(CMD_PLAYBACK);
		ctrlPanel.add(start);
		ctrlPanel.add(help);
		ctrlPanel.add(player);
		start.addActionListener(this);
		help.addActionListener(this);
		player.addActionListener(this);
		add(ctrlPanel,BorderLayout.NORTH);
		msg=new JLabel("designed by ruanjue!");
		add(msg,BorderLayout.SOUTH);
		showMessage("推箱子游戏,由阮珏设计,仅供参考");
	}
	private void initBoxs(){
		for(int i=0;i<indexs.length;i++){
			indexs[i]=i+1;
		}
		indexs[indexs.length-1]=0;
		juestfy();
		record.clear();
		for(int i=0;i<50;i++){
			int[] mv=getMovable(indexs);
			int r=(int)(Math.random()*mv.length);
			r=indexs[mv[r]];
			print("Move :"+r+"\t"+moveBox(r,0,true));
		}
		paintZero();
	}
	private void juestfy(){
		for(int i=0;i<indexs.length;i++){
			boxs[i].setText(String.valueOf(indexs[i]));
		}
		paintZero();
	}
	private void print(String s){
		msg.setText(s);
	}
	public void actionPerformed(ActionEvent e){
		if(e.getSource() instanceof JButton){
			String cmd=e.getActionCommand();
			if(cmd.startsWith("[")){
				Thread t=new Thread(cmd){
					public void run(){
						excute(getName());
					}
				};
				t.start();
			}
			else{
				try{
					int index=Integer.parseInt(cmd);
					excute(index);
				}catch(Exception exc){
				}
			}
		}
	}
	public void excute(String cmd){
		if(cmd.equals(CMD_PLAYBACK)){
			Byte b=null;
			player.setEnabled(false);
			for(int i=0;i<boxs.length;i++){
				boxs[i].setEnabled(false);
			}
			PLAYBACKING=true;
			for(int i=record.size()-1;i>=0&&PLAYBACKING;i--){
				b=(Byte)record.remove(i);
				moveBox(0,b.intValue(),false);
				print("=playback: Move box["+b.intValue()+"]");
				if(checkAll(indexs)){
					showMessage("Over!");
					record.clear();
					player.setEnabled(true);
					return ;
				}
				try{
					Thread.currentThread().sleep(TIME_PLAYBACK_INTERVAL);
				}catch(Exception e){
				}
			}
			player.setEnabled(true);
			for(int i=0;i<boxs.length;i++){
				boxs[i].setEnabled(true);
			}
			PLAYBACKING=false;
		}
		else if(cmd.equals(CMD_START)){
			player.setEnabled(true);
			for(int i=0;i<boxs.length;i++){
				boxs[i].setEnabled(true);
			}
			if(PLAYBACKING){
				record.clear();
				PLAYBACKING=false;
			}
			initBoxs();
		}
		else if(cmd.equals(CMD_HELP)){
			player.setEnabled(true);
			for(int i=0;i<boxs.length;i++){
				boxs[i].setEnabled(true);
			}
			if(PLAYBACKING){
				record.clear();
				PLAYBACKING=false;
			}
			if(pot!=null)
				HELPING=pot.getStatus();
			if(!HELPING){
				HELPING=true;
				pot=new Pot(indexs,new byte[0]);
				pot.run();
			}
			else{
				HELPING=false;
				print("USER CANCEL!");
				pot.shutDown();
			}
		}
	}
	//public static 
	public static int[] move(int[] array,int m,int n){
		int r[]=new int[array.length];
		for(int i=0;i<r.length;i++){
			r[i]=array[i];
		}
		if(check(m,n)){
			int t=r[m];
			r[m]=r[n];
			r[n]=t;
			return r;
		}
		else {
			return null;
		}
	}
	public static  int[] getMovable(int[] indexs){
		int zero=getRealIndex(indexs,0);
		int[] r=new int[4];
		Arrays.fill(r,NONE_VALUE);
		int i=0;
		if(zero-1>=0&&zero%3!=0){
			r[i++]=zero-1;
		}
		if(zero+1<indexs.length&&zero%3!=2){
			r[i++]=zero+1;
		}
		if(zero-3>=0){
			r[i++]=zero-3;
		}
		if(zero+3<indexs.length){
			r[i++]=zero+3;
		}
		int[] s=new int[i];
		for(int j=0;j<i;j++)
			s[j]=r[j];
		return s;
	}
	public void excute(int index){
		boolean b=moveBox(index,0,true);
		if(b){
			print("+OK Move box["+index+"]");
			if(checkAll(indexs)){
				showMessage(SUCCESS);
			}
		}
		else {
			print("-ERR Can't Move box["+index+"]");
		}
	}
	private boolean moveBox(int m,int n,boolean isRecording){//m,n is the index of boxs[];
		int mm=getRealIndex(indexs,m);
		int nn=getRealIndex(indexs,n);
		if(check(mm,nn)){
			boxs[mm].setText(String.valueOf(n));
			boxs[nn].setText(String.valueOf(m));
			indexs[mm]=n;
			indexs[nn]=m;
			paintZero();
			print("The Score is: "+Scorer.score(indexs));
			if(isRecording) {
				recording(m,n);
			}
			else {
			}
			return true;
		}
		else {
			return false;
		}
	}
	private void paintZero(){
		int i=getRealIndex(indexs,0);
		boxs[last_Zero].setBackground(COLOR_BACK);
		boxs[i].setBackground(COLOR_ACTIVED_BOX);
		last_Zero=i;
	}
	private void recording(int m,int n){
		record.add(new Byte((byte)m));
	}
	public static boolean checkAll(int[] indexs){
		for(int i=0;i<indexs.length;i++){
			if(indexs[i]==i+1){
				continue;
			}
			else if(i==indexs.length-1&&indexs[i]==0){
				continue;
			}
			else {
				return false;
			}
		}
		return true;
	}
	public static boolean check(int m,int n){
		if(m-n==1&&(m==0||m%3!=0)){
			return true;
		}
		else if(m-n==-1&&(n%3!=0)){
			return true;
		}
		else if(m-n==3){
			return true;
		}
		else if(m-n==-3){
			return true;
		}
		else{
			return false;
		}
	}
	public static int getRealIndex(int[] array,int m){
		for(int i=0;i<array.length;i++){
			if(m==array[i]){
				return i;
			}
		}
		return NONE_VALUE;
	}
	public Image getIconImage(){
		Image icon=Toolkit.getDefaultToolkit().getImage(logo);
		MediaTracker mt=new MediaTracker(this);
		mt.addImage(icon,0);
		try{
			mt.waitForAll();
		}catch(Exception e){
			showError(ICON_NOT_FOUND);
			return null;
		}
		if(icon==null){
			showError(ICON_NOT_FOUND);
			return null;
		}
		return icon;
	}
	public void showMessage(String msg){
		print(msg);
		JOptionPane.showMessageDialog(this,msg);
	}
	public void showError(String err){
		print(err);
		JOptionPane.showMessageDialog(this,err);
	}
	public static void main(String[] args){
		int[] dat=null;
		if(args!=null&&args.length==9){
			dat=new int[9];
			for(int i=0;i<9;i++){
				dat[i]=Integer.parseInt(args[i]);
			}
		}
		JFrame frame=new JFrame();
		Main panel=new Main(dat);
		frame.getContentPane().setLayout(new BorderLayout());
		frame.getContentPane().add(panel,BorderLayout.CENTER);
		frame.setIconImage(panel.getIconImage());
		frame.pack();
		frame.setTitle(title);
		frame.setLocation(Main.location_x,Main.location_y);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.show();
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -