作者:叁念

1.闲来无事,做了个简单版的植物大战僵尸,不多说直接看效果图:

2.程序的项目结构如下:

3.先上素材

图片素材 链接:https://pan.baidu.com/s/1dGqqIkx 密码:forj

项目源码 链接:https://pan.baidu.com/s/1dHaXVhB 密码:unb4

4.下面贴上代码

MainGame .javaimport javax.swing.JFrame;

import com.yujie.draw.GameDrawPanel;

/**

* 程序主入口

*

* @author yujie

*

*/

public class MainGame {

public static void main(String[] args) {

JFrame jFrame = new JFrame();

jFrame.setBounds(0, 0, 1400, 600);

jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

jFrame.setResizable(false);

GameDrawPanel gameDrawPanel = new GameDrawPanel();

new Thread(gameDrawPanel).start();

jFrame.addMouseListener(gameDrawPanel);

jFrame.addMouseMotionListener(gameDrawPanel);

jFrame.add(gameDrawPanel);

jFrame.setVisible(true);

}

}

GameDrawPanel .javapackage com.yujie.draw;

import java.awt.Color;

import java.awt.Font;

import java.awt.Graphics;

import java.awt.Image;

import java.awt.Point;

import java.awt.Toolkit;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.MouseEvent;

import java.awt.event.MouseListener;

import java.awt.event.MouseMotionListener;

import java.net.URL;

import java.util.ArrayList;

import javax.swing.ImageIcon;

import javax.swing.JButton;

import javax.swing.JPanel;

import javax.swing.Timer;

import com.yujie.Factory.ZombieFactory;

import com.yujie.model.Hammer;

import com.yujie.model.Zombie;

/**

* 游戏绘制面板

*

* @author yujie

*

*/

public class GameDrawPanel extends JPanel implements Runnable, MouseMotionL

e934

istener, MouseListener {

private static final long serialVersionUID = 1L;

private int zombieActionPicNum = 0;// 僵尸动作图片序列号

private static ArrayList zombieList;// 僵尸列表

private Image bgpic = new ImageIcon("img/background.jpg").getImage();// 背景图片

private Hammer hammer = new Hammer();// 锤子

private int score = 0;// 分数

public static boolean isGameStart = true;// 是否正常游戏

public GameDrawPanel() {

// 设置光标隐藏

URL classUrl = this.getClass().getResource("");

Image imageCursor = Toolkit.getDefaultToolkit().getImage(classUrl);

setCursor(Toolkit.getDefaultToolkit().createCustomCursor(imageCursor, new Point(0, 0), "cursor"));

// 初始化一个僵尸链表

zombieList = new ArrayList<>();

new Thread() {// 生产僵尸

@Override

public void run() {

super.run();

zombieList.add(ZombieFactory.getRandomZombie());

System.out.println("加入僵尸");

new Timer((int) (Math.random() * 3) * 1000, new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

zombieList.add(ZombieFactory.getRandomZombie());

}

}).start();

}

}.start();

}

/**

* 绘制游戏

*/

@Override

public void paint(Graphics g) {

super.paint(g);

if (isGameStart) {

// 绘制背景

g.drawImage(bgpic, 0, 0, null);

g.setFont(new Font("heiti ", Font.BOLD, 40));

g.drawString("叁念于2018制作", 600, 300);

// 绘制分数

g.setFont(new Font("heiti ", Font.BOLD, 40));

g.drawString("分数:" + score, 1000, 50);

// 绘制锤子

g.drawImage(hammer.getHammerStyle(), hammer.getX(), hammer.getY(), 60, 100, null);

g.setColor(Color.RED);

g.drawRect(hammer.getX(), hammer.getY(), 50, 50);

// 绘制僵尸

for (Zombie zombie : zombieList) {

g.drawImage(zombie.getZombieStyle().get(zombieActionPicNum), zombie.getX(), zombie.getY(), null);

g.setColor(Color.BLACK);

g.drawRect(zombie.getX(), zombie.getY(), 50, 100);

}

} else {

g.drawImage(bgpic, 0, 0, null);

g.drawImage(hammer.getHammerStyle(), hammer.getX(), hammer.getY(), 60, 100, null);

g.setColor(Color.RED);

g.drawRect(hammer.getX(), hammer.getY(), 50, 50);

g.setFont(new Font("heiti ", Font.BOLD, 60));

g.setColor(Color.red);

g.drawString("Game Over! You score:" + score, 420, 200);

g.fillRect(660, 360, 150, 50);

g.setFont(new Font("heiti ", Font.BOLD, 30));

g.setColor(Color.BLACK);

g.drawString("再来一次?", 665, 400);

}

}

/**

* 数据操控

*/

@Override

public void run() {

while (true) {

// 设置僵尸动作pic

zombieActionPicNum++;

if (zombieActionPicNum > 7)

zombieActionPicNum = 0;

// 设置僵尸移动

for (Zombie zombie : zombieList) {

zombie.setX(zombie.getX() - 5);

repaint();

// 判断游戏是否失败

if (zombie.getX() < 100)

isGameStart = false;

}

try {

// 模拟帧率

Thread.sleep(100);

} catch (InterruptedException e) {

e.printStackTrace();

}

// 重绘

repaint();

}

}

