• 步骤 :
  • 1、创建窗口对象Ui
  • 2、背景的绘制
  • 3、键盘的监听事件
-显示接口
-添加监听事件
  • 4、将己方鱼放上去
  • 5、让小鱼移动
  • 6、其他的鱼并引导(先创建集合将鱼装起来,获得每个对象,画图)
  • 7、吃鱼
  • 8、被吃
package 大鱼吃小鱼;

import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.*;

public class Ui extends JFrame implements KeyListener {

	FishPanel fishPanel = new FishPanel();//创建打开界面 鱼 对象
	
	public Ui() {
		
		this.setTitle( "大鱼吃小鱼" );//标题
		//this.setBounds(100,20,1440,900);//设置大小
		this.setSize( 1440 , 900 );//设置窗口大小
		
		//设置窗体关闭后台随之关闭
		this.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );//默认关闭
		this.setLocationRelativeTo( null );//窗口居中
		this.add(fishPanel);//生成背景界面
		fishPanel.action();//生成其他鱼的工具
		this.setVisible( true );//画面显示
		this.addKeyListener( this );
		
	}
	
	public static void main(String [] args) {
		new Ui();//创建对象
	}

	@Override
	public void keyTyped(KeyEvent e) {
		// TODO 自动生成的方法存根
		
	}

	@Override
	public void keyPressed(KeyEvent e) {	//键盘按压走keyPressed方法
		// TODO 自动生成的方法存根
		System.out.println(0);
		//System.out.println( e.getKeyCode() );
		fishPanel.move(e.getKeyCode());
	}

	@Override
	public void keyReleased(KeyEvent e) {
		// TODO 自动生成的方法存根
		//fishPanel.move(e.getKeyCode());
	}
	
}
package 大鱼吃小鱼;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.ImageIcon;
import javax.swing.JPanel;


/**
 * 
 * 背景的绘制
 * 
 */

public class FishPanel extends JPanel {
	//0:游戏加载;1:游戏开始;2:游戏暂停;3:游戏结束
	int state = 0;//游戏状态
	
	Image bkImg = new ImageIcon("images/bg.jpg").getImage();
	Image over = new ImageIcon("images/bg.jpg").getImage();
	Image zan = new ImageIcon("images/bg.jpg").getImage();
	Image start = new ImageIcon("images/start.png").getImage();
	
	ArrayList<Fish> fishs = new ArrayList<Fish>();//装其他鱼的集合
	int miniFish = 0 , middleFish = 0 , bigFish = 0 ,superFish = 0 ;//各种鱼在初始界面鱼的数量 
	int score = 0;//初始分数
	
	public FishPanel() {
		myFish = new MyFish();
	    //music = new Music();
	    oldzhanLi=myFish.zhanLi;
	}
	MyFish myFish = new MyFish();//己方鱼
	int oldzhanLi = myFish.zhanLi;
	/**
	 * 绘制的方法
	 *  g 画笔对象
	 */
	public void paint(Graphics g)  {//画图必备路径
		super.paint(g);// g 画笔对象
		System.out.println("zzzzz");
		//绘制游戏背景界面
		switch(state) {
		case 0://游戏加载
			g.drawImage(start, 0, 0, 1440, 900, 0, 0, 500,300, null);
			break;
		case 1://游戏开始
			drawBackGround(g);//背景绘制
			drawMyFish(g);//绘制己方的小鱼
			drawFishs(g);//绘制其他的鱼
			
			g.setColor(Color.white);
			Font f = new Font("黑体",Font.BOLD,20);
			g.setFont(f);  
			g.drawString("当前得分:"+score, 15, 20);//"当前分数"在界面的位置
			g.drawString("战斗力:"+myFish.zhanLi, 200, 20);//"战斗力"在界面的位置
			break;
		case 2://游戏暂停
			g.drawImage(zan, 0, 0, null);
			break;
		case 3://游戏结束
			//g.drawImage(over, 0, 0, null);break;
			drawBackGround(g);//背景绘制
			drawMyFish(g);//绘制己方的小鱼
			drawFishs(g);//绘制其他的鱼
			
			g.drawString("当前得分:"+score, 15, 20);//"当前分数"在界面的位置
			g.drawString("战斗力:"+myFish.zhanLi, 200, 20);//"战斗力"在界面的位置
			
			g.setColor(Color.white);//"游戏结束"的字体颜色
			Font ff = new Font("黑体",Font.BOLD,50);//"游戏结束"字体为黑体,粗细为BOLD,大小为50
			g.setFont(ff);
			g.drawString("游戏结束",600 ,450);//"游戏结束"在界面的位置
			break;
		}
	}
	
