1、序-3-3.2.3、程序代码4、课程设计总结225、参考文献231.需求分析1.1功能分析每次用户选择两个图形,如果图形满足一定条件(两个图形一样,且这两个图形之间存在转弯少于3的路径),则两个图形都能消掉。给定任意具有相同图形的两个格子,我们需要寻找这两个格子之间在转弯最少的情况下,经过格子数目最少的路径。如果这个最优路径的转弯数目少于,则这两个格子可以消去。将界面中相同的图片消去,游戏限时1000秒,如果在规定的时间内没有完成,就会跳出对话框“时间耗尽了,你输了:(”的字样。如果玩家赢了这局,则弹出“非常棒,你赢了!”在经典的最短路问题中,我们需要求出经过格子数目最少的路径。而这里,要保证
2、转弯数目最少,需要把最短路问题的目标函数修改为从一个点到另一个点的转弯次数。虽然,目标函数修改了,但算法的框架仍然可以保持不变。广度优先搜索是解决经典最短路问题的一个思路。我们看看在新的目标函数(转弯数目最少)下,如何用广度优先搜索来解决图形A(x1,y1)和图形B(x2,y2)之间的最短路问题。1.2设计任务1、明确软件实用性,设计本次软件;2、深入学习和理解android开发平台,掌握软件开发机制和方法;3、深入分析连连看软件功能流程图;4、应用软件工程思想,小组合作完成需求分析到代码设计并完成测试;-4-5、按照格式要求撰写设计报告2.设计正文2.1设计分析2.1.1连连看算法设计在检验
3、两个方块能否消掉的时候,我们要让两个方块同时满足两个条件才行,就是两者配对并且连线成功。分种情况:(从下面的这三种情况,我们可以知道,需要三个检测,这三个检测分别检测一条直路经。这样就会有三条路经。若这三条路经上都是空按钮,那么就刚好是三种直线(两个转弯点)把两个按钮连接起来了。1)相邻2)若不相邻的先在第一个按钮的同行找一个空按钮。1).找到后看第二个按钮横向到这个空按钮所在的列是否有按钮。2).没有的话再看第一个按钮到与它同行的那个空按钮之间是否有按钮。3).没有的话,再从与第一个按钮同行的那个空按钮竖向到与第二个按钮的同行看是否有按钮。没有的话路经就通了,可以消了.3)若2失败后,再在第
4、一个按钮的同列找一个空按钮。1).找到后看第二个按钮竖向到这个空按钮所在的行是否有按钮2).没有的话,再看第一个按钮到与它同列的那个空按钮之间是否有按钮。没有的话,再从与第一个按钮同列的那个空按钮横向到与第二个按钮同列看是否有按钮。没有的话路经就通了,可以消了。4)若以上三步都失败,说明这两个按钮不可以消去。2.2类的实现方法2.2.1成员变量成员变量也叫类的属性,一般带有访问控制属性的,而全局变量虽然也有类的属性,但全局变量严重影响了封装和模块化,一般的全局变量前面要加上static和fina属性其中,static使该变量任何类都可用(方法ClassName.全局变量名),而则使得变量不可更
5、改,基本上算是常量了,这也在一定程度上防止对变量的非法修改。成员变量描述 变量类型 名称文件 File File文件区 Jtextarea Textarea菜单项 Jmenuitem Menuitem_copy菜单 Umenuitem Umenuitem标签 Jlabel Label_seek文件名 String Seel图一2.2.2方法设计-5-方法名称为任何合乎语法的识别字,返回值类型是方法执行结果返回给调用者的数据类型,void表示没有返回值,参数行(parameterlist)是调用时给予的参数声明,两个以上的参数声明以逗号隔开,若没有参数则参数行为空白,调用时每一个参数对应一个参数
6、值(argument)大括号内为方法本体,也称为方法程序模块(block),包含声明(declarations)和语句(statements),声明也可以掺杂在语句之间。一个方法不能声明在另一个方法内。方法名 功能 备注MyTextEditor 创建文本编辑器 构造方法Dialog 创建对话框addMenu 添加菜单栏菜单项writeToFile 向文本区写文件readFromFile 读文件openDialog 打开文件saveDialog 保存对话框actionPerformed 事件处理itemStateChanged ItemListener事件处理mouseClicked 鼠标处理事
7、件 接口方法mouseEvent 鼠标处理事件 接口方法mouseReleased 鼠标处理事件 接口方法mouseEntered 鼠标处理事件 接口方法mouseExit 鼠标处理事件 接口方法mouseDragged 鼠标处理事件 接口方法图二 方法定义2.2.3设计流程图-6-进入主函数开始游戏接受用户点击两张图片是否相同Y两张图片是否可以相连程序是否还有图片没消除N结束3测试分析3.1程序运行情况连连看游戏规则很简单,就是点中两个互相匹配并且可以通过不多于两个折点的折线连在一起的方块后,这两个方块就可以消掉。-7-8-9-3.2测试计划及分析3.2.1 路径分析在检测两张图片是否可以消
8、除之前首先要判断两图之间的路径,因为图于图之间可以有很多条路径有些路径是可行的有些路径是不可行的,在检测中当路径不满足游戏条件时,则继续检测,一直到检测到一条满足游戏条件的路径时,停止检测并按此路径进行连接。当找到满足游戏条件的路径时,立刻按检测到的路径进行图片的连接,之后便消除连接的两张图片。3.2.2检验的先后顺序所以,这里应该先检验配对,如果该条件不成立的话,就不要再进行连线检查了,这样可以避免很多不必要的复杂运算。当然,如果你在做这个游戏的时候,配对规则不够如此简单的话,那么就看哪个算起来麻烦就把它放在后面。3.2.3程序代码ackagecom.automan;/画出网格,并对应的画上
9、分不好的图像importjava.util.ArrayList;java.util.Arrays;java.util.List;java.util.Random;com.automan.CtrlView.Point;android.content.Context;android.graphics.Bitmap;android.graphics.Canvas;android.graphics.Color;android.graphics.Paint;android.graphics.Rect;android.graphics.drawable.Drawable;android.util.Attr
10、ibuteSet;android.util.Log;android.view.View;publicclassGameViewextendsViewfinalintrow=10;col=10;floatwidth;height;privateselY;selX;-10-booleanisLine=false;grid=newintrowcol;RectselRect=newRect();lineType=0;V_LINE=1;H_LINE=1;ONE_C_LINE=2;TWO_C_LINE=3;much=0;Pointp;intimageType=newintR.drawable.aa,R.d
11、rawable.bb,R.drawable.cc,R.drawable.dd,R.drawable.ee,R.drawable.ff,R.drawable.gg,R.drawable.hh,R.drawable.ii,R.drawable.jj,R.drawable.kk,R.drawable.ll,R.drawable.mm,R.drawable.nn,R.drawable.oo,R.drawable.pp;PublicBitmapimage;Listtype=newArrayList();GameView(Contextcontext,AttributeSetattrs) super(co
12、ntext,attrs);this.setFocusable(true);this.setFocusableInTouchMode(true);attars,defStyle) super(context,attrs,defStyle);voidreset()fillImage(Contextcontext)lth=imageType.length;image=newBitmaplth;for(inti=0;ilth;i+)bitmap =Bitmap.createBitmap(int)width,(int)height,Bitmap.Config.ARGB_8888);Drawabledrw
13、;CanvascanvasCanvas(bitmap);drw=context.getResources().getDrawable(imageTypei);drw.setBounds(1,1,30,30);drw.draw(canvas);imageibitmap;initType()Log.e(gametest,inittype);size=(row-2)*(col-2);count=size/imageType.length;j=0;j0)index=ad.nextInt(type.size();gridij=type.get(index);type.remove(index);第二部分
14、packagejava.util.LinkedList;android.os.Handler;android.os.Message;android.view.MotionEvent;CtrlViewGameViewGAMETIME=300;UPTIME=1;PROCESS_VALUE=300;CURRENT_CH=false;CURRENT_TYPE=0;PointC_POINT;P_POINT;LinkedListli;CtrlView(Contextsuper(context,initType();initGrid();15much=(row-2)*(col-2);onTouchEvent(MotionEventevent)if(event.getAction()!=Mo