java做小窗体_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;
}
}
}
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实现简单窗体小游戏----球球大作战相关推荐
- java做五子棋 视频_java swing实现五子棋小游戏项目源码附带视频指导运行教程...
<p> <span style="color:#555555;font-family:"font-size:16px;background-color:#FFFF ...
- Java窗体小游戏开发飞机大作战Java小游戏开发源码
Java窗体小游戏开发飞机大作战Java小游戏开发源码
- java 做的原神抽卡模拟小程序
java做的原神抽卡模拟小程序 难度不大,适合学完面向对象后做着玩. import java.util.ArrayList; import java.util.Calendar; import jav ...
- c++游戏代码坦克大作战_一红一蓝多种模式的双人小游戏:红蓝大作战
作者有话说:上次推荐的森林冰火人很多小伙伴后台找我要链接,或者搜索不到:首先声明下森林冰火人.同桌大作战都不是辣椒人游戏工作室研发的,小编也是微信小游戏双人栏目下搜索到的,如果想要玩双人小游戏的可以打 ...
- egret开发HTML5小游戏-《猫猫大作战》(一)
ps:本文适用于和我一样刚刚入门egret的同学们,大佬看到这里可以忙别的去了. 之前用egret引擎设计了一款双人设计小游戏-<疯狂大乱斗>,算是初步了解了引擎的使用,这次打算开发一款基 ...
- java gui 日历_Java实现简单日历小程序 Java图形界面小日历开发
今天给大家介绍一下如何用Java swing开发一款简单的小日历,下面我们来看代码: 首先创建一个CalendarBean类,用于基本的日期计算: package other1; import jav ...
- java 日历界面_Java实现简单日历小程序 Java图形界面小日历开发
今天给大家介绍一下如何用java swing开发一款简单的小日历,下面我们来看代码: 首先创建一个calendarbean类,用于基本的日期计算: package other1; import jav ...
- java简易日历程序报告_Java实现简单日历小程序 Java图形界面小日历开发
今天给大家介绍一下如何用Java swing开发一款简单的小日历,下面我们来看代码: 首先创建一个CalendarBean类,用于基本的日期计算: package other1; import jav ...
- java简单小程序_Java简易登录注册小程序
这篇文章主要介绍了Java图形界面开发,简易登录注册小程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 登录注册小代码,将学过的一些小知识融合在一起进行了使用,加深印象.本例中如果有注释不详细的 ...
最新文章
- (三)AJAX基本介绍和简单实例03
- php jquery点击事件,jQuery操作html元素点击事件详解
- Linux基础--虚拟机的控制及linux系统的基本操作
- MySQL 5.7.18的安装与主从复制(转自:https://www.baidu.com/home/news/data/newspage?nid=9485770887287731252n_typ)
- bob-tong 字符串函数之Strtok()函数
- 从Wireshark看TCP连接的建立与关闭
- 设备树语法和多任务处理
- php画图教程,php画图实例_PHP
- PostgreSQL MySQL 兼容性之 - Gis类型
- js控制input控件只能输入数字
- 我的奇思妙想机器人消防员_【小作家专栏】我的奇思妙想(三)
- 【历史上的今天】9 月 16 日:乔布斯的归来;苹果崛起;易语言发布
- vhms销售系统_kangle虚拟主机管理系统(vhms虚拟主机销售系统)
- 常见机器学习算法原理
- php 过滤所有符号,php过滤所有特殊符号
- 西安交大计算机考研分数线2020院线,西安交通大学2020年复试分数线
- wordpress自建网站备案
- 1068. 万绿丛中一点红(20)
- 人工智能的软件研发管理系统
- CHINC 2022|熙牛医疗CEO墙辉演讲实录-医疗行业双中台架构探索与实践