国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - java實現飛機大戰游戲

java實現飛機大戰游戲

2021-08-26 11:41點丶錯了。。 Java教程

這篇文章主要為大家詳細介紹了java實現飛機大戰游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

java實現飛機大戰,供大家參考,具體內容如下

用Java寫個飛機大戰游戲練習一下,實現可播放游戲背景音樂和游戲的基本功能

設計

1、準備好相應的圖片和背景音樂(.wav文件);
2、直接看源碼;
3、還有部分功能未實現。

源碼

package forGame

加載游戲圖片類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package forGame;
 
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
 
//游戲圖片包裝
public class ImageUtil {
 
 //圖片大小
 public static int WIDTH_BACK;
 public static int HEIGHT_BACK;
 public static int WIDTH_PLANE;
 public static int HEIGHT_PLANE;
 
 //圖片
 public static BufferedImage START;
 public static ImageIcon BUTTON;
 public static BufferedImage PLANE_1;
 public static BufferedImage PLANE_2;
 public static BufferedImage Bullet_1;
 public static BufferedImage Bullet_2;
 public static BufferedImage XIAO_PLANE;
 public static BufferedImage BOMB_PLANE1;
 public static BufferedImage BOMB_PLANE2;
 
 static {
  try {
   START = ImageIO.read(new File("src\\image\\背景2.png"));
   BUTTON = new ImageIcon("src\\image\\開始.png");
   PLANE_1 = ImageIO.read(new File("src\\image\\飛機1.png"));
   PLANE_2 = ImageIO.read(new File("src\\image\\飛機2.png"));
   Bullet_1 = ImageIO.read(new File("src\\image\\導彈1.png"));
   Bullet_2 = ImageIO.read(new File("src\\image\\導彈2.png"));
   XIAO_PLANE = ImageIO.read(new File("src\\image\\小飛機.png"));
   BOMB_PLANE1 = ImageIO.read(new File("src\\image\\飛機爆炸1.png"));
   BOMB_PLANE2 = ImageIO.read(new File("src\\image\\飛機爆炸2.png"));
  } catch (IOException e) {
   e.printStackTrace();
  }
  WIDTH_BACK = START.getWidth();
  HEIGHT_BACK = START.getHeight();
  WIDTH_PLANE = PLANE_1.getWidth();
  HEIGHT_PLANE = PLANE_1.getHeight();
 }
}

播放游戲背景音樂類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package forGame;
 
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import java.io.File;
 
//播放背景音樂(.wav文件)
public class PlayMusic {
 private Clip clip;
 //需要傳入要播放的文件位置的字符串
 public void start(File file)
 {
  try
  {
   //創建相當于音樂播放器的對象
   clip = AudioSystem.getClip();
   //轉成可播放的文件
   AudioInputStream audioInput = AudioSystem.getAudioInputStream(file);
   //播放器打開這個文件
   clip.open(audioInput);
   //clip.start();//只播放一次
   //循環播放
   clip.loop(Clip.LOOP_CONTINUOUSLY);
  } catch(Exception ex){
   ex.printStackTrace();
  }
  //死循環不讓主程序結束(swing可不用)
  /*
   while(true){
   }
  */
 }
 
 //關閉音樂播放
 public void exit(){
  clip.close();//停止音樂播放,下次播放重新開始
 }
 
 //停止音樂播放
 public void stop(){
  clip.stop();//停止音樂播放,下次播放繼續播放
 }
}

package planeGame

接口

?
1
2
3
4
5
6
7
8
package planeGame;
 
import java.awt.*;
 
//繪制接口
public interface DrawMe {
 void drawMe(Graphics g);
}
?
1
2
3
4
5
6
package planeGame;
 
//分數接口
public interface Grade {
 int getGrade();
}

窗口父類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package planeGame;
 
import forGame.ImageUtil;
import forGame.PlayMusic;
 
import javax.swing.*;
import java.io.File;
 
//窗口父類
public class MyJFrameFather extends JFrame{
 protected int y1 = 0;
 protected int y2 = -830;
 protected PlayMusic playMusic = new PlayMusic();
 public MyJFrameFather(String name){
  super(name);
  setSize(ImageUtil.WIDTH_BACK, ImageUtil.HEIGHT_BACK);
  setLocationRelativeTo(null);
  setResizable(false);
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  playMusic.start(new File("src\\music\\bgm.wav"));
 }
}

開始界面

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package planeGame;
 
