日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java实现坦克大战(源码全)

發布時間:2023/12/31 java 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java实现坦克大战(源码全) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

開頭


參考自尚學堂

對代碼有一定的重構,功能的添加(按‘G’開掛)

文末源碼自取,不會 github、git 建議先去學會基本使用,
也可以在對應界面直接下載壓縮包


項目結構

GamePanel

KeyMonitor (內部類)

keyPressed(KeyEvent): void

keyReleased(KeyEvent): void

launch(): void

paint(Graphics): void

main(String[]): void

package com.company.tank; import javax.swing.*; import java .awt.*; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.ArrayList; import java.util.List; import java.util.Random;public class GamePanel extends JFrame {/** 定義雙緩存圖片 */private Image offScreenImage = null;//游戲狀態: 0 游戲未開始,1 單人模式,2 雙人模式, 3 游戲暫停, 4 游戲失敗,5 游戲成功public int state= 0;//臨時變量private int a = 1;//重繪次數public int count = 0;//窗口長寬private int width = 800;private int height = 610;//敵人數量private int enemyCount = 0;//高度private int y = 150;//是否開始private boolean start = false;//物體集合public List<Bullet> bulletList = new ArrayList<>();public List<Bot> botList = new ArrayList<>();public List<Tank> tankList = new ArrayList<>();public List<Wall> wallList = new ArrayList<>();public List<Bullet> removeList = new ArrayList<>();public List<Base> baseList = new ArrayList<>();public List<BlastObj> blastList = new ArrayList<>();//背景圖片public Image background = Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/background.jpg"));//指針圖片private Image select = Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/selecttank.gif"));//基地private Base base = new Base(Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/star.gif")) , 365, 560, this);//玩家private PlayerOne playerOne = new PlayerOne(Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/player1/p1tankU.gif")),125, 510,Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/player1/p1tankU.gif")),Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/player1/p1tankD.gif")),Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/player1/p1tankL.gif")),Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/player1/p1tankR.gif")), this);private PlayerTwo playerTwo = new PlayerTwo(Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/player2/p2tankU.gif")),625, 510,Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/player2/p2tankU.gif")),Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/player2/p2tankD.gif")),Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/player2/p2tankL.gif")),Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/player2/p2tankR.gif")), this);//窗口的啟動方法public void launch(){//標題setTitle("坦克大戰");//窗口初始大小setSize(width, height);//用戶不能調整大小setResizable(false);//使窗口可見setVisible(true);//獲取屏幕分辨率,使窗口生成時居中setLocationRelativeTo(null);//添加關閉事件setDefaultCloseOperation(EXIT_ON_CLOSE);//添加鍵盤事件this.addKeyListener(new GamePanel.KeyMonitor());//添加圍墻 60*60for(int i = 0; i< 14; i ++){wallList.add(new Wall(Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/walls.gif")), i*60 ,170, this ));}wallList.add(new Wall(Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/walls.gif")), 305 ,560,this ));wallList.add(new Wall(Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/walls.gif")), 305 ,500,this ));wallList.add(new Wall(Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/walls.gif")), 365 ,500,this ));wallList.add(new Wall(Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/walls.gif")), 425 ,500,this ));wallList.add(new Wall(Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/walls.gif")), 425 ,560,this ));//添加基地baseList.add(base);while (true){if(botList.size() == 0 && enemyCount == 10){state = 5;}if(tankList.size() == 0 && (state == 1 || state == 2)){state = 4;}if(state == 1 || state == 2){if (count % 100 == 1 && enemyCount < 10) {Random r = new Random();int rnum =r.nextInt(800);botList.add(new Bot(Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/enemy/enemy1U.gif")), rnum, 110,Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/enemy/enemy1U.gif")),Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/enemy/enemy1D.gif")),Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/enemy/enemy1L.gif")),Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/enemy/enemy1R.gif")), this));enemyCount++;}}repaint();try {//線程休眠Thread.sleep(25);}catch (Exception e){e.printStackTrace();}}}@Overridepublic void paint(Graphics g) {// 創建和容器一樣大小的Image圖片if(offScreenImage ==null){offScreenImage=this.createImage(width, height);}// 獲得該圖片的畫布Graphics gImage= offScreenImage.getGraphics();// 背景顏色gImage.setColor(Color.gray);// 填充整個畫布gImage.fillRect(0, 0, width, height);//改變畫筆的顏色gImage.setColor(Color.orange);//改變文字大小和樣式gImage.setFont(new Font("正楷",Font.BOLD,50));if(state == 0){//添加文字gImage.drawString("選擇游戲模式",220,100);gImage.drawString("單人游戲",220,200);gImage.drawString("雙人游戲",220,300);gImage.drawString("按1,2選擇模式,按回車開始游戲",0,400);gImage.drawImage(select,160,y,null);}else if(state == 1||state == 2){gImage.setColor(Color.red);gImage.setFont(new Font("仿宋",Font.BOLD,20));gImage.drawString("WASD控制移動",0,510);gImage.drawString("空格射擊",0,550);if(state == 2){gImage.drawString("方向鍵控制移動",575,510);gImage.drawString("K射擊",575,550);}//paint重繪游戲元素for(Tank tank : tankList){tank.paintSelf(gImage);}for(Bullet bullet: bulletList){bullet.paintSelf(gImage);}bulletList.removeAll(removeList);for(Bot bot: botList){bot.paintSelf(gImage);}for (Wall wall: wallList){wall.paintSelf(gImage);}for(Base base : baseList){base.paintSelf(gImage);}for(BlastObj blast : blastList){blast.paintSelf(gImage);}//重繪次數+1count++;}else if(state == 3){gImage.drawString("游戲暫停",220,200);}else if(state == 4){gImage.drawString("游戲失敗",220,200);}else if(state == 5){gImage.drawString("游戲勝利",220,200);}/* 將緩沖區繪制好的圖形整個繪制到容器的畫布中 */g.drawImage(offScreenImage, 0, 0, null);}private class KeyMonitor extends KeyAdapter {@Overridepublic void keyPressed(KeyEvent e) {//super.keyPressed(e);int key = e.getKeyCode();switch (key){case KeyEvent.VK_1:y = 150;a = 1;break;case KeyEvent.VK_2:y = 250;a = 2;break;case KeyEvent.VK_ENTER:state = a;//添加玩家if(state == 1 && !start){tankList.add(playerOne);}else{tankList.add(playerOne);tankList.add(playerTwo);}start = true;break;case KeyEvent.VK_P:if(state != 3){a = state;state = 3;}else{state = a;if(a == 0) {a = 1;}}break;default:playerOne.keyPressed(e);playerTwo.keyPressed(e);break;}}@Overridepublic void keyReleased(KeyEvent e){playerOne.keyReleased(e);playerTwo.keyReleased(e);}}public static void main(String[] args) {GamePanel gamePanel = new GamePanel();gamePanel.launch();} }

GameObject

GameObject()

GameObject(Image, int, int, GamePanel)

getImg(): Image

setImg(Image): void

對X,Y,Width,Height,Speed,GamePanel 的getter和setter

paintSelf(Graphics): void

getRec(): Rectangle

package com.company.tank;import java.awt.*;public abstract class GameObject {//游戲元素圖片Image img;//游戲元素的橫坐標int x;//游戲元素的縱坐標int y;//游戲元素的寬int width;//游戲元素的高int height;//游戲元素的移動速度int speed;//游戲元素的移動方向Direction direction;//引入主界面GamePanel gamePanel;public GameObject(){}public GameObject(Image img, int x, int y, GamePanel gamePanel) {this.img = img;this.x = x;this.y = y;this.gamePanel = gamePanel;}public Image getImg() {return img;}public void setImg(Image img) {this.img = img;}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 getWidth() {return width;}public void setWidth(int width) {this.width = width;}public int getHeight() {return height;}public void setHeight(int height) {this.height = height;}public double getSpeed() {return speed;}public void setSpeed(int speed) {this.speed = speed;}public GamePanel getGamePanel() {return gamePanel;}public void setGamePanel(GamePanel gamepanel) {this.gamePanel = gamePanel;}//繼承元素繪制自己的方法public abstract void paintSelf(Graphics g);//獲取當前游戲元素的矩形,是為碰撞檢測而寫(位置)public abstract Rectangle getRec(); }

Base

Base(Image, int, int, GamePanel)

paintSelf(Graphics): void

getRec(): Rectangle

package com.company.tank;import java.awt.*;public class Base extends GameObject {public int width = 60;public int height = 60;public Base(Image img, int x, int y, GamePanel gamePanel){super(img, x, y, gamePanel);}@Overridepublic void paintSelf(Graphics g) {g.drawImage(img, x, y, null);}@Overridepublic Rectangle getRec() {return new Rectangle(x, y, width, height);} }

Wall

Wall(Image, int, int, GamePanel)

paintSelf(Graphics): void

getRec(): Rectangle

package com.company.tank; import java.awt.*;public class Wall extends GameObject {public int width = 60;public int height = 60;public Wall(Image img, int x, int y, GamePanel gamePanel){super(img, x, y, gamePanel);}@Overridepublic void paintSelf(Graphics g) {g.drawImage(img, x, y, null);}@Overridepublic Rectangle getRec() {return new Rectangle(x, y, width, height);} }

Tank

AttackCD

run(): void

Tank(Image, int, int, Image, Image, Image, Image, …)

leftward(): void //移動

rightward(): void

upward(): void

downward(): void

attack(): void

hitWall(int, int): boolean

moveToBorder(int, int): boolean

getHeadPoint(): Point

paintSelf(Graphics): void

getRec(): Rectangle

package com.company.tank;import java.awt.*; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.util.List;public class Tank extends GameObject{private boolean attackCoolDown =true;//攻擊冷卻狀態private int attackCoolDownTime =1000;//攻擊冷卻時間毫秒間隔1000ms發射子彈private Image upImage; //向上移動時的圖片private Image downImage;//向下移動時的圖片private Image rightImage;//向右移動時的圖片private Image leftImage;//向左移動時的圖片boolean alive = true;//坦克sizeint width = 40;int height = 50;//坦克初始方向Direction direction = Direction.UP;//坦克速度private int speed = 3;//坦克頭部坐標Point p;//坦克坐標,方向,圖片,方向,面板public Tank(Image img, int x, int y, Image upImage, Image downImage, Image leftImage, Image rightImage, GamePanel gamePanel) {super(img, x, y, gamePanel);this.upImage = upImage;this.leftImage = leftImage;this.downImage = downImage;this.rightImage = rightImage;}public void leftward(){direction = Direction.LEFT;setImg(leftImage);if(!hitWall(x-speed, y) && !moveToBorder(x-speed, y) && alive){this.x -= speed;}}public void rightward(){direction = Direction.RIGHT;setImg(rightImage);if(!hitWall(x+speed, y) && !moveToBorder(x+speed, y) && alive){this.x += speed;}}public void upward(){direction = Direction.UP;setImg(upImage);if(!hitWall(x, y-speed) && !moveToBorder(x, y- speed) && alive){this.y -= speed;}}public void downward(){direction = Direction.DOWN;setImg(downImage);if(!hitWall(x, y+speed) && !moveToBorder(x, y+speed) && alive){this.y += speed;}}public void attack(){Point p = getHeadPoint();if(attackCoolDown && alive){Bullet bullet = new Bullet(Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/bullet/bulletGreen.gif")),p.x,p.y,direction, this.gamePanel);this.gamePanel.bulletList.add(bullet);attackCoolDown = false;new AttackCD().start();}}public boolean hitWall(int x, int y){//假設玩家坦克前進,下一個位置形成的矩形Rectangle next = new Rectangle(x, y, width, height);//地圖里所有的墻體List<Wall> walls = this.gamePanel.wallList;//判斷兩個矩形是否相交(即是否撞墻)for(Wall w:walls){if(w.getRec().intersects(next)){return true;}}return false;}public boolean moveToBorder(int x, int y){if(x < 0){return true;}else if(x > this.gamePanel.getWidth()-width){return true;}if(y < 0){return true;}else if(y > this.gamePanel.getHeight()-height){return true;}return false;}public class AttackCD extends Thread{public void run(){attackCoolDown=false;//將攻擊功能設置為冷卻狀態try{Thread.sleep(attackCoolDownTime);//休眠1秒}catch(InterruptedException e){e.printStackTrace();}attackCoolDown=true;//將攻擊功能解除冷卻狀態this.interrupt();}}//根據方向確定頭部位置,x和y是左下角的點public Point getHeadPoint(){switch (direction){case UP:return new Point(x + width/2, y );case LEFT:return new Point(x, y + height/2);case DOWN:return new Point(x + width/2, y + height);case RIGHT:return new Point(x + width, y + height/2);default:return null;}}@Overridepublic void paintSelf(Graphics g) {g.drawImage(img, x, y, null);}@Overridepublic Rectangle getRec() {return new Rectangle(x, y, width, height);} }

PlayerOne

PlayerOne(Image, int, int, Image, Image, Image, Image, …)

keyPressed(KeyEvent): void

keyReleased(KeyEvent): void

move(): void

paintSelf(Graphics): void

getRec(): Rectangle

package com.company.tank;import java.awt.*; import java.awt.event.KeyEvent;public class PlayerOne extends Tank {private boolean up = false;private boolean left = false;private boolean right = false;private boolean down = false;public PlayerOne(Image img, int x, int y, Image upImage, Image downImage, Image leftImage, Image rightImage, GamePanel gamePanel){super(img, x, y, upImage, downImage, leftImage, rightImage, gamePanel);}public void keyPressed(KeyEvent e){int key = e.getKeyCode();switch (key){case KeyEvent.VK_A:left = true;break;case KeyEvent.VK_S:down = true;break;case KeyEvent.VK_D:right = true;break;case KeyEvent.VK_W:up = true;break;case KeyEvent.VK_SPACE:this.attack();break;case KeyEvent.VK_G: // 開掛:清除現存敵方坦克中存活最久的一個Bot b = this.gamePanel.botList.remove(0);gamePanel.botList.remove(b);gamePanel.blastList.add(new BlastObj(b.x, b.y));break;//TODO gdefault:break;}}public void keyReleased(KeyEvent e){int key = e.getKeyCode();switch (key){case KeyEvent.VK_A:left = false;break;case KeyEvent.VK_S:down = false;break;case KeyEvent.VK_D:right = false;break;case KeyEvent.VK_W:up = false;break;default:break;}}public void move(){ // 根據狀態前進/停止if(left){leftward();}else if(right){rightward();}else if(up){upward();}else if(down){downward();}}public void paintSelf(Graphics g) {g.drawImage(img, x, y, null);move();}public Rectangle getRec() {return new Rectangle(x, y, width, height);} }

添加player只需要改名

Bot

Bot(Image, int, int, Image, Image, Image, Image, …)

go(): void

randomDirection(): Direction

attack(): void

paintSelf(Graphics): void

getRec(): Rectangle

package com.company.tank; import java.awt.*; import java.util.Random;public class Bot extends Tank{int moveTime = 0;public Bot(Image img, int x, int y, Image upImage, Image downImage, Image leftImage, Image rightImage, GamePanel gamePanel) {super(img, x, y, upImage, downImage, leftImage, rightImage, gamePanel);}public void go(){attack();if(moveTime>=20) {direction=randomDirection();moveTime=0;}else {moveTime+=1;}switch (direction) {case UP -> upward();case DOWN -> downward();case RIGHT -> rightward();case LEFT -> leftward();}}//電腦坦克隨機方向public Direction randomDirection() {Random r = new Random();int rnum = r.nextInt(4);switch(rnum) {case 0:return Direction.UP;case 1:return Direction.RIGHT;case 2:return Direction.LEFT;default:return Direction.DOWN;}}//只有4%幾率攻擊public void attack() {Point p = getHeadPoint();Random r = new Random();int rnum =r.nextInt(100);if(rnum<4) {EnemyBullet enemyBullet = new EnemyBullet(Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/bullet/bulletYellow.gif")),p.x,p.y,direction,gamePanel);this.gamePanel.bulletList.add(enemyBullet);}}@Overridepublic void paintSelf(Graphics g) {g.drawImage(img,x,y,null);this.go();}@Overridepublic Rectangle getRec() {return new Rectangle(x, y, width, height);} }

Bullet

Bullet(Image, int, int, Direction, GamePanel)

go(): void

leftward(): void

rightward(): void

upward(): void

downward(): void

hitBot(): void //碰撞檢測

hitBase(): void

hitWall(): void

moveToBorder(): void

paintSelf(Graphics): void

getRec(): Rectangle

package com.company.tank;import java.awt.*; import java.util.List;public class Bullet extends GameObject{private int width = 10;private int height = 10;private int speed = 7;Direction direction;public Bullet(Image img, int x, int y, Direction direction,GamePanel gamePanel) {super(img, x, y, gamePanel);this.direction = direction;}public void go(){/*判斷移動方向*/switch (direction) {case UP -> upward();case LEFT -> leftward();case DOWN -> downward();case RIGHT -> rightward();}}// 子彈移動+邊界判斷public void leftward(){x -= speed;moveToBorder();}public void rightward(){x += speed;moveToBorder();}public void upward(){y -= speed;moveToBorder();}public void downward(){y += speed;moveToBorder();}/*子彈與坦克碰撞檢測*/public void hitBot(){Rectangle next= this.getRec();List<Bot> bots = this.gamePanel.botList;//子彈和botfor(Bot bot: bots){if(bot.getRec().intersects(next)){ // 空間有交集this.gamePanel.blastList.add(new BlastObj(bot.x-34, bot.y-14));this.gamePanel.botList.remove(bot);this.gamePanel.removeList.add(this); // 回收子彈break;}}}public void hitBase(){Rectangle next = this.getRec();for(Base base: gamePanel.baseList) {if (base.getRec().intersects(next)) {this.gamePanel.baseList.remove(base);this.gamePanel.removeList.add(this);this.gamePanel.state = 4;break;}}}public void hitWall(){Rectangle next = this.getRec();List<Wall> walls = this.gamePanel.wallList;for(Wall w: walls) {if (w.getRec().intersects(next)) {this.gamePanel.wallList.remove(w);this.gamePanel.removeList.add(this);break;}}}// 出界回收public void moveToBorder(){if (x < 0||x > this.gamePanel.getWidth()) {this.gamePanel.removeList.add(this);}if(y < 0||y > this.gamePanel.getHeight()) {this.gamePanel.removeList.add(this);}}@Overridepublic void paintSelf(Graphics g) {g.drawImage(img, x, y, null);go();//碰撞檢測hitBot();hitWall();hitBase();}@Overridepublic Rectangle getRec() {return new Rectangle(x, y, width, height);} }

EnemyBullet

EnemyBullet(Image, int, int, Direction, GamePanel)

hitTank(): void

paintSelf(Graphics): void

package com.company.tank;import java.awt.*; import java.util.List;public class EnemyBullet extends Bullet {public EnemyBullet(Image img, int x, int y, Direction direction,GamePanel gamePanel){super(img, x, y, direction, gamePanel);}public void hitTank(){Rectangle next= this.getRec();java.util.List<Tank> tanks = this.gamePanel.tankList;//子彈和Tankfor(Tank tank: tanks){if(tank.getRec().intersects(next)){tank.alive = false;this.gamePanel.blastList.add(new BlastObj(tank.x-34, tank.y-14));this.gamePanel.tankList.remove(tank);this.gamePanel.removeList.add(this);break;}}}public void paintSelf(Graphics g){g.drawImage(img, x, y, null);go();hitBase();hitWall();hitTank();} }

BlastObj

BlastObj()

BlastObj(int, int)

init(): void

paintSelf(Graphics): void

getRec(): Rectangle

package com.company.tank;import java.awt.*;public class BlastObj extends GameObject {static Image[] imgs = new Image[3];int explodeCount = 0;public static void init() { // 初始化for (int i = 0; i < 3; i++) {imgs[i] = Toolkit.getDefaultToolkit().getImage(BlastObj.class.getResource("images/blast/blast" +(i + 1)+".png"));}}public BlastObj() {super();}public BlastObj(int x, int y) {this.x = x;this.y = y;init();}@Overridepublic void paintSelf(Graphics g) {//繪制點擊爆炸效果(連續繪制)if (explodeCount < 3 && explodeCount>=0){g.drawImage(imgs[explodeCount],x,y,null);explodeCount++;}}@Overridepublic Rectangle getRec() {return null;} }

Direction

public enum Direction {UP,LEFT,RIGHT,DOWN }

圖片添加

這里跳轉查看


最后

不定時更新,以后會重構。

源碼

已更新為github鏈接

總結

以上是生活随笔為你收集整理的Java实现坦克大战(源码全)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。