	/**
	 * 绘制其他的方法
	 * @param g
	 */
	private void drawFishs(Graphics g) {
		// TODO 自动生成的方法存根
		for(int i = 0 ; i < fishs.size() ; i ++ ) {
			Fish fish = fishs.get(i);
			fish.draw(g);
		}
	}

	/**
	 * 绘制游戏开始的背景
	 * @param g
	 */
	private void drawBackGround(Graphics g) {
		// TODO 自动生成的方法存根
		g.drawImage(bkImg, 0, 0, 1440, 900, 0, 0, 2048, 1024, null);
	}
	
	/**
	 * 绘制己方小鱼的方法
	 * @param g
	 */
	private void drawMyFish(Graphics g) {
		// TODO 自动生成的方法存根
		myFish.draw(g);
		
	}
	
	/**
	 * 键盘监听事件执行的方法 
	 */
	public void move(int keycode) {
		switch(keycode) {
		case KeyEvent.VK_SPACE:
			//空格键,进入游戏开始的界面
			if(state == 0) {
				state = 1;
			}
			break;
		case KeyEvent.VK_LEFT:
			//左键
			if(state == 1) {//当游戏结束时鱼不能动
				myFish.moveLeft();//己鱼
				repaint();//敌方鱼
			}
			break;
		case KeyEvent.VK_RIGHT:
			//右键
			if(state == 1) {//当游戏结束时鱼不能动
				myFish.moveRight();//己鱼
				repaint();//敌方鱼
			}
			break;
		case KeyEvent.VK_UP:
			//上键
			if(state == 1) {//当游戏结束时鱼不能动
				myFish.moveUp();//己鱼
				repaint();//敌方鱼
			}
			break;
		case KeyEvent.VK_DOWN:
			//下键
			if(state == 1) {//当游戏结束时鱼不能动
				myFish.moveDown();//己鱼
				repaint();//敌方鱼
			}
			break;
		}
	}
	
	/**
	 * 定时器的方法:
	 * 		创建其他鱼
	 * 		不断的改变其他鱼的位置
	 */
	int index=1;
	public void action() {
		Timer timer=new Timer();
		timer.schedule(new TimerTask() {
		public void run() {
			if(state == 1) {
				//创建其他鱼,不断的改变其他鱼的位置
				createFishs();
				//吃鱼
				hitFish();
				//当鱼跑出圈外,我们要删除集中的鱼
				repaint();
		  }
		}
	   },20,10);//鱼生成周期
	}
	
	/**
	 * 吃鱼       
	 */
	private void hitFish() {
		// TODO 自动生成的方法存根
		for( int i = 0 ; i < fishs.size() ; i ++ ) {
			Fish fish = fishs.get(i);
			//检查碰撞:如果是true则执行碰撞,否则没有参数碰撞
			if( hit(fish) ) {
				//产生碰撞:第一种情况吃掉其他鱼;第二种情况己方鱼被吃游戏结束
				if(myFish.zhanLi >= fish.zhanLi) {
					//自己鱼能吃掉敌方鱼,变强
					switch(fish.zhanLi) {
					case 1 ://吃最小鱼加一分
						score ++;
						break;
					case 2 ://吃中下等鱼加二分
						score += 2;
						break;
					case 3 ://吃中上等鱼加五分
						score += 5;
						break;
					case 4 ://吃大鱼加十分
						score += 10;
						break;
					}
					
					//升级
					if(score >= 5) {
						myFish.zhanLi = 2;
					}
					if(score >= 25) {
						myFish.zhanLi = 3;
					}
					if(score >= 45) {
						myFish.zhanLi = 4;
					}
					
					//其他鱼要消失
					fishs.remove(i);
					//自己鱼变大
					if(myFish.zhanLi > oldzhanLi) {
						myFish.x1 = (int)(myFish.x1*1.1);
						myFish.y1 = (int)(myFish.y1*1.1);
						oldzhanLi = myFish.zhanLi;
					}
				}else {
					//自己鱼被吃,游戏结束
					//游戏状态分	0:游戏加载;1:游戏开始;2:游戏暂停;3:游戏结束
					state = 3;//游戏结束
				}
			}
		}
	}
	