import forGame.ImageUtil;
 
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
//游戲開始界面
public class StartJFrame extends MyJFrameFather{
 public StartJFrame(){
  super("開始界面");
  ImageIcon imageIcon = ImageUtil.BUTTON;
  JButton jButton = new JButton(imageIcon);
  //設置按鈕沒有邊框
  jButton.setBorder(null);
  jButton.setBounds(200,350,imageIcon.getIconWidth(),imageIcon.getIconHeight());
  jButton.setBackground(Color.lightGray);
  setLayout(null);
  add(jButton);
  setVisible(true);
  jButton.addActionListener(actionListener);
 }
 
 @Override
 public void paint(Graphics g) {
  g.drawImage(ImageUtil.START,0,0 ,null );
 }
 
 private ActionListener actionListener = new ActionListener() {
  @Override
  public void actionPerformed(ActionEvent e) {
   playMusic.exit();
   new GameJFrame();
   dispose();
  }
 };
}

飛機父類(抽象類)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package planeGame;
 
import java.awt.*;
 
//飛機父類
public abstract class Plane implements DrawMe{
 //飛機坐標
 protected Point p = new Point();
 //飛機是否活著
 protected boolean isLive = true;
 //飛機移動速度
 protected int speed;
 public Plane(int x,int y){
  p.x = x;
  p.y = y;
 }
 //修改飛機坐標以重復使用
 public abstract void setP(int x);
 //畫自己
 public abstract void drawMe(Graphics g);
 //移動
 public abstract void move();
 //獲取飛機坐標
 protected Point getP(){
  return p;
 }
 
 //飛機發射子彈
 public void playBullet(Bullet bullet){
  //子彈狀態為true
  bullet.setLive();
 }
 
 //改變飛機狀態
 public void setLive(boolean aboolean){
  isLive = aboolean;
 }
 
 //返回飛機狀態
 public boolean getIsLive(){
  return isLive;
 }
}

主飛機類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package planeGame;
 
import forGame.ImageUtil;
 
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
 
//主飛機
public class MainPlane extends Plane{
 //移動方向 1;上 -1:下 2:右 -2:左
 private int direction = 1;
 public MainPlane(int x, int y) {
  super(x, y);
 }
 
 @Override
 public void setP(int x) {}
 
 private boolean aBoolean = true;//繪制動態主飛機
 @Override
 public void drawMe(Graphics g) {
  if(isLive){
   if(aBoolean) {
    g.drawImage(ImageUtil.PLANE_1, p.x, p.y, null);
    aBoolean = false;
   }
   else {
    g.drawImage(ImageUtil.PLANE_2, p.x, p.y, null);
    aBoolean = true;
   }
  }
  else{
   g.drawImage(ImageUtil.BOMB_PLANE1, p.x, p.y, null);//未繪制動態爆炸效果
  }
 }
 
 @Override
 public void move() {
  if(direction == 1 && p.y > 30)
   p.move(p.x,p.y + speed);
  else if(direction == -1 && p.y < ImageUtil.HEIGHT_BACK - ImageUtil.HEIGHT_PLANE)
   p.move(p.x,p.y + speed);
  else if(direction == 2 && p.x < ImageUtil.WIDTH_BACK - ImageUtil.HEIGHT_PLANE)
   p.move(p.x + speed,p.y);
  if(direction == -2 && p.x > 0)
   p.move(p.x + speed,p.y);
 }
 
 //監聽飛機移動
 private KeyListener keyListener = new KeyAdapter() {
  @Override
  public void keyPressed(KeyEvent e) {
   int keyCode = e.getKeyCode();
   //移動方向 1;上 -1:下 2:右 -2:左
   //上
   if(keyCode == KeyEvent.VK_UP){
    direction = 1;
    speed = -20;
    move();
   }
   //下
   if(keyCode == KeyEvent.VK_DOWN){
    direction = -1;
    speed = 20;
    move();
   }
   //左
   if(keyCode == KeyEvent.VK_LEFT){
    direction = -2;
    speed = -32;
    move();
   }
   //右
   if(keyCode == KeyEvent.VK_RIGHT){
    direction = 2;
    speed = 32;
    move();
   }
  }
 };
 //返回鍵盤監聽器
 public KeyListener getKeyListener(){
  return keyListener;
 }
 //主飛機是否與敵機相撞
 public void isBomb(Plane[] planes){
  for(int i = 0;i < planes.length; i++) {
   if (planes[i].getIsLive()) {
    if(planes[i].getP().x > p.x && planes[i].getP().x < p.x + 128 && (p.y - planes[i].getP().y < 64)) {
     isLive = false;
     planes[i].setLive(false);
    }
   }
  }
 }
}

