想必很多人都喜欢玩游戏,其实当工作或学习累了玩玩游戏有助于我们消除疲劳,另外也可以锻炼我们的大脑反应能力以及大及和身体各部位的谐调度,当然这只是在玩适当的时间为前提的,但是我们经常碰到的很多大型游戏又总是要花我们很多时间才能大战仅仅一个回合,显然是起不到健身益脑的作用的,这时候要怎么办呢?我们总不能每时每刻都沉浸在工作和学习吧,总会看到或听到周围的人说生活精彩,精彩生活,那么我们的生活到底精彩到哪儿呢?不要走开,答案即将揭晓。也许有的朋友已经猜到了,没错,就在于游戏,有人说,人生就像一场戏,其实呢,他说的就是一场游戏,而且是一场小型的游戏,呵呵,正所谓游戏人生。今天我就介绍一下一个弹球游戏制作过程,保证看到最后大家也能亲手做一个。Ok,Lets' go!
我们涉及到的java知识有Swing中的窗口设置,添加菜单以及相关的监听器,另外我们还要用到线程的知识。
我分以下三步,编写三个类,来完成该游戏的制作。
首先,我们先建一个窗口,请看代码:
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import javax.swing.JOptionPane;
/**
* 主界面类
*
* @author Administrator
*
*/
public class TanBallGame extends javax.swing.JFrame {
// 画布
private java.awt.Graphics g;
// 监听器
private MyListener ms;
// 睡眠时间,通过改变睡眠时间,可以改变游戏速度,从而设置游戏难度
public static int sleeptime;
// 程序入口
public static void main(String[] args) {
TanBallGame tbg = new TanBallGame();
tbg.showUI();
}
// 主界方法
private void showUI() {
// 设置标题
this.setTitle("弹球游戏");
// 设置界面大小
this.setSize(600, 600);
// 创建菜单条
javax.swing.JMenuBar bar = createMenu();
// 给窗体设置菜单条
this.setJMenuBar(bar);
// 界面布局方式
java.awt.FlowLayout fl = new java.awt.FlowLayout();
this.setLayout(fl);
// 让窗口初始化居中
this.setLocationRelativeTo(null);
// 窗口关闭量退出程序
this.setDefaultCloseOperation(3);
this.setVisible(true);
// 得到画布对象
g = this.getGraphics();
// 给画布添加监听器
MyListener ms = new MyListener(this, g);
this.addMouseMotionListener(ms);
this.update(g);
}
/**
* 创建菜单的方法
*
* @return
*/
public javax.swing.JMenuBar createMenu() {
// 菜单条对象
javax.swing.JMenuBar Bar = new javax.swing.JMenuBar();
// 菜单
javax.swing.JMenu play = new javax.swing.JMenu("游戏控制");
// 菜单选项
final javax.swing.JMenuItem start = new javax.swing.JMenuItem("开始游戏");
javax.swing.JMenuItem stop = new javax.swing.JMenuItem("结束游戏");
javax.swing.JMenuItem view = new javax.swing.JMenuItem("关于");
// 菜单
javax.swing.JMenu nandu = new javax.swing.JMenu("游戏难度");
// 菜单选项
javax.swing.JMenuItem Level1 = new javax.swing.JMenuItem("简单");
javax.swing.JMenuItem Level2 = new javax.swing.JMenuItem("中等");
javax.swing.JMenuItem Level3 = new javax.swing.JMenuItem("困难");
// 把菜单添加到菜单条
Bar.add(play);
Bar.add(nandu);
// 把菜单选项添加到菜单
play.add(start);
play.add(stop);
play.add(view);
nandu.add(Level1);
nandu.add(Level2);
nandu.add(Level3);
// 通过内部类,为菜单选项添加监听器
java.awt.event.ActionListener al = new java.awt.event.ActionListener() {
@SuppressWarnings("deprecation")
// 实现动作事件的方法
public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
if ("开始游戏".equals(command)) {
// 游戏开始,默认难度为简单
sleeptime = 40;
// 球的线程开始
Board bt = new Board(ms, getBallGame(), g);
bt.start();
}
if ("结束游戏".equals(command)) {
// 用户点击了“结束游戏”时,会弹出确认框
int n = JOptionPane.showConfirmDialog(getComponent(0),
"确定要退出游戏吗?");
// 当用户点击了YES时,退出程序,并关闭窗口
if (n == 0) {
System.exit(0);
// 用户点击NO时,回到主界面,提示框会自动消失,游戏将继续
} else if (n == 1) {
Board bt = new Board(ms, getBallGame(), g);
bt.stop();
bt.start();
}
}
// 查看相关提示
if ("关于".equals(command)) {
javax.swing.JOptionPane
.showMessageDialog(null,
"欢迎体验蓝杰游戏,祝你玩的愉快!在游戏过程每点一次“开始游戏”则会增加一个球,特别欢迎挑战高难度!");
}
}
};
// 给菜单选项添加监听器
start.addActionListener(al);
stop.addActionListener(al);
view.addActionListener(al);
// 创建给“游戏难度”菜单的相关监听器
java.awt.event.ActionListener alr = new java.awt.event.ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String str = e.getActionCommand();
if ("简单".equals(str)) {
sleeptime = 40;
}
if ("中等".equals(str)) {
sleeptime = 20;
}
if ("困难".equals(str)) {
sleeptime = 10;
}
}
};
// 添加到监听器
Level1.addActionListener(alr);
Level2.addActionListener(alr);
Level3.addActionListener(alr);
return Bar;
}
public TanBallGame getBallGame() {
return this;
}
}
大家会发现程序的主函数也在上面这个类中,而主函数中只调用了定义界面的方法,本类中其它的方法以及其它类的方法将会在主界面的方法中调用,大家可能很多地方没搞明白,没有关系,等看完下面的一切问题将会不功自破。
import java.awt.event.MouseEvent;
/*
*事件监听器
*/
import java.util.Random;
public class MyListener extends java.awt.event.MouseAdapter {
//随机取数对象
Random rand = new Random();
//画布对象
private java.awt.Graphics g;
//背景对象
private TanBallGame bg;
//挡板的参数
private int width = 80, height = 14;
//挡板初始位置
public static int x1 = 0;
private static int y1 = 575;
//用构造器传TanBallGame中的画布背景和画画布
public MyListener(TanBallGame bg, java.awt.Graphics g) {
this.bg = bg;
this.g = g;
}
//重写动作事件的方法,画一个矩形
public void mouseMoved(MouseEvent e) {
//重绘
g.setColor(bg.getBackground());
g.fillRect(x1, y1, width, height);
x1 = e.getX();
g.setColor(java.awt.Color.BLACK);
g.fillRect(x1, y1, width, height);
}
}
下面是一个线程类,也是本程序的重点和难点所在,当然这只是对于初步接触java而言的,呵呵。
package tanball;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.event.ActionListener;
import javax.swing.JOptionPane;
public class Board extends Thread {
// 新建一个随机取数对象
java.util.Random ran = new java.util.Random();
// 引入画布对象
private java.awt.Graphics g;
// 定义球的初始位置以及球的大小
private int x = ran.nextInt(500), y = 100, width = 20, height = 20;
// 画板的背景
// 随机得到球的移动变量,使球随机转到一个方向
private int dx = 8, dy = 3;
private int Marks = 0;
private TanBallGame gb;
private MyListener ms;
// 用构造器对参数赋值
public Board(MyListener ms, TanBallGame gb, Graphics g) {
this.ms = ms;
this.gb = gb;
this.g = g;
}
// 球的线程
public void run() {
while (true) {
// 球在框内部运行时,
if (x >= 15 && x <= 570 && y > 60 && y < 549) {
if (x < 300 && x >= 15) {
g.setColor(java.awt.Color.RED);
g.fillOval(x, y, width, height);
x = x + dx;
y = y + dy;
try {
Thread.sleep(TanBallGame.sleeptime);
} catch (Exception ef) {
ef.printStackTrace();
}
g.setColor(gb.getBackground());
g.fillOval(x - dx, y - dy, width, height);
}
//在此范围内小球颜色会变为深情的蓝色
if (x >= 300 && x < 400) {
g.setColor(java.awt.Color.BLUE);
g.fillOval(x, y, width, height);
x = x + dx;
y = y + dy;
try {
Thread.sleep(TanBallGame.sleeptime);
} catch (Exception ef) {
ef.printStackTrace();
}
g.setColor(gb.getBackground());
g.fillOval(x - dx, y - dy, width, height);
}
if (x >= 400 && x < 570) {
g.setColor(java.awt.Color.GREEN);
g.fillOval(x, y, width, height);
x = x + dx;
y = y + dy;
try {
Thread.sleep(TanBallGame.sleeptime);
} catch (Exception ef) {
ef.printStackTrace();}
g.setColor(gb.getBackground());
g.fillOval(x - dx, y - dy, width, height);
}
}
// 球碰到左右边界时
else if (x < 15 || x > 570) {
g.setColor(java.awt.Color.CYAN);
g.fillOval(x, y, width, height);
x = x - dx;
y = y + dy;
dx = (-dx);
try {
Thread.sleep(TanBallGame.sleeptime);
} catch (Exception ef) {
ef.printStackTrace();
}
g.setColor(gb.getBackground());
g.fillOval(x - dx, y - dy, width, height);
}// 球碰到上边界
else if (y <= 200) {
g.setColor(java.awt.Color.GREEN);
g.fillOval(x, y, width, height);
x = x + dx;
y = y - dy;
dy = (-dy);
try {
Thread.sleep(TanBallGame.sleeptime);
} catch (Exception ef) {
ef.printStackTrace();
}
g.setColor(gb.getBackground());
g.fillOval(x - dx, y - dy, width, height);
}// 球碰到滑板
else if ((x + 10) >= MyListener.x1
&& (x - 10) <= (MyListener.x1 + 80) && y >= 549) {
g.setColor(gb.getBackground());
g.fillOval(x, y, width, height);
try {
Thread.sleep(TanBallGame.sleeptime);
} catch (Exception ef) {
ef.printStackTrace();
}
x = x + dy;
y = y - dy;
dy = (-dy);
g.setColor(java.awt.Color.RED);
g.fillOval(x, y, width, height);
//当游戏为简单难度时每次加10分
if (TanBallGame.sleeptime == 40) {
Marks = Marks + 10;
}
//中等难度加20
if (TanBallGame.sleeptime == 20) {
Marks = Marks + 20;
}
//困难时每碰到一次挡板加40
if (TanBallGame.sleeptime == 10) {
Marks = Marks + 40;
}
}
// 球碰到下边界时
else if ((x < MyListener.x1 - 10 || x > MyListener.x1 + 90)
&& y > 549) {
JOptionPane.showMessageDialog(null, "Game over,本次得分为" + Marks
+ "分", "Game over", JOptionPane.INFORMATION_MESSAGE);
System.exit(0);
}
}
}
}
这个类的名字没起好,大家可以自行改到自己喜欢的,以上就是本游戏所有设计过程用源码,如果朋友们有什么建议或意见敬请多多指教,在下只是一只小小菜鸟,但我相信不会是怎么飞也飞不高的那种,因为有朋友们的支持和关怀。