圖片驗證碼 -- 拓薪教育
第一章:吃熱狗遊戲
遊戲效果
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學習交流,獲取學習資料,面試題,開發工具等。