可实现选择级别、计时、更改图像、撤销、重新开始等功能。

7.2 Animal.java

import java.awt.Graphics;
import java.awt.Image;
import java.io.File;
 
public abstract class Animal {
    String name ;
    Point [] allCanAtPoint;    //全部点位置
    Point point;               //动物当前所在的点位置
    ViewForAnimal animalView;  //动物的外观视图
    public void setAtPoint(Point p) {
        if(p!=null){
           point = p;
           point.setIsHaveAnimal(true);
           point.setAtPointAnimal(this);
        }
    }
    public Point getAtPoint() {
        return point;
    }
    public void setAllCanAtPoint(Point [] point){
        allCanAtPoint = point;
    }
    public void setAnimalView(ViewForAnimal animalView) {
        this.animalView = animalView;
        animalView.setAnimal(this);
    }
    public ViewForAnimal getAnimalView() {
         return animalView;
    }
    public void setName(String s) {
        name = s;
    }
    public String getName() {
        return name;
    }
   
    public abstract boolean move();
      
}

7.3 LeftAnimal.java

public class LeftAnimal extends Animal{
           public boolean move(){
              int k = -1;
              boolean successMove = false;
              Point p = getAtPoint();
              for(int i=0;i<allCanAtPoint.length;i++){
                 if(allCanAtPoint[i].equals(p)){ 
k = i; //找到动物当前所处的位置:allCanAtPoint[k]
                    break;
                 }
              } 
              if(k==allCanAtPoint.length-1){//已经在最右面的点位置
                  return false;
              }
              if(allCanAtPoint[k+1].isHaveAnimal()==false) { //前面位置上没有动物
                 this.setAtPoint(allCanAtPoint[k+1]);
successMove = true;
p.setAtPointAnimal(null);
                 return successMove ;
              }
              if((k+1)==allCanAtPoint.length-1){ //前面位置上是已经到达终点的动物
                  return false;
              }
              if(allCanAtPoint[k+2].isHaveAnimal()==false) {//前方隔位上没有动物
                 this.setAtPoint(allCanAtPoint[k+2]);
successMove = true;
p.setAtPointAnimal(null);
                 return successMove ;
              }
              return successMove ;  
           }
 
          
}

7.3 Point.java

public class Point{
    int x,y; 
    boolean haveAnimal; 
    Animal animal=null; //在该点位置上的动物
    public void setX(int x){
        this.x=x;
    }
    public void setY(int y){
        this.y=y;
    }
    public boolean isHaveAnimal(){
        return haveAnimal;
    }
    public void setIsHaveAnimal(boolean boo){
haveAnimal=boo;
    }
    public int getX(){
        return x;
    }
    public int getY(){
        return y;
    }
    public void setAtPointAnimal(Animal animal){
        this.animal=animal;
        if(animal!=null) {
haveAnimal = true;
        }
        else {
haveAnimal = false;
        }
    }
    public Animal getAtPointAnimal(){
        return animal;
    }
}

7.4 RightAnimal.java

import java.awt.Graphics;
import java.awt.Toolkit;
import java.io.File;
 
public class RightAnimal extends Animal{
        boolean isLeft;
           File leftImage, rightImage;
           Toolkit tool;
           public boolean move(){
              int k = -1;
              boolean successMove = false;
              Point p = getAtPoint();
              for(int i=0;i<allCanAtPoint.length;i++){
                 if(allCanAtPoint[i].equals(p)){
                    k = i;
                    break;
                 }
              }
              if(k==0){  //已经在最左面的点位置
                  return false;
              }
              if(allCanAtPoint[k-1].isHaveAnimal()==false) {//前面位置上没有动物
                 this.setAtPoint(allCanAtPoint[k-1]);//动物到达allCanAtPoint[k-1]点
                 successMove = true;
                 p.setAtPointAnimal(null);           //p点设置为无动物
                 return successMove ;
              }
              if((k-1)==0){   //前面位置上是已经到达终点的动物
                  return false;
              } 
              if(allCanAtPoint[k-2].isHaveAnimal()==false) {//前方隔位上没有动物
                 this.setAtPoint(allCanAtPoint[k-2]); //动物到达allCanAtPoint[k-2]点
                 successMove = true;
                 p.setAtPointAnimal(null);           //p点设置为无动物
                 return successMove ;
              }
              return successMove ; 
           }
}

 

7.5 ViewForAnimal.java

import javax.swing.JPanel;
public abstract class ViewForAnimal extends JPanel {
    public abstract void setAnimal(Animal animal);
    public abstract void setImage(String pic);
    public abstract Animal getAnimal();
    public abstract void setAnimalViewLocation(int x,int y);
    public abstract void setAnimalViewSize(int w,int h);
       
}

7.6 AnimalView.java

import java.awt.*;
import java.io.File;
 
import Animal_game.date.Animal;
import Animal_game.date.ViewForAnimal;
 
public class AnimalView extends ViewForAnimal{
   Animal animal;
   Image image;
   Image image2;
   Image image3;
   Toolkit tool;
   boolean isLeft;
   File leftImage, rightImage;
   public AnimalView() {
      tool = getToolkit();
   }
  
 
               
               
               