/**

* 鼠标点击

*/

@Override

public void mouseClicked(MouseEvent e) {

for (int i = 0; i < zombieList.size(); i++) {

Zombie zombie = zombieList.get(i);

if (zombie.getX() < hammer.getX() + 40 && zombie.getX() > hammer.getX()

&& zombie.getY() < hammer.getY() + 80 && zombie.getY() > hammer.getY()) {

System.out.println("消灭僵尸");

score += 10;

zombieList.remove(i);

}

}

if (!isGameStart) {

if (hammer.getX() > 660 && hammer.getX() < 810 && hammer.getY() > 360 && hammer.getY() < 510) {

isGameStart = true;

zombieList.removeAll(zombieList);

score = 0;

}

}

}

/**

* 鼠标按下

*/

@Override

public void mousePressed(MouseEvent e) {

hammer.setHammerStyle(new ImageIcon("img/hammer/hammer_down.png").getImage());

repaint();

}

/**

* 鼠标松开

*/

@Override

public void mouseReleased(MouseEvent e) {

hammer.setHammerStyle(new ImageIcon("img/hammer/hammer.png").getImage());

repaint();

}

/**

* 鼠标移动

*/

@Override

public void mouseMoved(MouseEvent e) {

hammer.setX(e.getX() - 30);

hammer.setY(e.getY() - 50);

repaint();

}

/**

* 鼠标进入

*/

@Override

public void mouseEntered(MouseEvent e) {

}

/**

* 鼠标退出

*/

@Override

public void mouseExited(MouseEvent e) {

}

/**

* 鼠标拖动

*/

@Override

public void mouseDragged(MouseEvent e) {

}

}

ZombieFactory .javapackage com.yujie.Factory;

import com.yujie.model.Zombie;

/**

* 僵尸工厂

* @author yujie

*

*/

public class ZombieFactory {

public static final int ZombieNormal = 1;// 普通僵尸

public static final int ZombieBucket = 2;// 铁桶僵尸

public static final int ZombieConehead = 3;// 蠢(圆锥帽)僵尸

/**

* 生产一个指定类型的僵尸

*

* @param type

* 僵尸类型

* @return Zombie

*/

public static Zombie getZombie(int type) {

switch (type) {

case ZombieNormal:

return new com.yujie.model.ZombieNormal();

case ZombieBucket:

return new com.yujie.model.ZombieBucket();

case ZombieConehead:

return new com.yujie.model.ZombieConehead();

}

return null;

}

public static Zombie getRandomZombie() {

int type = (int) (Math.random() * 3) + 1;

return getZombie(type);

}

}

Hammer .javapackage com.yujie.model;

import java.awt.Image;

import javax.swing.ImageIcon;

/**

* 锤子

*

* @author yujie

*

*/

public class Hammer {

private int x = 600;

private int y = 300;

private Image hammerStyle;

public Hammer() {

this.x = 600;

this.y = 300;

this.hammerStyle = new ImageIcon("img/hammer/hammer.png").getImage();

}

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 Image getHammerStyle() {

return hammerStyle;

}

public void setHammerStyle(Image hammerStyle) {

this.hammerStyle = hammerStyle;

}

}

Zombie .javapackage com.yujie.model;

import java.awt.Image;

import java.util.ArrayList;

import java.util.LinkedList;

/**

* 僵尸抽象类

* @author yujie

*

*/

public abstract class Zombie {

private int x = 1420;

private int y = (int) (Math.random() * 5) * 110;

LinkedList ZombieStyle = new LinkedList<>();

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 LinkedList getZombieStyle() {

return ZombieStyle;

}

public void setZombieStyle(LinkedList zombieStyle) {

ZombieStyle = zombieStyle;

}

}

ZombieBucket .javapackage com.yujie.model;

import javax.swing.ImageIcon;

/**

* 铁桶僵尸

* @author yujie

*

*/

public class ZombieBucket extends Zombie {

public ZombieBucket() {

super();

for (int i = 1; i < 9; i++) {

getZombieStyle().add(new ImageIcon("img/zombie_bucket/z_02_0" + i + ".png").getImage());

}

}

}

ZombieConehead .javapackage com.yujie.model;

import javax.swing.ImageIcon;

/**

* 垃圾桶僵尸

* @author yujie

*

*/

public class ZombieConehead extends Zombie {

public ZombieConehead() {

super();

for (int i = 1; i < 9; i++) {

getZombieStyle().add(new ImageIcon("img/zombie_conehead/z_01_0" + i + ".png").getImage());

}

}

}

ZombieNormal .javapackage com.yujie.model;

import javax.swing.ImageIcon;

/**

* 普通僵尸

*

* @author yujie

*

*/

