java代码实现坦克大战
时间: 2023-10-04 21:13:18 浏览: 109
Java实现坦克大战
以下是Java实现坦克大战的示例代码:
```java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class TankWar extends JFrame implements ActionListener {
private static final long serialVersionUID = 1L;
// 游戏开始按钮
private JButton startButton = new JButton("开始");
// 游戏区域
private GamePanel gamePanel = new GamePanel();
public TankWar() {
// 设置窗口标题
setTitle("坦克大战");
// 设置窗口大小
setSize(800, 600);
// 设置窗口可见性
setVisible(true);
// 设置关闭窗口时退出程序
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 设置布局为边框布局
setLayout(new BorderLayout());
// 将游戏面板添加到窗口中央
add(gamePanel, BorderLayout.CENTER);
// 创建一个面板用于放置游戏开始按钮
JPanel buttonPanel = new JPanel();
// 将开始按钮添加到面板中
buttonPanel.add(startButton);
// 将面板添加到窗口南侧
add(buttonPanel, BorderLayout.SOUTH);
// 注册按钮事件监听器
startButton.addActionListener(this);
}
// 实现按钮事件监听器接口
public void actionPerformed(ActionEvent e) {
if (e.getSource() == startButton) {
// 当点击开始按钮时,开始游戏
gamePanel.startGame();
}
}
public static void main(String[] args) {
new TankWar();
}
}
class GamePanel extends JPanel implements Runnable, KeyListener {
private static final long serialVersionUID = 1L;
// 游戏线程
private Thread gameThread;
// 游戏是否正在进行中的标志
private boolean isRunning = false;
// 玩家坦克的初始位置
private int playerX = 400, playerY = 500;
// 玩家坦克的移动速度
private int playerSpeed = 5;
// 玩家坦克的方向
private int playerDirection = 0;
// 玩家坦克是否在移动中的标志
private boolean isPlayerMoving = false;
// 敌人坦克的列表
private java.util.List<EnemyTank> enemyTanks = new java.util.ArrayList<EnemyTank>();
// 子弹的列表
private java.util.List<Bullet> bullets = new java.util.ArrayList<Bullet>();
public GamePanel() {
// 设置面板可获得焦点
setFocusable(true);
// 注册键盘事件监听器
addKeyListener(this);
}
// 开始游戏
public void startGame() {
// 初始化敌人坦克
for (int i = 0; i < 5; i++) {
enemyTanks.add(new EnemyTank());
}
// 启动游戏线程
gameThread = new Thread(this);
gameThread.start();
}
// 绘制游戏界面
protected void paintComponent(Graphics g) {
super.paintComponent(g);
// 绘制玩家坦克
g.setColor(Color.RED);
g.fillRect(playerX, playerY, 30, 30);
// 绘制敌人坦克
for (EnemyTank enemyTank : enemyTanks) {
g.setColor(Color.GREEN);
g.fillRect(enemyTank.x, enemyTank.y, 30, 30);
}
// 绘制子弹
for (Bullet bullet : bullets) {
g.setColor(Color.BLACK);
g.fillRect(bullet.x, bullet.y, 5, 5);
}
}
// 线程运行方法
public void run() {
// 游戏开始
isRunning = true;
while (isRunning) {
// 玩家坦克移动
if (isPlayerMoving) {
switch (playerDirection) {
case 0:
playerY -= playerSpeed;
break;
case 1:
playerX += playerSpeed;
break;
case 2:
playerY += playerSpeed;
break;
case 3:
playerX -= playerSpeed;
break;
}
}
// 敌人坦克移动
for (EnemyTank enemyTank : enemyTanks) {
enemyTank.move();
}
// 子弹移动
for (Bullet bullet : bullets) {
bullet.move();
// 检测子弹是否击中敌人坦克
for (EnemyTank enemyTank : enemyTanks) {
if (bullet.x >= enemyTank.x && bullet.x <= enemyTank.x + 30 && bullet.y >= enemyTank.y && bullet.y <= enemyTank.y + 30) {
enemyTanks.remove(enemyTank);
bullets.remove(bullet);
break;
}
}
}
// 重绘游戏界面
repaint();
// 等待一段时间
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
// 按下键盘事件处理方法
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_UP:
playerDirection = 0;
isPlayerMoving = true;
break;
case KeyEvent.VK_RIGHT:
playerDirection = 1;
isPlayerMoving = true;
break;
case KeyEvent.VK_DOWN:
playerDirection = 2;
isPlayerMoving = true;
break;
case KeyEvent.VK_LEFT:
playerDirection = 3;
isPlayerMoving = true;
break;
case KeyEvent.VK_SPACE:
// 创建一颗子弹,并将其添加到子弹列表中
bullets.add(new Bullet(playerX + 12, playerY + 12, playerDirection));
break;
}
}
// 松开键盘事件处理方法
public void keyReleased(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_UP:
case KeyEvent.VK_RIGHT:
case KeyEvent.VK_DOWN:
case KeyEvent.VK_LEFT:
isPlayerMoving = false;
break;
}
}
// 忽略键入的字符事件处理方法
public void keyTyped(KeyEvent e) {
}
}
class EnemyTank {
// 坦克位置
public int x, y;
// 坦克方向
public int direction;
// 坦克移动速度
private int speed = 3;
public EnemyTank() {
// 初始化坦克位置
x = (int) (Math.random() * 740);
y = (int) (Math.random() * 500);
// 初始化坦克方向
direction = (int) (Math.random() * 4);
}
// 移动坦克
public void move() {
switch (direction) {
case 0:
y -= speed;
break;
case 1:
x += speed;
break;
case 2:
y += speed;
break;
case 3:
x -= speed;
break;
}
// 如果坦克碰到了边界,则改变方向
if (x < 0 || x > 750 || y < 0 || y > 550) {
direction = (direction + 2) % 4;
}
}
}
class Bullet {
// 子弹位置
public int x, y;
// 子弹方向
public int direction;
// 子弹速度
private int speed = 10;
public Bullet(int x, int y, int direction) {
// 初始化子弹位置和方向
this.x = x;
this.y = y;
this.direction = direction;
}
// 移动子弹
public void move() {
switch (direction) {
case 0:
y -= speed;
break;
case 1:
x += speed;
break;
case 2:
y += speed;
break;
case 3:
x -= speed;
break;
}
}
}
```
这是一个简单的坦克大战实现,玩家可以控制坦克移动和发射子弹,敌人坦克会自动移动。注意,在实际开发中,还需要处理碰撞检测、爆炸效果等功能。
阅读全文