图片验证码 -- 拓薪教育
第一章:吃热狗游戏
游戏效果
1.封装热狗类
package cn.tx.main;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.List;
import java.util.Random;
/**
* 作者:樱木老师
* 热狗
*/
public class HotDog {
// 出生位置x
private int x;
// 出生位置 y
private int y;
// 热狗的图片
private BufferedImage image;
// 随机数
private Random random = new Random();
// 存储热狗的list集合
private List<HotDog> list;
/**
* 热狗随机出现的位置
*/
public HotDog(List<HotDog> list){
try {
// 加载图片
image = ImageIO.read(HotDog.class.getResource("/666.png"));
this.list = list;
// 默认从顶部出现
y = 0;
// x横座标随机出现
x = random.nextInt(400);
// 把热狗存入到list集合中
this.list.add(this);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 热狗移动的方法
*/
public void move(){
// 纵座标向下移动
y += 10;
// 判断y座标值是否大于最大高度,如果大于,从list集合中移除当前热狗对象
if(y >= 600){
this.list.remove(this);
}
}
/**
* 吃热狗碰撞,消除数据
* 返回消除的数量
* @param wsc
*/
public int clear(Wsc wsc){
// 开始判断
// 获取到热狗的横座标
// 获取到热狗的左边顶点横座标
int dogx2 = x;
// 获取到热狗的右边横座标
int dogx3 = dogx2+66;
// 获取到热狗的纵座标
int dogy = y;
// 获取到热狗图片的纵座标加上热狗的长度
int dogy2 = dogy+102;
// 获取到王思聪的嘴
int wscx = wsc.getX();
int wscx2 = wscx+30;
int wscx3 = wscx + 80;
int wscy = wsc.getY();
// 进行消除
// int flagx2 = wscx2 - dogx2;
int flagx2 = dogx2 - wscx2;
// int flagx3 = wscx3 - dogx3;
int flagx3 = dogx3 - wscx3;
// int flagy = wscy - dogy2;
int flagy = dogy2 - wscy;
if(flagx2 > -20 && flagx3 < 20 && flagy > 20 && flagy < 40){
boolean remove = this.list.remove(this);
if(remove){
return 1;
}
}
return 0;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public BufferedImage getImage() {
return image;
}
public void setImage(BufferedImage image) {
this.image = image;
}
}
2. 封装思聪类
package cn.tx.main;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.IOException;
/**
* 作者:樱木老师
* 思聪
*/
public class Wsc{
// 图片的横纵座标
private int x;
private int y;
// 图片
private BufferedImage image;
public Wsc() {
try {
// 默认的显示位置
x = 180;
y = 500;
image = ImageIO.read(Wsc.class.getResource("/555.png"));
} catch (IOException e) {
e.printStackTrace();
}
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public BufferedImage getImage() {
return image;
}
public void setImage(BufferedImage image) {
this.image = image;
}
}
编程主程序
package cn.tx.main;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;
import java.util.List;
import java.util.TimerTask;
/**
* 拓薪教育 -- 腾讯课程认证机构
* 樱木老师
*/
public class DogGame extends JPanel implements Runnable,MouseMotionListener {
// 构建思聪对象
private Wsc wsc = new Wsc();
// 存储热狗的list集合
private List<HotDog> list = new ArrayList<>();
// 总计分数使用
int sum = 0;
// 通过构造方法的方式添加背景图片
public DogGame(){
// 设置背景图片
Icon icon = new ImageIcon(DogGame.class.getResource("/111.png"));
JLabel label = new JLabel(icon);
// 添加
this.add(label);
}
/**
* 采用定时器的方式,创建很多的热狗对象,存入到list集合中
* 自己回去练代码
* 使用Java的定时器的API,定时器每隔1秒钟执行一次方法
*/
public void createHotDogs() {
// 读取雪花的图片
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
// 创建热狗对象
HotDog dog = new HotDog(list);
}
};
// 定时器
java.util.Timer timer = new java.util.Timer();
// 开启定时任务
timer.schedule(timerTask,0,1000);
}
/**
* 重写面板的绘图方法
* @param g
*/
@Override
public void paint(Graphics g) {
super.paint(g);
// 画王思聪
g.drawImage(wsc.getImage(),wsc.getX(),wsc.getY(),null);
// 画热狗
for (int i = 0; i < list.size(); i++) {
HotDog hotDog = list.get(i);
// 让热狗移动
hotDog.move();
// 消除热狗
int n = hotDog.clear(wsc);
// 计算分数
sum += n;
// 画热狗
g.drawImage(hotDog.getImage(),hotDog.getX(),hotDog.getY(),null);
}
g.setColor(Color.PINK);
g.setFont(new Font("隶书",Font.BOLD,20));
// 画数字
g.drawString("您吃了"+sum+"个热狗",20,30);
// 添加效果
if(sum >= 5){
g.drawString("牛逼,真香!",200,30);
}
}
/**
* 线程run方法
*/
@Override
public void run() {
// 死循环
while(true){
// 重绘
this.repaint();
try {
// 睡眠操作
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@Override
public void mouseDragged(MouseEvent e) {
}
@Override
public void mouseMoved(MouseEvent e) {
// 获取到移动的座标
int x = e.getX();
// 给思聪设置座标
wsc.setX(x);
}
/**
* 主函数,运行主函数开始游戏
* @param args
*/
public static void main(String[] args) {
// 创建窗口
JFrame frame = new JFrame("吃热狗游戏");
// 设置宽高
frame.setSize(500,650);
// 居中显示
frame.setLocationRelativeTo(null);
// 设置关闭
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 创建游戏主类
DogGame dogGame = new DogGame();
// 添加到窗口中
frame.add(dogGame);
// 创建多个热狗
dogGame.createHotDogs();
// 画思聪上去,调用重绘的方法
dogGame.repaint();
// 启动线程,定时刷新
new Thread(dogGame).start();
// 绑定鼠标监听事件
dogGame.addMouseMotionListener(dogGame);
// 显示窗口
frame.setVisible(true);
}
}
根据本人多年从业以及学习经验,录制了一套最新的Java精讲视频教程,如果你现在也在学习Java,在入门学习Java的过程当中缺乏系统的学习教程,你可以加我的微信renlliang2013学习交流,获取学习资料,面试题,开发工具等。