java编写小游戏大球吃小球

游戏简介

大二的时候自己写的一个java小游戏,在游戏中,玩家需要控制上下左右来操作大球吃点比自己小的球,让自己变得更大吃掉更多的小球。
在这里插入图片描述

项目结构

在这里插入图片描述

Direction类

枚举类用来标注控制小球的方向

package Ball;
public enum Direction {
	LEFT,
	UP,
	RIGHT,
	DOWN,
}

Ball类

球类,基本属性包括横纵坐标、直径、颜色。

package Ball;

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

public class Ball {
	private int diameter;
	private int x;
	private int y;
	private Color color;

	private int direction=(int) (Math.random()*8+1);
	
	public Ball(int diameter, int x, int y, Color color) {
		super();
		this.diameter = diameter;
		this.x = x;
		this.y = y;
		this.color = color;
	}

	public int getDiameter() {
		return diameter;
	}

	public void setDiameter(int diameter) {
		this.diameter = diameter;
	}

	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 void draw(Graphics g)
	{
		g.setColor(color);
		g.fillOval(x, y, diameter, diameter);  	
	}
	
	public void move(int m)
	{
		switch (direction) {
		case 1:x-=m;break;//左
		case 2:x+=m;break;//右
		case 3:y-=m;break;//上
		case 4:y+=m;break;//下
		case 5:x-=m;y-=m;break;//左上
		case 6:x-=m;y+=m;break;//左下
		case 7:x+=m;y-=m;break;//右上
		case 8:x+=m;y-=m;break;//右下
		default:
			break;
		}		
	}
}

MyBall类

玩家操作的小球

package Ball;

import java.awt.Color;

import java.awt.Graphics;

public class MyBall {
	private int diameter;
	private int x;
	private int y;
	private Color color;
	private Direction dir;
	public int getDiameter() {
		return diameter;
	}
	public int getX() {
		return x;
	}
	public int getY() {
		return y;
	}
	public Color getColor() {
		return color;
	}
	public Direction getDir() {
		return dir;
	}
	
	public void setDiameter(int diameter) {
		this.diameter = diameter;
	}
	public MyBall(int diameter, int x, int y, Color color) {
		super();
		this.diameter = diameter;
		this.x = x;
		this.y = y;
		this.color = color;
		dir=null;
	}	
	public void draw(Graphics g)
	{
		g.setColor(color);
		g.fillOval(x, y, diameter, diameter);  	
		g.setColor(Color.black);
		g.drawOval(x, y, diameter, diameter);
	}
	public void changDirection(Direction newDir)
	{		
			dir=newDir;		
	}
	public void move(int k)
	{
		if(dir!=null){
		switch(dir)
		{
		case LEFT:x-=k;break;
		case UP:y-=k;break;
		case RIGHT:x+=k;break;
		case DOWN:y+=k;break;
		}}
	}
	//吃方法
	public void eat(Ball ball,int i)
	{
		int x1=ball.getX();
		int y1=ball.getY();
		int d1=ball.getDiameter();
		if(this.diameter<600)
		{
			if(d1<this.diameter)//被吃小球直径小于玩家小球直径,玩家吃掉小球
			{
				int d=(int)Math.sqrt((x1+d1/2-this.x-this.diameter/2)*(x1+d1/2-this.x-this.diameter/2)+(y1+d1/2-this.y-this.diameter/2)*(y1+d1/2-this.y-this.diameter/2))-1;//玩家小球与该小球圆心之间的距离
				if(d<(int)(d1+this.diameter)/2)
				{				
					this.diameter+=(int)d1/i;
					ball.setX(-100);
					ball.setY(-100);
					ball.setDiameter(0);
					ball=null;
				}
				ball=null;
		}
			else if(d1>this.diameter)//被吃小球直径大于玩家小球直径,玩家死亡
			{
				int d=(int)Math.sqrt((x1+d1/2-this.x-this.diameter/2)*(x1+d1/2-this.x-this.diameter/2)+(y1+d1/2-this.y-this.diameter/2)*(y1+d1/2-this.y-this.diameter/2))-1;//����Բ��֮��ľ�����߼�һ
				if(d<(int)(d1+this.diameter)/2)
				{				
					this.x=-100;
					this.y=-100;
					this.diameter=0;
				}
		
			}
		}
	}
}