敵機類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package planeGame;
 
import forGame.ImageUtil;
 
import java.awt.*;
 
//敵機,未設置發射子彈功能
public class GamePlane extends Plane implements Grade{
 public GamePlane(int x, int y) {
  super(x, y);
 }
 
 @Override
 public void setP(int x) {
  p.x = x;
  p.y = 0;
 }
 
 @Override
 public void drawMe(Graphics g) {
  g.drawImage(ImageUtil.XIAO_PLANE,p.x,p.y,null);
  move();
 }
 
 @Override
 public void move() {
  if(p.y < 900)
   p.y = p.y +20;
  else
   isLive = false;
 }
 
 //未實現
 @Override
 public int getGrade() {
  return 0;
 }
}

子彈類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package planeGame;
 
import forGame.ImageUtil;
 
import java.awt.*;
 
//子彈類
public class Bullet implements DrawMe {
 private boolean isLive = false;//是否繪制子彈
 private int x;//子彈初始橫坐標
 private int y;//子彈初始縱坐標
 private int color;//繪制什么子彈的標志
 public Bullet(int number,int x,int y){
  this.color = number;
  this.x =x;
  this.y =y;
 }
 
 //修改子彈坐標
 public void setXY(int x,int y){
  this.x =x;
  this.y =y;
 }
 
 //修改子彈狀態
 public void setLive(){
  isLive = true;
 }
 public boolean getLive(){
  return isLive;
 }
 //繪制子彈
 @Override
 public void drawMe(Graphics g) {
  if(color == 1){
   g.drawImage(ImageUtil.Bullet_1, x, y,null);
  } else {
   g.drawImage(ImageUtil.Bullet_2, x, y, null);
  }
  move();
 }
 
 //子彈移動
 private void move(){
  if(color == 1){
   if(y > 30)
    y = y - 50;
   else
    isLive = false;
  }else{
   if(y < 900)
    y = y + 100;
   else
    isLive = false;
  }
 }
 
 //子彈是否擊中敵機
 public boolean isBom(Plane[] planes){
  boolean is = false;
  for(int i = 0;i < planes.length;i ++){
   if(planes[i].getIsLive()){
    if(x > planes[i].getP().x && x < planes[i].getP().x + 64){
     if(y - planes[i].getP().y <= 64) {
      isLive = false;
      planes[i].setLive(false);
      is = true;
     }
    }
   }
  }
  return is;
 }
 
 //子彈是否與主機相撞
 private void isBom(Plane plane){
 
 }
 
}

創建主飛機、敵機、子彈類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package planeGame;
 
import java.util.Random;
 
//生產飛機、子彈
public class Production{
 Random random = new Random();
 private GamePlane[] gamePlanes = new GamePlane[16];
 private Bullet[] bullets = new Bullet[50];
 
 //背景圖:596 x 854
 //飛機圖:128 x 128
 //子彈圖:9 x 21
 private MainPlane mainPlane = new MainPlane(random.nextInt(400),random.nextInt(160) + 400);
 public MainPlane getMainPlane() {
  return mainPlane;
 }
 
 //生產敵機
 
 public GamePlane[] getGamePlanes() {
  for(int i = 0;i < 16;i ++){
   gamePlanes[i] = new GamePlane(0,0);
   gamePlanes[i].setLive(false);
  }
  return gamePlanes;
 }
 
 //修改一個敵機狀態為true
 public void setGamePlanes(){
  for(int i = 0;i < 16;i ++){
   if(!gamePlanes[i].isLive){
    gamePlanes[i].setP(random.nextInt(12) * 45 + 32);
    gamePlanes[i].setLive(true);
    break;
   }
  }
 }
 //隨機產生一個boolean值
 public boolean getBoolean(){
  return random.nextBoolean();
 }
 
 //生產子彈
 public Bullet[] getBullets() {
  for(int i = 0;i < 50;i ++){
   if(i < 20)
    bullets[i] = new Bullet(1,0,0);
   else
    bullets[i] = new Bullet(2,0,0);
  }
  return bullets;
 }
}

游戲界面

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package planeGame;
 
import forGame.ImageUtil;
import forGame.PlayMusic;
 
import java.awt.*;
 
