0基礎學java-day18-( 坦克大戰【2】)

課件資源放在文末

1.線程-應用到坦克大戰

1.1 坦克大戰 0.3

【坦克類:包括坦克的基本屬性,以及坦克的移動方法】?

package com.hspedu.tankgame03;/*** @author 韓順平* @version 1.0*/
public class Tank {private int x;//坦克的橫坐標private int y;//坦克的縱坐標private int direct = 0;//坦克方向 0 上1 右 2下 3左private int speed = 1;public int getSpeed() {return speed;}public void setSpeed(int speed) {this.speed = speed;}//上右下左移動方法public void moveUp() {y -= speed;}public void moveRight() {x += speed;}public void moveDown() {y += speed;}public void moveLeft() {x -= speed;}public int getDirect() {return direct;}public void setDirect(int direct) {this.direct = direct;}public Tank(int x, int y) {this.x = x;this.y = y;}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;}
}

?【我方坦克類】繼承了坦克類,在這個版本中增加了發射子彈的方法【其實就是創建一個子彈對象,并且每一個子彈對象就是一個線程】

package com.hspedu.tankgame03;/*** @author 韓順平* @version 1.0* 自己的坦克*/
public class Hero extends Tank {//定義一個Shot對象Shot shot =null;public Hero(int x, int y) {super(x, y);}//射擊public void shotEnemyTank(){//創建 Shou 對象,根據當前Hero對象的位置和方向來創建switch (getDirect()){//得到hero方向case 0://向上shot =new Shot(getX()+20,getY(),0);break;case 1://向右shot=new Shot(getX()+60,getY()+20,1);break;case 2://向下shot=new Shot(getX()+20,getY()+60,2);break;case 3://向左shot=new Shot(getX(),getY()+20,3);break;}//啟動子彈線程new Thread(shot).start();}
}

【敵方坦克類】

package com.hspedu.tankgame03;/*** @author 韓順平* @version 1.0* 敵人的坦克*/
public class EnemyTank extends Tank {public EnemyTank(int x, int y) {super(x, y);}
}

【子彈類】包括子彈的基本屬性 ,以及子彈進程什么時候結束及其運動過程的變化

package com.hspedu.tankgame03;/*** @author 林然* @version 1.0*/
public class Shot implements Runnable{//設計子彈int x;//子彈x坐標int y;//子彈y坐標int direction =0;//子彈方向int speed = 2;//子彈宿舍boolean isLive = true;//是否存活//構造器public Shot(int x, int y, int direction) {this.x = x;this.y = y;this.direction = direction;}@Overridepublic void run() {while (true){try {Thread.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}//根據方向來改變switch (direction){case 0:y-=speed;break;//上case 1:x+=speed;break;//右case 2:y+=speed;break;//下case 3:x-=speed;break;//左}System.out.println("子彈x="+x+"子彈y="+y);if(!(x>=0&&x<=1000&&y>=0&&y<=750)){isLive=false;break;}}}
}

【面板類:主要在之前的基礎上新增了繪制子彈的功能以及將面板也作為一個線程,實現Runnable,每隔一段時間進行面板重繪】

