Java学习:用面向对象写个简单的“深海大游行”

后端学习评论4.8K字数 7367阅读24分33秒阅读模式

用面向对象写个简化版的捕鱼达人,因为没有捕鱼功能,就两种鱼类,就叫个“深海大作战1.0版”吧!哈哈

Java学习:用面向对象写个简单的“深海大游行”文章源自亦枫博客-https://yflad.cn/2018.html

案例具体要求:

  1. 有图片
  2. x轴,y轴坐标
  3. 图片的高度,宽度
  4. 有多种“鱼”类,会动,且按一定比例随机出现

 文章源自亦枫博客-https://yflad.cn/2018.html

代码如下:

package cn.yflad.buyudaren;
/**
 * 所有鱼的父类
 * @author yflad-F
 *
 */

import java.awt.image.BufferedImage;

public abstract class Fish {

	public BufferedImage image; //有图片
	public int x;//x坐标
	public int y;
	public int height;//图片的高度
	public int width;
	
	public abstract void step();
}

Java学习:用面向对象写个简单的“深海大游行”文章源自亦枫博客-https://yflad.cn/2018.html

package cn.yflad.buyudaren;

import java.awt.image.BufferedImage;

/**
 * 章鱼类
 * @author yflad-F
 */
public class Zy extends Fish{
	int xspeed=2;  //x轴移动的速度
	//图片数组
	BufferedImage[] images;
	//通过无参构造函数对成员进行初始化操作
	public Zy() {
		image=FishGame.zy1;   //章鱼的图片
		images=new BufferedImage[] {FishGame.zy1,FishGame.zy2,FishGame.zy3,FishGame.zy4,FishGame.zy5,FishGame.zy6,FishGame.zy7,FishGame.zy8,FishGame.zy9,FishGame.zy10,FishGame.zy11,FishGame.zy12,FishGame.zy13,FishGame.zy14,FishGame.zy15,FishGame.zy16};
		width=image.getWidth();   //
		height=image.getHeight();
		x=FishGame.WIDTH;  //章鱼在窗口的最右端出来
		y=(int) (Math.random()*(FishGame.HEIGHT-height));
	}
	
	//章鱼的移动方式
	int index=0;  //控制图片
	int stepIndex=0;
	@Override
	public void step() {
		/*
		 * 定时器10毫秒执行一次 step()方法,相当于50毫秒切换一次图片
		 */
		if (index++%5==0) {
			image=images[stepIndex++%images.length];
		}
		x-=xspeed;
	}
}

Java学习:用面向对象写个简单的“深海大游行”文章源自亦枫博客-https://yflad.cn/2018.html

package cn.yflad.buyudaren;

import java.awt.image.BufferedImage;

/**
 * 飞鱼类
 * @author yflad-F
 */
public class Fy extends Fish{
	int xspeed=2;  //x轴移动的速度
	//图片数组
	BufferedImage[] images;
	//通过无参构造函数对成员进行初始化操作
	public Fy() {
		image=FishGame.fy1;   //飞鱼的图片
		images=new BufferedImage[] {FishGame.fy1,FishGame.fy2,FishGame.fy3,FishGame.fy4,FishGame.fy5,FishGame.fy6,FishGame.fy7,FishGame.fy8,FishGame.fy9,FishGame.fy10,FishGame.fy11,FishGame.fy12,FishGame.fy13,FishGame.fy14,FishGame.fy15,FishGame.fy16,FishGame.fy17};
		width=image.getWidth();   //
		height=image.getHeight();
		x=FishGame.WIDTH;  //飞鱼在窗口的最右端出来
		y=(int) (Math.random()*(FishGame.HEIGHT-height));
	}
	
	//飞鱼的移动方式
	int index=0;  //控制图片
	int stepIndex=0;
	@Override
	public void step() {
		/*
		 * 定时器10毫秒执行一次 step()方法,相当于50毫秒切换一次图片
		 */
		if (index++%5==0) {
			image=images[stepIndex++%images.length];
		}
		x-=xspeed;
	}
}

 文章源自亦枫博客-https://yflad.cn/2018.html

实现代码:

package cn.yflad.buyudaren;

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.security.PublicKey;
import java.util.Arrays;
import java.util.Timer;
import java.util.TimerTask;

