做的一个植物大战僵尸的模拟游戏 锤子锤僵尸版本
知识点
1 抽象类的使用 写出抽象僵尸类 为了是创建抽象僵尸类的数组并且可以往里面放不同子类的僵尸。很方便, 里面有blood和speed两个属性 是定义的整合
属性要定义在抽象类里面 对于Zombie a = new ZombieCore(); 要理解好。a不能饿调用子类的方法。要用父类的方法 ?
package com.g.obj;
import java.awt.Image;
//僵尸父类 抽象类 不存在 定义整合
public abstract class Zombies {
public int blood;
public int speed; //???????
public int x;
public int y;
public int kind;
public Image zombiesImage;
public abstract void getXY();
// public abstract void getBloodSpeed();
public abstract Image getImageZombies(int num);
}
2 3种僵尸
知识点 如何获取随机位置 int location = (int) (Math.random() * 5);
location 随机为1 2 3 4 5; 很好用
package com.g.obj;
import java.awt.Image;
import javax.swing.ImageIcon;
public class ZombieBuket extends Zombies{
// public int blood;
// public int speed;
//
public ZombieBuket(){
getXY();
getImageZombies(1);
System.out.println("构造方法 Blood" + blood);
}
public Image getImageZombies(int num){
zombiesImage = new ImageIcon("image/zombie_bucket/z_02_0" + num +".png").getImage();
return zombiesImage;
}
public void getXY(){
kind = 5;
blood = 5;
speed = 5;
System.out.println("getXY");
int location = (int) (Math.random() * 5);
switch (location) {
case 0: x = (int) (Math.random()*500 + 730); y = 30;
break;
case 1:
x = (int) (Math.random()*500 + 730); y = 130;
break;
case 2:
x = (int) (Math.random()*500 + 730);; y = 230;
break;
case 3:
x = (int) (Math.random()*500 + 730); y = 330;
break;
case 4:
x = (int) (Math.random()*500 + 730);y = 430;
break;
}
}
}
package com.g.obj;
import java.awt.Image;
import javax.swing.ImageIcon;
public class ZombieCone extends Zombies{
public ZombieCone() {
// TODO Auto-generated constructor stub
// this.speed = 3;
// this.blood = 3;
getXY();
getImageZombies(1);
}
public Image getImageZombies(int num){
zombiesImage = new ImageIcon("image/zombie_conehead/z_01_0" + num +".png").getImage();
return zombiesImage;
}
public void getXY(){
int kind = 3;
this.speed = 3;
this.blood = 3;
int location = (int) (Math.random() * 5);
switch (location) {
case 0: x = (int) (Math.random()*500 + 730); y = 30;
break;
case 1:
x = (int) (Math.random()*500 + 730); y = 130;
break;
case 2:
x = (int) (Math.random()*500 + 730);; y = 230;
break;
case 3:
x = (int) (Math.random()*500 + 730); y = 330;
break;
case 4:
x = (int) (Math.random()*500 + 730);y = 430;
break;
}
}
}
package com.g.obj;
import java.awt.Image;
import javax.swing.ImageIcon;
import javax.xml.xpath.XPath;
public class ZombieNormal extends Zombies{
// public int blood;
// public int speed;
public ZombieNormal() {
// TODO Auto-generated constructor stub
getXY();
getImageZombies(1);
}
public Image getImageZombies(int num){
zombiesImage = new ImageIcon("image/zombie_normal/z_00_0" + num +".png").getImage();
return zombiesImage;
}
public void getXY(){
blood = 1;
speed = 1;
kind = 1;
int location = (int) (Math.random() * 5);
switch (location) {
case 0:
x = (int) (Math.random()*500 + 730); y = 30;
break;
case 1:
x = (int) (Math.random()*500 + 730); y = 130;
break;
case 2:
x = (int) (Math.random()*500 + 730);; y = 230;
break;
case 3:
x = (int) (Math.random()*500 + 730); y = 330;
break;
case 4:
x = (int) (Math.random()*500 + 730);y = 430;
break;
}
}
}
画板Jframe
package com.g.ui;
import java.awt.Panel;
import javax.swing.JFrame;
public class MyFrame extends JFrame{
MyFrame p;
MyPanel m;
public MyFrame() {
// TODO Auto-generated constructor stub
super("植物大战2");//wrong
m = new MyPanel();
add(m);
addMouseListener(m);
addMouseMotionListener(m);
m.startGame();
}
public void showMe(){
setSize(800, 600);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
new MyFrame().showMe();
}
}
package com.g.ui;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.xml.xpath.XPath;
import com.g.obj.ZombieBuket;
import com.g.obj.ZombieCone;
import com.g.obj.ZombieNormal;
import com.g.obj.Zombies;
public class MyPanel extends JPanel implements Runnable, MouseMotionListener, MouseListener{
Image bg;
Image cz;
Image cz_down;
Zombies[] zb;
int numz;//僵尸的个数
int numc;//僵尸是第几张图片
int grade;
int xHammer;
int yHammer;
boolean tagHammerDown = false;
public MyPanel() {
// TODO Auto-generated constructor stub
grade = 0;
numc = 1;
//这边为什么?
bg = new ImageIcon("image/background1.jpg").getImage();
numz = 50;
zb = new Zombies[numz];
cz = new ImageIcon("image/hammer.png").getImage();
cz_down = new ImageIcon("image/hammer_down").getImage();
for(int i = 0; i < numz; i++){
int location = (int) (Math.random()*3);
switch (location) {
case 0:
zb[i] = new ZombieNormal();
// zb[i].getXY();
break;
case 1:
zb[i] = new ZombieBuket();
//zb[i].getXY();
break;
case 2:
zb[i] = new ZombieCone();
//zb[i].getXY();
break;
}
System.out.println("MyPanel" + zb[i].blood);
}
}
@Override
public void paint(Graphics g) {
super.paint(g);
g.setColor(Color.blue);
g.setFont(new Font("微软雅黑", Font.BOLD, 50));
g.drawString("你的积分"+ grade, 50, 50);
if(grade < 10)
g.drawString("菜鸟" , 80,80);
else if(grade <20){
g.drawString("高手", 80, 80);
}
else {
g.drawString("笨蛋 僵尸是打不完的", 80, 80);
}
for(int i = 0; i < numz; i++){
//System.out.println("zb[i].x" + zb[i].x);
// System.out.println("zb[i].x" + zb[i].y);
g.drawImage(zb[i].getImageZombies(numc), zb[i].x, zb[i].y, null);
// System.out.println("INPAInt"+ zb[i].blood);
}
g.drawImage(cz, xHammer, yHammer, 60, 60, null);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponents(g);
g.drawImage(bg, 0, 0, getWidth(), getHeight(), null);
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("mouseEntered");
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
xHammer = e.getX();
yHammer = e.getY();
// tagHammerDown = true;
cz = new ImageIcon("image/hammer_down.png").getImage();
System.out.println("mousePressed");
tagHammerDown = true;
xHammer = e.getX() -30;
yHammer = e.getY() - 30;
for (int i = 0; i < numz; i++) {
if(xHammer > zb[i].x && xHammer <zb[i].x + 100
&&yHammer > zb[i].y && yHammer < zb[i].y + 100 && tagHammerDown){
zb[i].blood--;
// ``````System.out.println("之前的" + zb[i].blood);
if(zb[i].kind == 5 && zb[i].blood == 0){
System.out.println("之后的" + zb[i].blood);
grade+=3;
System.out.println("gradeBucket->>"+ grade);
}
if(zb[i].kind == 3 && zb[i].blood == 0){
grade+=2;
System.out.println("gradeCone->>"+ grade);
}
System.out.println("zb[i].blood"+ zb[i].blood);
if(zb[i].blood == 0){
grade++;
System.out.println("blood"+zb[i].blood);
System.out.println("gradeNormal->>" + grade);
if(zb[i].blood == 0){
zb[i].x = (int) (Math.random()*500 + 700);
if(zb[i].kind == 5)
zb[i].blood =5;
else if(zb[i].kind == 3){
zb[i].blood = 3;
}
else
zb[i].blood = 1;
}
}
break;//敲一个僵尸
}
}
repaint();
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
cz = new ImageIcon("image/hammer.png").getImage();
System.out.println("mouseReleased");
tagHammerDown = false;
}
@Override
public void mouseDragged(MouseEvent arg0) {
// TODO Auto-generated method stub
// System.out.println("mouseDragged");
}
@Override
public void mouseMoved(MouseEvent e) {
// TODO Auto-generated method stub
// System.out.println("mouseMoved");
xHammer = e.getX() - 30;
yHammer = e.getY() - 30;
// tagHammerDown = true;
cz = new ImageIcon("image/hammer.png").getImage();
repaint();
}
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for (int i = 0; i < numz; i++) {
zb[i].x-= 5;
//更换图片
numc++;
if(numc == 8)
numc =1;
if(zb[i].x < 0){
zb[i].x = (int) (Math.random()*500 + 730);
}
}
repaint();
}
}
//游戏启动
public void startGame() {
// TODO Auto-generated method stub
Thread thread = new Thread(this);
thread.start();
}
}
坐标的更改在线程中 在mousePressed中来处理血量的问题
知识点
1 抽象类的使用 写出抽象僵尸类 为了是创建抽象僵尸类的数组并且可以往里面放不同子类的僵尸。很方便, 里面有blood和speed两个属性 是定义的整合
属性要定义在抽象类里面 对于Zombie a = new ZombieCore(); 要理解好。a不能饿调用子类的方法。要用父类的方法 ?
package com.g.obj;
import java.awt.Image;
//僵尸父类 抽象类 不存在 定义整合
public abstract class Zombies {
public int blood;
public int speed; //???????
public int x;
public int y;
public int kind;
public Image zombiesImage;
public abstract void getXY();
// public abstract void getBloodSpeed();
public abstract Image getImageZombies(int num);
}
2 3种僵尸
知识点 如何获取随机位置 int location = (int) (Math.random() * 5);
location 随机为1 2 3 4 5; 很好用
package com.g.obj;
import java.awt.Image;
import javax.swing.ImageIcon;
public class ZombieBuket extends Zombies{
// public int blood;
// public int speed;
//
public ZombieBuket(){
getXY();
getImageZombies(1);
System.out.println("构造方法 Blood" + blood);
}
public Image getImageZombies(int num){
zombiesImage = new ImageIcon("image/zombie_bucket/z_02_0" + num +".png").getImage();
return zombiesImage;
}
public void getXY(){
kind = 5;
blood = 5;
speed = 5;
System.out.println("getXY");
int location = (int) (Math.random() * 5);
switch (location) {
case 0: x = (int) (Math.random()*500 + 730); y = 30;
break;
case 1:
x = (int) (Math.random()*500 + 730); y = 130;
break;
case 2:
x = (int) (Math.random()*500 + 730);; y = 230;
break;
case 3:
x = (int) (Math.random()*500 + 730); y = 330;
break;
case 4:
x = (int) (Math.random()*500 + 730);y = 430;
break;
}
}
}
package com.g.obj;
import java.awt.Image;
import javax.swing.ImageIcon;
public class ZombieCone extends Zombies{
public ZombieCone() {
// TODO Auto-generated constructor stub
// this.speed = 3;
// this.blood = 3;
getXY();
getImageZombies(1);
}
public Image getImageZombies(int num){
zombiesImage = new ImageIcon("image/zombie_conehead/z_01_0" + num +".png").getImage();
return zombiesImage;
}
public void getXY(){
int kind = 3;
this.speed = 3;
this.blood = 3;
int location = (int) (Math.random() * 5);
switch (location) {
case 0: x = (int) (Math.random()*500 + 730); y = 30;
break;
case 1:
x = (int) (Math.random()*500 + 730); y = 130;
break;
case 2:
x = (int) (Math.random()*500 + 730);; y = 230;
break;
case 3:
x = (int) (Math.random()*500 + 730); y = 330;
break;
case 4:
x = (int) (Math.random()*500 + 730);y = 430;
break;
}
}
}
package com.g.obj;
import java.awt.Image;
import javax.swing.ImageIcon;
import javax.xml.xpath.XPath;
public class ZombieNormal extends Zombies{
// public int blood;
// public int speed;
public ZombieNormal() {
// TODO Auto-generated constructor stub
getXY();
getImageZombies(1);
}
public Image getImageZombies(int num){
zombiesImage = new ImageIcon("image/zombie_normal/z_00_0" + num +".png").getImage();
return zombiesImage;
}
public void getXY(){
blood = 1;
speed = 1;
kind = 1;
int location = (int) (Math.random() * 5);
switch (location) {
case 0:
x = (int) (Math.random()*500 + 730); y = 30;
break;
case 1:
x = (int) (Math.random()*500 + 730); y = 130;
break;
case 2:
x = (int) (Math.random()*500 + 730);; y = 230;
break;
case 3:
x = (int) (Math.random()*500 + 730); y = 330;
break;
case 4:
x = (int) (Math.random()*500 + 730);y = 430;
break;
}
}
}
画板Jframe
package com.g.ui;
import java.awt.Panel;
import javax.swing.JFrame;
public class MyFrame extends JFrame{
MyFrame p;
MyPanel m;
public MyFrame() {
// TODO Auto-generated constructor stub
super("植物大战2");//wrong
m = new MyPanel();
add(m);
addMouseListener(m);
addMouseMotionListener(m);
m.startGame();
}
public void showMe(){
setSize(800, 600);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
new MyFrame().showMe();
}
}
package com.g.ui;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.xml.xpath.XPath;
import com.g.obj.ZombieBuket;
import com.g.obj.ZombieCone;
import com.g.obj.ZombieNormal;
import com.g.obj.Zombies;
public class MyPanel extends JPanel implements Runnable, MouseMotionListener, MouseListener{
Image bg;
Image cz;
Image cz_down;
Zombies[] zb;
int numz;//僵尸的个数
int numc;//僵尸是第几张图片
int grade;
int xHammer;
int yHammer;
boolean tagHammerDown = false;
public MyPanel() {
// TODO Auto-generated constructor stub
grade = 0;
numc = 1;
//这边为什么?
bg = new ImageIcon("image/background1.jpg").getImage();
numz = 50;
zb = new Zombies[numz];
cz = new ImageIcon("image/hammer.png").getImage();
cz_down = new ImageIcon("image/hammer_down").getImage();
for(int i = 0; i < numz; i++){
int location = (int) (Math.random()*3);
switch (location) {
case 0:
zb[i] = new ZombieNormal();
// zb[i].getXY();
break;
case 1:
zb[i] = new ZombieBuket();
//zb[i].getXY();
break;
case 2:
zb[i] = new ZombieCone();
//zb[i].getXY();
break;
}
System.out.println("MyPanel" + zb[i].blood);
}
}
@Override
public void paint(Graphics g) {
super.paint(g);
g.setColor(Color.blue);
g.setFont(new Font("微软雅黑", Font.BOLD, 50));
g.drawString("你的积分"+ grade, 50, 50);
if(grade < 10)
g.drawString("菜鸟" , 80,80);
else if(grade <20){
g.drawString("高手", 80, 80);
}
else {
g.drawString("笨蛋 僵尸是打不完的", 80, 80);
}
for(int i = 0; i < numz; i++){
//System.out.println("zb[i].x" + zb[i].x);
// System.out.println("zb[i].x" + zb[i].y);
g.drawImage(zb[i].getImageZombies(numc), zb[i].x, zb[i].y, null);
// System.out.println("INPAInt"+ zb[i].blood);
}
g.drawImage(cz, xHammer, yHammer, 60, 60, null);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponents(g);
g.drawImage(bg, 0, 0, getWidth(), getHeight(), null);
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("mouseEntered");
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
xHammer = e.getX();
yHammer = e.getY();
// tagHammerDown = true;
cz = new ImageIcon("image/hammer_down.png").getImage();
System.out.println("mousePressed");
tagHammerDown = true;
xHammer = e.getX() -30;
yHammer = e.getY() - 30;
for (int i = 0; i < numz; i++) {
if(xHammer > zb[i].x && xHammer <zb[i].x + 100
&&yHammer > zb[i].y && yHammer < zb[i].y + 100 && tagHammerDown){
zb[i].blood--;
// ``````System.out.println("之前的" + zb[i].blood);
if(zb[i].kind == 5 && zb[i].blood == 0){
System.out.println("之后的" + zb[i].blood);
grade+=3;
System.out.println("gradeBucket->>"+ grade);
}
if(zb[i].kind == 3 && zb[i].blood == 0){
grade+=2;
System.out.println("gradeCone->>"+ grade);
}
System.out.println("zb[i].blood"+ zb[i].blood);
if(zb[i].blood == 0){
grade++;
System.out.println("blood"+zb[i].blood);
System.out.println("gradeNormal->>" + grade);
if(zb[i].blood == 0){
zb[i].x = (int) (Math.random()*500 + 700);
if(zb[i].kind == 5)
zb[i].blood =5;
else if(zb[i].kind == 3){
zb[i].blood = 3;
}
else
zb[i].blood = 1;
}
}
break;//敲一个僵尸
}
}
repaint();
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
cz = new ImageIcon("image/hammer.png").getImage();
System.out.println("mouseReleased");
tagHammerDown = false;
}
@Override
public void mouseDragged(MouseEvent arg0) {
// TODO Auto-generated method stub
// System.out.println("mouseDragged");
}
@Override
public void mouseMoved(MouseEvent e) {
// TODO Auto-generated method stub
// System.out.println("mouseMoved");
xHammer = e.getX() - 30;
yHammer = e.getY() - 30;
// tagHammerDown = true;
cz = new ImageIcon("image/hammer.png").getImage();
repaint();
}
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for (int i = 0; i < numz; i++) {
zb[i].x-= 5;
//更换图片
numc++;
if(numc == 8)
numc =1;
if(zb[i].x < 0){
zb[i].x = (int) (Math.random()*500 + 730);
}
}
repaint();
}
}
//游戏启动
public void startGame() {
// TODO Auto-generated method stub
Thread thread = new Thread(this);
thread.start();
}
}
坐标的更改在线程中 在mousePressed中来处理血量的问题