package com.hspedu.tankgame03;import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Vector;/*** @author 韓順平* @version 1.0* 坦克大戰的繪圖區域*///為了監聽 鍵盤事件, 實現KeyListener//為了讓Panel 不停地重繪子彈,需要將MyPanelRunnable,當做一個線程使用
public class MyPanel extends JPanel implements KeyListener,Runnable {//定義我的坦克Hero hero = null;//定義敵人坦克,放入到VectorVector<EnemyTank> enemyTanks = new Vector<>();int enemyTankSize = 3;public MyPanel() {hero = new Hero(100, 100);//初始化自己坦克//初始化敵人坦克for (int i = 0; i < enemyTankSize; i++) {//創建一個敵人的坦克EnemyTank enemyTank = new EnemyTank((100 * (i + 1)), 0);//設置方向enemyTank.setDirect(2);//加入enemyTanks.add(enemyTank);}}@Overridepublic void paint(Graphics g) {super.paint(g);g.fillRect(0, 0, 1000, 750);//填充矩形,默認黑色//畫出自己坦克-封裝方法drawTank(hero.getX(), hero.getY(), g, hero.getDirect(), 1);//畫出hero射擊的子彈if(hero.shot!=null&&hero.shot.isLive!=false){g.draw3DRect(hero.shot.x,hero.shot.y,5,5,false);}//畫出敵人的坦克, 遍歷Vectorfor (int i = 0; i < enemyTanks.size(); i++) {//取出坦克EnemyTank enemyTank = enemyTanks.get(i);drawTank(enemyTank.getX(), enemyTank.getY(), g, enemyTank.getDirect(), 0);}}//編寫方法,畫出坦克/*** @param x      坦克的左上角x坐標* @param y      坦克的左上角y坐標* @param g      畫筆* @param direct 坦克方向(上下左右)* @param type   坦克類型*/public void drawTank(int x, int y, Graphics g, int direct, int type) {//根據不同類型坦克,設置不同顏色switch (type) {case 0: //敵人的坦克g.setColor(Color.cyan);break;case 1: //我的坦克g.setColor(Color.yellow);break;}//根據坦克方向,來繪制對應形狀坦克//direct 表示方向(0: 向上 1 向右 2 向下 3 向左 )//switch (direct) {case 0: //表示向上g.fill3DRect(x, y, 10, 60, false);//畫出坦克左邊輪子g.fill3DRect(x + 30, y, 10, 60, false);//畫出坦克右邊輪子g.fill3DRect(x + 10, y + 10, 20, 40, false);//畫出坦克蓋子g.fillOval(x + 10, y + 20, 20, 20);//畫出圓形蓋子g.drawLine(x + 20, y + 30, x + 20, y);//畫出炮筒break;case 1: //表示向右g.fill3DRect(x, y, 60, 10, false);//畫出坦克上邊輪子g.fill3DRect(x, y + 30, 60, 10, false);//畫出坦克下邊輪子g.fill3DRect(x + 10, y + 10, 40, 20, false);//畫出坦克蓋子g.fillOval(x + 20, y + 10, 20, 20);//畫出圓形蓋子g.drawLine(x + 30, y + 20, x + 60, y + 20);//畫出炮筒break;case 2: //表示向下g.fill3DRect(x, y, 10, 60, false);//畫出坦克左邊輪子g.fill3DRect(x + 30, y, 10, 60, false);//畫出坦克右邊輪子g.fill3DRect(x + 10, y + 10, 20, 40, false);//畫出坦克蓋子g.fillOval(x + 10, y + 20, 20, 20);//畫出圓形蓋子g.drawLine(x + 20, y + 30, x + 20, y + 60);//畫出炮筒break;case 3: //表示向左g.fill3DRect(x, y, 60, 10, false);//畫出坦克上邊輪子g.fill3DRect(x, y + 30, 60, 10, false);//畫出坦克下邊輪子g.fill3DRect(x + 10, y + 10, 40, 20, false);//畫出坦克蓋子g.fillOval(x + 20, y + 10, 20, 20);//畫出圓形蓋子g.drawLine(x + 30, y + 20, x, y + 20);//畫出炮筒break;default:System.out.println("暫時沒有處理");}}@Overridepublic void keyTyped(KeyEvent e) {}//處理wdsa 鍵按下的情況@Overridepublic void keyPressed(KeyEvent e) {System.out.println(e.getKeyCode());if (e.getKeyCode() == KeyEvent.VK_W) {//按下W鍵//改變坦克的方向hero.setDirect(0);////修改坦克的坐標 y -= 1hero.moveUp();} else if (e.getKeyCode() == KeyEvent.VK_D) {//D鍵, 向右hero.setDirect(1);hero.moveRight();} else if (e.getKeyCode() == KeyEvent.VK_S) {//S鍵hero.setDirect(2);hero.moveDown();} else if (e.getKeyCode() == KeyEvent.VK_A) {//A鍵hero.setDirect(3);hero.moveLeft();}if(e.getKeyCode()==KeyEvent.VK_J){hero.shotEnemyTank();}//讓面板重繪this.repaint();}@Overridepublic void keyReleased(KeyEvent e) {}@Overridepublic void run() {while (true){try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}this.repaint();}}
}