OtherBall类

用来控制除了自己的小球之外的所有的其他小球。其他小球用List保存,统一操作。

package Ball;

import java.awt.Color;

import java.awt.Graphics;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class OtherBall {
	private List<Ball> balls=new ArrayList<>();
	public OtherBall(){	
		Random rand = new Random();
		//构造函数初始化产生二十个球
		while(balls.size()<20){
			int x1 = rand.nextInt(201) + -100;
			int x2 = rand.nextInt(201) + 800;
			int y1 = rand.nextInt(201) +-100;
			int y2 = rand.nextInt(201) + 800;
			Ball ball=null;
			int count=(int) (Math.random()*9+1);
			switch (count) {
			case 1:
				ball=new Ball(10,x1, y1, Color.green);balls.add(ball);
				break;
			case 2:
				ball=new Ball(20,x1, y2, Color.black);balls.add(ball);
				break;
			case 3:
				ball=new Ball(30,x2, y1, Color.blue);balls.add(ball);
				break;
			case 4:
				ball=new Ball(40,x2, y2, Color.CYAN);balls.add(ball);
				break;
			case 5:
				ball=new Ball(50,x1, y2, Color.yellow);balls.add(ball);
				break;
			case 6:
				ball=new Ball(60,x1, y1, Color.red);balls.add(ball);
				break;
			case 7:
				ball=new Ball(70,x2, y2, Color.gray);balls.add(ball);
				break;
			case 8:
				ball=new Ball(80,x2, y1, Color.PINK);balls.add(ball);
				break;
			case 9:
				ball=new Ball(14,x2, y2, Color.gray);balls.add(ball);
				break;	
			default:
				break;
			}
		}
	}
	//判断是否有球出界,如果有删除该球添加新球
	public void isAlive()
	{
		for(Ball ball:balls)
		{
			if(ball.getX()<-200||ball.getX()>1000||ball.getY()<-200||ball.getY()>1000){
				ball=null;
			}
		}	
		newball();
	}
	public void move(int m)
	{
		for(Ball ball:balls)
		{
			ball.move(m);
		}
	}
	public void iseat(MyBall mb,int i)//判断是否被吃
	{
		for(Ball ball:balls)
		{
			mb.eat(ball,i);
		}
	}
	public void draw(Graphics g)
	{
	/*
	用这里的代码会出现
	Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException
	for(Ball ball:balls)
		{
			ball.draw(g);
		}
		*/
		for(int i=0;i<balls.size();i++){
			Ball ball=balls.get(i);
			ball.draw(g);
		}
	}

	//产生新球
	public void newball()
	{
			Random rand = new Random();
			int x1 = rand.nextInt(101) + -100;
			int x2 = rand.nextInt(101) + 1000;
			int y1 = rand.nextInt(101) +-100;
			int y2 = rand.nextInt(101) + 1000;
			int x3 = rand.nextInt(1001) + 0;			
			int y3 = rand.nextInt(1001) + 0;
			Ball ball=null;
			int count=(int) (Math.random()*18+1);
			int count2=(int) (Math.random()*100+1);
			if(count2>70)
			{
			switch (count) {
			case 1:
				ball=new Ball(10,x1, y1, Color.green);balls.add(ball);
				break;
			case 2:
				ball=new Ball(20,x1, y2, Color.black);balls.add(ball);
				break;
			case 3:
				ball=new Ball(30,x2, y1, Color.blue);balls.add(ball);
				break;
			case 4:
				ball=new Ball(40,x2, y2, Color.CYAN);balls.add(ball);
				break;
			case 5:
				ball=new Ball(50,x1, y2, Color.yellow);balls.add(ball);
				break;
			case 6:
				ball=new Ball(60,x1, y1, Color.red);balls.add(ball);
				break;
			case 7:
				ball=new Ball(70,x2, y2, Color.gray);balls.add(ball);
				break;
			case 8:
				ball=new Ball(80,x2, y1, Color.PINK);balls.add(ball);
				break;
			case 9:
				ball=new Ball(100,x1, y1, Color.magenta);balls.add(ball);
				break;	
			case 10:
				ball=new Ball(14,x2, y2, Color.gray);balls.add(ball);
				break;
			case 11:
				ball=new Ball(70,x1, y3, Color.gray);balls.add(ball);
				break;
			case 12:
				ball=new Ball(80,x3, y1, Color.PINK);balls.add(ball);
				break;
			case 13:
				ball=new Ball(100,x3, y2, Color.magenta);balls.add(ball);
				break;	
			case 14:
				ball=new Ball(14,x2, y3, Color.gray);balls.add(ball);
				break;	
			case 15:
				ball=new Ball(10,x1, y3, Color.green);balls.add(ball);
				break;
			case 16:
				ball=new Ball(20,x3, y1, Color.black);balls.add(ball);
				break;
			case 17:
				ball=new Ball(30,x2, y3, Color.blue);balls.add(ball);
				break;
			case 18:
				ball=new Ball(40,x3, y2, Color.CYAN);balls.add(ball);
				break;	
			default:
				break;
			}
		}
	}
}