public class ZombieNormal extends Zombie {

public ZombieNormal() {

super();

for (int i = 1; i < 9; i++) {

getZombieStyle().add(new ImageIcon("img/zombie_normal/z_00_0" + i + ".png").getImage());

}

}

}

java随机yujie_植物大战僵尸简单版教程java版相关推荐

  1. 用Java写一个植物大战僵尸简易版!

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | https://urlify.cn/byeEj ...

  2. 自己动手制作植物大战僵尸简单修改器(2)

    自己动手制作植物大战僵尸简单修改器2 地上物品自动拾取 地上物品自动拾取 上次的内容自己动手制作植物大战僵尸简单修改器 地上物品的地址是 0x006A9EC0 + 0x768 + 0xe4 + 0xd ...

  3. 自己动手制作植物大战僵尸简单修改器(3)

    自己动手制作植物大战僵尸简单修改器3 目的 过程 找到阳光地址 获取修改阳光的指令 找到自动汇编窗口 找到代码注入 改变阳光增量 结果 目的 这一篇并不是制作,改变每一次捡起阳光时阳光增加量. 过程 ...

  4. 用 Java 写一个植物大战僵尸简易版!

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:2 个月的面试亲身经历告诉大家,如何进入大厂? 有谁没玩过植物大战僵尸吗?一位读者用Java语言开发了自己的植物 ...

  5. 用 Java 写一个植物大战僵尸简易版

    转自:公众号:程序员小灰     作者:林Lychee 前言 有谁没玩过植物大战僵尸吗? 有一位读者,用Java语言开发了自己的植物大战僵尸游戏.虽然系统相对简单,但是麻雀虽小五脏俱全,对游戏开发感兴 ...

  6. java设计建议植物大战僵尸_基于Java的游戏设计之植物大战僵尸

    植物大战僵尸这款游戏相信大家或多或少都玩过,那么大家有没有想过自己尝试着做一下植物大战僵尸的游戏设计呢.本文将基于Java语言为大家展示如何开发出植物大战僵尸游戏的简易版本,主要内容包括规则.对象.功 ...

  7. 微信公众号开发java流程_微信公众号开发教程java 编程语言的特点及选择

    微信公众号开发教程java 编程语言的特点及选择 微信公众号为用户提供了相关的工具,来对微信公众号进行一个简单的开发.但是如果想实现一些复杂的功能,其实还是要借助于一些编程语言的使用.所以要了解,在微 ...

  8. java植物大战僵尸游戏下载安装_用 Java 写一个植物大战僵尸简易版

    植物父类.子弹父类就同理可得了. 上面说到子类共有的方法需要抽到父类中,那么部分子类共有的方法该如何处理呢?比如,豌豆射手.寒冰射手可以发射子弹,坚果墙就没有射击的这个行为.所以这里就需要用到接口(I ...

  9. java随机加法题_Java简单随机加法算式

    package Example; /* 随机产生10以内的两个整数number1和number2,显示算式, 例如"What is 7 plus 9 ?",输入答案后,提示答案是否 ...

最新文章

  1. 【C++】二叉树的先序、中序、后序遍历序列
  2. blob 图片_《你不知道的 Blob》番外篇
  3. 创建一个存储过程,返回指定员工的姓名和薪水
  4. 在c++中,如果派生类没有重写基类中对应virtual函数会怎样?
  5. 【数学工具?拉普拉斯机制?随机响应?】差分隐私系统学习记录(二)
  6. content-providers
  7. topjui/easyui 表格分页简单实例
  8. 机器学习数学基础之高数篇——函数极限和导数(python版)
  9. 2011最全的国内外开源SNS源码大集合
  10. 【Android】关于ARouter转场动画的问题
  11. graphpad如何换柱状图与折线图能否混合一起_excel柱状图加折线图组合怎么做,原来是这样的...
  12. JAVA 配合 Vue前台,完成中文、拼音全拼、拼音首字母检索
  13. 夏令时-前端要知道的知识
  14. 国产蓝牙耳机哪款值得入手?高性价比游戏低延迟蓝牙耳机推荐
  15. 数字证书在web应用中实现登陆
  16. DNS-域名解析协议
  17. 请问你知道分布式系统设计模式的最低水位线思想么?
  18. 客厅风水中钟表的摆设要注意什么?
  19. WPF TreeView 启动时如何默认选择首个节点
  20. 云小课|帮您高效快速上传组件至私有依赖库

热门文章

  1. 前端程序员的职业发展规划与路线——ChatGPT的回答
  2. 2013年3月张家界自助游个人经验分享
  3. 科大讯飞:我们和华为基因相似,板凳能坐十年冷,如今向C端强劲发力
  4. Android与JSP javaweb交互参考文章
  5. 计数计量单位KMGTPEZY【计算机】【天文】
  6. 一个刚开的新店是如何借力空手套白狼,快速赚大钱
  7. bash有意思的记录
  8. 《仙剑奇侠传3》流程攻略3
  9. 创业是不是很难,假如只有500块如何创业?
  10. POJ 3618 Exploration