Java课程设计(第三版)动物换位源代码(可实现选择级别、计时、更改图像、撤销、重新开始等功能。)

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

 

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

关注“触动青年”公众号,在对话框中搜索“动物换位”,即可获取源代码链接。

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值