- 80.50 KB
- 10页
- 1、本文档共5页,可阅读全部内容。
- 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
- 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
- 文档侵权举报电话:19940600175。
'重庆科创职业学院《Java高级应用开发》课程作业(二)课题名称:Applet舞动的小球设计与实现专业:计算机应用技术班级:计算机应用ZK0901学号:姓名:成绩:________________________完成时间:二○一○年十一月二十五日9
一、课题设计目的1、进一步掌握Applet的生命周期及各种方法的应用;2、利用Graphics类完成简单的多媒体设计;3、掌握线程的生命周期及其相关的方法;4、掌握线程应用的两种方法及线程调度;5、通过本次课题设计,进一步理解Applet小应用程序的基本结构和线程的基本原理。二、课题的描述和要求本次课题要求运用JAVA语言完成一个基于Applet的舞动小球,并可将这个小程序进行修改拓展完成一个简单的游戏设计。三、课题设计的步骤3.1完成小球的绘制任务一:创建一个Java项目DancingBallApplet,然后再创建一个主类DancingBall来完成设计;任务二:在DancingBall主类中完成小球的绘制。步骤1:定义小球坐标位置和小球的大小。intx,y;finalintSIZE=50;步骤2:重写小应用程序的init()方法完成对小球坐标x,y的初始publicvoidinit(){x=0;y=0;}步骤3:重写小应用程序的paint(Graphicsg)方法完成小球的绘制publicvoidpaint(Graphicsg){g.fillOval(x,y,SIZE,SIZE);}3.2将小球舞动起来要使小球运动起来,即是需要不停地改变小球的坐标。可以通过线程不停地改变坐标值,然后调用repaint()的方法重新绘制小球。任务一:定义一个线程Ball,完成对小球坐标的修改任务二:修改paint方法中绘制小球的方法任务三:在DancingBall中声明一个线程Ball的对象,并在init()方法中创建。任务四:重写start()方法,在其中运行线程对象importjava.applet.Applet;importjava.awt.*;publicclassDancingBallextendsApplet{finalintSIZE=50;Ballball;9
classBallextendsThread{intx=0,y=0,m=2,n=2;//x、y为小球出现的坐标,m、n为每次改变的数值publicvoidrun(){while(true){x=x+m;y=y+n;if(y+SIZE>=getHeight()){n=(-1)*n;}elseif(y<=0){n=(-1)*n;}if(x+SIZE>=getWidth()){m=(-1)*m;}elseif(x<=0){m=(-1)*m;}try{sleep(10);//小球运动的速度,即每次移动等待的时间}catch(InterruptedExceptione){e.printStackTrace();}repaint();//首先调用update清除界面,然后再调用paint方法重绘}}publicvoidinit(){ball=newBall();//创建改变小球坐标的线程对象}publicvoidstart(){ball.start();//运行线程}publicvoidpaint(Graphicsg){g.fillOval(ball.x,ball.y,SIZE,SIZE);}}思考:如何让小球出现的初始位置每次都不一样?解决方案:要使小球的初始位置不一样,即每次启动线程时都需要给x、y赋不同的数值,因此我们可以通过随机函数来实现。步骤1:为线程类Ball增加构造方法,通过构造方法为x,y赋值;Ball(intx,inty){this.x=x;this.y=y;}步骤2:创建Ball类对象时,给构造方法传入随机数。ball=newBall((int)(Math.random()*400),(int)(Math.random()*400));思考:如果要求每次小球都从顶端开始出现,又该如何创建呢??3.3接球挡板的设计9
任务一:完成挡板的绘制步骤1:声明挡板的坐标intx1,y1;步骤2:完成g.fillRect(x1,y1,SIZE,10);任务二:完成挡板随着鼠标移动步骤1:主类DancingBall引用MouseMotionListener接口步骤2:在init()方法中为小应用程序加载MouseMontionListener监视器步骤3:重写MouseMontionListener的抽象方法publicvoidmouseDragged(MouseEventarg0){}publicvoidmouseMoved(MouseEventarg0){x1=arg0.getX();y1=arg0.getY();repaint();}任务三:完成游戏计分步骤1:完成计分规则制定,接住一次加10分,小球掉下一次减20分步骤2:完成游戏计分并显示关键问题:在于如何判断接住了小球??if(n>0&&y1-y==SIZE&&(Math.abs(x-x1)<=SIZE&&Math.abs(x-x1)>=0)){score=score+10;n=(-1)*n;}if(y+SIZE>=this.getHeight()){score=score-10;n=(-1)*n;}elseif(y<=0){n=(-1)*n;}if(x+BALLSIZE>=this.getWidth()){m=(-1)*m;}elseif(x<=0){m=(-1)*m;}3.4多个小球的同时舞动要有多个小球就需要在paint()方法中多次调用fillOval(x,y,SIZE,SIZE)方法来实现小球的绘制,但必须保证每个小球的初始坐标x、y都不一样,否则就会使得两个小球重叠。任务一:在创建Ball对象时设置不同的x、y值;ball1=newBall((int)(Math.random()*(getWidth()-SIZE)),0);ball2=newBall((int)(Math.random()*(getWidth()-SIZE)),0);然后分别运行ball1和ball2两个线程。思考:如果需要更多的小球呢?解决方案:可以通过线程数组来完成。1、首先声明Ball类的数组对象ball9
Ballball[]=newBall[5];2、在init()方法中用循环创建每个数组对象,并在start()方法中循环运行每个线程(此时5个小球在同一轨迹上,需要改变每个小球出现的初始位置或者运动改变值的大小)思考:如何改变每个小球出现的初始位置呢?即是要改变Ball类中x,y的初始值参考代码importjava.applet.Applet;importjava.awt.*;importjava.awt.event.*;publicclassKeyGameextendsAppletimplementsKeyListener{finalintNUM=10;//定义线程的数量,即每次出现字符的个数Keyskey[]=newKeys[NUM];intscore=0;charc[]={"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};//,"a","b","c","d","e","f","g","h","i","j","k","l","m","n",//"o","p","q","r","s","t","u","v","w","x","y","z"};classKeysextendsThread{intx=0,y=0,a=2,b=3;intaa;//用来保存当前线程中字符对应的字符数组c的下标Keys(intx,inty,inta,intb){this.x=x;this.y=y;this.a=a;this.b=b;}publicvoidrun(){while(true){x=x+a;y=y+b;if(y>=getHeight()){aa=(int)(Math.random()*25);y=0;score=score-10;}if(x>=getWidth()){x=0;}try{sleep(80);}catch(InterruptedExceptione){//TODO自动生成catch块e.printStackTrace();}repaint();}}}9
publicvoidinit(){for(inti=0;i=getHeight())y=0;if(x>=getWidth())x=0;try{sleep(10);}catch(InterruptedExceptione){//TODO自动生成catch块e.printStackTrace();}repaint();}}}publicvoidinit(){for(inti=0;i=getHeight()){aa=(int)(Math.random()*25);y=0;score=score-10;}if(x>=getWidth()){x=0;}9
try{sleep(80);}catch(InterruptedExceptione){//TODO自动生成catch块e.printStackTrace();}repaint();}}}publicvoidinit(){for(inti=0;i