Java【swing】-捕鱼达人项目(2)

在游戏中完成一条静止不动的鱼

方法一:

画一条静止不动的鱼 --不考虑面向对象
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

效果图:

在这里插入图片描述

方法二:

画一条静止不动的鱼 --考虑面向对象

如何实现一条静止不动的鱼?

  • step1:新建一个类为Fish,表示鱼对象
  • step2:在Fish类的特征处,定义鱼的种类,大小和位置
  • step3:在Fish类中添加构造方法,在构造方法中完成对种类、大小和位置的赋值
  • step4:在Pool的特征处,定义了一条鱼 Fish f;
  • step5:在Pool的构造方法中,创建一条鱼,给f赋值
  f=new Fish();
  • step6:在Pool类的行为处,在paint方法中,使用画笔g将鱼f画在了池塘中

代码部分:

Fish.java --鱼对象

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
/**
 * 鱼对象
 * @author Katrina
 */
public class Fish {
	
	//特征  -- 属性
	//1、鱼的种类  --不同的鱼的图片
	BufferedImage type;
	//2、鱼的大小
	int width;
	int height;
	//3、鱼的位置
	int x;
	int y;
	
	/*
	 * 构造方法  --对特征第一次赋值(初始化)
	 */
	public Fish() throws IOException{
		type = ImageIO.read(new File("images/fish07_00.png"));
		//获取图片的原始大小(宽度,高度) --动态获取【相比直接写数值】
		width = type.getWidth();
		height = type.getHeight();
		//说明:临时给x和y赋值,不超出池塘的范围就可以,后期等鱼移动以后,改成随机数实现
		x = 400;
		y = 300;
	}
	
	//行为   -- 方法
	
}

Pool.java --池塘对象

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
/**
 * 池塘对象
 * - 让Pool类继承JPanel,JPanel看成是一个带画笔的画板,让Pool类继承之后,就可以在Pool类绘画了
 * @author Katrina
 */
public class Pool extends JPanel {
	
	//特征 --属性
	//1、池塘的环境(水、水草、岩石) --一张背景图片
	//int表示整数类型、double表示小数类型 ;BufferedImage是Java提供的一个类,主要用于表示图片的类型
	BufferedImage bg;
	//2、多条鱼
	//一条鱼  --不考虑面向对象  --鱼就是图片
//	BufferedImage wugui;
	//一条鱼  --考虑面向对象  --类 --Class --Fish
	Fish f;
	//3、渔网
	//4、大炮
	//5、子弹
	
	/**
	 * 构造方法 --构造器
	 * 功能:对特征进行赋值
	 * 语法:以public开始,构造方法的方法名和类名一致,构造方法没有返回值,连void也没有
	 * 执行时机:当创建池塘对象new Pool(),底层自动调用该构造方法
	 * @throws IOException
	 */
	public Pool() throws IOException {
		//从images文件夹中读取bg.jpg图片,然后对特征bg的赋值
		bg = ImageIO.read(new File("images/bg.jpg"));
		//从images文件夹中读取乌龟的图片,然后给wugui赋值
//		wugui = ImageIO.read(new File("images/fish08_00.png"));
		//创建一条鱼,然后给特征f赋值
		f = new Fish();
	}
	
	/**
	 * 行为 --方法(普通方法)
	 * 调出paint方法   -- 绘画的行为     Alt+/
	 */
	public void paint(Graphics g) {
		//使用画笔g将特征bg画在池塘中
		//参数1:所画的哪张图片  
		//参数2和3:所画图片左上角的坐标(x和y)
		//参数4和5:所画图片的大小(宽度和高度)  
		//参数6:无意义null值
		g.drawImage(bg, 0, 0, 1000, 700, null);
		//使用画笔g将wugui画在池塘中
//		g.drawImage(wugui, 500, 300, 99, 103, null);
		//使用画笔g将鱼f画在池塘中 
		//f.type:表示鱼的种类
		//f.x和f.y:表示鱼的位置
		//f.width和f.height:表示鱼的大小
		g.drawImage(f.type, f.x, f.y, f.width, f.height, null);
	}
	
}

Start.java --启动捕鱼达人主类

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;
/**
 * 启动捕鱼达人游戏的主类
 * @author Katrina
 */
public class Start {
	
	//main方法 -- 主方法
	public static void main(String[] args) throws IOException {
		//创建捕鱼达人游戏界面的窗体  JFrame
		JFrame w = new JFrame();
		
		//创建池塘对象 -newPool,在把创建的池塘添加到窗体中
		Pool pl = new Pool();
		w.add(pl);
		
		//创建面板 --小板子
//		JPanel p = new JPanel();
		//创建标签JLabel --显示文字 
//		JLabel label = new JLabel("Hello World!");
		//创建标签JLabel --显示图片,图片放到图标(ImageIcon)上
//		JLabel label1 = new JLabel(new ImageIcon("images/bg.jpg"));
		
//		p.add(label); //将带有文字的标签放到面板中
//		p.add(label1); //将带有图片的标签放到面板中
//		w.add(p); //将面板放到窗体中
		
		w.setVisible(true); //设置窗体可见【true可见;false不可见(默认)】
		w.setSize(1000, 700); //设置窗体的大小 (宽度,高度)
		w.setLocation(400, 100); //设置窗体的位置(距离左边的长度,距离顶部的长度)
		w.setTitle("我的捕鱼达人"); //设置窗体的标题
		w.setResizable(false); //设置窗体的大小不可改变【true可以改变(默认);false不可以改变】
		w.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设置关闭窗体的运行后台
		//使用ImageIO类中的read方法读取图片,图片的读取要以File文件的方式读
		w.setIconImage(ImageIO.read(new File("images/5.png"))); //设置窗体的图标
	}
	
}
效果图:

