📄 main.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 + -