java实现简单窗体小游戏----球球大作战

java实现简单窗体小游戏----球球大作战

需求分析

1、分析小球的属性:

​ 坐标、大小、颜色、方向、速度

2、抽象类:Ball

​ 设计类:BallMain—创建窗体

​ BallJPanel—画小球

​ BallAndBall—处理小球之间的关系

3、流程:

​ 1)小球的绘制

​ 2)产生小球,让一个小球进行运动,多个小球的运动

​ 3)小球进行碰撞

​ 4)实现大球吃小球

源代码如下:

Ball.java

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;

public class Ball {
	/* 小球的基本属性 */
	int x, y;//定义x, y坐标
	int d;//直径
	Color ballColor;//小球的颜色
	int speed;//小球的运动速度
	int position;//小球的运动方向
	
	/*小球的运动方向*/
	public static final int LEFT_UP = 0;//左上
	public static final int RIGHT_UP = 1;//右上
	public static final int LEFT_DOWN = 2;//左下
	public static final int RIGHT_DOWN = 3;//右下
	
	/*构造方法*/
	public Ball(int x, int y, int position, int d, int speed, Color ballColor){
		this.x = x;
		this.y = y;
		this.position = position;
		this.d = d;
		this.speed = speed;
		this.ballColor = ballColor;
	}
	//构造玩家球
	public Ball(int x, int y, int d, int speed, Color ballColor){
		this.x = x;
		this.y = y;
		this.d = d;
		this.speed = speed;
		this.ballColor = ballColor;
	}

	//画小球
	public void drawBall(Graphics g){
		g.setColor(ballColor);
		g.fillOval(x, y, d, d);
	}
	public void drawBall2(Graphics g){
		g.setColor(ballColor);
		g.fillOval(x, y, d, d);
		
		//球加文字
		g.setColor(Color.RED);
		//设置字体大小
		Font font = new Font(Font.DIALOG, Font.BOLD, 14);
		g.setFont(font);
		g.drawString("^_^", x+d/2, y+d/2);
	}

//小球的运动方向
public void ballMove(){
	switch (this.position) {
	case LEFT_UP:
		x -= speed;
		y -= speed;
		if (x <= 0) {
			this.position = RIGHT_UP;
		}else if (y <= 0) {
			this.position = LEFT_DOWN;
		}
		break;
	case RIGHT_UP:
		x += speed;
		y -= speed;
		if (x >= BallMain.SCREEN_WIDTH - d) {
			this.position = LEFT_UP;
		}else if (y <= 0) {
			this.position = RIGHT_DOWN;
		}
		break;
	case LEFT_DOWN:
		x -= speed;
		y += speed;
		if (x <= 0) {
			this.position = RIGHT_DOWN;
		}else if (y >= BallMain.SCREEN_HEIGHT - d) {
			this.position = LEFT_UP;
		}
		break;
	case RIGHT_DOWN:
		x += speed;
		y += speed;
		if (x >= BallMain.SCREEN_WIDTH - d) {
			this.position = LEFT_DOWN;
		}else if (y >= BallMain.SCREEN_HEIGHT - d) {
			this.position = RIGHT_UP;
		}
		break;
		}
	}
}

BallMain.java

import java.awt.Dimension;
import java.awt.Toolkit;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import javax.swing.JFrame;

import sun.audio.AudioData;
import sun.audio.AudioPlayer;
import sun.audio.AudioStream;
import sun.audio.ContinuousAudioDataStream;

/*创建窗体*/
public class BallMain extends JFrame{
	//窗体的宽高
	public static final int SCREEN_WIDTH = 1360;
	public static final int SCREEN_HEIGHT = 760;
	
	//全屏
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int width = (int)d.getWidth();
    int height = (int)d.getHeight();
	