//游戲界面,繪制并顯示
public class GameJFrame extends MyJFrameFather{
 private boolean isRepaint = true;
 private PlayMusic playMusicB = new PlayMusic();
 private Production production = new Production();
 private GamePlane[] gamePlanes;
 private Bullet[] bullets;
 private MainPlane mainPlane = production.getMainPlane();
 private int grade = 0;
 public GameJFrame(){
  super("游戲界面");
  setVisible(true);
  addKeyListener(mainPlane.getKeyListener());
  MyRunning myRunning = new MyRunning();
  myRunning.start();
  gamePlanes = production.getGamePlanes();
  bullets = production.getBullets();
 }
 
 @Override
 public void paint(Graphics g) {
  Image image = this.createImage(getWidth(),getHeight());
  Graphics gImage = image.getGraphics();
  gImage.setColor(gImage.getColor());
  gImage.fillRect(0,0,getWidth(),getHeight());
  super.paint(gImage);
 
  //596 x 854
  //繪制動態背景
  if(y2 == 0){
   y1 = 0;
   y2 = -830;
  }
  gImage.drawImage(ImageUtil.START,0 ,y1 ,null );
  gImage.drawImage(ImageUtil.START,0 ,y2 ,null );
  y1 = y1 + 10;
  y2 = y2 + 10;
  //繪制飛機子彈
  if(mainPlane.isLive){//主飛機活著
   for(int i = 0;i < 20;i ++){
    //找子彈狀態為false,重新設置坐標并修改狀態
    if(!bullets[i].getLive()){
     bullets[i].setXY(mainPlane.getP().x + 60,mainPlane.getP().y - 21);
     mainPlane.playBullet(bullets[i]);
     break;
    }
   }
   //繪制活著的敵機
   for(int i =0;i < 10;i ++){
    if(gamePlanes[i].isLive){
     gamePlanes[i].drawMe(gImage);
    }
   }
   //控制什么時候讓敵機活
   if(production.getBoolean() && production.getBoolean())
    production.setGamePlanes();
   //判斷主飛機是否爆炸
   mainPlane.isBomb(gamePlanes);
   //繪制主飛機
   mainPlane.drawMe(gImage);
   //首先判斷子彈是否擊中敵機,沒有擊中則繪制子彈
   for(int i = 0;i < bullets.length;i ++){
    if(bullets[i].getLive()) {
     if (bullets[i].isBom(gamePlanes))
      grade = grade + 10;
     else
      bullets[i].drawMe(gImage);
    }
   }
  }else{
   isRepaint = false;
   mainPlane.drawMe(gImage);
   gImage.setFont(new Font("宋體",Font.ITALIC ,50));
   gImage.drawString("GameOver",200,350);
  }
  gImage.drawString("得分:" + grade,10,100);
  //最后繪制緩沖后的圖片
  g.drawImage(image,0 ,0 , null);
 }
 
 //多線程去控制重新繪制的時間
 private class MyRunning extends Thread{
  @Override
  public void run() {
   while (isRepaint){
    try {
     sleep(100);
     repaint();
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
   }
  }
 }
}

測試類

?
1
2
3
4
5
6
7
8
package planeGame;
 
//測試類
public class Demo {
 public static void main(String[] args) {
  new StartJFrame();//創建開始界面
 }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/weixin_46085748/article/details/115015948

延伸 · 閱讀

精彩推薦
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7472021-02-04
主站蜘蛛池模板: 色综合欧美 | 亚洲高清日本 | 日本高清中文字幕 | 日本少妇一区二区三区 | 欧美日韩免费在线 | 亚洲永久免费视频 | 免费观看黄色大片 | 精品视频在线观看 | 人人射视频 | 欧美久久综合 | 中文字幕一区二区三区四区五区 | 久久久精 | 极品美女销魂一区二区三区 | 日韩精品一区二区三区在线观看视频网站 | 免费成人高清在线视频 | 国产精品久久久久久久7电影 | 狠久久| 欧美激情国产日韩精品一区18 | 另类一区 | a∨色狠狠一区二区三区 | 一级a性色生活片毛片 | 色综合天天综合网国产成人网 | 丝袜久久 | 国产黄a三级三级看三级 | 日韩和的一区二在线 | 91欧美视频在线 | 精品黄色国产 | 龙珠z国语291集普通话 | 毛片网站大全 | 成人免费视频网站在线观看 | 欧美剧场 | 成人aaa| 欧美性一区二区三区 | 欧美成人精品一区二区三区在线看 | 欧美日韩久久久 | 免费看黄色影片 | 91在线观| 国产精品成人一区二区三区夜夜夜 | 国产精品久久久久久久久久久久 | 欧美日韩国产精品 | 国产成人精品一区二区三区福利 |