在这里插入图片描述

练习:

雪花飘落的程序:在天空中画出一个雪花
com.bzxy.snow包

  • Snow.java --雪花对象
  • Sky.java --天空对象
  • Start.java --启动雪花飘落程序的主类
    要求:不准复制代码

代码部分:

Sky.java
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JPanel;

/**
 * 天空对象
 * @author Katrina
 */
public class Sky extends JPanel { // 先继承,继承之后可以在Sky类绘画

	//特征 --属性
	//1、蓝天白云 --背景图片
	BufferedImage bg;
	//2、多个雪花
	//一个雪花 --对象
	Snow s;

	/**
	 * 构造方法 --对特征赋值
	 * @throws IOException
	 */
	public Sky() throws IOException {
		bg = ImageIO.read(new File("images/sky.jpg"));
		//创建一个雪花,对s进行赋值
		s = new Snow();
	}

	/**
	 * 行为 --方法 
	 * paint方法 --绘画的行为
	 */
	public void paint(Graphics g) {
		//使用画笔g将背景bg画在天空中
		g.drawImage(bg, 0, 0, 1000, 700, null);
		//使用画笔g将雪花s画在天空中
		g.drawImage(s.img, s.x, s.y, s.width, s.height, null);
	}

}
Snow.java
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
/**
 * 雪花对象
 * @author Katrina
 */
public class Snow {
	
	//特征  --属性
	//1、雪花的图片
	BufferedImage img;
	//2、雪花的大小
	int width;
	int height;
	//3、雪花的位置
	int x;
	int y;
	
	/**
	 * 构造方法  --对特征赋值
	 * @throws IOException
	 */
	public Snow() throws IOException {
		img = ImageIO.read(new File("images/snow.png"));
		width = img.getWidth();
		height = img.getHeight();
		x = 400;
		y = 200;
	}
	
	//行为  --方法
	
}
Start.java
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
/**
 * 启动雪花飘落程序的主类
 * @author Katrina
 */
public class Start {
	
	public static void main(String[] args) throws IOException {
		//创建雪花飘落程序的界面  --JFrame
		JFrame w = new JFrame();
	
		//创建天空对象,并添加到窗体中
		Sky s = new Sky();
		w.add(s);
		
		//设置窗体的相关属性(可见、大小、位置、关闭后台...)
		w.setVisible(true);
		w.setSize(1000, 700);
		w.setLocation(400, 100);
		w.setTitle("下雪啦");
		w.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		w.setResizable(false);
		w.setIconImage(ImageIO.read(new File("images/sky.jpg")));
	}
	
}
效果图:

在这里插入图片描述

多线程

概念:

  • a 程序:能安装在电脑上的都叫程序(微信 qq 钉钉…)
  • b 进程:运行中的程序,会在计算机内存中多出进程
  • c 多线程:在进程的内部,出现的一种并发执行的现象叫做多线程

如何使用多线程?【Thread类、Runnable接口】

  • ① 让一个类去继承Thread
  • ② 在该类中调出run方法,在run方法中实现多线程要做的事请
  • ③ 创建该类,然后调用start方法启动多线程

顺序执行(从上往下依次执行) --不使用多线程
并发执行(各自执行互补干扰) --使用多线程

举例:

同学A,1000问:你是谁啊
同学B,1000答:我是B同学

代码部分:

FirstThread.java
/**
 * 第一个线程类 --执行1000遍问:你是谁啊
 * @author Katrina
 */
public class FirstThread extends Thread {
	
	/**
	 * 调出run方法 --在run方法中实现多线程要做的事情
	 */
	public void run() {
		for (int i = 1; i <= 1000; i++) {
			System.out.println("你是谁啊" + i);
		}
	}

}
SecondThread.java
/**
 * 第二个线程类 --执行1000遍答:我是B同学
 * @author Katrina
 */
public class SecondThread extends Thread {
	
	/**
	 * 调出run方法 --实现多线程要做的事情
	 */
	public void run() {
		for (int i = 1; i <= 1000; i++) {
			System.out.println("我是B同学啊" + i);
		}
	}

}
Test.java
/**
 * 演示多线程的使用语法
 * @author Katrina
 */
public class Test {

	public static void main(String[] args) {
		//顺序执行 -- 从上往下,依次执行
//		for (int i = 1; i <= 1000; i++) {
//			System.out.println("你是谁啊" + i);
//		}
//		for (int i = 1; i <= 1000; i++) {
//			System.out.println("我是B同学" + i);
//		}
		//并发执行 --各自执行,互补干扰
		//创建第一个线程类,然后调用start方法启动线程
		FirstThread first = new FirstThread();
		first.start(); //start()方法底层会执行run()方法
		//创建第二个线程类,然后调用start方法启动线程
		SecondThread second = new SecondThread();
		second.start();
	}

}
效果图:

在这里插入图片描述

并发执行理解:

并发执行并不是真正意义上的同时执行,同时执行只能在现实中做到,在计算机中,只能做到并发执行,是计算机中CPU分配时间片给不同的线程,获得时间片的线程执行,其它线程等待,而且CPU分配时间片是不可控制的,还有CPU分配时间片的速度非常快,快到已经无法识别线程有停止现象,CPU的快可以认为是又做到了同时执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值