Java-飛翔的小鳥

前言

基于Java的飛翔小鳥游戲,本代碼來自b站up主分享。本游戲所需的圖片素材需要自己獲取并下載,在此視頻下,視頻鏈接:【Java經典小游戲項目之飛翔的小鳥】 https://www.bilibili.com/video/BV1ou411o7br/?p=10&share_source=copy_web&vd_source=4611ec45767280678018f593c547e388



啟動入口

package com.bird.app;
import com.bird.main.GameFrame;public class GameApp {public static void main(String[] args) {new GameFrame();}
}



主類


游戲主窗口類

package com.bird.main;import static com.bird.util.Constant.*;import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;/*** 游戲的主窗口類,所有的關于游戲中繪制的內容都在此類中完成。*/
public class GameFrame extends Frame {//實例化gamebackGround類private GameBackGround gameBackGround;//實例化Bird類private Bird bird;//實例化GameBarrierLayer類private GameBarrierLayer gameBarrierLayer;//實例化GameFrontGround類private GameFrontGround gameFrontGround;//存放圖片的圖片private BufferedImage buffimg = new BufferedImage(FRAM_WIDTH,FRAM_HEIGNT,BufferedImage.TYPE_4BYTE_ABGR);//構造方法中初始化一些參數public GameFrame(){//窗口是否可見setVisible(true);//窗口的大小setSize(FRAM_WIDTH,FRAM_HEIGNT);//窗口的標題setTitle(FRAM_TITLE);//窗口的初始化位置setLocation(FRAM_X,FRAM_Y);//窗口的大小不可改變setResizable(false);//窗口的關閉事件addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);//結束程序}});//初始化游戲對象initGamg();new run().start();//添加按鍵監聽addKeyListener(new KeyAdapter() {@Overridepublic void keyPressed(KeyEvent e) {add(e);}@Overridepublic void keyReleased(KeyEvent e) {minu(e);}});}//對游戲中的對象初始化public void initGamg(){gameBackGround = new GameBackGround();bird = new Bird();gameFrontGround = new GameFrontGround();gameBarrierLayer = new GameBarrierLayer();}class run extends Thread{@Overridepublic void run() {while (true) {repaint();try {Thread.sleep(33);} catch (InterruptedException e) {e.printStackTrace();}}}}/*** 所有的我們需要繪制的內容都在此方法中進行調用繪制*/@Overridepublic void update(Graphics g) {if(bird.life){//得到圖片的畫筆Graphics graphics = buffimg.getGraphics();gameBackGround.draw(graphics);bird.draw(graphics);gameFrontGround.draw(graphics);gameBarrierLayer.draw(graphics,bird);//一次性的將圖片繪制到屏幕中g.drawImage(buffimg,0,0,null);}else {String over = "游戲結束";g.setColor(Color.red);g.setFont(new Font("微軟雅黑",1,60));g.drawString(over,180,250);String reset = "Space Reset Game";g.drawString(reset,25,350);}}//按鍵public void add(KeyEvent e){switch (e.getKeyCode()){case KeyEvent.VK_UP:bird.fly(1);break;case KeyEvent.VK_SPACE:if (bird.life == false) {restart();}break;}}//抬鍵public void minu(KeyEvent e){switch (e.getKeyCode()){case KeyEvent.VK_UP:bird.fly(5);break;}}/*** 重置游戲*/public void restart(){gameBarrierLayer.restant();bird.restartDraw();}}



游戲前景類

package com.bird.main;import com.bird.util.Constant;
import com.bird.util.GameUtil;import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;/*** 游戲的前景類*/
public class GameFrontGround {//云彩的個數private static final int CLOUND_COUNT = 2;//存放云彩的容器private List<Cloud> clouds;//云彩的飛行速度private static final int CLOUNG_SPEED = 1;//使用到圖片資源private BufferedImage[] img;//用于產生隨機數private Random random;// 構造器初始化數據public GameFrontGround() {clouds = new ArrayList<>();img = new BufferedImage[CLOUND_COUNT];//容器中添加云彩的圖片for (int i = 0; i < CLOUND_COUNT; i++) {img[i] = GameUtil.loadBufferedImage("img/cloud" + i + ".png");}random = new Random();}//繪制云彩public void draw(Graphics g) {logic();for (int i = 0; i < clouds.size(); i++) {clouds.get(i).draw(g);}}/*** 用于云彩的個數控制*/private void logic() {if ((int) (500 * Math.random()) < 5) {Cloud cloud = new Cloud(img[random.nextInt(CLOUND_COUNT)], CLOUNG_SPEED, 600, random.nextInt(150));clouds.add(cloud);}for (int i = 0; i < clouds.size(); i++) {Cloud cloud = clouds.get(i);if (cloud.isOutFrame()){clouds.remove(i);i--;System.out.println("移除了"+cloud);}}}
}



障礙物類

package com.bird.main;import com.bird.util.Constant;import java.awt.*;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;/*** 游戲中障礙物層*/
public class GameBarrierLayer {private GameTime gameTime;private int txt;private Random random = new Random();private List<Barrier> barriers;public GameBarrierLayer() {barriers = new ArrayList<>();gameTime = new GameTime();}//繪制障礙物public void draw(Graphics g, Bird bird) {for (int i = 0; i < barriers.size(); i++) {Barrier barrier = barriers.get(i);if (barrier.isVisible()) {barrier.draw(g);} else {Barrier remove = barriers.remove(i);Barrierpool.setPool(remove);i--;}}collideBird(bird);logic(g);}public void logic(Graphics g) {if (barriers.size() == 0) {ran();gameTime.begin();insert(600, 0, numberTop, 0);insert(600, 500 - numberDown, numberDown, 2);} else {long differ = gameTime.differ();g.setColor(Color.white);g.setFont(new Font("微軟雅黑", 1, 20));g.drawString("堅持了:" + differ + "秒", 30, 50);//顯示最高成績/*txt = getTxt();if (differ <= txt){g.drawString("最高成績:" + txt , 200, 50);}else {setTxt(String.valueOf(differ));g.drawString("最高成績:" + getTxt() , 200, 50);}*///判斷最后一個障礙物是否完全進入屏幕內Barrier last = barriers.get(barriers.size() - 1);if (last.isInFrame()) {ran();if (number < 50){insert(600,32,440,4);}else if (number>450){insert(600,125,200,6);}else {insert(600, 0, numberTop, 0);insert(600, 500 - numberDown, numberDown, 2);}}}}//用于儲存游戲數據File file = new File("game.txt");/*** 從文件獲取數據* @return*/public int getTxt()   {BufferedReader in = null;try {in = new BufferedReader(new FileReader(file));} catch (FileNotFoundException e) {e.printStackTrace();}int read = 0;try {read = Integer.parseInt(in.readLine());} catch (IOException e) {e.printStackTrace();}try {in.close();} catch (IOException e) {e.printStackTrace();}return read;}/*** 寫入數據到文件* @param str*/public void setTxt(String str)   {FileWriter out = null;try {out = new FileWriter(file);} catch (IOException e) {e.printStackTrace();}try {out.write(str);} catch (IOException e) {e.printStackTrace();}try {out.close();} catch (IOException e) {e.printStackTrace();}}/*** 用于從池中獲取對象,并吧參數封裝成barrier 存入barriers數組中*/public void insert(int x, int y, int num, int type) {Barrier top = Barrierpool.getPool();top.setX(x);top.setY(y);top.setHeight(num);top.setType(type);top.setVisible(true);barriers.add(top);}//上方障礙物高度private int numberTop;//下方障礙物高度private int numberDown;private int number;//產生兩個100-500之間的隨機高度public void ran() {numberTop = random.nextInt(400) + 100;numberDown = random.nextInt(400) + 100;number = random.nextInt(500);//如果管道重合,則重新隨機if (numberTop + numberDown > 450) {ran();}}/*** 判斷障礙物和小鳥發生碰撞*/public boolean collideBird(Bird bird) {for (int i = 0; i < barriers.size(); i++) {Barrier barrier = barriers.get(i);//判斷矩形是否相交if (barrier.getRect().intersects(bird.getRect())) {System.out.println("裝上啦");bird.life = false;}}return false;}/*** 用于清空障礙物的池子*/public void restant(){barriers.clear();}}



游戲背景類

package com.bird.main;import static com.bird.util.Constant.*;import com.bird.util.Constant;
import com.bird.util.GameUtil;import java.awt.*;
import java.awt.image.BufferedImage;/*** 游戲背景類*/
public class GameBackGround {//背景需要的資源圖片private BufferedImage bkimg;//構造器初始化資源public GameBackGround(){bkimg = GameUtil.loadBufferedImage(Constant.BK_IMG_OATH);}//繪制圖片public void draw(Graphics g){//填充背景色g.setColor(BK_COLOR);g.fillRect(0,0,FRAM_WIDTH,FRAM_HEIGNT);g.setColor(Color.black);//得到圖片的高度和寬度int height = bkimg.getHeight();int weight = bkimg.getWidth();//循環的次數int count = Constant.FRAM_WIDTH/weight+1;for (int i = 0; i < count; i++) {g.drawImage(bkimg,weight*i,Constant.FRAM_HEIGNT-height,null);}}
}



游戲計時器類

package com.bird.main;/*** 游戲計時器*/
public class GameTime {//開始private long beginTime;//結束private long endTime;//時間差private long differ;public GameTime(){}public void  begin(){beginTime = System.currentTimeMillis();}public long differ(){endTime = System.currentTimeMillis();return differ=(endTime-beginTime)/1000;}}



云彩類

package com.bird.main;import java.awt.*;
import java.awt.image.BufferedImage;/*** 云彩類*/
public class Cloud {//云彩圖片private BufferedImage img;//云彩速度private  int speed;//云彩的位置private  int x,y;public Cloud(){}public Cloud(BufferedImage img, int speed, int x, int y) {this.img = img;this.speed = speed;this.x = x;this.y = y;}public void draw(Graphics g){x-=speed;g.drawImage(img,x,y,null);}/*** 用于判斷云彩是否飛出屏幕以外*/public boolean isOutFrame(){if (x < -100) {return true;}return false;}}



小鳥類

package com.bird.main;import static com.bird.util.Constant.*;
import com.bird.util.GameUtil;
import java.awt.*;
import java.awt.image.BufferedImage;/*** 小鳥類*/
public class Bird {//小鳥矩形對象private Rectangle rect;//小鳥加速度private int acceleration;//小鳥的生命public boolean life = true;//存放小鳥圖片private BufferedImage[] images;public static final int BIRD_IMG_COUNT = 3;//鳥的狀態private int state;public static final int STATE_NORMAR = 0;//平著飛public static final int STATE_UP = 1;//向上飛public static final int STATE_DOWN = 2;//向下飛//小鳥的位置private int x=200,y=200;//小鳥移動方向 上下private boolean up=false,down=false;//小鳥移動速度private int speed=4;//構造方法中對資源初始化public Bird() {images = new BufferedImage[BIRD_IMG_COUNT];for (int i = 0; i < BIRD_IMG_COUNT; i++) {images[i] = GameUtil.loadBufferedImage(BIRD_IMG[i]);}int w = images[0].getWidth();int h = images[0].getHeight();rect = new Rectangle(w,h);}//繪制小鳥public void draw(Graphics g) {flyLogic();g.drawImage(images[state], x, y, null);//繪制小鳥的矩形
//        g.drawRect(x,y,(int)rect.getWidth(), rect.height);rect.x=this.x;rect.y=this.y;}//控制小鳥移動方向public void flyLogic(){if (up){acceleration--;y+=acceleration;if (acceleration < -10) {acceleration=-10;}if (y<20){y=20;acceleration=0;}}if (!up){acceleration++;y+=acceleration;if (acceleration > 10) {acceleration=10;}if (y>475){y=475;acceleration=0;}}}public void fly(int fly){switch (fly){case 1:state=1;up=true;break;case 5:state=2;up=false;break;}}public Rectangle getRect() {return rect;}/*** 重新繪制小鳥的位置*/
public void  restartDraw(){life=true;x=200;y=200;
}}



障礙物對象池類

package com.bird.main;import java.util.ArrayList;
import java.util.List;/*** 為了避免反復的創建和銷毀對象,使用對象池來提前創建好一些對象。* 使用的時候從池中獲得,使用完畢后,歸還*/
public class Barrierpool {//用于管理池中所有對象的容器private static List<Barrier> pool = new ArrayList<>();//池中初始的對象個數public static final int initCount = 16;//對象池中最大個數public static final int maxCOunt = 20;static {//初始化池中的對象for (int i = 0; i < initCount; i++) {pool.add(new Barrier());}}/*** 從池中獲取一個對象*/public static Barrier getPool(){int size = pool.size();//如果池中有對象才可以拿if (size > 0) {//移除并返回對象System.out.println("拿走一個");return pool.remove(size-1);}else {//池中沒有對象了 只能newSystem.out.println("新的對象");return new Barrier();}}/*** 將對象歸還容器中*/public static void setPool(Barrier barrier){if (pool.size() < maxCOunt) {pool.add(barrier);System.out.println("容器歸還了");}}}



障礙物類

package com.bird.main;import com.bird.util.Constant;
import com.bird.util.GameUtil;import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.Random;/*** 障礙物類*/
public class Barrier {//矩形參數private Rectangle rect;private boolean mob = true;//障礙物移動速度private int speed = 3;//障礙物需要的三個圖片private static BufferedImage[] imgs;//障礙物的狀態private boolean visible;static {final int COUNT = 3;//類加載的時候將三個圖片初始化imgs = new BufferedImage[COUNT];for (int i = 0; i < COUNT; i++) {imgs[i] = GameUtil.loadBufferedImage(Constant.BARRIER_IMG_PATH[i]);}}//位置private int x, y;//寬度和高度private int width, height;//障礙物的類型private int type;public static final int TYPE_TOP_NORMAL = 0;public static final int TYPE_BOTTOM_NORMAL = 2;public static final int TYPE_HOVER_NORMAL = 4;public static final int TYPE_MOBILE = 6;//獲得障礙物的寬度和高度public static final int BARRIRE_WIDTH = imgs[0].getWidth();public static final int BARRIRE_HEIGHT = imgs[0].getHeight();public static final int BARRIRE_HEAD_WIDTH = imgs[1].getWidth();public static final int BARRIRE_HEAD_HEIGHT = imgs[1].getHeight();public Barrier() {rect = new Rectangle();}public Barrier(int x, int y, int height, int type) {this.x = x;this.y = y;this.height = height;this.type = type;this.width = BARRIRE_WIDTH;}//根據不同的類型繪制障礙物public void draw(Graphics g) {switch (type) {case TYPE_TOP_NORMAL:drawTopMormal(g);break;case TYPE_BOTTOM_NORMAL:drawNomalTop(g);break;case TYPE_HOVER_NORMAL:drawHoverNormal(g);break;case TYPE_MOBILE:drawMobile(g);break;}}//繪制從上向下的障礙物private void drawTopMormal(Graphics g) {//求出所需要的障礙物的塊數int count = (height - BARRIRE_HEAD_HEIGHT) / BARRIRE_HEIGHT + 1;//for循壞繪制障礙物for (int i = 0; i < count; i++) {g.drawImage(imgs[0], x, y + i * BARRIRE_HEIGHT, null);}//繪制頭int y = height - BARRIRE_HEAD_HEIGHT;g.drawImage(imgs[2], x - (BARRIRE_HEAD_WIDTH - BARRIRE_WIDTH) / 2, y, null);x -= speed;if (x < 50) {visible = false;}rect(g);}//繪制從下向上的障礙物private void drawNomalTop(Graphics g) {//求出所需要的障礙物的塊數int count = height / BARRIRE_HEIGHT + 1;//for循環繪制障礙物for (int i = 0; i < count; i++) {g.drawImage(imgs[0], x, Constant.FRAM_HEIGNT - i * BARRIRE_HEIGHT, null);}//繪制頭int y = Constant.FRAM_HEIGNT - height;g.drawImage(imgs[1], x - (BARRIRE_HEAD_WIDTH - BARRIRE_WIDTH) / 2, y, null);x -= speed;if (x < -50) {visible = false;}rect(g);}//繪制中間的障礙物private void drawHoverNormal(Graphics g) {//求出所需要的障礙物的塊數int count = (height-BARRIRE_HEAD_HEIGHT)/BARRIRE_HEIGHT;//繪制上頭g.drawImage(imgs[1],x,y,null);//for循環繪制障礙物for (int i = 0; i < count; i++) {g.drawImage(imgs[0], x, y+BARRIRE_HEAD_HEIGHT+i*BARRIRE_HEIGHT, null);}rect(g);//繪制下頭int y11 = y+height-BARRIRE_HEAD_HEIGHT;g.drawImage(imgs[2],x,y11,null);x -= speed;if (x < -50) {visible = false;}}//繪制移動的障礙物private void drawMobile(Graphics g) {//求出所需要的障礙物的塊數int count = (height-BARRIRE_HEAD_HEIGHT)/BARRIRE_HEIGHT;//繪制上頭g.drawImage(imgs[1],x,y,null);//for循環繪制障礙物for (int i = 0; i < count; i++) {g.drawImage(imgs[0], x, y+BARRIRE_HEAD_HEIGHT+i*BARRIRE_HEIGHT, null);}rect(g);//繪制下頭int y11 = y+height-BARRIRE_HEAD_HEIGHT;g.drawImage(imgs[2],x,y11,null);x -= speed;if (x < -50) {visible = false;}if (mob) {y+=5;if (y >= 250) {mob=false;}}else if (!mob){y-=5;if (y <= 100) {mob=true;}}}/*** 繪制障礙物碰撞矩形** @return*/public void rect(Graphics g) {int x1 = this.x;int y1 = this.y;int w1 = imgs[0].getWidth();
//        g.setColor(Color.blue);
//        g.drawRect(x1, y1, w1, height);setRecyangle(x1, y1, w1, height);}/*** 障礙物的碰撞矩形參數** @return*/public void setRecyangle(int x, int y, int width, int height) {rect.x = x;rect.y = y;rect.width = width;rect.height = height;}//判斷什么時候繪制下一組障礙物public boolean isInFrame() {return 600 - x > 150;}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 int getHeight() {return height;}public void setHeight(int height) {this.height = height;}public int getType() {return type;}public void setType(int type) {this.type = type;}public boolean isVisible() {return visible;}public void setVisible(boolean visible) {this.visible = visible;}public Rectangle getRect() {return rect;}
}



工具類



常量值類

package com.bird.util;import java.awt.*;/*** @author* @create*/
public class Constant {//窗口的大小public static final int FRAM_WIDTH= 600;public static final int FRAM_HEIGNT= 500;//窗口標題public static final String FRAM_TITLE= "飛翔的小鳥";//窗口的初始化位置public static final int FRAM_X= 200;public static final int FRAM_Y= 200;//背景圖片public static final String BK_IMG_OATH = "img/bird_bk.png";//背景色public static final Color BK_COLOR = new Color(0x4BC4CF);//小鳥圖片資源public static final String[] BIRD_IMG={"img/bird_normal.png","img/bird_up.png","img/bird_down.png"};//    障礙物圖片資源public static final String[] BARRIER_IMG_PATH ={"img/barrier.png","img/barrier_up.png","img/barrier_down.png"};
}



游戲工具類

package com.bird.util;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.FileInputStream;
import java.io.IOException;/*** 游戲工具類*/
public class GameUtil {/***該方法傳入一個圖片路徑 讀取圖片*/public static BufferedImage loadBufferedImage(String imgPath){try {return ImageIO.read(new FileInputStream(imgPath));} catch (IOException e) {e.printStackTrace();}return null;}
}

End

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/164500.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/164500.shtml
英文地址,請注明出處:http://en.pswp.cn/news/164500.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C#編程題分享(4)

換行輸出整數問題 輸?任意?個位數未知的整數&#xff0c;輸出這個數每?位上的數字。輸出的時候&#xff0c;從個位開始輸出&#xff0c;每輸出?個數字換??。樣例輸?&#xff1a;3547 輸出&#xff1a;7 換行輸出 4 換行輸出5 換行輸出3 int n Convert.ToInt32(Conso…

【python基礎(九)】文件和異常詳解:使用、讀取、寫入、追加、保存用戶的信息,以及優雅的處理異常

文章目錄 一. 從文件中讀取數據1. 讀取整個文件2. 文件路徑3. 逐行讀取4. 創建一個包含文件各行內容的列表 二. 寫入文件1. 寫入空文件2. 寫入多行3. 附加到文件 三. 異常1. 處理ZeroDivisionError異常2. 使用try-except代碼塊3. try-except-else ing4. 處理FileNotFoundError異…

如何在AD上創建完整的項目

首先&#xff0c;我們先安裝好AD&#xff0c;這里我使用的是AD22&#xff0c;安裝過程如下&#xff1a; Altium Designer 22下載安裝教程-CSDN博客 Altium Designer 22是全球領先的PCB設計軟件之一&#xff0c;為電路板設計師提供了一種集成的解決方案&#xff0c;旨在簡化和加…

探討工業元宇宙和數字孿生的關系

就在各類技術專家還在試圖設想元宇宙虛擬世界將為企業和消費者帶來什么時&#xff0c;工業元宇宙虛擬世界已經在改變人們設計、制造以及與各行業物理實體互動的方式。盡管元宇宙的定義比比皆是&#xff0c;工業元宇宙將如何發展還有待觀察&#xff0c;但數字孿生越來越多地被視…

shell(函數和數組)

目錄 一、函數 1.函數的由來 2.函數的作用 3.函數的使用方法 4.函數的定義 5.查看函數 6.刪除函數 7.函數返回值 8.函數的傳參數 9.函數遞歸 二、數組 1.數組的相關介紹 2.聲明數組 3.定義數組的格式 4.冒泡排序 總結&#xff1a;本章主要介紹了函數和數組相關知…

運維 在Windows上搭建小型Git服務

文章目錄 1、Git選型1.1、主要特性1.2、代碼管理1.3、工單管理1.4、Pull/Merge requests1.5、第三方集成1.6、選型結論 2、環境搭建2.1、Gitea下載2.2、Gitea安裝2.3、配置服務信息2.4、運行服務2.5、注冊Gitea為服務2.6、正常使用 1、Git選型 1.1、主要特性 1.2、代碼管理 1.…

多數據庫使用django-apscheduler時,migrate后并不能生成django_apscheduler_djangojob表的問題

先說一下django-apscheduler定時器的使用過程&#xff1a; django-apscheduler基本使用 1.安裝django-apscheduler代碼如下&#xff08;示例&#xff09;&#xff1a; pip install django-apscheduler 2.配置settings.py的INSTALLED_APPS代碼如下&#xff08;示例&#xff09…

項目中常用的 19 條 SQL 優化寶典

一、EXPLAIN 做MySQL優化,我們要善用 EXPLAIN 查看SQL執行計劃。 下面來個簡單的示例,標注(1,2,3,4,5)我們要重點關注的數據 type列,連接類型。一個好的sql語句至少要達到range級別。杜絕出現all級別 key列,使用到的索引名。如果沒有選擇索引,值是NULL。可以采取強制索引…

【CCF-PTA】第03屆Scratch第01題 -- 夢醒時分

夢醒時分 【題目描述】 睡眠是人體正常的生理需要&#xff0c;同年齡男女睡眠時間無明顯差別&#xff0c;一般是8小時左右。居家的小明作息生活很規律&#xff0c;晚上11點睡覺&#xff0c;早晨7點起床學習。請你編寫程序來判斷&#xff0c;每周&#xff08;共168小時&#x…

【JavaEE初階】 JavaScript相應的WebAPI

文章目錄 &#x1f332;WebAPI 背景知識&#x1f6a9;什么是 WebAPI&#x1f6a9;什么是 API &#x1f38d;DOM 基本概念&#x1f6a9;什么是 DOM&#x1f6a9;DOM 樹 &#x1f340;獲取元素&#x1f6a9;querySelector&#x1f6a9;querySelectorAll &#x1f384;事件初識&am…

不是吧?線程池這樣搞?

其他系列文章目錄 設計模式合集 多線程合集 分布式合集 ES合集 文章目錄 系列文章目錄 前言 一、為什么需要線程池&#xff1f; 二、舉個背景例子 三、怎么創建線程池&#xff1f; 四、線程池指定線程數 前言 學習線程池能夠幫助我們更好地處理多線程編程&#xff0c;并提高程…

TikTok美區本土店鋪如何做好IP隔離?

為什么要進行IP隔離呢&#xff1f;因為我們無法在國內直接運營Shopee、TikTok、Lazada等平臺的本土店&#xff0c;平臺識別出店鋪登錄IP非本土IP&#xff0c;則容易導致店鋪風控、被標記為偽本土店&#xff0c;影響店鋪經營。 TikTok美區店鋪的IP隔離方法和Shopee本土店一致&a…

SpringMVC(二)

八、HttpMessageConverter HttpMessageConverter&#xff0c;報文信息轉換器&#xff0c;將請求報文轉換為Java對象&#xff0c;或將Java對象轉換為響應報文 HttpMessageConverter提供了兩個注解和兩個類型&#xff1a;RequestBody&#xff0c;ResponseBody&#xff0c;Reque…

【MySQL】子查詢

文章目錄 子查詢IN運算符子查詢 VS 連接ALL關鍵字ANY關鍵字相關子查詢 !EXISTS運算符select子句中的子查詢from子句中的子查詢 子查詢 獲取價格大于id為3的貨物的商品 用到了內查詢&#xff0c;獲取id為3的商品的單價&#xff0c;把結構傳給外查詢 在where子句中編寫子查詢&am…

【python基礎(四)】if語句詳解

文章目錄 一. 一個簡單示例二. 條件測試1. 檢查多個條件1.1. 使用and關聯多個條件1.2. 使用or檢查多個條件1.3. in的判斷 2. 布爾表達式 三. if語句1. 簡單的if語句2. if-else語句3. if-elif-else結構4. 使用多個elif代碼塊5. 省略else代碼塊 四. 使用if語句處理列表1. 檢查特殊…

2023-11-23 LeetCode每日一題(HTML 實體解析器)

2023-11-23每日一題 一、題目編號 1410. HTML 實體解析器二、題目鏈接 點擊跳轉到題目位置 三、題目描述 「HTML 實體解析器」 是一種特殊的解析器&#xff0c;它將 HTML 代碼作為輸入&#xff0c;并用字符本身替換掉所有這些特殊的字符實體。 HTML 里這些特殊字符和它們…

Endnote軟件添加期刊引用格式

在下述網址中&#xff0c;找到你想要添加的期刊&#xff0c;下載引用格式文件&#xff08;后綴為.ens格式&#xff09; https://endnote.com/downloads/styles/?wpv_post_searchInformationfusion&wpv_aux_current_post_id12829&wpv_view_count12764-TCPID12829 下載…

SQLY優化

insert優化 1.批量插入 手動事務提交 主鍵順序插入&#xff0c;主鍵順序插入性能高于亂序插入 2.大批量插入數據 如果一次性需要插入大批量數據&#xff0c;使用Insert語句插入性能較低&#xff0c;此時可以使用MYSQL數據庫提供的load指令進行插入 主鍵優化 主鍵設計原則 …

Java實現王者榮耀小游戲

主要功能 鍵盤W,A,S,D鍵&#xff1a;控制玩家上下左右移動。按鈕一&#xff1a;控制英雄發射一個矩形攻擊紅方小兵。按鈕控制英雄發射魅惑技能&#xff0c;傷害小兵并讓小兵停止移動。技能三&#xff1a;攻擊多個敵人并讓小兵停止移動。普攻&#xff1a;對小兵造成基礎傷害。小…

vue3 終端實現 (vue3+xterm+websocket)

目錄 一、xterm介紹 二、效果展示 三、vue文件實現代碼 一、xterm介紹 xterm是一個使用