   public void setAnimal(Animal animal){
      this.animal = animal;
   }
   public void setImage(String name){
      image = tool.getImage(name);
      repaint();  //  repaint()方法对界面重绘。
   }
 
   public Animal getAnimal() {
      return animal;
   }
   public void setAnimalViewLocation(int x,int y){
      setLocation(x,y);
   }
   public void setAnimalViewSize(int w,int h){
      setSize(w,h);
   }
   public void paintComponent(Graphics g){
      super.paintComponent(g);
      int w=getBounds().width;
      int h=getBounds().height;
      g.drawImage(image,0,0,w,h,this);
 
                      }
     
    
   }

7.7 GamePanel.java

import javax.swing.*;
import java.awt.*;
import Animal_game.date.Animal;
import Animal_game.date.Point;
import Animal_game.date.ViewForAnimal;
import Animal_game.date.LeftAnimal;
import Animal_game.date.RightAnimal;
import java.util.*;
import java.awt.geom.*;
import java.io.File; 
public class GamePanel extends JPanel {
    public int animalCount = -1;
    public Point [] point ;
    Animal []  leftAnimal,rightAnimal; 
    public ViewForAnimal [] leftAnimalView,rightAnimalView;//动物视图
    public int width =90,height=70;  //动物视图的大小
    public int gap = 2;              //动物之间的间隙
    public JButton buttonRedo;//撤销按钮
    public JButton buttonReStart;//重新开始游戏
    public Stack<Point> saveAnimalStep; //存放动物走动的位置,以便恢复
    HandleAnimalMove handleAnimalMove;//负责处理MouseEvent的监视器
    HandleRedo handleRedo;           //负责ActionEvent的监视器
    HandleReStart handleReStart;    //负责ActionEvent的监视器
    File leftImage,rightImage;
    int distance=100,grade=1,m=3,n=3;
    public GamePanel(){
       setLayout(null);
      
buttonRedo = new JButton("撤销");
buttonReStart = new JButton("重新开始");
saveAnimalStep = new Stack<Point>();
    }
    public HandleAnimalMove getHandleAnimalMove(){
 
        return handleAnimalMove;
 
     }
  
    public void setAnimalCount(int n){
       if(n%2 != 0 ||n<=1) {
          System.out.println(n+"的个数不合理");
          System.exit(0);
       } 
       removeAll();  //首先移出曾添加到该容器中的全部组件
animalCount = n;
       initPoitAndAnimal();  //初始化动物和位置对象
       initLeftAnimalView(); //初始化左边的动物视图
       initRightAnimalView();
       registerListener();   //注册监视器
    }
    private void initPoitAndAnimal(){//初始化动物和位置对象
point = new Point[animalCount+1];
       int posionX = width; //点的位置的x坐标
       int posionY = height;
       for(int i=0;i<point.length;i++) {
point[i] = new Point();
point[i].setX(posionX);
point[i].setY(posionY);
posionX = posionX+width+gap;
       } 
       int m = animalCount/2;
leftAnimal = new LeftAnimal[m];
rightAnimal = new RightAnimal[m];
       for(int i =0;i<leftAnimal.length;i++ ){
leftAnimal[i] = new LeftAnimal();
leftAnimal[i].setAtPoint(point[i]);
leftAnimal[i].setAllCanAtPoint(point);
       } 
       for(int i =0;i<rightAnimal.length;i++ ){
rightAnimal[i] = new RightAnimal();
rightAnimal[i].setAtPoint(point[m+1+i]);
rightAnimal[i].setAllCanAtPoint(point);
       }  
    }
    private void initLeftAnimalView(){//初始化左边的动物视图
       int m = animalCount/2;
leftAnimalView = new ViewForAnimal[m];
       for(int i =0;i<leftAnimalView.length;i++ ){
leftAnimalView[i] = new AnimalView();
leftAnimal[i].setAnimalView(leftAnimalView[i]);
          Point p = leftAnimal[i].getAtPoint();
          int x = p.getX();
          int y = p.getY();
          add(leftAnimalView[i]);
//动物视图所在位置和动物所在点相同:
leftAnimalView[i].setAnimalViewLocation(x,y);
leftAnimalView[i].setAnimalViewSize(width,height);
       } 
    }
    private void initRightAnimalView(){//初始化右边的动物视图
       int m = animalCount/2;
rightAnimalView = new ViewForAnimal[m];
       for(int i =0;i<rightAnimalView.length;i++ ){
rightAnimalView[i] = new AnimalView();
rightAnimal[i].setAnimalView(rightAnimalView[i]);
          Point p = rightAnimal[i].getAtPoint();
          int x = p.getX();
          int y = p.getY();
          add(rightAnimalView[i]);
rightAnimalView[i].setAnimalViewLocation(x,y);
rightAnimalView[i].setAnimalViewSize(width,height);
       } 
    }
    private void registerListener(){
handleAnimalMove = new HandleAnimalMove(this);
//监视用户在动物视图上触发的MouseEvent事件:
        for(int i =0;i<rightAnimalView.length;i++ ){
rightAnimalView[i].addMouseListener(handleAnimalMove);
        }
        for(int i =0;i<leftAnimalView.length;i++ ){
leftAnimalView[i].addMouseListener(handleAnimalMove);
        }
handleRedo = new HandleRedo(this);
handleReStart = new HandleReStart(this);
//监视用户在按钮上触发的ActionEvent事件:
buttonRedo.addActionListener(handleRedo);
buttonReStart.addActionListener(handleReStart);
    }
   
   
  
   
    public void setLeftAnimalImage(String pic){
      if(animalCount==-1)
           return;
       for(int i =0;i<leftAnimalView.length;i++ ){
leftAnimalView[i].setImage(pic);
       } 
    }
    public void setRightAnimalImage(String pic){
      if(animalCount==-1)
           return;  
       for(int i =0;i<rightAnimalView.length;i++ ){
rightAnimalView[i].setImage(pic);
       } 
    }
    public void paintComponent(Graphics g){
       int penHeight =12;  //画笔的高度
       super.paintComponent(g);
       int xStart =width+gap;
       int yStart =2*height+penHeight/2;
       int xEnd =(animalCount+2)*width+(animalCount+1)*2;
       int yEnd =2*height+penHeight/2;
       Line2D line=new Line2D.Double(xStart,yStart,xEnd,yEnd);
       Graphics2D g_2d=(Graphics2D)g;
g_2d.setColor(Color.blue);
       BasicStroke bs=
       new BasicStroke(penHeight,BasicStroke.CAP_ROUND,BasicStroke.JOIN_MITER);
g_2d.setStroke(bs);
g_2d.draw(line);
   }
}