	/**
	 * 检查碰撞:如果是true则执行碰撞,否则没有参数碰撞 
	 * @param fish
	 * @return
	 */
	private boolean hit(Fish fish) {
		// TODO 自动生成的方法存根
		//找出自己鱼的坐标和其他鱼的坐标
		int x = myFish.x + (myFish.x1 - myFish.x)/2;//己方鱼的x中心
		int y = myFish.y + (myFish.y1 - myFish.y)/2;//己方鱼的y中心
		if(x >= fish.x && x <= fish.x + fish.length) {
			if(y >= fish.y && y <= fish.y + fish.height) {
				return true;
			}
		}
		return false;
	}
	
	/**
	 * 生成其他鱼对象
	 */
	private void createFishs() {
		// TODO 自动生成的方法存根
		if(miniFish ++ % 200 == 0) {//生成最小的鱼的速度
			fishs.add(new MiniFish());
			
		}
		if(middleFish ++ % 400 == 0) {//生成中等下的鱼的速度
			fishs.add(new MiddleFish());
			
		}
		if((bigFish ++ % 1000) == 0) {//生成中等上的鱼的速度
			 fishs.add(new bigFish());
			 
		}
		
		if((superFish++%5000)==0) {//生成大的鱼的速度
			 fishs.add(new superFish());
			 
		}
	}
}

鱼的父类

package 大鱼吃小鱼;

import java.awt.Graphics;
import java.awt.Image;

public class Fish {
	
	int x,y;//己鱼的初始位置
	int length,height;//己鱼的宽和高
	boolean isMoveLeft = true;//己鱼的初始方向
	Image image;//己鱼的图片
	Image[] img = new Image[10];
	
	//裁剪大小的范围
	int sx1,sy1;
	int sx2,sy2;
	int zhanLi;
	
	int step;
    int count;
	//绘制
	public void draw(Graphics g) {
		
	}
	public void move() {
		
	}
}

绘制各种鱼
有mini鱼、middle鱼、big鱼、super鱼

  1. mini鱼
package 大鱼吃小鱼;

import java.awt.Graphics;

import javax.swing.ImageIcon;

/**
 1. 最小鱼
 2. @author jin
 3.  */
public class MiniFish extends Fish{
	public MiniFish() {
		int r = (int)(Math.random()*2);//取随机值,要么1,要么0
		if(r == 0) {
			isMoveLeft = false;
			//朝向左移,从右边进
			x = -68;
			
		}else {
			isMoveLeft = true;
			//朝向右移,从右边进
			x = 1440;
		}
		
		y = (int)(Math.random()*900);//y取随机值
		length = 68;
		height = 55;
		
		zhanLi = 1;
		//界面坐标
		step = 0;
		image = new ImageIcon("images/fish08.png").getImage();
	}
	
	/**
	 * 绘制最小鱼的功能,向左向右移动
	 */
	public void draw(Graphics g) {
		super.draw(g);
		if( isMoveLeft ) {
			//己鱼方向向左
			sy1=height*step;
			sx1=0;
			sy2=height*step+height;
			sx2=length;
			//画最小鱼的图
			g.drawImage(image, x--, y, x+length, y+height, sx1, sy1, sx2, sy2, null);
		}else {
			//己鱼方向向右
			sx2=0;
			sy2=height*step;
			sx1=length;
			sy1=height*step+height;
			//画最小鱼的图
			g.drawImage(image, x++, y, x+length, y+height, sx1, sy1, sx2, sy2, null);
		}
	}
	
	public void move() {
		// TODO Auto-generated method stub

		if(step<1){
			step++;
		}else
			step=0;
	}
}
  1. middle鱼
package 大鱼吃小鱼;

/**
 * 中等下鱼
 * @author jin
 *
 */
import java.awt.Graphics;

import javax.swing.ImageIcon;

public class MiddleFish extends Fish {
	public MiddleFish() {
		int r = (int)(Math.random()*2);//取随机值,要么1,要么0
		if(r == 0) {
			isMoveLeft = false;
			//朝向左移,从右边进
			x = -68;
			
		}else {
			isMoveLeft = true;
			//朝向右移,从右边进
			x = 1440;
		}
		y = (int)(Math.random()*900);//y取随机值
		length = 96;
		height = 29;
		
		zhanLi = 2;
		//界面坐标
		step = 0;
		
		image = new ImageIcon("images/fish12.png").getImage();
	}
	
