java模拟一个植物大战僵尸的游戏

本文介绍了如何使用Java Swing创建一个简易的植物大战僵尸游戏,涉及关键组件如GameFrame、MyGamePanel和Plant/Zombies类,展示了游戏面板的绘制与键盘事件监听。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
在这里插入图片描述

package com.test;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;

public class Test02 {
    public static void main(String[] args) {
        new GameFrame();
    }
}

class GameFrame extends JFrame{
    public GameFrame(){
        this.setSize(800,600);
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);
        MyGamePanel myPanel = new MyGamePanel();
        this.addKeyListener(myPanel);
        this.add(myPanel);
        Thread t = new Thread(myPanel);
        t.start();
    }
}

class MyGamePanel extends JPanel implements Runnable,KeyListener{
    private static final String TITLE = "植物大战僵尸";
    private BufferedImage bufferedImage1 = null;
    private BufferedImage bufferedImage2 = null;
    private List<Plant> plants = null;
    private List<Zombies> zombiesList = null;
    private boolean stop;
    public MyGamePanel(){
        this.setBackground(Color.BLACK);
        this.setFont(new Font("微软雅黑",Font.PLAIN,36));
        plants = this.initPlants(5);
        zombiesList = this.initZombies(5);
        File file1 = new File(plants.get(0).PLANT_URL);
        File file2 = new File(zombiesList.get(0).ZOMBIES_URL);
        try {
            bufferedImage1 = ImageIO.read(file1);
            bufferedImage2 = ImageIO.read(file2);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 初始化植物列表
     * @param size
     * @return
     */
    private List<Plant> initPlants(int size){
        List<Plant> plants = new LinkedList<>();
        for (int i = 0; i <size ; i++) {
            Plant plant = new Plant();
            Bullet bullet = new Bullet(100,100*i+45,10,true);
            plant.setBullet(bullet);
            plant.setLive(true);
            plant.setSpeed(0);
            plant.setX(0);
            plant.setY(100*i+20);
            plants.add(plant);
        }
        return plants;
    }

    /**
     * 初始化僵尸列表
     * @param size
     * @return
     */
    private List<Zombies> initZombies(int size){
        List<Zombies> zombiesList = new LinkedList<>();
        for (int i = 0; i <size ; i++) {
            Zombies zombies = new Zombies();
            zombies.setLive(true);
            zombies.setLifeValue(8);
            zombies.setSpeed(1);
            zombies.setX(600);
            zombies.setY(100*i+20);
            zombiesList.add(zombies);
        }
        return zombiesList;
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.drawString(TITLE,250,50);
        g.setColor(Color.GREEN);
        for (int i = 0; i <5 ; i++) {
//            g.drawLine(0,100*i-20,800,100*i-20);
            g.drawImage(bufferedImage1,plants.get(i).getX(),plants.get(i).getY(),null);
            if(zombiesList.get(i).isLive()){
                g.drawImage(bufferedImage2,zombiesList.get(i).getX(),zombiesList.get(i).getY(),null);
            }

            //画子弹
            Bullet bullet = plants.get(i).getBullet();
            if(bullet.isLive()){
                g.fillOval(bullet.getX(),bullet.getY(),20,20);
            }
            if(stop){
                g.drawString("暂停游戏!",300,300);
            }
        }
    }

    @Override
    public void run() {
        while (true){
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            this.updateZombies();
            this.updateBullet();
            this.repaint();
            if(this.stop){
                break;
            }
        }
    }

    public void updateZombies(){
        for(Zombies zombies:zombiesList){
            zombies.setX(zombies.getX()-zombies.getSpeed());
            if(zombies.getLifeValue()==0){
//                zombies.setLive(false);
                zombies.setX(600);
                zombies.setLifeValue(8);
            }
        }
    }

    public void updateBullet(){
        for (int i = 0; i <plants.size() ; i++) {
            Zombies zombies = zombiesList.get(i);
            Bullet bullet = plants.get(i).getBullet();
            bullet.setX(bullet.getX()+bullet.getSpeed());
            if(bullet.getX()> zombies.getX()){
                bullet.setX(100);
                zombies.setLifeValue(zombies.getLifeValue()-1);
            }
            if(bullet.getX()>800){
                bullet.setLive(false);
            }
        }
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {
        System.out.println("监听到按下键盘事件!");
        if(e.getKeyCode()==KeyEvent.VK_ENTER){
            this.stop = true;
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {

    }
}

class Plant{
    final String PLANT_URL = "C:\\Users\\Administrator\\Desktop\\peanut2.png";
    private int x;
    private int y;
    private int speed;
    private boolean isLive;
    private Bullet bullet;
    public boolean isLive() {
        return isLive;
    }
    public void setLive(boolean live) {
        isLive = live;
    }
    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 getSpeed() {
        return speed;
    }

    public void setSpeed(int speed) {
        this.speed = speed;
    }

    public Bullet getBullet() {
        return bullet;
    }

    public void setBullet(Bullet bullet) {
        this.bullet = bullet;
    }
}

class Zombies{
    public  final String ZOMBIES_URL = "C:\\Users\\Administrator\\Desktop\\zombies2.png";
    private boolean isLive;
    private int x;
    private int y;
    private int speed;
    private int lifeValue;

    public boolean isLive() {
        return isLive;
    }

    public void setLive(boolean live) {
        isLive = live;
    }

    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 getSpeed() {
        return speed;
    }

    public void setSpeed(int speed) {
        this.speed = speed;
    }

    public int getLifeValue() {
        return lifeValue;
    }

    public void setLifeValue(int lifeValue) {
        this.lifeValue = lifeValue;
    }
}

class Bullet{
    private int x;
    private int y;
    private int speed;
    private boolean isLive;

    public Bullet(){}
    public Bullet(int x,int y,int speed,boolean isLive){
        this.x = x;
        this.y = y;
        this.speed = speed;
        this.isLive = isLive;
    }
    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 getSpeed() {
        return speed;
    }

    public void setSpeed(int speed) {
        this.speed = speed;
    }

    public boolean isLive() {
        return isLive;
    }

    public void setLive(boolean live) {
        isLive = live;
    }
}


效果演示:
在这里插入图片描述
这里似乎涉及到缓存渲染的问题,导致绘图失败。因为这个程序是在显卡配置比较高的电脑上写的,放到其他电脑上就画不出来了,需要研究下render问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值