7.8 HandleAnimalMove.java


7.9 HandleRedo.java

import Animal_game.date.Point;
import Animal_game.date.Animal;
import Animal_game.date.ViewForAnimal;
 
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.*;
 
import javax.swing.JFrame;
import javax.swing.JPanel;
public class HandleRedo implements ActionListener {
     GamePanel panel;
     HandleRedo(GamePanel panel){
        this.panel = panel;
     }
     public void actionPerformed(ActionEvent e){ //撤销移动动物的操作
           if(panel.saveAnimalStep.empty())
               return;
           Point pEnd = panel.saveAnimalStep.pop();
           Point pStart = panel.saveAnimalStep.pop();
           Animal animal = pEnd.getAtPointAnimal();
           pEnd.setIsHaveAnimal(false);
           pEnd.setAtPointAnimal(null);
           animal.setAtPoint(pStart);
           ViewForAnimal animalView =animal.getAnimalView();
           int x = pStart.getX();
           int y = pStart.getY();
           animalView.setAnimalViewLocation(x,y);//让动物视图所在位置和动物所在点相同
    }
}

7.10 HandleReStart.java

import Animal_game.date.ViewForAnimal;
import java.awt.event.*;
public class HandleReStart implements ActionListener {
     GamePanel panel;
     HandleReStart(GamePanel panel){
        this.panel = panel;
     }
     public void actionPerformed(ActionEvent e){ //处理重新开始
       panel.saveAnimalStep.clear();
       for(int i=0;i<panel.point.length;i++) {
           panel.point[i].setIsHaveAnimal(false);
       }
       for(int i =0;i<panel.leftAnimal.length;i++ ){
           panel.leftAnimal[i].setAtPoint(panel.point[i]);
           int x = panel.point[i].getX();
           int y = panel.point[i].getY();
           //让动物视图所在位置和动物所在点相同
           ViewForAnimal animalView =panel.leftAnimal[i].getAnimalView();
           animalView.setAnimalViewLocation(x,y);
       }
       for(int i =0;i<panel.rightAnimal.length;i++ ){
           int m = panel.animalCount/2;
           panel.rightAnimal[i].setAtPoint(panel.point[m+1+i]);
           int x = panel.point[m+1+i].getX();
           int y = panel.point[m+1+i].getY();
           //让动物视图所在位置和动物所在点相同
           ViewForAnimal animalView =panel.rightAnimal[i].getAnimalView();
           animalView.setAnimalViewLocation(x,y);
       } 
   
     }
}

7.11 PlayMusic.java

import java.net.URI;
import java.net.URL;
import java.io.File;
import java.applet.Applet;
import java.applet.AudioClip;
public class PlayMusic implements Runnable {
      String musicName;
      Thread threadPlay;
      AudioClip clip = null;
      public PlayMusic(){
         threadPlay = new Thread(this);
      }
      public void run() {
          clip.play();
      }
      public void playMusic(){
          threadPlay = new Thread(this);
          try{
             threadPlay.start();
          }
          catch(Exception exp) {}   
      }
      public void setClipFile(String name){
           musicName = name;
        /*  if(musicName == null)
              musicName = "image/mine.wav";*/
          File file=new File(musicName);  //创建file对象
          try { URI uri=file.toURI();     //获取URI对象
                URL url=uri.toURL();      //获取URL对象
                clip=Applet.newAudioClip(url);
          }
          catch(Exception ee){}
      }
}

 

7.1 AppWindow.java