【主方法類:將面板作為一個線程啟動】

package com.hspedu.tankgame03;import javax.swing.*;/*** @author 韓順平* @version 1.0*/
public class HspTankGame03 extends JFrame {//定義MyPanelMyPanel mp = null;public static void main(String[] args) {HspTankGame03 hspTankGame01 = new HspTankGame03();}public HspTankGame03() {mp = new MyPanel();Thread thread =new Thread(mp);thread.start();this.add(mp);//把面板(就是游戲的繪圖區域)this.setSize(1000, 750);this.addKeyListener(mp);//讓JFrame 監聽mp的鍵盤事件this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setVisible(true);}
}

1.2 坦克大戰 0.4

在本次項目中大量在使用線程,我們也要知道即使線程結束了,但是其對象也是依然存在的,對于不同的邏輯操作我們可以在對應的類中寫出對應的方法并不斷重繪,對于需要反復判斷的我們也要在Mypanel的run方法中不斷進行調用?

package com.hspedu.tankgame04;import javax.swing.*;/*** @author 林然* @version 1.0*/
public class HspTankGame04 extends JFrame {//定義MyPanelMyPanel mp = null;public static void main(String[] args) {HspTankGame04 hspTankGame01 = new HspTankGame04();}public HspTankGame04() {mp = new MyPanel();Thread thread =new Thread(mp);thread.start();this.add(mp);//把面板(就是游戲的繪圖區域)this.setSize(1000, 750);this.addKeyListener(mp);//讓JFrame 監聽mp的鍵盤事件this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setVisible(true);}
}
package com.hspedu.tankgame04;import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Vector;/*** @author linran* @version 1.0* 坦克大戰的繪圖區域*///為了監聽 鍵盤事件, 實現KeyListener//為了讓Panel 不停地重繪子彈,需要將MyPanelRunnable,當做一個線程使用
public class MyPanel extends JPanel implements KeyListener,Runnable {//定義我的坦克Hero hero = null;//定義敵人坦克,放入到VectorVector<EnemyTank> enemyTanks = new Vector<>();int enemyTankSize = 3;//定義一個Vector用于存放炸彈//當子彈擊中坦克時,就加入Vector<Bomb> bombs =new Vector<>();//定義三張圖片用于顯示爆炸效果Image image1 = null;Image image2 =null;Image image3 =null;public MyPanel() {hero = new Hero(100, 100);//初始化自己坦克//初始化敵人坦克for (int i = 0; i < enemyTankSize; i++) {//創建一個敵人的坦克EnemyTank enemyTank = new EnemyTank((100 * (i + 1)), 0);//設置方向enemyTank.setDirect(2);//啟動坦克線程,讓他動起來new Thread(enemyTank).start();//加入一顆子彈Shot shot = new Shot(enemyTank.getX() + 20, enemyTank.getY() + 60, enemyTank.getDirect());//加入enemyTank的Vector成員進行管理enemyTank.shots.add(shot);//啟動shot對象new Thread(shot).start();//加入enemyTanks.add(enemyTank);}//初始化炸彈圖片image1=Toolkit.getDefaultToolkit().getImage(MyPanel.class.getResource("/bomb_1.gif"));image2=Toolkit.getDefaultToolkit().getImage(MyPanel.class.getResource("/bomb_2.gif"));image3=Toolkit.getDefaultToolkit().getImage(MyPanel.class.getResource("/bomb_3.gif"));}@Overridepublic void paint(Graphics g) {super.paint(g);g.fillRect(0, 0, 1000, 750);//填充矩形,默認黑色//畫出自己坦克-封裝方法if(hero.isLife){drawTank(hero.getX(), hero.getY(), g, hero.getDirect(), 1);}//畫出hero射擊的子彈for (int i=0;i<hero.shots.size();i++){Shot shot = hero.shots.get(i);if(shot!=null&&shot.isLive!=false){g.draw3DRect(shot.x,shot.y,5,5,false);}else {//從vector移除hero.shots.remove(shot);}}for(int i=0;i<bombs.size();i++){Bomb bomb = bombs.get(i);//根據當前對象的life值去畫圖片if(bomb.life>6){g.drawImage(image1,bomb.x,bomb.y,60,60,this);}else if(bomb.life>3){g.drawImage(image2,bomb.x,bomb.y,60,60,this);}else {g.drawImage(image3,bomb.x,bomb.y,60,60,this);}//讓炸彈生命值減少bomb.lifeDown();if(bomb.life==0){bombs.remove(i);//如果生命為0就刪除}}//畫出敵人的坦克, 遍歷Vectorfor (int i = 0; i < enemyTanks.size(); i++) {//取出坦克EnemyTank enemyTank = enemyTanks.get(i);if(enemyTank.isLive){//當子彈存活才畫出坦克drawTank(enemyTank.getX(), enemyTank.getY(), g, enemyTank.getDirect(), 0);//畫出enemyTank的所有子彈for (int j=0;j<enemyTank.shots.size();j++){//取出子彈Shot shot = enemyTank.shots.get(j);if(shot.isLive!=false){g.draw3DRect(shot.x,shot.y,5,5,false);}else {enemyTank.shots.remove(shot);}}}}}//編寫方法,畫出坦克/*** @param x      坦克的左上角x坐標* @param y      坦克的左上角y坐標* @param g      畫筆* @param direct 坦克方向(上下左右)* @param type   坦克類型*/public void drawTank(int x, int y, Graphics g, int direct, int type) {//根據不同類型坦克,設置不同顏色switch (type) {case 0: //敵人的坦克g.setColor(Color.cyan);break;case 1: //我的坦克g.setColor(Color.yellow);break;}//根據坦克方向,來繪制對應形狀坦克//direct 表示方向(0: 向上 1 向右 2 向下 3 向左 )//switch (direct) {case 0: //表示向上g.fill3DRect(x, y, 10, 60, false);//畫出坦克左邊輪子g.fill3DRect(x + 30, y, 10, 60, false);//畫出坦克右邊輪子g.fill3DRect(x + 10, y + 10, 20, 40, false);//畫出坦克蓋子g.fillOval(x + 10, y + 20, 20, 20);//畫出圓形蓋子g.drawLine(x + 20, y + 30, x + 20, y);//畫出炮筒break;case 1: //表示向右g.fill3DRect(x, y, 60, 10, false);//畫出坦克上邊輪子g.fill3DRect(x, y + 30, 60, 10, false);//畫出坦克下邊輪子g.fill3DRect(x + 10, y + 10, 40, 20, false);//畫出坦克蓋子g.fillOval(x + 20, y + 10, 20, 20);//畫出圓形蓋子g.drawLine(x + 30, y + 20, x + 60, y + 20);//畫出炮筒break;case 2: //表示向下g.fill3DRect(x, y, 10, 60, false);//畫出坦克左邊輪子g.fill3DRect(x + 30, y, 10, 60, false);//畫出坦克右邊輪子g.fill3DRect(x + 10, y + 10, 20, 40, false);//畫出坦克蓋子g.fillOval(x + 10, y + 20, 20, 20);//畫出圓形蓋子g.drawLine(x + 20, y + 30, x + 20, y + 60);//畫出炮筒break;case 3: //表示向左g.fill3DRect(x, y, 60, 10, false);//畫出坦克上邊輪子g.fill3DRect(x, y + 30, 60, 10, false);//畫出坦克下邊輪子g.fill3DRect(x + 10, y + 10, 40, 20, false);//畫出坦克蓋子g.fillOval(x + 20, y + 10, 20, 20);//畫出圓形蓋子g.drawLine(x + 30, y + 20, x, y + 20);//畫出炮筒break;default:System.out.println("暫時沒有處理");}}//判斷我方子彈是否擊中敵人坦克public  void hittank(Vector<Shot> shots,EnemyTank enemyTank){//判斷s擊中坦克for (int i=0;i<shots.size();i++){Shot s = shots.get(i);switch (enemyTank.getDirect()){case 0://上case 2://下if(s.x>enemyTank.getX()&&s.x<enemyTank.getX()+40&&s.y>enemyTank.getY()&&s.y<enemyTank.getY()+60){   s.isLive=false;enemyTank.isLive=false;//創建Bomb對象加入集合中Bomb bomb =new Bomb(enemyTank.getX(),enemyTank.getY());bombs.add(bomb);enemyTanks.remove(enemyTank);}break;case 1: //左右case 3:if(s.x>enemyTank.getX()&&s.x<enemyTank.getX()+60&&s.y>enemyTank.getY()&&s.y<enemyTank.getY()+40){   s.isLive=false;enemyTank.isLive=false;//創建Bomb對象加入集合中Bomb bomb =new Bomb(enemyTank.getX(),enemyTank.getY());bombs.add(bomb);enemyTanks.remove(enemyTank);}break;}}}//判斷我方子彈是否擊中敵人坦克public  void hitHero(Vector<Shot> shots,Hero hero){//判斷s擊中坦克for (int i=0;i<shots.size();i++){Shot s = shots.get(i);if(s.isLive&&hero.isLife){switch (hero.getDirect()){case 0://上case 2://下if(s.x>hero.getX()&&s.x<hero.getX()+40&&s.y>hero.getY()&&s.y<hero.getY()+60){   s.isLive=false;//創建Bomb對象加入集合中Bomb bomb =new Bomb(hero.getX(),hero.getY());bombs.add(bomb);hero.isLife=false;}break;case 1: //左右case 3:if(s.x>hero.getX()&&s.x<hero.getX()+60&&s.y>hero.getY()&&s.y<hero.getY()+40){   s.isLive=false;hero.isLife=false;//創建Bomb對象加入集合中Bomb bomb =new Bomb(hero.getX(),hero.getY());bombs.add(bomb);}break;}}}}@Overridepublic void keyTyped(KeyEvent e) {}//處理wdsa 鍵按下的情況@Overridepublic void keyPressed(KeyEvent e) {System.out.println(e.getKeyCode());if (e.getKeyCode() == KeyEvent.VK_W) {//按下W鍵//改變坦克的方向hero.setDirect(0);////修改坦克的坐標 y -= 1hero.moveUp();} else if (e.getKeyCode() == KeyEvent.VK_D) {//D鍵, 向右hero.setDirect(1);hero.moveRight();} else if (e.getKeyCode() == KeyEvent.VK_S) {//S鍵hero.setDirect(2);hero.moveDown();} else if (e.getKeyCode() == KeyEvent.VK_A) {//A鍵hero.setDirect(3);hero.moveLeft();}if(e.getKeyCode()==KeyEvent.VK_J){//if(!(hero.shot!=null&&hero.shot.isLive)) {發射一顆子彈if(hero.shots.size()<5)hero.shotEnemyTank();//發射多顆子彈,在面板最多有5g顆子彈//}}//讓面板重繪this.repaint();}@Overridepublic void keyReleased(KeyEvent e) {}@Overridepublic void run() {while (true){try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}//判斷是否擊中坦克if(hero.shots.size()>0){//當前我的子彈存活//遍歷敵人所有坦克for (int i = 0; i < enemyTanks.size(); i++) {EnemyTank enemyTank =enemyTanks.get(i);hittank(hero.shots,enemyTank);}}//判斷是否擊中我方坦克for (int i=0;i<enemyTanks.size();i++){hitHero(enemyTanks.get(i).shots,hero);}this.repaint();}}
}
package com.hspedu.tankgame04;/*** @author 林然* @version 1.0*/
public class Tank {private int x;//坦克的橫坐標private int y;//坦克的縱坐標private int direct = 0;//坦克方向 0 上1 右 2下 3左private int speed = 5;public int getSpeed() {return speed;}public void setSpeed(int speed) {this.speed = speed;}//上右下左移動方法public void moveUp() {if(y>0)//判斷邊界條件,個人感覺在這里設置的話我方和敵人坦克都可以直接控制{y -= speed;}}public void moveRight() {if(x<1000&&(x+80)<1000){x += speed;}}public void moveDown() {if(y<750&&(y+100)<750){y += speed;}}public void moveLeft() {if(x>0){x -= speed;}}public int getDirect() {return direct;}public void setDirect(int direct) {this.direct = direct;}public Tank(int x, int y) {this.x = x;this.y = y;}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;}
}
package com.hspedu.tankgame04;import java.util.Vector;/*** @author 林然* @version 1.0* 敵人的坦克*/
public class EnemyTank extends Tank implements Runnable{Vector <Shot> shots=new Vector<>();boolean isLive =true;public EnemyTank(int x, int y) {super(x, y);}//射擊public void shotHeroTank(){//創建 Shou 對象,根據當前EnemyTank對象的位置和方向來創建Shot shot =null;switch (getDirect()){//得到EnemyTank方向case 0://向上shot =new Shot(getX()+20,getY(),0);break;case 1://向右shot=new Shot(getX()+60,getY()+20,1);break;case 2://向下shot=new Shot(getX()+20,getY()+60,2);break;case 3://向左shot=new Shot(getX(),getY()+20,3);break;}//加入子彈集合shots.add(shot);//啟動子彈線程new Thread(shot).start();}@Overridepublic void run() {int count=0;while (isLive){if(shots.size()<5){shotHeroTank();}count++;//根據坦克方向來繼續移動switch (getDirect()){case 0://向上moveUp();break;case 1://向右moveRight();break;case 2://向下moveDown();break;case 3://向左moveLeft();break;}try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}//然后隨機的改變坦克方向[0-4).連續走10步后換方向if(count%10==0){setDirect((int)(Math.random()*4));count=0;}//寫并發程序一定要考慮線程什么時候結束}}
}
package com.hspedu.tankgame04;import java.util.Vector;/*** @author linran* @version 1.0* 自己的坦克*/
public class Hero extends Tank {//定義一個Shot對象Shot shot =null;boolean isLife =true;//可以發送多顆子彈Vector<Shot> shots =new Vector<>();public Hero(int x, int y) {super(x, y);}//射擊public void shotEnemyTank(){//創建 Shou 對象,根據當前Hero對象的位置和方向來創建switch (getDirect()){//得到hero方向case 0://向上shot =new Shot(getX()+20,getY(),0);break;case 1://向右shot=new Shot(getX()+60,getY()+20,1);break;case 2://向下shot=new Shot(getX()+20,getY()+60,2);break;case 3://向左shot=new Shot(getX(),getY()+20,3);break;}//加入子彈集合shots.add(shot);//啟動子彈線程new Thread(shot).start();}
}
package com.hspedu.tankgame04;/*** @author 林然* @version 1.0*/
public class Shot implements Runnable{//設計子彈int x;//子彈x坐標int y;//子彈y坐標int direction =0;//子彈方向int speed = 2;//子彈宿舍boolean isLive = true;//是否存活//構造器public Shot(int x, int y, int direction) {this.x = x;this.y = y;this.direction = direction;}@Overridepublic void run() {while (true){try {Thread.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}//根據方向來改變switch (direction){case 0:y-=speed;break;//上case 1:x+=speed;break;//右case 2:y+=speed;break;//下case 3:x-=speed;break;//左}System.out.println("子彈x="+x+"子彈y="+y);//當子彈碰到面板邊界時應該被銷毀//當子彈碰到敵人坦克時,也應該結束進程if(!(x>=0&&x<=1000&&y>=0&&y<=750&&isLive)){isLive=false;break;}}}
}
package com.hspedu.tankgame04;/*** @author 林然* @version 1.0* 炸彈*/
public class Bomb {int x,y;//炸彈坐標int life = 9;//炸彈的生命周期boolean isLife =true;//是否還存活public Bomb(int x, int y) {this.x = x;this.y = y;}//減少生命值public void lifeDown(){if(life>0){life--;}else{isLife=false;}}
}

