当前位置:文档之家› Java程序设计实验报告2(弹球游戏)[1]1

Java程序设计实验报告2(弹球游戏)[1]1

《Java语言程序设计》课程设计实习报告题目:班级:学号:姓名:同组人员:指导老师:张彬一、实验目的1、掌握Swing图形用户界面编程以及事件处理等,掌握java绘图技术。

2、掌握多线程编程的基本原理,能使用Runnable、ExecutorService等接口进行线程的创建、启动等工作。

3、培养独立查找资料,并解决问题的能力。

二、实验任务1、设计并编程实现弹球游戏:用户能通过GUI组件指定生成小球的数量,每个小球将从随机的位置出现,并具有随机颜色,随机速度以及随机的运动方向,小球沿初始方向匀速运动,当碰到窗口边缘时,小球将依据受力原理改变运动方向(可简化考虑,受力只改变小球的运动方向,小球仍按照初始速度匀速运动,且不考虑小球之间的碰撞)。

鼠标在界面中显示为方块状,玩家需按住鼠标来回移动以避开运动的小球及屏幕四周,如果鼠标碰到任一小球或者窗口四周,则游戏结束。

程序需提供计时功能,并最终显示玩家能坚持多少秒。

2、程序要求:(1)具备相应界面,并通过事件编程,实现相应的GUI组件功能。

(2)使用多线程技术,在程序窗口区域绘制小球,并以线程控制小球的移动,实现动画效果。

(3)实现鼠标与屏幕四周,以及与小球的碰撞检测。

三、开发工具与平台1.开发工具:Eclipse默认是一个和Jbuilder类似的Java开发工具,但它不仅仅只是Java开发工具,只要装上相应的插件,eclipse也可作为其它语言的开发工具。

如C/C++插件(CDT)。