	public BallMain(){
		this.setTitle("V1.0");
		//设置位置
		this.setBounds(0,0,SCREEN_WIDTH,SCREEN_HEIGHT);
		
		//添加小球到窗体
		BallJPanel bj = new BallJPanel();
		this.add(bj);
		
		//添加键盘的监听事件
		this.addKeyListener(bj);
		
		/*frame.addKeyListener(tj);
		tj.addKeyListener(tj);
		*/
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);	
	}
	
	public static void main(String[] args) {
		BallMain b = new BallMain();
		//添加音乐
				try {
					FileInputStream f =new FileInputStream("music/yyyy.wav");
					AudioStream as = new AudioStream(f);
					AudioPlayer.player.start(as);
				} catch (FileNotFoundException e) {
					e.printStackTrace();
				} catch (IOException e) {
			
					e.printStackTrace();
				}
	}
}

BallJPanel.java

import java.awt.Color;
import java.awt.Graphics;
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.ArrayList;
import java.util.List;

import javax.imageio.ImageIO;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

/*画小球*/
public class BallJPanel extends JPanel implements KeyListener{
	//存储小球的集合
	List<Ball> ballList = new ArrayList<Ball>();
	int x1 = 450;
	int y1 = 450;
	int d1 = 40;
	private Color white;
	//玩家球
	Ball game = new Ball(x1, y1, d1, 50, white);
	
	//小球的数量
	private int ballNumber = 100;
	
	public BallJPanel(){
		addBall();
		startBalls();
	}
	
	//产生小球的方法
	public void addBall(){
		for (int i = 0; i < ballNumber; i++) {	
			//随机产生100个小球
			int x = (int)(Math.random()*BallMain.SCREEN_WIDTH);
			int y = (int)(Math.random()*BallMain.SCREEN_HEIGHT);
			int position = (int)(Math.random()*4);
		//	int d = (int)(Math.random()*50 + 1);
			int d = 20;
			int speed = 1;
			
			//颜色   三原色 R G B
			int red = (int)(Math.random()*255 + 1);
			int green = (int)(Math.random()*255 + 1);
			int blue = (int)(Math.random()*255 + 1);
			Color ballColor = new Color(red, green, blue);
			Ball b = new Ball(x, y, position, d, speed, ballColor);
			
			//将小球添加到集合中
			ballList.add(b);	
		}
	}
	