2.課件資源

鏈接:https://pan.baidu.com/s/1anOddH3cE47HuAUHyAGiVg?pwd=msmz?
提取碼:msmz

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

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

相關文章

XMemcached network layout exception java.nio.channels.ClosedChannelException

java.nio.channels.ClosedChannelException 表示嘗試在已關閉的通道上進行 I/O 操作&#xff0c;通常發生在網絡連接意外關閉后嘗試在關閉的通道上執行讀取或寫入操作。 XMemcached network layout exception 可能是由于 XMemcached 客戶端在嘗試與 Memcached 服務器通信時發生…

一些AG10K FPGA 調試的建議-Douglas

PLL AGM FPGA 在配置成功時&#xff0c;PLL 已經完成鎖定&#xff0c;lock 信號已經變高&#xff1b;如果原設計中用 lock 信號輸出實現系統 reset 的復位功能&#xff0c;就不能正確完成上電復位&#xff1b;同時&#xff0c;為了保證 PLL 相移的穩定&#xff0c;我們需要在 P…

C++筆記之重載和重寫辨別

C筆記之重載和重寫辨別 code review! 文章目錄 C筆記之重載和重寫辨別重載&#xff08;overloading&#xff09;重寫&#xff08;Overriding&#xff09; 在C中&#xff0c;重載&#xff08;overloading&#xff09;和重寫&#xff08;overriding&#xff09;是面向對象編程中…

