盘基地资源论坛

 找回密码
 立即注册
搜索
热搜: 书籍 电影 音乐
莆田鞋
查看: 217|回复: 0

Java坦克大战代码

[复制链接]

966

主题

155

回帖

4384

积分

中级会员

Rank: 3Rank: 3

UID
32013
金钱
3256
钻石
7
积分
4384
注册时间
2023-7-27
发表于 2024-6-23 17:05:33 | 显示全部楼层 |阅读模式

  1. import java.awt.Color;
  2. import java.awt.Graphics;
  3. import java.awt.event.KeyAdapter;
  4. import java.awt.event.KeyEvent;
  5. import java.util.ArrayList;
  6. import java.util.Iterator;
  7. import java.util.List;
  8. import java.util.Random;
  9. import javax.swing.JFrame;
  10. import javax.swing.JPanel;

  11. public class TankMovementWithKeysAndBullets extends JPanel {

  12.     private int x = 175;
  13.     private int y = 340;
  14.     private static final int TANK_WIDTH = 30;
  15.     private static final int TANK_HEIGHT = 15;
  16.     private static final int MOVE_DISTANCE = 5;

  17.     private static final int CANNON_HEIGHT = 10;
  18.     private static final int WHEEL_DIAMETER = 10;

  19.     private List<Bullet> bullets = new ArrayList<>();
  20.     private List<EnemyTank> enemyTanks = new ArrayList<>();
  21.     private boolean spacePressed = false;
  22.     private int cannonDirection = 0; // 0: up, 1: right, 2: down, 3: left
  23.     private int enemiesDefeated = 0;

  24.     public TankMovementWithKeysAndBullets() {
  25.         addKeyListener(new KeyAdapter() {
  26.             @Override
  27.             public void keyPressed(KeyEvent e) {
  28.                 handleKeyPress(e.getKeyCode());
  29.                 repaint();
  30.             }

  31.             @Override
  32.             public void keyReleased(KeyEvent e) {
  33.                 if (e.getKeyCode() == KeyEvent.VK_SPACE) {
  34.                     spacePressed = false;
  35.                 }
  36.             }
  37.         });
  38.         setFocusable(true);

  39.         new Thread(() -> {
  40.             Random rand = new Random();
  41.             while (true) {
  42.                 if (rand.nextInt(100) < 2 && enemyTanks.size() < 30) { // 2% chance to spawn an enemy tank, max 30
  43.                     int side = rand.nextInt(4);
  44.                     int enemyX = 0, enemyY = 0;
  45.                     switch (side) {
  46.                         case 0: // top
  47.                             enemyX = rand.nextInt(getWidth());
  48.                             enemyY = 0;
  49.                             break;
  50.                         case 1: // right
  51.                             enemyX = getWidth();
  52.                             enemyY = rand.nextInt(getHeight());
  53.                             break;
  54.                         case 2: // bottom
  55.                             enemyX = rand.nextInt(getWidth());
  56.                             enemyY = getHeight();
  57.                             break;
  58.                         case 3: // left
  59.                             enemyX = 0;
  60.                             enemyY = rand.nextInt(getHeight());
  61.                             break;
  62.                     }
  63.                     enemyTanks.add(new EnemyTank(enemyX, enemyY, rand.nextInt(4), new Color(rand.nextInt(256), rand.nextInt(256), rand.nextInt(256))));
  64.                 }
  65.                 moveAndRemoveBullets();
  66.                 moveEnemyTanks();
  67.                 checkBulletCollisions();
  68.                 repaint();
  69.                 try {
  70.                     Thread.sleep(10);
  71.                 } catch (InterruptedException e) {
  72.                     e.printStackTrace();
  73.                 }
  74.             }
  75.         }).start();
  76.     }

  77.     private void handleKeyPress(int keyCode) {
  78.         switch (keyCode) {
  79.             case KeyEvent.VK_UP:
  80.                 if (y - MOVE_DISTANCE >= CANNON_HEIGHT) {
  81.                     y -= MOVE_DISTANCE;
  82.                 }
  83.                 cannonDirection = 0;
  84.                 break;
  85.             case KeyEvent.VK_DOWN:
  86.                 if (y + MOVE_DISTANCE <= getHeight() - TANK_HEIGHT - WHEEL_DIAMETER / 2) {
  87.                     y += MOVE_DISTANCE;
  88.                 }
  89.                 cannonDirection = 2;
  90.                 break;
  91.             case KeyEvent.VK_LEFT:
  92.                 if (x - MOVE_DISTANCE >= WHEEL_DIAMETER / 2) {
  93.                     x -= MOVE_DISTANCE;
  94.                 }
  95.                 cannonDirection = 3;
  96.                 break;
  97.             case KeyEvent.VK_RIGHT:
  98.                 if (x + MOVE_DISTANCE <= getWidth() - TANK_WIDTH - WHEEL_DIAMETER / 2) {
  99.                     x += MOVE_DISTANCE;
  100.                 }
  101.                 cannonDirection = 1;
  102.                 break;
  103.             case KeyEvent.VK_SPACE:
  104.                 if (!spacePressed) {
  105.                     int bulletX = x + TANK_WIDTH / 2;
  106.                     int bulletY = y - CANNON_HEIGHT;
  107.                     switch (cannonDirection) {
  108.                         case 0: // up
  109.                             bulletY = y - CANNON_HEIGHT;
  110.                             break;
  111.                         case 1: // right
  112.                             bulletX = x + TANK_WIDTH;
  113.                             bulletY = y + TANK_HEIGHT / 2;
  114.                             break;
  115.                         case 2: // down
  116.                             bulletX = x + TANK_WIDTH / 2;
  117.                             bulletY = y + TANK_HEIGHT;
  118.                             break;
  119.                         case 3: // left
  120.                             bulletX = x - CANNON_HEIGHT;
  121.                             bulletY = y + TANK_HEIGHT / 2;
  122.                             break;
  123.                     }
  124.                     bullets.add(new Bullet(bulletX, bulletY, cannonDirection));
  125.                     spacePressed = true;
  126.                 }
  127.                 break;
  128.         }
  129.     }

  130.     @Override
  131.     protected void paintComponent(Graphics g) {
  132.         super.paintComponent(g);
  133.         drawTank(g, x, y);
  134.         for (Bullet bullet : bullets) {
  135.             bullet.draw(g);
  136.         }
  137.         for (EnemyTank enemy : enemyTanks) {
  138.             enemy.draw(g);
  139.             for (Bullet enemyBullet : enemy.getBullets()) {
  140.                 enemyBullet.draw(g);
  141.             }
  142.         }
  143.         g.setColor(Color.BLACK);
  144.         g.drawString("Enemies Defeated: " + enemiesDefeated, 10, 20);
  145.     }

  146.     private void drawTank(Graphics g, int x, int y) {
  147.         g.setColor(Color.YELLOW);
  148.         g.fillRect(x, y, TANK_WIDTH, TANK_HEIGHT);
  149.         g.setColor(Color.BLACK);
  150.         switch (cannonDirection) {
  151.             case 0: // up
  152.                 g.fillRect(x + (TANK_WIDTH / 2) - 2, y - CANNON_HEIGHT, 4, CANNON_HEIGHT);
  153.                 break;
  154.             case 1: // right
  155.                 g.fillRect(x + TANK_WIDTH, y + (TANK_HEIGHT / 2) - 2, CANNON_HEIGHT, 4);
  156.                 break;
  157.             case 2: // down
  158.                 g.fillRect(x + (TANK_WIDTH / 2) - 2, y + TANK_HEIGHT, 4, CANNON_HEIGHT);
  159.                 break;
  160.             case 3: // left
  161.                 g.fillRect(x - CANNON_HEIGHT, y + (TANK_HEIGHT / 2) - 2, CANNON_HEIGHT, 4);
  162.                 break;
  163.         }
  164.         g.fillOval(x - WHEEL_DIAMETER / 2, y + TANK_HEIGHT - WHEEL_DIAMETER / 2, WHEEL_DIAMETER, WHEEL_DIAMETER);
  165.         g.fillOval(x + TANK_WIDTH - WHEEL_DIAMETER / 2, y + TANK_HEIGHT - WHEEL_DIAMETER / 2, WHEEL_DIAMETER, WHEEL_DIAMETER);
  166.     }

  167.     private void moveAndRemoveBullets() {
  168.         for (Bullet bullet : bullets) {
  169.             bullet.move();
  170.         }
  171.         bullets.removeIf(bullet -> bullet.getY() < 0 || bullet.getY() > getHeight() || bullet.getX() < 0 || bullet.getX() > getWidth());
  172.         for (EnemyTank enemy : enemyTanks) {
  173.             for (Bullet enemyBullet : enemy.getBullets()) {
  174.                 enemyBullet.move();
  175.             }
  176.             enemy.getBullets().removeIf(bullet -> bullet.getY() < 0 || bullet.getY() > getHeight() || bullet.getX() < 0 || bullet.getX() > getWidth());
  177.         }
  178.     }

  179.     private void moveEnemyTanks() {
  180.         for (EnemyTank enemy : enemyTanks) {
  181.             enemy.move(enemyTanks);
  182.             if (new Random().nextInt(100) < 1) { // 1% chance to shoot
  183.                 enemy.shoot();
  184.             }
  185.         }
  186.         enemyTanks.removeIf(enemy -> enemy.getX() < 0 || enemy.getX() > getWidth() || enemy.getY() < 0 || enemy.getY() > getHeight());
  187.     }

  188.     private void checkBulletCollisions() {
  189.         Iterator<Bullet> bulletIterator = bullets.iterator();
  190.         while (bulletIterator.hasNext()) {
  191.             Bullet bullet = bulletIterator.next();
  192.             Iterator<EnemyTank> enemyIterator = enemyTanks.iterator();
  193.             while (enemyIterator.hasNext()) {
  194.                 EnemyTank enemy = enemyIterator.next();
  195.                 if (bullet.getX() >= enemy.getX() && bullet.getX() <= enemy.getX() + EnemyTank.ENEMY_TANK_WIDTH &&
  196.                     bullet.getY() >= enemy.getY() && bullet.getY() <= enemy.getY() + EnemyTank.ENEMY_TANK_HEIGHT) {
  197.                     enemyIterator.remove();
  198.                     bulletIterator.remove();
  199.                     enemiesDefeated++;
  200.                     break; // Exit the inner loop after removing the enemy tank
  201.                 }
  202.             }
  203.         }
  204.     }

  205.     private class Bullet {
  206.         private int x;
  207.         private int y;
  208.         private int direction;
  209.         private static final int BULLET_SIZE = 3;
  210.         private static final int BULLET_SPEED = 5;

  211.         public Bullet(int x, int y, int direction) {
  212.             this.x = x;
  213.             this.y = y;
  214.             this.direction = direction;
  215.         }

  216.         public int getX() {
  217.             return x;
  218.         }

  219.         public int getY() {
  220.             return y;
  221.         }

  222.         public void move() {
  223.             switch (direction) {
  224.                 case 0: // up
  225.                     y -= BULLET_SPEED;
  226.                     break;
  227.                 case 1: // right
  228.                     x += BULLET_SPEED;
  229.                     break;
  230.                 case 2: // down
  231.                     y += BULLET_SPEED;
  232.                     break;
  233.                 case 3: // left
  234.                     x -= BULLET_SPEED;
  235.                     break;
  236.             }
  237.         }

  238.         public void draw(Graphics g) {
  239.             g.setColor(Color.RED);
  240.             g.fillOval(x - BULLET_SIZE / 2, y - BULLET_SIZE / 2, BULLET_SIZE, BULLET_SIZE);
  241.         }
  242.     }

  243.     private class EnemyTank {
  244.         private int x;
  245.         private int y;
  246.         private int direction;
  247.         private Color color;
  248.         private static final int ENEMY_TANK_WIDTH = 30;
  249.         private static final int ENEMY_TANK_HEIGHT = 15;
  250.         private static final int ENEMY_MOVE_DISTANCE = 2;
  251.         private List<Bullet> bullets = new ArrayList<>();

  252.         public EnemyTank(int x, int y, int direction, Color color) {
  253.             this.x = x;
  254.             this.y = y;
  255.             this.direction = direction;
  256.             this.color = color;
  257.         }

  258.         public int getX() {
  259.             return x;
  260.         }

  261.         public int getY() {
  262.             return y;
  263.         }

  264.         public List<Bullet> getBullets() {
  265.             return bullets;
  266.         }

  267.         public void move(List<EnemyTank> enemyTanks) {
  268.             int newX = x;
  269.             int newY = y;
  270.             switch (direction) {
  271.                 case 0: // up
  272.                     newY -= ENEMY_MOVE_DISTANCE;
  273.                     break;
  274.                 case 1: // right
  275.                     newX += ENEMY_MOVE_DISTANCE;
  276.                     break;
  277.                 case 2: // down
  278.                     newY += ENEMY_MOVE_DISTANCE;
  279.                     break;
  280.                 case 3: // left
  281.                     newX -= ENEMY_MOVE_DISTANCE;
  282.                     break;
  283.             }

  284.             boolean collision = false;
  285.             for (EnemyTank other : enemyTanks) {
  286.                 if (other != this && newX < other.getX() + ENEMY_TANK_WIDTH && newX + ENEMY_TANK_WIDTH > other.getX() &&
  287.                     newY < other.getY() + ENEMY_TANK_HEIGHT && newY + ENEMY_TANK_HEIGHT > other.getY()) {
  288.                     collision = true;
  289.                     break;
  290.                 }
  291.             }

  292.             if (!collision) {
  293.                 x = newX;
  294.                 y = newY;
  295.             } else {
  296.                 direction = new Random().nextInt(4); // 重新选择路线
  297.             }
  298.         }

  299.         public void shoot() {
  300.             int bulletX = x + ENEMY_TANK_WIDTH / 2;
  301.             int bulletY = y - CANNON_HEIGHT;
  302.             switch (direction) {
  303.                 case 0: // up
  304.                     bulletY = y - CANNON_HEIGHT;
  305.                     break;
  306.                 case 1: // right
  307.                     bulletX = x + ENEMY_TANK_WIDTH;
  308.                     bulletY = y + ENEMY_TANK_HEIGHT / 2;
  309.                     break;
  310.                 case 2: // down
  311.                     bulletX = x + ENEMY_TANK_WIDTH / 2;
  312.                     bulletY = y + ENEMY_TANK_HEIGHT;
  313.                     break;
  314.                 case 3: // left
  315.                     bulletX = x - CANNON_HEIGHT;
  316.                     bulletY = y + ENEMY_TANK_HEIGHT / 2;
  317.                     break;
  318.             }
  319.             bullets.add(new Bullet(bulletX, bulletY, direction));
  320.         }

  321.         public void draw(Graphics g) {
  322.             g.setColor(color);
  323.             g.fillRect(x, y, ENEMY_TANK_WIDTH, ENEMY_TANK_HEIGHT);
  324.             g.setColor(Color.BLACK);
  325.             switch (direction) {
  326.                 case 0: // up
  327.                     g.fillRect(x + (ENEMY_TANK_WIDTH / 2) - 2, y - CANNON_HEIGHT, 4, CANNON_HEIGHT);
  328.                     break;
  329.                 case 1: // right
  330.                     g.fillRect(x + ENEMY_TANK_WIDTH, y + (ENEMY_TANK_HEIGHT / 2) - 2, CANNON_HEIGHT, 4);
  331.                     break;
  332.                 case 2: // down
  333.                     g.fillRect(x + (ENEMY_TANK_WIDTH / 2) - 2, y + ENEMY_TANK_HEIGHT, 4, CANNON_HEIGHT);
  334.                     break;
  335.                 case 3: // left
  336.                     g.fillRect(x - CANNON_HEIGHT, y + (ENEMY_TANK_HEIGHT / 2) - 2, CANNON_HEIGHT, 4);
  337.                     break;
  338.             }
  339.             g.fillOval(x - WHEEL_DIAMETER / 2, y + ENEMY_TANK_HEIGHT - WHEEL_DIAMETER / 2, WHEEL_DIAMETER, WHEEL_DIAMETER);
  340.             g.fillOval(x + ENEMY_TANK_WIDTH - WHEEL_DIAMETER / 2, y + ENEMY_TANK_HEIGHT - WHEEL_DIAMETER / 2, WHEEL_DIAMETER, WHEEL_DIAMETER);
  341.         }
  342.     }

  343.     public static void main(String[] args) {
  344.         JFrame frame = new JFrame("可通过方向键移动且发射子弹的坦克");
  345.         TankMovementWithKeysAndBullets panel = new TankMovementWithKeysAndBullets();

  346.         frame.add(panel);
  347.         frame.setSize(400, 400);
  348.         frame.setVisible(true);
  349.         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  350.         panel.requestFocusInWindow();
  351.     }
  352. }
复制代码


盘基地论坛免责声明
1、本站资源来自互联网用户收集发布,仅供用于学习和交流。
2、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。
3、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决。
4、联系邮箱:admin@panjdzy.com
5、官方网址:www.panjdzy.com
6、备用网址:www.panjd.top




上一篇:一根万能角钢重 5kg,长 2 米,求其单位长度的质量。
下一篇:JavaFX SDK相关配置
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|盘基地资源论坛

GMT+8, 2024-9-8 09:53

Powered by Discuz!    联系邮箱:admin@panjdzy.com

本站资源来自互联网用户收集发布,仅供用于学习和交流。

如有侵权之处,请联系站长并出示版权证明以便删除,敬请谅解!

本站由慈云安全系统提供加速防御支持

快速回复 返回顶部 返回列表