java-课程设计报告-拼图游戏_第1页
java-课程设计报告-拼图游戏_第2页
java-课程设计报告-拼图游戏_第3页
java-课程设计报告-拼图游戏_第4页
java-课程设计报告-拼图游戏_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

面向对象的课程设计与分析(java)拼图游戏 (学号。班级。姓名。)目录1、 题目介绍.3 1、题目.3 2、任务.3 3、要求.3二、需求分析.33、 概要设计.4 1、功能分析.4 2、界面初始化.4 3、事件处理(1)鼠标事件.4 4、事件处理(2)键盘事件.5 5、状态判断.5 6、程序流程图.54、 详细设计.6 1、.html代码设计.6 2、.java代码设计.6五、调试结果.19第一个大图的拼图界面.19第一个拼图全图预览.19第二个大图的拼图界面.20第二个拼图全图预览.20第三个大图的拼图界面.21第三个拼图全图预览.21六、心得总结.22七、参考资料.221、 题目介绍1、 题目:拼图游戏设计2、 任务:利用java的图形用户界面设计,设计一个拼图游戏界面,能够实现基本的游戏功能。3、 要求:(1)游戏者可以选择不同的图片。(2)按完成的时间计算成绩。(3)记录拼图完成的总步数。2、 需求分析拼图游戏是一个简单的小程序,游戏规则如下:将一张大图打散成9张小图,然后在游戏里任意挑8张图,贴在3行3列的矩阵中的任意位置。通过鼠标或键盘的方向键移动打乱的8张图片,让其复原成原来的顺序,玩家就胜利了,游戏就结束了。在游戏结束之后,算出玩家的得分。三、概要设计1、功能分析由于要计算游戏的时间,需要引入线程,通过实现Runnable接口和创建Thread类来实现线程的功能。使用多线程机制来计算时间的流逝。引入AWT绘图包,实现图片的绘制。 引入事件处理机制,要求对鼠标事件,键盘事件进行相应,实现移动图片,预览全图等功能。按键“Y”实现临时的原图整体预览。按键“1或者2或者3”实现大图选择、2、 界面初始化调用public void init()通过接收html数据,加载三张源图片,安装媒体监视器和鼠标键盘监听器,实现界面初始化;调用public void initData()将加载的一张大图分割成九个随机分布的小图部分; 调用public void paint(Graphics g)划分提示信息区域和拼图区域;3、 事件处理(1) 鼠标事件调用public void mouseClicked(MouseEvent e)方法实现鼠标事件处理。调用Public int directionCanMove(int nCol,int nRow)方法检测那个方向没有拼图而可以向之移动。调用public void move(int nCol,int nRow,int nDirection)方法实现鼠标激活拼图移动。(2) 键盘事件调用public void keyPressed(KeyEvent e)方法实现键盘事件处理。 调用public void initImageAgain(int nImgNo)方法实现重新加载另一张大图。调用public boolean move(int nDirection)方法实现判断指定拼图是否可以往方向nDirection移动。4、状态判断动过调用public void checkStatus()方法来检测拼图状态,判断是否拼图成功,确定游戏是否结束。5、附加功能调用public void run()方法,给游戏过程添加计时进程。6、程序流程图4、 详细设计1、 编写.html代码拼图游戏拼图游戏这是一个拼图游戏。玩家应该将打散的小图拼成一张大图。玩家可以通过鼠标和键盘来移动小图,移动的次数和拼成一张大图所化费的时间作为游戏得分的依据。成绩=1000-时间(秒)-移动步数*10按F1键重新开始该游戏,按Y健可以预览整个的图片2、 编写.java代码1、界面设计和附加功能import java.applet.*;import java.awt.*;import java.awt.event.*;import .*;/Download by public class pintu extends Applet implements MouseListener,KeyListener,Runnable Image m_Image=new Image9; /9个用来装入每个拼图的图片对象 Image m_ImgAll; /总的大图片int m_nImageNo=new int33; /标志现在各个拼图的排列情况final int NO_IMAGE=-1; /此位置没有拼图,表示空白拼图final int IMAGE_WIDTH=120; /每张拼图的宽final int IMAGE_HEIGHT=120; /每张拼图的高final int DIRECTION_UP=1;final int DIRECTION_DOWN=2;final int DIRECTION_LEFT=3;final int DIRECTION_RIGHT=4;final int DIRECTION_NONE=-1; final int DELTAX=120; /标志提示信息区的宽度 boolean bWantStartNewGame=false; /游戏是否结束,是否需要开始新游戏 int nStep=0; /已经走的步数 int nTime=0; /已经玩过的时间,以秒为单位 Thread thTimer; /计时器线程 int nScore=0; /玩家所得的分数 int m_nNumOfImg=0; /拼图底图所使用的图片的个数 String m_sImgName=new String9; /记录拼图底图的名字 boolean bOnShowAll=false; /预览的开关 AudioClip m_audioClip1,m_audioClip2; /装载要播放的声音对象 public void init()/ String param=getParameter(NumOfImg); try m_nNumOfImg=Integer.parseInt(param); catch(Exception e) m_nNumOfImg=1; System.out.println(Cant convert the params name to int.); for(int i=0;im_nNumOfImg;i+) m_sImgNamei=getParameter(Image+(i+1)+.jpg;/用字符串数组m_sImgName分别保存三个大图及其规范命名:p/pintu.jpg pintu1.jpg pintu2.jpg System.out.println(m_sImgNamei); System.out.println(param); MediaTracker mediaTracker=new MediaTracker(this); /为这个拼图界面设置一个监视器m_ImgAll=getImage(getDocumentBase(),img/+m_sImgName0); /从装载总的大图片mediaTracker.addImage(m_ImgAll,1);/为向此媒体跟踪器正在跟踪的图像列表中添加一个图像,/并分配一个表示号1 给这个图像trymediaTracker.waitForID(1);/加载所跟踪的图像列表中的某一个标识号所对应的的一个图像catch(Exception e)System.out.println(图片装载出错); if(mediaTracker.isErrorAny()System.out.println(图片装载出错); for(int i=0;i9;i+) m_Imagei=createImage(IMAGE_WIDTH,IMAGE_HEIGHT); Graphics g=m_Imagei.getGraphics(); int nRow=i%3; int nCol=i/3; g.drawImage(m_ImgAll, 0, 0, IMAGE_WIDTH, IMAGE_HEIGHT, nRow*IMAGE_WIDTH, nCol*IMAGE_HEIGHT, (nRow+1)*IMAGE_WIDTH, (nCol+1)*IMAGE_HEIGHT, this); System.out.println(init +i); /将一个大图切割成九个小图 System.out.println(init over);thTimer=new Thread(this); /为线程分配内存空间 thTimer.start(); /开始线程 initData(); m_audioClip1=getAudioClip(getCodeBase(),au/move.au); m_audioClip2=getAudioClip(getCodeBase(),au/notmove.au); addMouseListener(this);addKeyListener(this); public void initData()System.out.println(run initData); int nHasDistrib=new int9;/为每个小图分配一个数字标识,用来判定该小图是否被随机编一个二维数组号 for(int i=0;i9;i+)nHasDistribi=0;for(int j=0;j3;j+)for(int i=0;i200)sTemp=sTemp+时间用的很长了,你可要加油啦!; else sTemp=sTemp+别紧张,慢慢来。; showStatus(sTemp); if(!bWantStartNewGame)nTime+; catch(Exception e) public void paint(Graphics g) g.setColor(Color.blue); /将当前颜色变为蓝色g.fillRect(0,0,DELTAX,IMAGE_HEIGHT*3); /填充左边的提示信息区域 g.setFont(new Font(宋体,Font.PLAIN,15); /设置字体/*Font是一个字体类!PLAIN是它的一个静态常量!类似的还有BOLD,ITALICFont.PLAIN 是一个普通的系统默认的字体!jMenuSystem.setFont(new java.awt.Font(华文新魏, Font.PLAIN, 20);设置字体为 华文新魏 类型: 普通系统默认 大小为20 */ g.setColor(Color.red); /setColor函数对该函数调用的下文进行颜色设置 g.drawString(步数:+nStep,5,20); g.drawString(现有图片+m_nNumOfImg+张,5,60); g.drawString(请按1-+m_nNumOfImg+键改变图片,5,100); /在坐标(5,20)画出字串,来显示现在走了多少步。 g.setColor(Color.blue); if(bOnShowAll) int x=DELTAX; int y=0; g.drawImage(m_ImgAll,x,y,this); return; for(int i=0;i3;i+)for(int j=0;j3;j+)int x=i*IMAGE_WIDTH+DELTAX;int y=j*IMAGE_HEIGHT;if(m_nImageNoij=NO_IMAGE)g.fill3DRect(x,y,IMAGE_WIDTH,IMAGE_HEIGHT,false);else g.drawImage(m_Imagem_nImageNoij,x,y,this); g.drawRect(x,y,IMAGE_WIDTH,IMAGE_HEIGHT); checkStatus(); if(bWantStartNewGame) /如果游戏结束,玩家将拼图的顺序排对之后 nScore=1000-nStep*10-nTime; g.setColor(Color.blue); g.drawString(请按任意键重新开始,5,140); g.setColor(Color.red); g.setFont(new Font(宋体,Font.PLAIN,40); g.drawString(你赢了+nScore+分,70+DELTAX,160); g.drawString(祝贺你!,110+DELTAX,210); public void checkStatus() boolean bWin=true; /定义成员,默认值为真 int nCorrectNum=0; for(int j=0;j3;j+) for(int i=0;i=0)if(m_nImageNonRownCol-1=NO_IMAGE)return DIRECTION_UP;if(nCol+1)=0)if(m_nImageNonRow-1nCol=NO_IMAGE)return DIRECTION_LEFT;if(nRow+1)=2)if(m_nImageNonRow+1nCol=NO_IMAGE)return DIRECTION_RIGHT;return DIRECTION_NONE;public void move(int nCol,int nRow,int nDirection)switch(nDirection)case DIRECTION_UP:m_nImageNonRownCol-1=m_nImageNonRownCol;m_nImageNonRownCol=NO_IMAGE;break;case DIRECTION_DOWN:m_nImageNonRownCol+1=m_nImageNonRownCol;m_nImageNonRownCol=NO_IMAGE;break;case DIRECTION_LEFT:m_nImageNonRow-1nCol=m_nImageNonRownCol;m_nImageNonRownCol=NO_IMAGE;break;case DIRECTION_RIGHT: m_nImageNonRow+1nCol=m_nImageNonRownCol;m_nImageNonRownCol=NO_IMAGE;break;3、键盘事件处理public void keyPressed(KeyEvent e)/Invoked when a key has been pressed. if(bOnShowAll) if(e.getKeyCode()=KeyEvent.VK_Y) bOnShowAll=false; repaint(); return; System.out.println(press key+e.getKeyCode()+ +e.getKeyText(e.getKeyCode(); System.out.println(KeyEvent.VK_LEFT);if(bWantStartNewGame) initData(); bWantStartNewGame=false; repaint(); return; int nDirection=DIRECTION_NONE; switch(e.getKeyCode()case KeyEvent.VK_DOWN:nDirection=DIRECTION_DOWN;break;case KeyEvent.VK_UP:nDirection=DIRECTION_UP;break;case KeyEvent.VK_LEFT:System.out.println(left111.);nDirection=DIRECTION_LEFT;break;case KeyEvent.VK_RIGHT:System.out.println(left.);nDirection=DIRECTION_RIGHT;break; case KeyEvent.VK_F1: /F1键按下,重新开始游戏 initData(); /init(); repaint(); return; case KeyEvent.VK_1: case KeyEvent.VK_2: case KeyEvent.VK_3: case KeyEvent.VK_4: case KeyEvent.VK_5: case KeyEvent.VK_6: case KeyEvent.VK_7: case KeyEvent.VK_8: case KeyEvent.VK_9: int nImgNo=e.getKeyCode()-KeyEvent.VK_1; if(nImgNom_nNumOfImg) showStatus(你要的图片不存在!); return; / System.out.println(param); MediaTracker mediaTracker=new MediaTracker(this); /建立一个监视器m_ImgAll=getImage(getDocumentBase(),img/+m_sImgNamenImgNo); /装载总的大图片mediaTracker.addImage(m_ImgAll,1);trymediaTracker.waitForAll();catch(Exception e)System.out.println(图片装载出错); for(int i=0;i9;i+) m_Imagei=createImage(IMAGE_WIDTH,IMAGE_HEIGHT); Graphics g=m_Imagei.getGraphics(); int nRow=i%3; int nCol=i/3; g.drawImage(m_ImgAll,0,0,IMAGE_WIDTH,IMAGE_HEIGHT,nRow*IMAGE_WIDTH,nCol*IMAGE_HEIGHT,(nRow+1)*IMAGE_WIDTH,(nCol+1)*IMAGE_HEIGHT,this); System.out.println(dfsdfdfdsdf+i); /public void update(Graphics g)/ / paint(g);/ / 由于:/paint方法是applet继承自awt中的Component的方法,/会在对象加载时自动调用,用来绘制该组件内部的所有内容。/如果想重新调用该方法中执行的操作可以使用repaint()方法。/如果paint方法在其他方法中调用,则会在对象加载是自动调用调用了paint方法的那个方法。/代码中之所这样包含以下,作用其实是为paint改一个更合乎代码业务逻辑的名称。public boolean move(int nDirection)int nNoImageCol=-1;int nNoImageRow=-1;int i=0;int j=0;while (i3 & nNoImageRow=-1)while (j3 & nNoImageCol=-1)if(m_nImageNoij=NO_IMAGE)nNoImageRow=i;nNoImageCol=j; j+; j=0; i+; /以上判断哪个拼图可以往方向nDirection移动 /可以移动的拼图的位置为第nNoImageCol行,第nNoImageRow列。 System.out.println(nNoImageCol+,+nNoImageRow);switch(nDirection)case DIRECTION_UP:if(nNoImageCol=3)return false;m_nImageNonNoImageRownNoImageCol=m_nImageNonNoImageRownNoImageCol+1;m_nImageNonNoImageRownNoImageCol+1=NO_IMAGE;break;case DIRECTION_DOWN:if(nNoImageCol=0)return false;m_nImageNonNoIma

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论