Java程序设计实例制作拼图游戏.docx
Java程序设计实例制作拼图游戏Java程序设计实例:制作拼图游戏 本例知识点 新学知识 已学知识 使用Image类 使用MouseEvent类 使用Point类 使用Graphics类 一句话讲解 导入图片 处理鼠标事件 转换坐标 管理屏幕显示 一、练习具体要求 本练习制作拼图游戏,运行效果如图99-1所示。执行本实例后,用鼠标拖动选中的小图片进行拼接,可以拼成一幅完整的图片。本实例的知识点有:鼠标事件的监听,Graphics类和Image类的应用。 二、程序及注释 编程思路:本练习因为要制作拼图游戏,所以首先要实现图片的导入。这是通过getImage函数来实现的,该函数有两个参数,第一个参数指明图片的路径,第二个参数指明图片的名称。然后,因为要实现图片摆放的随意性,所以要通过initgame函数来实现。Initgame函数是自写函数,在函数体内,通过调用Math.random函数产生随机数,用来达到图片位置摆放的随意性和随机性。最后,因为要实现人机交互.,所以首先要通过一系列函数来实现对鼠标事件的监听和响应,这是通过函数addMouseListener(this) 和addMouseMotionListener(this)来完成的。这样程序会区分用户对鼠标不同的操作,正确执行相应的功能。 (2) 程序实现及注释: import java.awt.*; import java.applet.*; import java.awt.event.* ; public class pintu extends Applet implements MouseListener,MouseMotionListener private Image picture; private Graphics buffer; private Image pic; private Image off_pic; private Graphics off_buf; private Image off_screen; private Graphics off_buffer; private Image off_drag; private Graphics off_drag_buf; private int map; private int ran; private int width=0; private int height=0; private int lastx; private int lasty; private int last_downx; private int last_downy; private int stepx; private int stepy; private boolean choose; private boolean click; private boolean m_down; private boolean m_drag; private boolean not_redraw; private boolean able; Font font1,font2; /程序的初始化 public void init resize(640,480); pic = new Image 3; off_pic = new Image16; off_buf = new Graphics 16; map = new int 44; ran = new int 15; for(int a=0;a<16;a+) mapa/4a%4 = a; for(int a=0;a<15;a+) rana=a; click=new boolean 44; MediaTracker tracker= new MediaTracker (this); /要载入的图片 pic0=getImage(getCodeBase,"PICTURE0.JPG"); pic1=getImage(getCodeBase,"PICTURE1.JPG"); pic2=getImage(getCodeBase,"PICTURE2.GIF"); tracker.addImage (pic0,0); tracker.addImage (pic1,0); tracker.addImage (pic2,0); try tracker.waitForID (0); catch(InterruptedException e) /设置字体 font1= new Font ("TimesRoman", Font.BOLD, 48); font2= new Font ("TimesRoman", Font.BOLD, 32); width=640; height=480; /初始化主界面 initForm; /添加鼠标监听事件 addMouseListener(this); addMouseMotionListener(this); /面板初始化 void initForm public void paint(Graphics g) if(off_screen=null) if(able) for(int a=0;a<4;a+) for(int b=0;b<4;b+) if(mapab!=15) off_buffer.setColor (Color.black ); off_screen = createImage(width,height); off_buffer=off_screen.getGraphics ; this.setBackground (Color.orange); if(off_drag=null) off_drag = createImage(width/4,height/4); off_drag_buf = off_drag.getGraphics ; off_buffer.drawImage (off_picmapab,b*width/4,a*height/4,this); if(mapab=15) off_buffer.fillRect (b*width/4,a*height/4,width/4,height/4); for(int c=0;c<2;c+) off_buffer.drawRect (b*width/4+c,a*height/4+c,width/4-c,height/4-c); if(clickab) off_buffer.setColor(Color.red); for(int d=0;d<2;d+) off_buffer.drawOval (b*width/4-d,a*height/4-d,width/4+d,height/4+d); else g.drawImage (off_screen,0,0,this); off_buffer.setColor (Color.orange ); off_buffer.fillRect (0,0,640,480); off_buffer.setFont (font1); off_buffer.setColor(Color.red ); off_buffer.drawImage (pic2,30,50,250,180,this); off_buffer.drawImage (pic0,370,160,250,180,this); off_buffer.drawImage (pic1,60,270,250,180,this); off_buffer.drawString ("Choose One!",320,100); off_buffer.setColor (Color.black ); public void repaint paint(this.getGraphics ); /单击鼠标时产生的事件 public void mouseClicked(MouseEvent evt) /鼠标进入某个区域时产生的事件 public void mouseEntered(MouseEvent evt) /鼠标退出某个区域时产生的事件 public void mouseExited(MouseEvent evt) /移动鼠标时产生的事件 public void mouseMoved(MouseEvent evt) if(!able) Point point; point=evt.getPoint; if(point.x >30 && point.x<280 && point.y>50 && point.y<230) off_buffer.setColor (Color.orange ); off_buffer.fillRect (0,0,640,480); off_buffer.setFont (font1); off_buffer.drawImage (pic2,25,45,250,180,this); off_buffer.drawImage (pic0,370,160,250,180,this); off_buffer.drawImage (pic1,60,270,250,180,this); off_buffer.setColor(Color.black ); off_buffer.fillRect (30,225,250,5); off_buffer.fillRect (275,50,5,176); off_buffer.setColor(Color.red ); off_buffer.drawString ("picture 2!",320,100); this.getGraphics .drawImage (off_screen,0,0,this); else if(point.x >370 && point.x<620 && point.y>160 && point.y<340) off_buffer.setColor (Color.orange ); off_buffer.fillRect (0,0,640,480); off_buffer.setFont (font1); off_buffer.drawImage (pic2,30,50,250,180,this); off_buffer.drawImage (pic0,365,155,250,180,this); off_buffer.drawImage (pic1,60,270,250,180,this); off_buffer.setColor(Color.black ); off_buffer.fillRect (370,335,250,5); off_buffer.fillRect (615,160,5,175); off_buffer.setColor(Color.red ); off_buffer.drawString ("picture 0!",320,100); this.getGraphics .drawImage (off_screen,0,0,this); else if(point.x >60 && point.x<310 && point.y>270 && point.y<450) off_buffer.setColor (Color.orange ); off_buffer.fillRect (0,0,640,480); off_buffer.setFont (font1); off_buffer.drawImage (pic2,30,50,250,180,this); off_buffer.drawImage (pic0,370,160,250,180,this); off_buffer.drawImage (pic1,55,265,250,180,this); off_buffer.setColor(Color.black ); off_buffer.fillRect (60,445,250,5); off_buffer.fillRect (305,270,5,175); off_buffer.setColor(Color.red ); off_buffer.drawString ("picture 1!",320,100); this.getGraphics .drawImage (off_screen,0,0,this); else repaint; /拖动鼠标时产生的事件 public void mouseDragged(MouseEvent evt) if(!able) return; if(m_down) Point point; Point temp; point=evt.getPoint; m_drag=true; repaint; Graphics david = this.getGraphics ; if(!not_redraw) off_drag_buf.drawImage (off_picmaplast_downylast_downx,0,0,this); david.drawImage (off_drag,point.x+stepx,point.y+stepy,this); not_redraw=true; /按下鼠标时产生的事件 public void mousePressed(MouseEvent evt) if(!able) return; Point point; Point temp; point=evt.getPoint; if(getarea(point) = point) return; else temp=getarea(point); if(!m_down) else if(m_down) if(maptemp.ytemp.x=15) return; else m_down=true; last_downx=temp.x; last_downy=temp.y; stepx=temp.x*160-point.x; stepy=temp.y*120-point.y; m_down=false; /放开鼠标时产生的事件 public void mouseReleased(MouseEvent evt) if(able) if(m_drag) m_down=false;m_drag=false;not_redraw=false; Point point; Point temp; point=evt.getPoint; if(getarea(point) = point) repaint; return; else temp=getarea(point); if(maptemp.ytemp.x!=15) repaint;return; else if(Math.abs (last_downx-temp.x)=1 && last_downy-temp.y=0) maplast_downylast_downx =15; maptemp.ytemp.x=david; if(wingame) int david; david=maplast_downylast_downx; able=false; repaint; return; else if(last_downx-temp.x=0 && Math.abs (last_downy-temp.y)=1) else Point point; elserepaint; return; maplast_downylast_downx =15; maptemp.ytemp.x=david; if(wingame) able=false; int david; david=maplast_downylast_downx; repaint; return; point=evt.getPoint; if(point.x >30 && point.x<280 && point.y>50 && point.y<230) able=true; initmap(2); if(point.x >370 && point.x<620 && point.y>160 && point.y<340) able=true;initmap(0); if(point.x >60 && point.x<310 && point.y>270 && point.y<450) able=true;initmap(1); else return; /转换坐标 public Point getarea(Point point) if(point.x>640 | point.y>480) return point; else return point = new Point (point.x/160,point.y/120); /图片初始化 void initmap(int stage) for(int a=0;a<15;a+) off_pica = createImage(width/4,height/4); off_bufa = off_pica.getGraphics ; off_bufa.drawImage (picture,0,0,width/4,height/4, picture = createImage(width,height); buffer = picture.getGraphics ; buffer.drawImage (picstage,0,0,640,480,this); (a%4)*width/4,(a/4)*height/4,(a%4+1)*width/4,(a/4+1)*height/4,this); initgame; repaint; /程序是否结束 boolean wingame /游戏初始化 void initgame for(int a=0;a<4;a+) for(int b=0;b<4;b+) if(mapab=a*4+b) ; else return false; return true; for(int a=0;a<4;a+) for(int b=0;b<4;b+) if(!(a=3 && b=3) mapab = (int)(Math.random*14); if(ranmapab=-1) int temp=mapab; while(rantemp=-1) mapab=rantemp; rantemp=-1; temp+; if(temp>14) temp=0; else ranmapab=-1; else map33 = 15; 三、练习效果 本实例代码编写完毕,存盘为:C: j2sdk1.4.0javaprograms pintu.java。 打开计算机的命令提示符窗口,然后在命令提示符窗口中,定位到javaprograms目录,输入javac pintu.java 来编译程序,最后将程序加载到网页上。在javaprograms文件夹下新建一个记事本文件,内容为 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb_2312-80"> <meta name="GENERATOR" content="Microsoft FrontPage Express 2.0"> <title>拼图 1.0</title> </head> <body> <hr> <p> <applet code="pintu.class" align="baseline" width="640" height="480" name="Pizza" style="HEIGHT: 480px; LEFT: 0px; TOP: 0px; WIDTH: 640px"></applet> </p> </body> </html>,然后保存为pintu.html的网页文件。 本例制作完毕,用浏览器打开pintu.html文件便可以看到制作效果。图99-1练习效果 四、总结提高 本练习制作拼图游戏的实例,运用了Java2中的图形处理技术和消息响应技术。通过图形技术,实现图片的导入和分割。通过消息响应机制,使程序可以响应用户的鼠标操作,进行拼图游戏的操作。 疯狂java简介 疯狂Java是广州为学教育科技有限公司旗下品牌,由李刚老师、肖文吉老师联合创建,作为一家专注于javaEE和3G/4G技术的专业培训服务机构,疯狂Java怀抱“软件强国”的理想,立志以务实的技术来改变中国的软件教育。以“十年磨一剑”的心态打造全中国最强的Java学习体系。 疯狂java培训讲义 疯狂Java相继出版疯狂Java讲义、疯狂Android讲义、轻量级JavaEE企业应用实战、疯狂Ajax讲义、疯狂XML讲义、经典JavaEE企业应用实战、Struts2.1 权威指南、RubyOnRails敏捷开发最佳实践、疯狂Java突破程序员基本功的16课、疯狂JAVA成为程设高手的16堂课等著作。其中疯狂Java体系图书都是已经得到广泛的市场认同,并多次重印的畅销图书,并被多家高校选作教材,部分图书已被翻译成繁体中文版、输出到台湾地区。 疯狂java发展概况 疯狂Java紧扣IT前沿技术的脉搏,高瞻远瞩立于潮头,引领行业标杆,开创IT教育培训的新天地,被称为新式IT教育的“黄埔军校”。疯狂java教育中心主要面对大学生和准大学生的长期就业培训、企业员工定制内训、在职工程师的短期高端培训以及企业级应用的产品研发,其专业服务和质量承诺在客户中赢得广泛的声誉。为保服务的质量,学校与华南理工大学、中山大学、暨南大学、华南师范大学等高等学府建立了师资力量方面的合作关系,同时与中国电信、中国移动、中国邮政、新华南方、汇丰银行等知名企业建立了广泛的战略合作伙伴关系。 疯狂java师资力量 疯狂Java创始人李刚,携疯狂Java精英讲师团队肖文吉、李韩飞、黄勇、陈辉等老师将带给广大学习者“非一般”的疯狂。 疯狂java培训特色 疯狂Java结合自身特色,打破固有思维模式,以突出实战性,系统性,学识转换相结合的理念体系指引下,注重如何将培训内容真正转化为实操经验,以此促进工作能力的达成。在疯狂软件学院,学员通过参与企业实际项目开发,学以致用,获得实际项目经验。凭借自身强悍的师资、一流的课程、真实的项目、超高的就业率已经让广大南方学子成功走上软件工程师职业道路。大量毕业即失业的学子已通过疯狂Java实现了就业。加入疯狂Java,加入改变世界的力量,让我们一起行动,用自己的代码改变世界! 地址:广州市天河区车陂大岗路4号沣宏大厦3011过马路左转前行200米) 联系电话: 020-28309358、28309378 java技术问题咨询QQ:951170790