Java 捕鱼达人

181 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第16天,点击查看活动详情

捕鱼达人

捕鱼达人游戏开发 界面-->池塘Pool-->池塘的环境-->鱼-->渔网

1、完成捕鱼达人游戏的窗体界面

2、完成捕鱼达人的背景(环境)功能

3、完成一条静止不动的鱼

  • (1)定义了Fish类
  • (2)在Fish类添加了5个特征
  • (3)在Fish类中添加了构造方法,在构造方法中对5个特征赋值
  • (4)在Pool的特征处,定义了一条鱼Fish f;
  • (5)在Pool类的构造方法中,创建一条鱼,给f赋值。 f=new Fish();
  • (6)在Pool类的paint方法中,使用画笔画出鱼f

4、完成一条能够移动的鱼(游)

  • (1)让Fish类继承Thread
  • (2)在Fish类的行为处,调出run方法,在run()方法中实现x—
  • (3)在Pool类的构造方法中,通过f调用start()方法启动线程
  • (4)在Pool类中自定义action方法,在action方法中实现不停的执行paint方法
  • (5)在Start类中通过pl调用action()方法

5、鱼游出池塘,在重新进入池塘

6、重新进入池塘,改变y坐标值(不在一条线上游)

7、鱼的速度 1-5随机

8、鱼重新进入池塘,速度也发生改变(鱼别一直一个速度)

9、鱼初始位置的设置

10、完成一条鱼的动画效果

fish08_00.png fish08_01.png … fish08_09.png 10张图片 -- 一组鱼游的动画

11、完成多条同种类型的鱼

12、完成多条不同种类型的鱼

13、渔网

14、渔网的功能

  • (1)渔网移动的功能
  • (2)渔网的隐藏功能
  • (3)渔网的显示功能
  • (4)渔网的捕鱼功能

Start.java

package com.lddx.projects;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;


//启动捕鱼达人游戏的主类
public class Start {

	
	public static void main(String[] args) throws Exception{
		Start s=new Start();
		s.Init();
		
	}
	//初始化
	public void Init() throws Exception{
		JFrame f=new JFrame();
		JPanel p=new JPanel();
		Pool pl= new Pool();
		/*ImageIcon fish=new ImageIcon("images/fish05_00.png");
		JLabel label=new JLabel(fish);
		p.add(label);
		f.add(p);*/
		
		f.add(pl);
		f.setTitle("捕鱼达人破解版");
		f.setVisible(true);
		f.setSize(2000, 1000);
		
		f.setLocation(3, 6);
		f.setResizable(false);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setIconImage(ImageIO.read(new File("images/fish09_00.png")));
		pl.action();
		
		
	}
	
	

}

池塘Pool.java

package com.lddx.projects;

import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Random;


import javax.imageio.ImageIO;
import javax.swing.JPanel;