import javax.imageio.ImageIO;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class FishGame extends JPanel {
	// 定义窗口的宽高
	public static final int WIDTH = 730;
	public static final int HEIGHT = 445;
	// 定义要加载的图片
	public static BufferedImage bj;
	public static BufferedImage zy1;
	public static BufferedImage zy2;
	public static BufferedImage zy3;
	public static BufferedImage zy4;
	public static BufferedImage zy5;
	public static BufferedImage zy6;
	public static BufferedImage zy7;
	public static BufferedImage zy8;
	public static BufferedImage zy9;
	public static BufferedImage zy10;
	public static BufferedImage zy11;
	public static BufferedImage zy12;
	public static BufferedImage zy13;
	public static BufferedImage zy14;
	public static BufferedImage zy15;
	public static BufferedImage zy16;
	public static BufferedImage fy1;
	public static BufferedImage fy2;
	public static BufferedImage fy3;
	public static BufferedImage fy4;
	public static BufferedImage fy5;
	public static BufferedImage fy6;
	public static BufferedImage fy7;
	public static BufferedImage fy8;
	public static BufferedImage fy9;
	public static BufferedImage fy10;
	public static BufferedImage fy11;
	public static BufferedImage fy12;
	public static BufferedImage fy13;
	public static BufferedImage fy14;
	public static BufferedImage fy15;
	public static BufferedImage fy16;
	public static BufferedImage fy17;

	// 创建一个存储鱼类的数组
	Fish[] fish = {};

	static {
		try {
			bj = ImageIO.read(FishGame.class.getResource("..\\images\\fish\\bg.jpg"));
			zy1 = ImageIO.read(FishGame.class.getResource("..\\images\\fish\\zy\\zy1.png"));
			zy2 = ImageIO.read(FishGame.class.getResource("..\\images\\fish\\zy\\zy2.png"));
			zy3 = ImageIO.read(FishGame.class.getResource("..\\images\\fish\\zy\\zy3.png"));
			zy4 = ImageIO.read(FishGame.class.getResource("..\\images\\fish\\zy\\zy4.png"));
			zy5 = ImageIO.read(FishGame.class.getResource("..\\images\\fish\\zy\\zy5.png"));
			zy6 = ImageIO.read(FishGame.class.getResource("..\\images\\fish\\zy\\zy6.png"));
			zy7 = ImageIO.read(FishGame.class.getResource("..\\images\\fish\\zy\\zy7.png"));
			zy8 = ImageIO.read(FishGame.class.getResource("..\\images\\fish\\zy\\zy8.png"));
			zy9 = ImageIO.read(FishGame.class.getResource("..\\images\\fish\\zy\\zy9.png"));
			zy10 = ImageIO.read(FishGame.class.getResource("..\\images\\fish\\zy\\zy10.png"));
			zy11 = ImageIO.read(FishGame.class.getResource("..\\images\\fish\\zy\\zy11.png"));
			zy12 = ImageIO.read(FishGame.class.getResource("..\\images\\fish\\zy\\zy12.png"));
			zy13 = ImageIO.read(FishGame.class.getResource("..\\images\\fish\\zy\\zy13.png"));
			zy14 = ImageIO.read(FishGame.class.getResource("..\\images\\fish\\zy\\zy14.png"));
			zy15 = ImageIO.read(FishGame.class.getResource("..\\images\\fish\\zy\\zy15.png"));
			zy16 = ImageIO.read(FishGame.class.getResource("..\\images\\fish\\zy\\zy16.png"));
			fy1 = ImageIO.read(FishGame.class.getResource("..\\images\\fish\\fy\\fy1.png"));
			fy2 = ImageIO.read(FishGame.class.getResource("..\\images\\fish\\fy\\fy2.png"));
			fy3 = ImageIO.read(FishGame.class.getResource("..\\images\\fish\\fy\\fy3.png"));
			fy4 = ImageIO.read(FishGame.class.getResource("..\\images\\fish\\fy\\fy4.png"));
			fy5 = ImageIO.read(FishGame.class.getResource("..\\images\\fish\\fy\\fy5.png"));
			fy6 = ImageIO.read(FishGame.class.getResource("..\\images\\fish\\fy\\fy6.png"));
			fy7 = ImageIO.read(FishGame.class.getResource("..\\images\\fish\\fy\\fy7.png"));
			fy8 = ImageIO.read(FishGame.class.getResource("..\\images\\fish\\fy\\fy8.png"));
			fy9 = ImageIO.read(FishGame.class.getResource("..\\images\\fish\\fy\\fy9.png"));
			fy10 = ImageIO.read(FishGame.class.getResource("..\\images\\fish\\fy\\fy10.png"));
			fy11 = ImageIO.read(FishGame.class.getResource("..\\images\\fish\\fy\\fy11.png"));
			fy12 = ImageIO.read(FishGame.class.getResource("..\\images\\fish\\fy\\fy12.png"));
			fy13 = ImageIO.read(FishGame.class.getResource("..\\images\\fish\\fy\\fy13.png"));
			fy14 = ImageIO.read(FishGame.class.getResource("..\\images\\fish\\fy\\fy14.png"));
			fy15 = ImageIO.read(FishGame.class.getResource("..\\images\\fish\\fy\\fy15.png"));
			fy16 = ImageIO.read(FishGame.class.getResource("..\\images\\fish\\fy\\fy16.png"));
			fy17 = ImageIO.read(FishGame.class.getResource("..\\images\\fish\\fy\\fy17.png"));
		} catch (Exception e) {
			System.out.println("图片加载失败!");
		}
	}

	//重写JPanel中的paint()方法
	@Override
	public void paint(Graphics g) {
		// 画背景
		g.drawImage(bj, 0, 0, null);
		// 画鱼
		for (int i = 0; i < fish.length; i++) { // 遍历数组对象
			Fish f = fish[i]; // 获取每一个章鱼对象
			if (f instanceof Zy) { // 判断
				Zy zy = (Zy) f; // 获取每一个章鱼对象
				g.drawImage(zy.image, zy.x, zy.y, null);
			}
			if (f instanceof Fy) {
				Fy fy = (Fy) f; // 获取每一个飞鱼对象
				g.drawImage(fy.image, fy.x, fy.y, null);
			}
		}
	}

	// 创建章鱼,飞鱼对象。比例9:1
	public Fish nextOne() {

		if ((int) (Math.random() * 10) == 0) {
			return new Fy(); // Fy fy=new fy();
		}
		return new Zy(); // Zy zy=new Zy();
	}

	// 创建对象存入数组的方法
	int index = 0;

	public void addAction() {
		// 对数组进行扩容
		if (index++ % 40 == 0) {// 相当于400毫秒创建一个对象
			// 对数组进行扩容
			fish = Arrays.copyOf(fish, fish.length + 1);
			fish[fish.length - 1] = nextOne();
		}
	}

	// 所有鱼类移动的方法
	public void stepAction() {
		// 遍历数组中的每一个鱼类对象
		for (int i = 0; i < fish.length; i++) {
			Fish f = fish[i]; // 获取每一个对象
			if (f instanceof Zy) {
				Zy z = (Zy) f;
				z.step(); // 让每一个章鱼对象动起来
			}
			if (f instanceof Fy) {
				Fy fy = (Fy) f;
				fy.step(); // 让每一个飞鱼对象动起来
			}
		}
	}

	// 用定时器让鱼类移动
	Timer timer = new Timer();
	public void action() {
		timer.schedule(new TimerTask() {
			@Override
			public void run() {
				addAction();// 调用 将鱼类对象放入敌机数组 的方法
				stepAction();// 调用 移动 方法
				repaint(); // 刷新界面
			}
		}, 0, 10);
	}

	public static void main(String[] args) {
		JFrame frame = new JFrame("深海大游行");
		FishGame game = new FishGame();
		frame.add(game); // 相当于在画板中添加画笔
		frame.setSize(WIDTH, HEIGHT);// 设置窗口的大小
		frame.setVisible(true);// 窗口显示
		frame.setLocationRelativeTo(null);// 窗口居中
		frame.setAlwaysOnTop(true);// 窗口置顶
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 设置窗口关闭按钮
		game.action();
	}
}

 文章源自亦枫博客-https://yflad.cn/2018.html

下载信息 素材 3.53 MB
最近更新2019-5-11
下载地址
文章源自亦枫博客-https://yflad.cn/2018.html文章源自亦枫博客-https://yflad.cn/2018.html
继续阅读
扫扫关注公众号
weinxin
我的微信
扫扫体验小程序
weinxin
我的公众号
亦枫
  • 本文由 发表于 2018年12月11日 18:32:19
评论  0  访客  0
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定