• PUDN用户
    了解作者
  • Java
    开发工具
  • 15KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 241
    下载次数
  • 2005-08-14 09:27
    上传日期
使用启发式算法编写的推箱子游戏,有图形界面,可以自动演示最优步骤
HeuristicBoxman.rar
  • org
  • genomics
  • boxman
  • Main.java
    8.2KB
  • Pot.class
    3.8KB
  • Data.class
    1.4KB
  • Data.java
    1.1KB
  • Scorer.class
    596B
  • Main$1.class
    620B
  • Main.class
    9.5KB
  • Scorer.java
    568B
  • Pot.java
    3KB
  • www.pudn.com.txt
    218B
内容介绍
/* * 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 f
评论
  • PUDN用户 2010-01-05 00:01:00
    好用,大家多读交流
相关推荐
  • Java推箱子.rar
    使用Java语言编程,实现推箱子小游戏的功能
  • JAVA推箱子
    JAVA程序 可以用于新手来当教学代码来使用
  • java推箱子
    java推箱子游戏,课程作业,程序设计,一共30关 包含选关、跳关、悔步操作 UI界面
  • 推箱子 java .net
    推箱子 java .net 推箱子 java .net 推箱子 java .net 推箱子 java .net
  • java推箱子
    Java语言写的推箱子
  • 推箱子java代码
    java开发的复古推箱子游戏,但是加了不少额外功能,画面也是全新的。注释很完整
  • 推箱子游戏JAVA
    这是一款JAVA推箱子游戏,一共12关。输入游戏级别,按回车,然后按光标键推箱子。将所有箱子放到目标位置你就过关了,这款游戏是基于网页的,也可以用APPLET游戏查看器直接运行等。
  • java 推箱子 游戏
    java 推箱子 游戏
  • Java推箱子源码
    Java版的推箱子源码,做得比较简单。有兴趣的读者可以自己扩充。
  • java推箱子
    java推箱子源码 包含游戏所需的素材,以及主角行走图。