	/**
	 * 绘制中等鱼的功能,向左向右移动
	 */
	public void draw(Graphics g) {
		super.draw(g);
		if( isMoveLeft ) {
			//己鱼方向向左
			sy1=height*step;
			sx1=0;
			sy2=height*step+height;
			sx2=length;
			//画最小鱼的图
			g.drawImage(image, x--, y, x+length, y+height, sx1, sy1, sx2, sy2, null);
		}else {
			//己鱼方向向右
			sx2=0;
			sy2=height*step;
			sx1=length;
			sy1=height*step+height;
			//画最小鱼的图
			g.drawImage(image, x++, y, x+length, y+height, sx1, sy1, sx2, sy2, null);
		}
	}

	public void move() {
		// TODO Auto-generated method stub

		int step = 0;
		if(step<2) {
			step++;
		}else
			step=0;
	}
}
  1. big鱼
package 大鱼吃小鱼;
import java.awt.Graphics;

import javax.swing.ImageIcon;
/**
 * 中等上鱼
 * @author jin
 *
 */
public class bigFish extends Fish {
	public bigFish() {
		int r = (int)(Math.random()*2);//取随机值,要么1,要么0
		if(r == 0) {
			isMoveLeft=false;
			//朝向左移,从右边进
			x=-310;
		}else {
			isMoveLeft=true;
			//朝向右移,从右边进
			x=1440;
		}
	
		y=(int)(Math.random()*900);
		length= 310;
		height=	104;
	
		zhanLi=3;
		//界面坐标
		step=0;
	
		image = new ImageIcon("images/fish03.png").getImage();
	}
	
	/**
	 * 绘制最小鱼的功能,向左向右移动
	 */
	public void draw(Graphics g){
		if(isMoveLeft) {//左移
			sy1=height*step;
			sx1=0;
			sy2=height*step+height;
			sx2=length;
			g.drawImage(image, x--, y, x+length, y+height, sx1, sy1, sx2,sy2, null);
			}
		else {//右移
			sx2=0;
			sy2=height*step;
			sx1=length;
			sy1=height*step+height;
			g.drawImage(image, x++, y, x+length, y+height, sx1, sy1, sx2,sy2, null);
		}
	}

	public void move() {
		// TODO Auto-generated method stub

		if(step<8){
			step++;
		}else
			step=0;
	}
}
  1. super鱼
package 大鱼吃小鱼;
import java.awt.Graphics;

import javax.swing.ImageIcon;

public class superFish extends Fish {
	
	public superFish() {
		int r = (int)(Math.random()*2);//取随机值,要么1,要么0
			if(r == 0) {
				isMoveLeft=false;
				//朝向左移,从右边进
				x=-380;
			}else {
				isMoveLeft=true;
				//朝向右移,从右边进
				x=1440;
			}
		
			y=(int)(Math.random()*900);
			length= 380;
			height=	210;	
			zhanLi=4;
			//界面坐标
			step=0;
			image = new ImageIcon("images/fish17.png").getImage();
	}
	
	/**
	 * 绘制最小鱼的功能,向左向右移动
	 */
	public void draw(Graphics g){
		if(isMoveLeft) {//左移
			sy1=height*step;
			sx1=0;
			sy2=height*step+height;
			sx2=length;
			g.drawImage(image, x--, y, x+length, y+height, sx1, sy1, sx2,sy2, null);
		}
		else {//右移
			sx2=0;
			sy2=height*step;
			sx1=length;
			sy1=height*step+height;
			g.drawImage(image, x++, y, x+length, y+height, sx1, sy1, sx2,sy2, null);
		}
	}

	public void move() {
		// TODO Auto-generated method stub
		if(step<1) {
			step++;
		}else
			step=0;
	}
}

代码所需要的图片

  1. 游戏界面
    images/start.png

Java大鱼吃小鱼课设报告 java大鱼吃小鱼简单源代码_Image

  1. 游戏运行界面
    images/bg.jpg
  2. Java大鱼吃小鱼课设报告 java大鱼吃小鱼简单源代码_fish_02

  3. super鱼
    images/fish17.png
  4. Java大鱼吃小鱼课设报告 java大鱼吃小鱼简单源代码_游戏程序_03

  5. big鱼
    images/fish03.png
  6. Java大鱼吃小鱼课设报告 java大鱼吃小鱼简单源代码_Image_04

  7. middle鱼
    images/fish12.png
  8. Java大鱼吃小鱼课设报告 java大鱼吃小鱼简单源代码_游戏程序_05

  9. 自己鱼和mini鱼
    images/fish08.png
  10. Java大鱼吃小鱼课设报告 java大鱼吃小鱼简单源代码_Image_06