public class Pool extends JPanel{
	//背景
	BufferedImage bg;
	//渔网图片
	//11种鱼
	Fish[] fish=new Fish[11];
	//渔网
	Fishnet net=new Fishnet();
	//无参的默认构造函数
	public Pool() throws Exception{
		bg=ImageIO.read(new File("images/bg.jpg"));
		for(int i=0;i<fish.length;i++)
		{
			fish[i]=new Fish(i+1);//11种不同的鱼
			fish[i].start();//通过start()方法启动鱼
		}
	}
	//画笔
	public void paint(Graphics g){
		
		g.drawImage(bg, 0, 0,2000, 1000,null);//画背景
		//画11种不同的鱼
		for(int i=0;i<fish.length;i++)
		{
			g.drawImage(fish[i].type,fish[i].x,fish[i].y,fish[i].width,fish[i].height,null);
		}
		if(net.show)//表示显示渔网
		{
			g.drawImage(net.net_image,net.x,net.y,net.width,net.height,null);//画渔网
		}
		
	}
	//自定义方法,让paint()重复执行
	public void action(){
		//使用匿名内部类继承MouseAdapter
		MouseAdapter ma=new MouseAdapter(){
			//鼠标移动事件的监听,完成渔网移动的功能
			public void mouseMoved(MouseEvent e) {
				//System.out.println("鼠标移动了");
				net.change(e.getX(), e.getY());//渔网跟着鼠标移动
			}
			//鼠标点击事件的监听,完成捕鱼的功能
			public void mouseClicked(MouseEvent e) {
				//System.out.println("鼠标点击了");
				//当监听到鼠标单击了,进行捕鱼功能
				//将数组中每一条鱼取出,检测这些fish是否被捕捉
				for(int i=0;i<fish.length;i++)
				{
					//表示渔网中线(鼠标位置)在鱼身上,说明捕捉到鱼,让鱼消失,重新进入池塘
					if(e.getX()>=fish[i].x&&e.getX()<=fish[i].x+fish[i].width
							&&e.getY()>=fish[i].y&&e.getY()<=fish[i].y+fish[i].height)
					{
						fish[i].x=2000;
						Random r=new Random();//重新进入池塘,改变y坐标。
						fish[i].y=r.nextInt(800-fish[i].height);//随机产生y坐标
						fish[i].speed=r.nextInt(10)+1;//随机改变鱼的速度
					}
					
				}
				
			}
			//鼠标离开事件的监听,完成渔网隐藏的功能
			public void mouseExited(MouseEvent e) {
				//System.out.println("鼠标离开了");
				net.show=false;
			}
			//鼠标进入事件的监听,完成渔网显示的功能
			public void mouseEntered(MouseEvent e) {
				//System.out.println("鼠标进来了");
				net.show=true;
			}
		};
		//将定义好的匿名内部类绑定到池塘
		//使用关键字this,表示当前池塘Pool类
		this.addMouseListener(ma);
		this.addMouseMotionListener(ma);//鼠标移动
		while(true)
		{
			//repaint()继承父类JPanel,
			repaint();//将paint()调用一次;
		}
	}
}

鱼类Fish.java

package com.lddx.projects;

import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Random;

import javax.imageio.ImageIO;

//鱼类
public class Fish extends Thread{

	//种类
	BufferedImage type;
	//大小
	int width,height;
	//位置
	int x,y;
	//速度
	int speed;
	//状态
	BufferedImage[] state=new BufferedImage[10];
	public Fish() throws Exception{
		Random r=new Random();
		//对鱼的特征初始化
		type=ImageIO.read(new File("images/fish06_00.png"));
		width=type.getWidth();
		height=type.getHeight();
		x=2000;
		y=r.nextInt(800-height);
		speed=r.nextInt(6)+1;
		for(int i=0;i<state.length;i++)
		{
			state[i]=ImageIO.read(new File("images/fish06_0"+i+".png"));
		}
	}
	public Fish(int num) throws Exception{
		Random r=new Random();
		//对鱼的特征初始化
		type=ImageIO.read(new File("images/fish0"+num+"_00.png"));
		width=type.getWidth();
		height=type.getHeight();
		x=2000;
		y=r.nextInt(800-height);
		speed=r.nextInt(6)+1;
		for(int i=0;i<state.length;i++)
		{
			state[i]=ImageIO.read(new File("images/fish0"+num+"_0"+i+".png"));
		}
	}
	//行为
	//在run方法中实现鱼游动的行为
	public void run() {
		int index=0;
		while(true)
		{
			x=x-speed;//改变鱼的x坐标位置
			type=state[(index++)%10];//不停改变鱼的状态
			if(x<=-width)
			{
				x=2000;
				Random r=new Random();//重新进入池塘,改变y坐标。
				y=r.nextInt(800-height);//随机产生坐标
				speed=r.nextInt(10)+1;//随机改变鱼的速度	
			}
			try {
				Thread.sleep(60);//线程睡眠
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

}

渔网Fishnet.java

package com.lddx.projects;


import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;

public class Fishnet{

	//渔网
	BufferedImage net_image;
	//大小
	int width,height;
	//位置
	int x,y;
	//渔网的显示隐藏
	boolean show;//为true表示显示;
	//无参的默认构造函数
	public Fishnet() throws Exception{
		net_image=ImageIO.read(new File("images/net09.png"));
		width=net_image.getWidth();
		height=net_image.getHeight();
		x=100;
		y=100;
		show=true;
	}
	//定义修改渔网坐标值的方法
	public void change(int x1,int y1){
		x=x1-width/2;//渔网的x坐标-渔网宽度的一半
		y=y1-height/2;
		
	}

}