需求分析

1、分析小球的属性:

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

2、抽象类:Ball

设计类:BallMain—创建窗体

BallJPanel—画小球

BallAndBall—处理小球之间的关系

3、流程:

1)小球的绘制

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

3)小球进行碰撞

4)实现大球吃小球

源代码如下:

Ball.javaimport 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.javaimport 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.javaimport 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 ballList = new ArrayList();

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

//随机产生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

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

//取出小球

Ball b = ballList.get(i);

//让每一个小球进行移动

b.ballMove();

}

for (int i = 0; i

//先取第一个小球

Ball b1 = ballList.get(i);

for (int j = i+1; 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 += 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,下载之后转变格式即可

运行截图如下:

java球球大作战_java实现简单窗体小游戏----球球大作战相关推荐

  1. java做小窗体_java实现简单窗体小游戏----球球大作战

    java实现简单窗体小游戏----球球大作战 需求分析 1.分析小球的属性: ​坐标.大小.颜色.方向.速度 2.抽象类:Ball ​设计类:BallMain-创建窗体 ​BallJPanel-画小球 ...

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

    java实现简单窗体小游戏----球球大作战 需求分析 1.分析小球的属性: ​ 坐标.大小.颜色.方向.速度 2.抽象类:Ball ​ 设计类:BallMain-创建窗体 ​ BallJPanel- ...

  3. Java窗体小游戏开发飞机大作战Java小游戏开发源码

    Java窗体小游戏开发飞机大作战Java小游戏开发源码

  4. java简易日历程序报告_Java实现简单日历小程序 Java图形界面小日历开发

    今天给大家介绍一下如何用Java swing开发一款简单的小日历,下面我们来看代码: 首先创建一个CalendarBean类,用于基本的日期计算: package other1; import jav ...

  5. java写的网络版斗地主_Java实现简单的斗地主游戏

    本文实例为大家共享了Java实现斗地主游戏的详细代码,供大家参考,详细内容如下 原理图: 斗地主过程: 1.组合牌 * 2.洗牌 * 3.发牌 * 4.看牌 代码实现: package itcast. ...

  6. JAVA小游戏推球球

    图形化界面的简单应用 先看效果 java小游戏推球球 代码如下 import javax.swing.*; import java.awt.*; import java.awt.event.*;pub ...

  7. java简单通讯录的实现02person类_用java实现简单的小游戏(你一定玩过)

    用java实现简单的小游戏(你一定玩过) 对于java初学者来说,通过一些学习小游戏来对swing学习以及对java基础的学习是一个好的方法,同时也给学习带来了很多的乐趣,接下来就给大家分享一个jav ...

  8. 仿照贪吃蛇大作战的原型做的小游戏

    仿照贪吃蛇大作战的原型做的小游戏,通过摇杆移动小蛇,吃掉食物可以增加身体的长度.有加速功能,还有不太智能的AI电脑. 文件:590m.com/f/25127180-493401547-1ed8d3(访 ...

  9. matlab 五连珠,我是初学者,想求哪位大神帮帮我把这个小游戏程序简单写写注释,五连珠游戏...

    我是初学者,想求哪位大神帮帮我把这个小游戏程序简单写写注释,五连珠游戏 五连珠游戏 游戏规则: 移动小球,五个或五个以上相同颜色的组成一行或一列就会消失 移动的时候只能移动到相连通的格子里去 func ...

最新文章

  1. python 中文转unicode编码_Python 解码 Unicode 转义字符串
  2. Android消息处理:EventBus、BroadCast和Handler-优缺点比较
  3. 解决sublime text无法安装插件问题
  4. 《Python游戏编程快速上手》第十四章----凯撒密码
  5. linux内核设计与实现 怎么读,《Linux内核设计与实现》读书笔记(一)
  6. java 数组构造_java – 从数组构造(非二进制)树
  7. K8S+Harbor+gluster+haproxy 实践加坑
  8. 交叉编译和使用HTOP
  9. js获取当前页面url信息
  10. Stylus Studio 2010 XML 的激活码
  11. 软件测试中期答辩,毕业论文中期答辩报告.doc
  12. Java精进-20分钟学会mybatis使用
  13. 调整csgo画面显示FPS值
  14. Win10喇叭图标出现红叉,没有声音,并且提示“未安装任何音频输出设备“的解决办法
  15. VM虚拟机上的网络设置
  16. SpringCloud--鸿鹄Cloud分布式微服务云系统
  17. 【WEB项目】腾讯云服务器使用WordPress搭建网站
  18. 十六进制解码_快速十六进制编码和解码
  19. 印度紧盯中国,计划在东海岸建新海军基地
  20. 那些年我们错过的markdown

热门文章

  1. 疯狂坦克 高级教程(二)
  2. 【Android源码解析】选择多张图片上传多图预览
  3. Ubuntu18.04 libfreerdp不支持H264 GFX模式
  4. Git怎么操作 一文学会使用Git (比视频还详细)
  5. 基于Java毕业设计薪酬福利管理信息系统源码+系统+mysql+lw文档+部署软件
  6. 国家普通话水平计算机辅助测试考试流程,2018年9月国家普通话水平智能测试考试流程...
  7. IAT HOOK DEMO win32/win64
  8. 2021UPC个人训练赛第47场
  9. 2021-08-09 src文件夹, 灰色变蓝色
  10. 数据安全工具建设实践