筆記69:Conv1d 和 Conv2d 之間的區別

筆記地址&#xff1a;D:\work_file\&#xff08;4&#xff09;DeepLearning_Learning\03_個人筆記\4. Transformer 網絡變體 a a a a a a a a a a a

設計模式-門面模式(Facade)

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、定義二、結構 前言 在組件構建過程中&#xff0c;某些接口之間直接依賴會帶來很多問題&#xff0c;甚至無法直接實現。采用一層間接接口&#xff0c;來隔離…

SpringBoot報No qualifying bean of type ‘com.lzk.mapper.UserMapper‘ available

這個異常是SpringBoot程序沒有找到要Bean&#xff0c;這里提示找不到UserMapper&#xff0c;有以下三種解決方式&#xff1a; 在UserMapper上添加注解MapperMapper public interface UserMapper extends BaseMapper<User> { }在啟動類上進行Mapper包掃描&#xff0c;不用…

【IC前端虛擬項目】工程目錄組織說明

【IC前端虛擬項目】數據搬運指令處理模塊前端實現虛擬項目說明-CSDN博客 文檔目錄在“MVU芯片前端設計驗證虛擬項目”中&#xff0c;截至本篇文章時&#xff0c;包含了MVU_FS.md/project_req.md和mvu_vp_list.xlsx三個文件。 MVU_FS是模塊的方案文檔&#xff0c;除了feature和…