	public void paint(Graphics g){
		super.paint(g);
		
		BufferedImage img =null;
		//添加图片
		try {
			img = ImageIO.read(new File("music/timg.png"));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		g.drawImage(img, 0, 0, 1360, 760, this);
		
		this.setBackground(Color.CYAN);
		
		for (int i = 0; i < ballList.size(); i++) {
			Ball ball = ballList.get(i);
			ball.drawBall(g);
			
		}
		
		//玩家
		game.drawBall2(g);
		
	}
	
	public void startBalls(){
		//启动线程-----匿名内部类
		new Thread(){
			public void run() {
				while (true) {
					//遍历小球集合
					for (int i = 0; i < ballList.size(); i++) {
						//取出小球
						Ball b = ballList.get(i);
						//让每一个小球进行移动
						b.ballMove();
					}
					for (int i = 0; i < ballList.size(); i++) {
						//先取第一个小球
						Ball b1 = ballList.get(i);
						for (int j = i+1; j < ballList.size(); j++) {
							Ball b2 = ballList.get(j);
							BallAndBall bad = new BallAndBall();
							//bad.ballCrach(b1, b2);
							if(bad.isBallCrach(b1, b2)){
								if (b1.d >= b2.d) {
									b1.d += b2.d/3;
									ballList.remove(b2);
									break;
								}else if(b1.d < b2.d){
									b2.d += b1.d/3;
									ballList.remove(b1);
									break;
								}
							}
							if (bad.isBallCrach(b1, game)) {
								if (bad.isBallCrach(b1, game)) {
									if (b1.d > game.d) {
										System.out.println("GAME OEVR");
										JOptionPane.showMessageDialog(null, "GAME OVER");
										return;
									}else{
										game.d += b1.d/3;
										ballList.remove(b1);
										break;
									}
								}
							}
						}
					}
					repaint();//重绘
					try {
						Thread.sleep(5);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			};
		}.start();
	}

	@Override
	public void keyTyped(KeyEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void keyPressed(KeyEvent e) {
		// TODO Auto-generated method stub
		if (e.getKeyCode() == KeyEvent.VK_UP) {
		//	System.out.println("点击了上方向键");
			game.y -= 10;
		}
		
		if (e.getKeyCode() == KeyEvent.VK_DOWN) {
		//	System.out.println("点击了下方向键");
			game.y += 10;
		}
	
	
  		if (e.getKeyCode() == KeyEvent.VK_LEFT ) {
		//	System.out.println("点击了左方向键");
  			game.x -= 15;
		}
 
  		if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
		//	System.out.println("点击了右方向键");
			game.x += 15; 
		}
		if (e.getKeyCode() == KeyEvent.VK_1) {
			//	System.out.println("点击了右方向键");
				game.x += 10; 
				game.y -= 10;
		}
		if (e.getKeyCode() == KeyEvent.VK_2) {
			//	System.out.println("点击了右方向键");
				game.x -= 10; 
				game.y -= 10;
		}
		if (e.getKeyCode() == KeyEvent.VK_3) {
			//	System.out.println("点击了右方向键");
				game.x -= 10;
				game.y += 10;
		}
		if (e.getKeyCode() == KeyEvent.VK_4) {
			//	System.out.println("点击了右方向键");
				game.x += 10;
				game.y += 10;
		}
		repaint();
	
	}

	@Override
	public void keyReleased(KeyEvent e) {
		// TODO Auto-generated method stub
		
	}
}

BallAndBall.java

/*处理小球之间的关系*/
public class BallAndBall {

	//两小球碰撞
	public void ballCrach(Ball b1, Ball b2){
		int x1 =  b1.x + b1.d/2;
		int y1 =  b1.y + b1.d/2;
		int x2 =  b2.x + b2.d/2;
		int y2 =  b2.y + b2.d/2;
		
		double e = Math.sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));
		//如果碰撞上
		if (e <= b1.d/2 + b2.d/2) {
			//b1小球
			switch (b1.position) {
			case Ball.LEFT_UP:
				b1.position = Ball.RIGHT_DOWN;
				break;
			case Ball.RIGHT_UP:
				b1.position = Ball.LEFT_DOWN;
				break;
			case Ball.LEFT_DOWN:
				b1.position = Ball.RIGHT_UP;
				break;
			case Ball.RIGHT_DOWN:
				b1.position = Ball.LEFT_UP;
				break;
			}
			//b2小球
			switch (b2.position) {
			case Ball.LEFT_UP:
				b2.position = Ball.RIGHT_DOWN;
				break;
			case Ball.RIGHT_UP:
				b2.position = Ball.LEFT_DOWN;
				break;
			case Ball.LEFT_DOWN:
				b2.position = Ball.RIGHT_UP;
				break;
			case Ball.RIGHT_DOWN:
				b2.position = Ball.LEFT_UP;
				break;
			}
		}
	}
	
	//检查是否碰撞上
	public boolean isBallCrach(Ball b1, Ball b2){
		boolean flag = false;
		int x1 =  b1.x + b1.d/2;
		int y1 =  b1.y + b1.d/2;
		int x2 =  b2.x + b2.d/2;
		int y2 =  b2.y + b2.d/2;
		//计算圆心距
		double e = Math.sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));
		
		if (e <= b1.d/2 + b2.d/2) {
			return true;
		}
		
		return false;
	}
}

其中音乐和图片可自行修改,只需要修改路径即可,音乐格式为wav,我个人用的音乐是彩豆森林****https://www.kugou.com/song/#hash=91968197C4524D5D9CDE382E824F0B01&album_id=15251465
下载之后转变格式即可

运行截图如下:

java实现简单窗体小游戏----球球大作战_第1张图片
java实现简单窗体小游戏----球球大作战_第2张图片

你可能感兴趣的:(java实现简单窗体小游戏----球球大作战)