java随机yujie_植物大战僵尸简单版教程java版
作者:叁念
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版相关推荐
- 用Java写一个植物大战僵尸简易版!
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | https://urlify.cn/byeEj ...
- 自己动手制作植物大战僵尸简单修改器(2)
自己动手制作植物大战僵尸简单修改器2 地上物品自动拾取 地上物品自动拾取 上次的内容自己动手制作植物大战僵尸简单修改器 地上物品的地址是 0x006A9EC0 + 0x768 + 0xe4 + 0xd ...
- 自己动手制作植物大战僵尸简单修改器(3)
自己动手制作植物大战僵尸简单修改器3 目的 过程 找到阳光地址 获取修改阳光的指令 找到自动汇编窗口 找到代码注入 改变阳光增量 结果 目的 这一篇并不是制作,改变每一次捡起阳光时阳光增加量. 过程 ...
- 用 Java 写一个植物大战僵尸简易版!
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:2 个月的面试亲身经历告诉大家,如何进入大厂? 有谁没玩过植物大战僵尸吗?一位读者用Java语言开发了自己的植物 ...
- 用 Java 写一个植物大战僵尸简易版
转自:公众号:程序员小灰 作者:林Lychee 前言 有谁没玩过植物大战僵尸吗? 有一位读者,用Java语言开发了自己的植物大战僵尸游戏.虽然系统相对简单,但是麻雀虽小五脏俱全,对游戏开发感兴 ...
- java设计建议植物大战僵尸_基于Java的游戏设计之植物大战僵尸
植物大战僵尸这款游戏相信大家或多或少都玩过,那么大家有没有想过自己尝试着做一下植物大战僵尸的游戏设计呢.本文将基于Java语言为大家展示如何开发出植物大战僵尸游戏的简易版本,主要内容包括规则.对象.功 ...
- 微信公众号开发java流程_微信公众号开发教程java 编程语言的特点及选择
微信公众号开发教程java 编程语言的特点及选择 微信公众号为用户提供了相关的工具,来对微信公众号进行一个简单的开发.但是如果想实现一些复杂的功能,其实还是要借助于一些编程语言的使用.所以要了解,在微 ...
- java植物大战僵尸游戏下载安装_用 Java 写一个植物大战僵尸简易版
植物父类.子弹父类就同理可得了. 上面说到子类共有的方法需要抽到父类中,那么部分子类共有的方法该如何处理呢?比如,豌豆射手.寒冰射手可以发射子弹,坚果墙就没有射击的这个行为.所以这里就需要用到接口(I ...
- java随机加法题_Java简单随机加法算式
package Example; /* 随机产生10以内的两个整数number1和number2,显示算式, 例如"What is 7 plus 9 ?",输入答案后,提示答案是否 ...
最新文章
- 【C++】二叉树的先序、中序、后序遍历序列
- blob 图片_《你不知道的 Blob》番外篇
- 创建一个存储过程,返回指定员工的姓名和薪水
- 在c++中,如果派生类没有重写基类中对应virtual函数会怎样?
- 【数学工具?拉普拉斯机制?随机响应?】差分隐私系统学习记录(二)
- content-providers
- topjui/easyui 表格分页简单实例
- 机器学习数学基础之高数篇——函数极限和导数(python版)
- 2011最全的国内外开源SNS源码大集合
- 【Android】关于ARouter转场动画的问题
- graphpad如何换柱状图与折线图能否混合一起_excel柱状图加折线图组合怎么做,原来是这样的...
- JAVA 配合 Vue前台,完成中文、拼音全拼、拼音首字母检索
- 夏令时-前端要知道的知识
- 国产蓝牙耳机哪款值得入手?高性价比游戏低延迟蓝牙耳机推荐
- 数字证书在web应用中实现登陆
- DNS-域名解析协议
- 请问你知道分布式系统设计模式的最低水位线思想么?
- 客厅风水中钟表的摆设要注意什么?
- WPF TreeView 启动时如何默认选择首个节点
- 云小课|帮您高效快速上传组件至私有依赖库