淺談CompletableFuture

作者簡介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中興通訊、美團架構師&#xff0c;現某互聯網公司CTO 聯系qq&#xff1a;184480602&#xff0c;加我進群&#xff0c;大家一起學習&#xff0c;一起進步&#xff0c;一起對抗互聯網寒冬 回顧FutureTask 之前我…

安全高效 江西變電站成功應用國家電網無人機巡檢

隨著電力需求的迅速增長&#xff0c;電網的巡檢、維護與保養變得越來越重要。為迎接這一挑戰&#xff0c;江西供電公司的一座變電站成功引入了復亞智能國家電網無人機巡檢系統&#xff0c;在提升巡檢水平、開創新型巡檢模式方面做出了重要嘗試&#xff0c;為電網設備的高效巡檢…

EDA 數字時鐘

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、數字時鐘是什么&#xff1f;二、EDA里面數碼管的顯示1.元件模型2.參考程序3. 實驗仿真波形4.實驗現象5. 仿真問題 三、顯示時鐘1. 時鐘電路模塊2.參考程序3…

gRPC .net學習

學習helloworld server用.net client有.net的控制臺 和 unity server端 直接使用vs2022創建(需自行看有無裝asp.net哦),搜索gPRC,使用6.0吧&#xff0c;創建工程后直接F5跑起來,服務端到此完成 .net控制臺client,創建新的控制臺,使用NuGet,然后導入server端的Protos文件夾 學…