Select_Frame类

选择难度
在这里插入图片描述

package Ball;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Select_Frame extends JFrame implements ActionListener{
	JButton jb1=null;
	JButton jb2=null;
	JButton jb3=null;
	JButton jb4=null;
	JButton jb5=null;
	Select_Frame()
	{
		jb1=new JButton("简单");
		jb2=new JButton("普通");
		jb3=new JButton("困难");
		jb4=new JButton("极难");
		jb5=new JButton("炼狱");
		this.add(jb1);
		this.add(jb2);
		this.add(jb3);
		this.add(jb4);
		this.add(jb5);
		jb1.addActionListener(this);
		jb2.addActionListener(this);
		jb3.addActionListener(this);
		jb4.addActionListener(this);
		jb5.addActionListener(this);
		jb1.setActionCommand("jb1");
		jb2.setActionCommand("jb2");
		jb3.setActionCommand("jb3");
		jb4.setActionCommand("jb4");
		jb5.setActionCommand("jb5");
		this.setTitle("选择难度");
		this.setVisible(true);
		this.setLocation(700,300);
		this.setSize(400,400);
		this.setLayout(new GridLayout(5, 1));
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
	}
	public static void main(String[] args)
	{
		Select_Frame sf=new Select_Frame();
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		if(e.getActionCommand().equals("jb1")){			
			this.setVisible(false);
			Frame frame=new Frame(2,2,1,10);
		}
		else if(e.getActionCommand().equals("jb2")){			
			this.setVisible(false);
			Frame frame=new Frame(4,2,1,10);
		}
		else if(e.getActionCommand().equals("jb3")){			
			this.setVisible(false);
			Frame frame=new Frame(6,2,1,10);
		}
		else if(e.getActionCommand().equals("jb4")){			
			this.setVisible(false);
			Frame frame=new Frame(6,2,1,8);
		}
		else if(e.getActionCommand().equals("jb5")){			
			this.setVisible(false);
			Frame frame=new Frame(6,2,1,6);
		}
	}
}

AgainPanel类

重新开始

package Ball;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

import org.omg.CORBA.PUBLIC_MEMBER;

