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;

}

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

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();

}

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

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 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 < 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

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

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;

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

其中音乐和图片可自行修改,只需要修改路径即可,音乐格式为wav,我个人用的音乐是彩豆森林

---------------------

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

  1. java做五子棋 视频_java swing实现五子棋小游戏项目源码附带视频指导运行教程...

    <p> <span style="color:#555555;font-family:"font-size:16px;background-color:#FFFF ...

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

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

  3. java 做的原神抽卡模拟小程序

    java做的原神抽卡模拟小程序 难度不大,适合学完面向对象后做着玩. import java.util.ArrayList; import java.util.Calendar; import jav ...

  4. c++游戏代码坦克大作战_一红一蓝多种模式的双人小游戏:红蓝大作战

    作者有话说:上次推荐的森林冰火人很多小伙伴后台找我要链接,或者搜索不到:首先声明下森林冰火人.同桌大作战都不是辣椒人游戏工作室研发的,小编也是微信小游戏双人栏目下搜索到的,如果想要玩双人小游戏的可以打 ...

  5. egret开发HTML5小游戏-《猫猫大作战》(一)

    ps:本文适用于和我一样刚刚入门egret的同学们,大佬看到这里可以忙别的去了. 之前用egret引擎设计了一款双人设计小游戏-<疯狂大乱斗>,算是初步了解了引擎的使用,这次打算开发一款基 ...

  6. java gui 日历_Java实现简单日历小程序 Java图形界面小日历开发

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

  7. java 日历界面_Java实现简单日历小程序 Java图形界面小日历开发

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

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

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

  9. java简单小程序_Java简易登录注册小程序

    这篇文章主要介绍了Java图形界面开发,简易登录注册小程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 登录注册小代码,将学过的一些小知识融合在一起进行了使用,加深印象.本例中如果有注释不详细的 ...

最新文章

  1. (三)AJAX基本介绍和简单实例03
  2. php jquery点击事件,jQuery操作html元素点击事件详解
  3. Linux基础--虚拟机的控制及linux系统的基本操作
  4. MySQL 5.7.18的安装与主从复制(转自:https://www.baidu.com/home/news/data/newspage?nid=9485770887287731252n_typ)
  5. bob-tong 字符串函数之Strtok()函数
  6. 从Wireshark看TCP连接的建立与关闭
  7. 设备树语法和多任务处理
  8. php画图教程,php画图实例_PHP
  9. PostgreSQL MySQL 兼容性之 - Gis类型
  10. js控制input控件只能输入数字
  11. 我的奇思妙想机器人消防员_【小作家专栏】我的奇思妙想(三)
  12. 【历史上的今天】9 月 16 日:乔布斯的归来;苹果崛起;易语言发布
  13. vhms销售系统_kangle虚拟主机管理系统(vhms虚拟主机销售系统)
  14. 常见机器学习算法原理
  15. php 过滤所有符号,php过滤所有特殊符号
  16. 西安交大计算机考研分数线2020院线,西安交通大学2020年复试分数线
  17. wordpress自建网站备案
  18. 1068. 万绿丛中一点红(20)
  19. 人工智能的软件研发管理系统
  20. CHINC 2022|熙牛医疗CEO墙辉演讲实录-医疗行业双中台架构探索与实践

热门文章

  1. 十几加几不进位加法题C语言,十几加几(不进位))的加法教案
  2. 腾讯物联TencentOS tiny上云初探
  3. matlab 数字信号波形图,数字信号处理第三次实验代码及波形图
  4. 模仿 Android支付宝咻一咻功能实现
  5. Android 基础入门教程--笔记
  6. 超全总结:Go 读文件的 10 种方法
  7. C语言基础选择题100道(附答案)04
  8. 听说蚂蚁金服上市,但是实现财务自由的只是那些架构师?
  9. 计算机网络基础知识满昌勇,-精选版《计算机网络》说课课件.ppt
  10. JavaWeb基础学习2