基于Jedis來探討池化技術

為什么需要池化技術 系統運行時必然是需要數據庫連接、線程等一些重量級對象&#xff0c;頻繁的創建這種對象對性能有著不小的開銷&#xff0c;所以為了減少沒必要的創建和開銷&#xff0c;我們就用到了池化技術。 通過創建一個資源池來保存這些資源便于后續的復用&#xff0c…

【C++初階】七、內存管理(C/C++內存分布、C++內存管理方式、operator new / delete 函數、定位new表達式)

相關代碼gitee自取&#xff1a; C語言學習日記: 加油努力 (gitee.com) 接上期&#xff1a; 【C初階】六、類和對象&#xff08;初始化列表、static成員、友元、內部類&#xff09;-CSDN博客 目錄 一 . C/C內存分布 C/C中程序內存區域劃分&#xff1a; 二 . C內存管理方式 …

16.Java程序設計-基于SSM框架的android餐廳在線點單系統App設計與實現

摘要&#xff1a; 本研究旨在設計并實現一款基于SSM框架的Android餐廳在線點單系統&#xff0c;致力于提升餐廳點餐流程的效率和用戶體驗。通過整合Android移動應用和SSM框架的優勢&#xff0c;該系統涵蓋了用戶管理、菜單瀏覽與點單、訂單管理、支付與結算等多個功能模塊&…