public class AgainPanel extends JFrame implements ActionListener{
	JButton jb1=null;
	JButton jb2=null;
	JButton jb3=null;
	public AgainPanel()
	{
		jb1=new JButton("重新开始");
		jb2=new JButton("结束游戏");
		jb3=new JButton("查看排名");
		this.add(jb1);
		this.add(jb2);
		this.add(jb3);
		jb1.addActionListener(this);
		jb1.setActionCommand("jb1");
		jb2.addActionListener(this);
		jb2.setActionCommand("jb2");
		jb3.addActionListener(this);
		jb3.setActionCommand("jb3");
		this.setVisible(true);
		this.setLayout(new GridLayout(3,1));
		this.setLocation(800, 300);
		this.setSize(300, 400);
		
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		if(e.getActionCommand().equals("jb1"))
		{
			Select_Frame sFrame=new Select_Frame();
		}
		else if(e.getActionCommand().equals("jb2"))
		{
			System.exit(0);
		}
	}
}

Frame类

游戏运行的核心类

扫描二维码关注公众号,回复: 5782920 查看本文章
package Ball;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import javax.swing.*;

public class Frame extends JFrame{
		private BufferedImage image=new BufferedImage(1000, 1000, 1);
		private OtherBall otherBall=new OtherBall();
		private MyBall mb=new MyBall(15, 500, 500, Color.white);
		JPanel jp1=null;
		JButton jb1=null;
		JLabel jlb1=null;
		String string="当前直径:";
		public Frame(int i,int k,int m,int j)//i控制增长速度,k我的控制速度,m控制敌方速度,j控制线程刷新
		{
			jp1=new JPanel();
			jb1=new JButton("重新开始");
			jp1.add(jb1);
			jlb1=new JLabel(string);
			jlb1.setBounds(10, 10, 80, 20);
			this.add(jlb1);
			this.setLayout(null);
			this.setVisible(true);
			this.setTitle("大球吃小球");
			this.setSize(1000, 1000);
			this.setLocation(400, 0);
			this.setDefaultCloseOperation(EXIT_ON_CLOSE);
			this.setBackground(Color.white);
			addKeyListener(new KeyAdapter() {
				@Override
				public void keyPressed(KeyEvent e)
				{
						Direction newDir=mb.getDir();
						switch(e.getKeyCode())
						{
						case KeyEvent.VK_LEFT:
							newDir=Direction.LEFT;break;
						case KeyEvent.VK_UP:
							newDir=Direction.UP;break;
						case KeyEvent.VK_RIGHT:
							newDir=Direction.RIGHT;break;
						case KeyEvent.VK_DOWN:
							newDir=Direction.DOWN;break;
						}
						if(newDir!=mb.getDir())
						{
							mb.changDirection(newDir);
						}
				}/*
				public void keyReleased(KeyEvent e)
				{
					Direction newDir=mb.getDir();
					switch(e.getKeyCode())
					{
					case KeyEvent.VK_A:
						newDir=null;break;
					case KeyEvent.VK_W:
						newDir=null;break;
					case KeyEvent.VK_D:
						newDir=null;break;
					case KeyEvent.VK_S:
						newDir=null;break;
					
					}
					if(newDir!=mb.getDir())
					{
						mb.changDirection(newDir);
					}
				}*/
			});
			new Thread(new Runnable() {
				@Override
				public void run() {
					// TODO Auto-generated method stub
					while(true)
					{
						otherBall.iseat(mb,i);
						string="当前直径:"+mb.getDiameter();
						jlb1.setText(string);
						if(mb.getDiameter()!=0&&mb.getX()>-100&&mb.getX()<1100&&mb.getY()>-100&&mb.getY()<1100){
						repaint();
						otherBall.move(m);
						mb.move(k);
						otherBall.isAlive();
						}
						else{
							try {
								Thread.sleep(3000);
								setVisible(false);
							} catch (InterruptedException e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							}
							System.out.println("游戏失败");
							AgainPanel againPanel=new AgainPanel();
							break;
						}
						try {
							Thread.sleep(j);
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}
				}
			}).start();
		}
		
		public void paint(Graphics g)
		{
			Graphics g2=image.getGraphics();
			super.paint(g2);			
			otherBall.draw(g2);
			mb.draw(g2);
			g.drawImage(image, 0, 0, null);
		}
}

猜你喜欢

转载自blog.csdn.net/qq_40351478/article/details/88082618