2.开发平台:JDK1.5四、设计思路1.界面设计(1)制作一个简单的面板JFrame,文件保存为bollFrame.java其中为一public的类bollFrame,其构造方法为:bollFrame(int n){super();setTitle("我的弹球小游戏");setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();//得到电脑屏幕大小setSize(450,450);setLocation((dimension.width-game.getWidth())/2-250,(dimension.height-game.getHeight())/2-250);//设置面板显示基中;this.n = n;myBollPanel = new bollPanel(n);//构造一个画板;add(myBollPanel);//将画板放入JFramecreateMenu();//创建菜单;setJMenuBar(bar);}(2)构造画板类,文件保存为bollPanel.java其构造函数如下:bollPanel(int n){this.n = n;// executorThread = Executors.newCachedThreadPool();//创建线程池;mouse = new mouseThread(mxNow,myNow,groupThread,this);//启动鼠标线程;this.setIsOver(false);//游戏开始线程条件的判断;for(int i =0 ;i<n;++i){myBollThread =new bollThread(this);groupThread.add(myBollThread);//executorThread.execute(myBollThread);//小球线程加入线程池;}addMouseListener(this);addMouseMotionListener(this);}Paint()方法如下构造:public void paint(Graphics g){if(!this.getIsOver()) //如果游戏还没结束;{super.paint(g);//清除原先的图像g.setColor(Color.RED);g.setFont(new Font("宋体",Font.BOLD+Font.ITALIC,15));g.drawString("你已坚持:"+getT()+"S", 15, 15);//计时器的显示;for(int i = 0;i<n;++i){//画出每个线程球int xNow =groupThread.get(i).getxNow();int yNow = groupThread.get(i).getyNow();g.setColor(groupThread.get(i).getColor());g.fillOval(xNow,yNow,30,30);if(xNow>(getWidth()-23)||xNow<0){//碰到左右边界;groupThread.get(i).dx = -groupThread.get(i).dx;}if(yNow>(getHeight()-23)||yNow<0){//碰到上下边界;groupThread.get(i).dy = -groupThread.get(i).dy;}groupThread.get(i).setxNow(xNow+groupThread.get(i).getdx());// 设置下一个位置;groupThread.get(i).setyNow(yNow+groupThread.get(i).getdy());}}if(isMouse){g.drawImage(new ImageIcon("boll.gif").getImage(), mxNow, myNow, 40,40, this);//鼠标的图像;}}//end paint();总体界面如下:2.逻辑设计(1).首先,我们考虑到多个小球的运动,实质上是多线程的使用,n个小球我们就同时启动n个线程去控制每个小球的运动。

因此我构造出一个类作为一个小球的线程,保存文件为bollThread.java,顾名思义,小球线程类。

相关构造方法如下:public bollThread(bollPanel my){this.myPanel = my;xStart = data.nextInt(200);//随机产生开始位置;yStart = data.nextInt(200);setxNow(xStart);////设置现在的位置;setyNow(yStart);setdx();//设置随机方向使用;注意:若不设置为随机,则所有小球将相同一个方向运动;setdy();}(2)再次,小球的出现需要有载体,这就是画板,前面界面设置中已提到过,通过让多个小球共享一个画板,以及通过线程控制小球的重绘,最后通过画板显示给用户。

(3)在第(2)点中提到的画板上我们需要实现鼠标的监听,以下给出几个重要的鼠标事件监听:public void mousePressed(MouseEvent e) {//单击启动鼠标事件;if(e.getButton()==MouseEvent.BUTTON1){copy.schedule(new task(), 0,1000);//启动定时器;for(int i =0 ;i<n;++i){Thread my = new Thread(groupThread.get(i));my.start();//启动游戏,启动小球线程;}mxNow = e.getX();myNow = e.getY();isMouse = true;if(!mouse.isAlive()){mouse.start();//启动鼠标线程;}}//end if(e.getButton()==MouseEvent.BUTTON1);}//注意按下鼠标开始游戏;public void mouseDragged(MouseEvent e) {//游戏过程中通过按住鼠标左键控制“眼睛”的移动来躲避小球;mxNow = e.getX();// TODO Auto-generated method stubmyNow = e.getY();if(mxNow>(this.getWidth()-30)||mxNow<=0||myNow>(this.getHeight()-30)||myNow <=0){//鼠标是否碰到边界;// executorThread.shutdown();this.setIsOver(true);copy.cancel();JOptionPane.showMessageDialog(null, "你撞墙了,下次小心点。

游戏结束","提示" ,JOptionPane.OK_OPTION);this.removeMouseListener(this);this.removeMouseMotionListener(this);}for(int i =0 ;i<n;++i){int xNow =groupThread.get(i).getxNow();int yNow = groupThread.get(i).getyNow();if(isPeng(xNow,yNow,mxNow,myNow)){// executorThread.shutdown();this.setIsOver(true);copy.cancel();JOptionPane.showMessageDialog(null, "if(你撞球了){"+"\n"+"挑战失败,游戏结束.}","提示" ,JOptionPane.OK_OPTION);//System.exit(0);this.removeMouseListener(this);this.removeMouseMotionListener(this);} //鼠标的上下左右边和球碰撞的情况,}}(4) 如果游戏开始后我们突然松开鼠标,让我们控制的小球(或"眼睛")停留在最后松开的点上,那么小球碰到它还会判断是否相撞吗?答案是可以的,我们可以通过编写一个鼠标线程类来实现,保存文件为mouseThread.java;让此线程在我们按下鼠标开始游戏时同时启动,在我们松开鼠标时启动判断相撞事件。

相关的构造方法如下:mouseThread(int mxNow,int myNow,List<bollThread>group,bollPanel bollpane){ this.mxNow = mxNow;//传入鼠标现在位置;this.myNow = myNow;this.groupThread = group;//传入小球线程组;this.bollpane = bollpane;//传入画板对象;}3.程序测试在程序测试中,先后测试出了,以下几个注意点:A.在判断小球与鼠标控制的小球(“眼睛”)相撞时,条件中用到两点之间的距离问题,发现条件不能是两点距离刚好等于两相撞物体半径和,此条件太苛刻,可能引起判断的失误(概率蛮高的呵呵),而应该是小于半径和。

相关主题