`

多线程实现植物大战僵尸

    博客分类:
  • JAVA
 
阅读更多

        我们在之前学的编程语言中,所有代码的执行顺序是串行的,也就是按顺序执行,这样就造成了一个问题,也许当你刚刚接触编程语言时候无关大碍,甚至在达到一定水平之后可以自己设计五子棋,贪食蛇,连连看等游戏,但是看着自己设计的界面以及游戏,有没有感觉缺少什么?对了,就是单调,不够动态,因为串行语句必须等上面的代码执行完了才会执行下面的语句,这样就无法支持同步性,当时造成我主要困扰的是想要完成儿童时代的经典游戏   坦克大战  时,忽然考虑到了一个很大的问题

          用单线程实现不出来!!!!!因为子弹是一个线程,坦克是一个线程,敌人的坦克又是一个线程,当时有种崩溃的感觉,因为还不知道有多线程这个东西

因此再学了多线程以后(多线程是并行语句),立马就像做出目前脍炙人口的游戏

         植物大战僵尸



 

简单部署界面,用到了缓冲图,实现不断刷新的功能

还加上了声音,以及判断阳光点击获取

一下是关键代码:

import java.awt.BorderLayout;

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
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.awt.Color;
import java.awt.event.MouseAdapter;
import java.awt.image.BufferedImage;

import java.net.URL;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class main extends JFrame {
	private ImageIcon background;
	private JFrame jf;
	private JPanel imagePanel;
	private Game game;
	 static int x=0,y=0;
	 private Graphics g;
	public static void main(String args[]){
		//new main().initUi2();
		new main().initUi1();
	}
	public void initUi1(){
		JFrame jf=new JFrame();
	    background = new ImageIcon("image//menu.png");//
	    JLabel label = new JLabel(background);//
	    ImageIcon login=new ImageIcon("image//start_leave.png");
		JButton jlogin=new JButton(login);
		this.game=new Game();
	
		jlogin.setPreferredSize(new Dimension(login.getIconWidth(),login.getIconHeight()));
		
		ActionListener a=new ActionListener(){

			@Override
			public void actionPerformed(ActionEvent e) {
				
				game.initUI();
				
			}

			
		};
		
		label.setBounds(0,0,background.getIconWidth(),background.getIconHeight());
		
		imagePanel = (JPanel)this.getContentPane();
		imagePanel.setOpaque(false);
		
		imagePanel.setLayout(new FlowLayout());
		imagePanel.add(jlogin);
		
		this.getLayeredPane().setLayout(null);
		
	    this.getLayeredPane().add(label,new Integer(Integer.MIN_VALUE));
	  
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setSize(background.getIconWidth(),background.getIconHeight());
		this.setLayout(new BorderLayout());
		jlogin.addActionListener(a);
		this.add(jlogin,BorderLayout.SOUTH);
		this.setVisible(true);
		
	}

 接下来是游戏界面

 

 代码如下:

import java.awt.Color;



import sun.audio.*;


import java.applet.Applet;
import java.applet.AudioClip;
import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.List;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import java.util.ArrayList;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class  Game{
	private JFrame jf;
	
	private int [] a=new int[100];
	private ArrayList<Ball> list=new ArrayList<Ball>();

	public void initUI(){
	    jf = new JFrame();
		jf.setSize(1600, 620);
		jf.setDefaultCloseOperation(3);
		AudioClip clip = null;
		try {
			clip = Applet.newAudioClip((new File("image/网1.wav")).toURI().toURL());
		} catch (MalformedURLException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		clip.play();

		
	
		jf.setLayout(new FlowLayout());
		
		    ImageIcon p1=new ImageIcon("image//single_bullet_plant.png");
		    ImageIcon p2=new ImageIcon("image//2.png");
		    ImageIcon p3=new ImageIcon("image//3.png");
		    ImageIcon p4=new ImageIcon("image//4.png");
		    ImageIcon p5=new ImageIcon("image//5.png");
		    ImageIcon p6=new ImageIcon("image//6.png");
		    ImageIcon p7=new ImageIcon("image//7.png");
		   
		    
		    JButton start=new JButton("开始战斗");
			start.setLocation(500,600);
			start.setBounds(500, 500, 600, 600);
			
			
			jf.setLayout(new FlowLayout());

			jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			
			
			jf.add(start);
		
		    jf.setVisible(true);
		    
		  
		
		while(true){
			try {
				Thread.sleep(10);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			draw(jf.getGraphics());
		}
	
	}
	
	
	ImageIcon bjIcon = new ImageIcon("image/background1.jpg");
	ImageIcon personIcon = new ImageIcon("image/person.gif");
	ImageIcon p1=new ImageIcon("image//1.png");
	ImageIcon p11=new ImageIcon("image//11.jpg");
	ImageIcon p2=new ImageIcon("image//2.png");
	ImageIcon p22=new ImageIcon("image//sun.gif");
	ImageIcon p3=new ImageIcon("image//3.png");
	ImageIcon p4=new ImageIcon("image//4.png");
	ImageIcon p44=new ImageIcon("image//u9.jpg");
	ImageIcon p5=new ImageIcon("image//5.png");
	ImageIcon p6=new ImageIcon("image//6.png");
	ImageIcon p66=new ImageIcon("image//111.jpg");
	ImageIcon p7=new ImageIcon("image//7.png");
	ImageIcon p77=new ImageIcon("image//u5.jpg");
	ImageIcon chanzi1=new ImageIcon("image//shovel_bk.png");
	ImageIcon chanzi=new ImageIcon("image//shovel.png");
	ImageIcon a1=new ImageIcon("image//u1.jpg");
	ImageIcon a2=new ImageIcon("image//u2.jpg");
	ImageIcon a3=new ImageIcon("image//u3.jpg");
	ImageIcon a5=new ImageIcon("image//u5.jpg");
	ImageIcon a6=new ImageIcon("image//u6.jpg");
	ImageIcon a7=new ImageIcon("image//u7.jpg");
	ImageIcon a8=new ImageIcon("image//u8.jpg");
	ImageIcon a9=new ImageIcon("image//u9.jpg");
	ImageIcon a10=new ImageIcon("image//u10.jpg");
	ImageIcon a11=new ImageIcon("image//u11.jpg");
	ImageIcon a12=new ImageIcon("image//u12.jpg");
	ImageIcon a13=new ImageIcon("image//u13.jpg");
	ImageIcon a14=new ImageIcon("image//uwogua.jpg");
	int x=0,y=0;
	int lx,ly;
	int lxx,lyy;
	int px,py;
	BufferedImage buffer = new BufferedImage(
			1600,
			620,
			BufferedImage.TYPE_INT_RGB);
	public void draw(Graphics g){
		
		Graphics gg = buffer.getGraphics();
		
		gg.setColor(Color.BLACK);
		gg.fillRect(0, 0, jf.getWidth(), jf.getHeight());
		gg.drawImage(bjIcon.getImage(), x, y, null);
		gg.drawImage(bjIcon.getImage(), x+bjIcon.getIconWidth(), y, null);
		//画随机植物
		gg.drawImage(a1.getImage(), 400, 350, null);
		
		gg.drawImage(p11.getImage(), 250, 280, null);
		Wandou w=new Wandou();
		if(true){
		w.draw(gg,290,280);
		try {
			w.sleep(3);
		} catch (InterruptedException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		//w.draw(gg,280,280);
		}
		//画阳光值增加
		gg.setColor(Color.BLACK);
		
		if(true){
			new Sun().draw(gg,jf);
		}
		//gg.setColor(Color.RED);
		//gg.drawString("50", 100, 100);
		gg.drawImage(a2.getImage(), 500, 150, null);
		
		gg.drawImage(a3.getImage(), 600, 200, null);
		gg.drawImage(a6.getImage(), 700, 200, null);
		gg.drawImage(a5.getImage(), 480, 330, null);
		gg.drawImage(a7.getImage(), 1000, 400, null);
		gg.drawImage(a8.getImage(), 800, 200, null);
		gg.drawImage(a14.getImage(), 250, 150, null);
		//gg.drawImage(a13.getImage(), 1000, 200, null);//画一个普通僵尸
		Zombie z1=new Zombie();
		if(true){
			try {
				z1.sleep(50);
			} catch (InterruptedException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			z1.draw(gg,1000,200);
			}
		
		gg.drawImage(a12.getImage(), 320, 70, null);
		//画阳光值增加
		g.drawString("50", 80, 30);
		//画可以挑选植物
		gg.drawImage(p1.getImage(), 400, 20, null);
		gg.drawImage(p2.getImage(),460, 20, null);
		gg.drawImage(p3.getImage(), 520, 20, null);
		gg.drawImage(p4.getImage(), 580, 20, null);
		gg.drawImage(p5.getImage(), 640, 20, null);
		gg.drawImage(p6.getImage(), 700, 20, null);
		gg.drawImage(p7.getImage(), 760, 20, null);
		gg.drawImage(chanzi1.getImage(), 1000, 500, null);
		//gg.drawImage(personIcon.getImage(), 1200, 300, null);
		  jf.addMouseListener(new MouseAdapter(){
		  	   public void mousePressed(MouseEvent e){
//		  		   
		  		   System.out.println("32");
		  		    lx=e.getX();ly=e.getY();
		  		   }
		  		  });
		  jf.addMouseMotionListener(new MouseAdapter(){

	 			
				public void mouseDragged(MouseEvent e) {
					  lxx=e.getX();lyy=e.getY();
				}

				public void mouseReleased(MouseEvent e) {
					  px=e.getX();
					  py=e.getY();
				}

				
				public void mouseMoved(MouseEvent e) {
					// TODO Auto-generated method stub
					
				}
		    	
		    });
		
	    if(lx<=460&&lx>=400){
	    	  
		   
		 		
		 gg.drawImage(p11.getImage(), lxx,lyy, null);
		 gg.drawImage(p11.getImage(), a[0],a[1], null);
		
	     }
	    
		//if(lx<=460&&lx>=400){
			//new Plant().draw(jf, gg);
		//}
		
	    if(lx<=520&&lx>=460){
	    	
	    	 
			 gg.drawImage(p22.getImage(), lxx,lyy, null);
			 gg.drawImage(p22.getImage(), a[1],a[2], null);
			
		     }
	    // if(lx<=520&&lx>=460){
	    	// new Plant().draw(jf, gg);
			
		    // }
	     if(lx<=580&&lx>=520){
			 gg.drawImage(p3.getImage(), lxx,lyy, null);
			// gg.drawImage(p3.getImage(), px,py, null);
			
		     }
	     if(lx<=640&&lx>=580){
			 gg.drawImage(p44.getImage(), lxx,lyy, null);
			
		     }
	     if(lx<=700&&lx>=640){
			 gg.drawImage(p5.getImage(), lxx,lyy, null);
			
		     }
	     if(lx<=760&&lx>=700){
			 gg.drawImage(p66.getImage(), lxx,lyy, null);
			
		     }
	     if(lx<=820&&lx>=760){
			 gg.drawImage(p77.getImage(), lxx,lyy, null);
			
		     }
	     if(lx<=1200&&lx>=820){
			 gg.drawImage(chanzi.getImage(), lxx,lyy, null);
			
		     }
	     
	     
		
		
		//x-=5;
		//if(x+bjIcon.getIconWidth() <= 0){
			//x = 0;
		//}
		
		
		
		
		
		for(int i=0; i<list.size(); i++){
			Ball ball = list.get(i);
			ball.draw(gg);
		}
		
		
		g.drawImage(buffer, 0, 0, null);
	}
	
	ActionListener l = new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			String cmd = e.getActionCommand();
			if("start".equals(cmd)){
				Ball t = new Ball(jf, list);
				t.start();
				
				list.add(t);
			}
			if("pause".equals(cmd)){
				for(int i=0; i<list.size(); i++){
					Ball ball = list.get(i);
//					ball.suspend();
					ball.setPause(true);
				}
			}
			if("resume".equals(cmd)){
				for(int i=0; i<list.size(); i++){
					Ball ball = list.get(i);
//					ball.resume();
					ball.setPause(false);
				}
			}
			if("stop".equals(cmd)){
				while(!list.isEmpty()){
					Ball ball = list.remove(0);
					ball.setStop(true);
				}
			}
		}
	};
	
	
	public static void main(String[] args) {
	   new Game().initUI();
	
		
	}
	
}

 阳光:

 

 

 

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import java.util.Random;

import javax.swing.ImageIcon;
import javax.swing.JFrame;

public class Sun extends Thread{
	public Random r=new Random();
	private int x=800,y=30;
	private static int vx,vy;
	private static int i=50;
	public void draw(final Graphics g,JFrame jf){
		
		final ImageIcon sun=new ImageIcon("image/sun.png");
		final ImageIcon sunback=new ImageIcon("image/SunBank.png");
		g.drawImage(sun.getImage(),x,y+vy,null);
		g.drawImage(sunback.getImage(),220,30,null);
		vy+=1;
		g.setColor(Color.RED);
		g.drawString(i+"", 250, 110);
		 jf.addMouseListener(new MouseAdapter(){
		  	   public void mousePressed(MouseEvent e){
		  		  
		  		    if(Math.abs(e.getX()-x)<=100&&Math.abs(y+vy-e.getY())<=100){
		  		    	if(x>250&&y>0){
		  		    		 System.out.println("32");
		  		    	
		  				g.drawImage(sun.getImage(),220,30,null);
		  				vy-=100;
		  				vx-=100;
		  		    	}
		  				i+=50;
		  		    	
		  		    }
		  		   }
		  		  });
		
			
		
		if(y+vy>600){
			vy=5;
			g.drawImage(sun.getImage(),x,y+vy,null);
			vy+=1;
		}
	
	
	}

}

 

豌豆攻击线程代码:

import java.awt.Graphics;

import javax.swing.ImageIcon;

public class Wandou extends Thread{
	private int  wx=280,wy=280;
	private static int vx=5;
	public void draw(Graphics g,int wx,int wy){
		
		//System.out.print("23232");
		ImageIcon wandou=new ImageIcon("image//bullet_01.png");
		g.drawImage(wandou.getImage(),wx+vx,wy,null);
		vx+=5;
		if(wx+vx>=800){
			vx=5;
			g.drawImage(wandou.getImage(),wx+vx,wy,null);
			vx+=5;
		}
		}
	
	

}

 僵尸前进代码:

import java.awt.Graphics;

import javax.swing.ImageIcon;

public class Zombie extends Thread{
	private int  zx=280,zy=280;
	private static int vx=5;
	public void draw(Graphics g,int zx,int zy){
		ImageIcon a8=new ImageIcon("image//u8.jpg");
		//System.out.print("23232");
		ImageIcon a13=new ImageIcon("image//u13.jpg");
		g.drawImage(a13.getImage(),zx-vx,zy,null);
		vx+=1;
		//if(zx-vx<=800){
		//	vx=5;
		//	g.drawImage(a8.getImage(),800-vx,200,null);
		//	vx+=1;
		//}
		}
}

 之后就是计算算法,执行攻击功能的预判了

  • 大小: 616.3 KB
  • 大小: 1.2 MB
  • 大小: 1.2 MB
4
0
分享到:
评论
4 楼 梳子不爱头发 2014-04-30  
之后会完善代码,之后会上传源代码
3 楼 ayaome 2014-04-29  
2 楼 lyshine66 2014-04-28  
不错,希望把源码共享,学习一下!
1 楼 rex0654335 2014-04-27  
有料,希望写完整拜读。

相关推荐

    c++的植物大战僵尸模型以及代码

    《C++实现的植物大战僵尸模型及代码解析》 在编程世界中,游戏开发一直是一项充满挑战和趣味的任务。本文将深入探讨一个基于C++语言实现的植物大战僵尸(Plants vs. Zombies)模型,旨在解析其核心机制,帮助读者...

    Java版的植物大战僵尸游戏完整项目源码(含图片素材)

    总的来说,这个Java版的“植物大战僵尸”项目不仅提供了游戏开发的实战案例,还涵盖了Java GUI编程、多线程、动画制作、资源管理等多个核心知识点。通过深入研究和实践这个项目,开发者可以提升自己的Java编程技能,...

    基于QT开发的植物大战僵尸游戏源代码,C++程序设计期末课程设计

    在本项目中,学生以“基于QT开发的植物大战僵尸游戏源代码”为主题,完成了C++程序设计的期末课程设计。这个项目不仅展示了C++语言的强大功能,还突显了QT框架在图形用户界面(GUI)开发上的优势。以下是关于这个...

    多线程植物大战僵尸源代码

    《多线程植物大战僵尸源代码》是一款基于Java编程语言实现的游戏项目,它展示了如何运用多线程技术来实现复杂的并发场景。在这个项目中,我们可以深入理解如何在游戏开发中运用多线程来提高程序的运行效率和用户体验...

    java版植物大战僵尸源码

    在Java版的植物大战僵尸源码中,我们可以看到Java语言在游戏开发中的应用,包括面向对象的设计、图形用户界面(GUI)的创建、事件处理、多线程等核心概念。这些知识对于想要深入学习Java游戏开发的人来说,无疑是一...

    Java版植物大战僵尸

    通过分析这个Java版植物大战僵尸项目,我们可以看到它涵盖了Java编程的多个方面,不仅涉及基本语法和面向对象设计,还包括图形用户界面开发、多线程编程、数据结构与算法的应用以及游戏开发的特定技术。这个项目为...

    C#植物大战僵尸.zip

    在这个“植物大战僵尸”项目中,开发者可能利用了操作系统的多线程功能来实现游戏的并发执行,确保游戏流畅运行。多线程允许游戏同时处理玩家输入、渲染画面、计算游戏逻辑等多个任务,提高游戏体验。 再来看多线程...

    C++编写植物大战僵尸 源代码

    8. **多线程**:为了提高游戏性能,开发者可能会使用多线程技术,如处理游戏逻辑和渲染的分离,以实现更流畅的游戏体验。 9. **调试与优化**:编写源代码的过程中,调试和性能优化是必不可少的。使用调试器检查代码...

    C#-Winform小游戏-植物大战僵尸.rar

    【C# Winform小游戏-植物大战僵尸】 C# Winform是一个基于.NET框架的用户界面库,用于构建桌面应用程序。在这个项目中,"植物大战僵尸"游戏被移植到了Winform平台上,为用户提供了一种在本地环境下体验这款经典游戏...

    java植物大战僵尸.zip

    《Java技术在“植物大战僵尸”游戏开发中的应用解析》 在编程世界中,Java以其跨平台、面向对象和高效性等特性,被广泛应用于各种软件开发,包括游戏开发领域。这里我们将深入探讨如何利用Java技术来开发一款类似...

    植物大战僵尸完整版

    【植物大战僵尸完整版】项目是一个基于Java编程语言开发的游戏,深受编程爱好者和游戏开发者喜爱。这个项目在众多同类作品中脱颖而出,以其流畅的游戏体验获得了高度评价,是学习和研究Java游戏开发的理想案例。 ...

    Java项目:植物大战僵尸(java+swing)

    总的来说,"Java项目:植物大战僵尸(java+swing)"是一个综合性的项目,它涵盖了Java编程、Swing GUI设计、多线程编程、游戏逻辑实现、碰撞检测、音效处理、数据持久化等多个IT领域的知识点。这个项目对于学习Java和...

    Qt版本的植物大战僵尸源码

    【Qt版本的植物大战僵尸源码】是一款基于流行的塔防游戏《植物大战僵尸》的开源实现,使用了Qt框架进行开发。Qt是一个跨平台的C++图形用户界面应用程序开发框架,广泛应用于桌面、移动和嵌入式设备。通过分析这款...

    植物大战僵尸Javascript版web游戏源码.zip

    《植物大战僵尸Javascript版web游戏源码》是一个基于JavaScript编程语言开发的网页游戏,它完美地复刻了经典的电脑版《植物大战僵尸》的游戏体验。这款游戏的源代码提供了丰富的学习和研究材料,对于想要深入理解...

    基于C++开发的植物大战僵尸【100013171】

    和第一次课设一样,以状态机的方式实时对用户的输入做出反应,达到多线程并行,而不会阻碍其他 功能的执行。 随着植物和僵尸种类的增加,考虑用继承实现代码复用,所有植物公用一个基类,所有僵尸以普通僵 尸为基类...

    Java植物大战僵尸简易版源代码

    在本资源中,我们主要探讨的是一个基于Java编程语言实现的"植物大战僵尸"简易版游戏的源代码。这个游戏是经典游戏"植物大战僵尸"的一个简化版本,旨在帮助初学者理解游戏开发的基本原理,以及Java编程的核心概念。...

    安卓Android源码——植物大战僵尸源码.zip

    《安卓Android源码——植物大战僵尸源码》 在安卓平台上,开发一款游戏不仅需要扎实的编程基础,还需要对Android系统有深入的理解。植物大战僵尸作为一款广受欢迎的塔防类游戏,其源码分析对于Android开发者来说,...

    植物大战僵尸(java源代码)

    2. **继承**:在《植物大战僵尸》的Java实现中,可能会有多个植物类,比如豌豆射手、向日葵等,它们共享一些基本属性和行为。这时,可以设计一个基础的`Plant`类,然后让特定的植物类继承它,这样就实现了代码的复用...

    java版植物大战僵尸

    【标题】:“java版植物大战僵尸”是一款使用Java编程语言实现的经典游戏的重制版本,主要基于Eclipse IDE和JDK 1.8.0_151进行开发。这款游戏复刻了原版《植物大战僵尸》的核心玩法,包括日间和夜间两种模式。 ...

    android 植物大战僵尸 源码

    "植物大战僵尸"的源码中,游戏逻辑的实现主要在Java代码中。开发者利用ArrayList等数据结构存储游戏状态,如植物位置、僵尸状态等。同时,使用SharedPreferences进行数据持久化,保存用户的进度和设置。 四、事件...

Global site tag (gtag.js) - Google Analytics