用戶登錄權限

文章目錄 [TOC](文章目錄) 前言一、 Cookie與session1.HTTP無狀態2.cookie 和 session 的生命周期2.1 cookie 生命周期影響因素2.2 session 生命周期影響因素 3.cookie 和 session 的區別4.工作原理3 用戶登錄Node.js和Express驗證session 二、JSON Web Token1. JWT 介紹2. JWT…

C#使用Matrix類對Dicom圖像的放縮

C#使用Matrix類對Dicom圖像的放縮&#xff0c;使用Matrix 1.同時操作水平、垂直同時放縮 // 創建一個 Matrix 對象 Matrix m_Matrix new Matrix();//放縮參數 float inputZoom1.2f; m_Matrix.Scale(inputZoom, inputZoom, MatrixOrder.Append); 2.操作水平&#xff08;X軸…

前端使用插件預覽pdf、docx、xlsx、pptx格式文件

PDF預覽 H5頁面pdf預覽 插件&#xff1a;pdfh5 版本&#xff1a;“pdfh5”: “^1.4.7” npm install pdfh5 import PdfH5 from "pdfh5"; import "pdfh5/css/pdfh5.css";// methods this.$nextTick(() > {this.pdfH5 new PdfH5("#pdf", {pd…

【算法系列篇】遞歸、搜索和回溯(二)

文章目錄 前言1. 兩兩交換鏈表中的節點1.1 題目要求1.2 做題思路1.3 代碼實現 2. Pow(X,N)2.1 題目要求2.2 做題思路2.3 代碼實現 3. 計算布爾二叉樹的值3.1 題目要求3.2 做題思路3.3 代碼實現 4. 求根節點到葉結點數字之和4.1 題目要求4.2 做題思路4.3 代碼實現 前言 前面為大…

計算機畢業設計springboot+ssm停車場車位預約系統java

管理員不可以注冊賬號 停車位包括車位所在樓層、車位編號、車位類型(全時間開放/高峰期開放)、預定狀態等 用戶預約時要求支付預約時間段的停車費用 違規行為&#xff1a;1.停車超過預約時間段 2.預約未使用 于系統的基本要求 &#xff08;1&#xff09;功能要求&am…

6G來襲,真的有必要嗎?

6G來襲&#xff0c;6G標準將在2025年完成制定&#xff0c;2030年商用。當5G都還沒玩明白的時候&#xff0c;6G又來了。 這次6G又提出了三個全新高大上場景&#xff0c;感知通信、人工智能通信、天地一體泛在物聯&#xff0c;精英們還說&#xff0c;未來要連接很多機器人、元宇宙…