




已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
学院 XX学院智能移动终端应用开发设计报告(20XX/20XX学年第X学期)题 目 : 欢乐连连看 专 业 : XXXXXX 小组成员 : 设计成绩 : 20XX年XX月XX日1.需求分析1.1功能分析每次用户选择两个图形,如果图形满足一定条件(两个图形一样,且这两个图形之间存在转弯少于3的路径),则两个图形都能消掉。给定任意具有相同图形的两个格子,我们需要寻找这两个格子之间在转弯最少的情况下,经过格子数目最少的路径。如果这个最优路径的转弯数目少于3 ,则这两个格子可以消去。将界面中相同的图片消去,游戏限时1000秒,如果在规定的时间内没有完成,就会跳出对话框“时间耗尽了,你输了:(”的字样。如果玩家赢了这局,则弹出“非常棒,你赢了!”在经典的最短路问题中,我们需要求出经过格子数目最少的路径。而这里,要保证转弯数目最少,需要把最短路问题的目标函数修改为从一个点到另一个点的转弯次数。虽然,目标函数修改了,但算法的框架仍然可以保持不变。广度优先搜索是解决经典最短路问题的一个思路。我们看看在新的目标函数(转弯数目最少)下,如何用广度优先搜索来解决图形A(x1,y1)和图形B(x2,y2)之间的最短路问题。1.2设计任务 1、明确软件实用性,设计本次软件; 2、深入学习和理解android开发平台,掌握android软件开发机制和方法; 3、深入分析连连看软件功能流程图; 4、应用软件工程思想,小组合作完成需求分析到代码设计并完成测试; 5、按照格式要求撰写设计报告。 2.设计正文2.1设计分析2.1.1连连看算法设计在检验两个方块能否消掉的时候,我们要让两个方块同时满足两个条件才行,就是两者配对并且连线成功。分3种情况:(从下面的这三种情况,我们可以知道,需要三个检测,这三个检测分别检测一条直路经。这样就会有三条路经。若这三条路经上都是空按钮,那么就刚好是三种直线(两个转弯点)把两个按钮连接起来了。1) 相邻 2) 若不相邻的先在第一个按钮的同行找一个空按钮。1).找到后看第二个按钮横向到这个空按钮所在的列是否有按钮。2).没有的话再看第一个按钮到与它同行的那个空按钮之间是否有按钮。3).没有的话,再从与第一个按钮同行的那个空按钮竖向到与第二个按钮的同行看是否有按钮。没有的话路经就通了,可以消了. 3) 若2失败后,再在第一个按钮的同列找一个空按钮。1).找到后看第二个按钮竖向到这个空按钮所在的行是否有按钮 2).没有的话,再看第一个按钮到与它同列的那个空按钮之间是否有按钮。没有的话,再从与第一个按钮同列的那个空按钮横向到与第二个按钮同列看是否有按钮。没有的话路经就通了,可以消了。4) 若以上三步都失败,说明这两个按钮不可以消去。2.2 类的实现方法2.2.1 成员变量成员变量也叫类的属性,一般带有访问控制属性的,而全局变量虽然也有类的属性,但全局变量严重影响了封装和模块化,一般的全局变量前面要加上static和 fina属性其中,static使该变量任何类都可用(方法 ClassName.全局变量名) ,而 fina则使得变量不可更改,基本上算是常量了,这也在一定程度上防止对变量的非法修改。成员变量描述变量类型名称文件FileFile文件区JtextareaTextarea菜单项JmenuitemMenuitem_copy菜单UmenuitemUmenuitem标签JlabelLabel_seek文件名StringSeel图一 成员变量2.2.2 方法设计方法名称为任何合乎语法的识别字,返回值类型是方法执行结果返回给调用者的数据类型,void表示没有返回值,参数行(parameterlist)是调用时给予的参数声明,两个以上的参数声明以逗号隔开,若没有参数则参数行为空白,调用时每一个参数对应一个参数值(argument)大括号内为方法本体,也称为方法程序模块(block),包含声明(declarations)和语句(statements),声明也可以掺杂在语句之间。一个方法不能声明在另一个方法内。方法名功能备注MyTextEditor创建文本编辑器构造方法Dialog创建对话框addMenu添加菜单栏菜单项writeToFile向文本区写文件readFromFile读文件openDialog打开文件saveDialog保存对话框actionPerformed事件处理itemStateChangedItemListener事件处理方法mouseClicked鼠标处理事件接口方法mouseEvent鼠标处理事件接口方法mouseReleased鼠标处理事件接口方法mouseEntered鼠标处理事件接口方法mouseExit鼠标处理事件接口方法mouseDragged鼠标处理事件接口方法Main程序开始运行图二 方法定义2.2.3 设计流程图3测试分析3.1 程序运行情况连连看游戏规则很简单,就是点中两个互相匹配并且可以通过不多于两个折点的折线连在一起的方块后,这两个方块就可以消掉。图三 游戏开始界面 图四 游戏赢了的界面图五 游戏时间耗尽时的界面3.2 测试计划及分析3.2.1 最短路径分析由于用户每次只能消除一对图形,即只会用到一个最短路径,但由于实现并不知道用户会选择哪一对图形,所以需要事先计算出所有可能的最短路径并保存起来。此外,采用这种方法的话似乎每次用户消去一对相同图像之后都需要重新计算出当前所有可能被连接的相同图形之间最短路径,这是因为当某些图像被消去之后可能会产生很多新路径,而我们又不能确定这些空出来的格子到底能够影响哪些路径,所以就只好都重新计算一遍。其缺点很明显就是每次消去图形动作之后重新计算所有可能的最短路径所需要消耗的时间;而该方法的优点则是可以很快地判断两个相同图形之间是否存在满足条件的最短路径。如果用户很厉害,每次都能选中可以消除的图形对,那么用这种方法浪费的时间就会相当可观,毕竟用户未选中的其他可以连接的图形对之间的最短路径都被浪费掉了;而如果用户很差劲,每轮选择的次数都远远大于当前可能的连接数量时,该方法就会比书中正文提到的方法高效。但这种情况是比较少的,因为在整个游戏中用户主要是会用眼睛“找”而不是频繁的用鼠标去“试”。所以总的来看,维护所有最短路径的方法的效率相对比较低。3.2.2 检验的先后顺序在检验两个方块能否消掉的时候,我们要让两个方块同时满足两个条件才行,就是两者配对并且连线成功。所以,这里应该先检验配对,如果该条件不成立的话,就不要再进行连线检查了,这样可以避免很多不必要的复杂运算。当然,如果你在做这个游戏的时候,配对规则不够如此简单的话,那么就看哪个算起来麻烦就把它放在后面。3.2.3 程序代码package com.automan;/画出网格,并对应的画上分布好图像import java.util.ArrayList;import java.util.Arrays;import java.util.List;import java.util.Random;import com.automan.CtrlView.Point;import android.content.Context;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Rect;import android.graphics.drawable.Drawable;import android.util.AttributeSet;import android.util.Log;import android.view.View;public class GameView extends View public final int row=10;public final int col=10;public float width;public float height;private int selY;private int selX;public boolean isLine=false;public int grid=new introwcol;private Rect selRect = new Rect();public int lineType=0;public final int V_LINE=1;public final int H_LINE=1;public final int ONE_C_LINE=2;public final int TWO_C_LINE=3;public int much=0;Point p;public int imageType=new intR.drawable.aa,R.drawable.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;public Bitmap image;public List type=new ArrayList(); public GameView(Context context, AttributeSet attrs) super(context, attrs); this.setFocusable(true);this.setFocusableInTouchMode(true); public GameView(Context context, AttributeSet attrs, int defStyle) super(context, attrs, defStyle); this.setFocusable(true);this.setFocusableInTouchMode(true); public void reset()public void fillImage(Context context)int lth=imageType.length;image=new Bitmaplth;for(int i=0;ilth;i+)Bitmap bitmap = Bitmap.createBitmap(int)width, (int)height, Bitmap.Config.ARGB_8888);Drawable drw;Canvas canvas = new Canvas(bitmap);drw=context.getResources().getDrawable(imageTypei); drw.setBounds(1,1, 30, 30); drw.draw(canvas); imagei = bitmap; public void initType()Log.e(gametest,inittype);int size=(row-2)*(col-2);int count=size/imageType.length;for(int j=0;jimageType.length;j+)for(int i=0;icount;i+)type.add(imageTypej);public void select(int x,int y)invalidate(selRect);selX =Math.min(Math.max(x,0),9);selY=Math.min(Math.max(y,0),9);getRect(selX,selY,selRect);invalidate(selRect);private void getRect(int x,int y,Rect rect)rect.set(int)(x*width),(int)( y*height), (int)(x*width+width),(int) (y*height+height);Overrideprotected void onDraw(Canvas canvas) Paint background= new Paint();background.setColor(Color.WHITE);canvas.drawRect(0, 0,getWidth(),getHeight(),background);Paint hilite= new Paint();hilite.setColor(getResources().getColor(R.color.hilite);Paint light= new Paint();light.setColor(getResources().getColor(R.color.light);for (int i=0;i9;i+)canvas.drawLine(0, i * height,getWidth(),i * height,light);canvas.drawLine(0,i * height+1,getWidth(),i * height+1,hilite);canvas.drawLine(i * width,0,i * width,getHeight(),light);canvas.drawLine(i * width+1,0,i * width+1,getHeight(),hilite);if(CtrlView.CURRENT_CH)Paint selected= new Paint();selected.setColor(getResources().getColor(R.color.puzzle_selected);canvas.drawRect(selRect, selected);for (int i=0;i9;i+)for (int j=0;j9;j+)if(gridij!=0)canvas.drawBitmap(imageArrays.binarySearch(imageType, gridij), i*width, j*height, null);if(isLine)Paint lineColor= new Paint();lineColor.setColor(Color.RED);switch(lineType)case V_LINE:canvas.drawLine(p0.x*width+width/2,p0.y*height+height/2,p1.x*width+width/2,p1.y*height+height/2, lineColor);break;case ONE_C_LINE:canvas.drawLine(p0.x*width+width/2,p0.y*height+height/2,p1.x*width+width/2,p1.y*height+height/2, lineColor);canvas.drawLine(p1.x*width+width/2,p1.y*height+height/2,p2.x*width+width/2,p2.y*height+height/2, lineColor);break;case TWO_C_LINE:canvas.drawLine(p0.x*width+width/2,p0.y*height+height/2,p1.x*width+width/2,p1.y*height+height/2, lineColor);canvas.drawLine(p1.x*width+width/2,p1.y*height+height/2,p2.x*width+width/2,p2.y*height+height/2, lineColor);canvas.drawLine(p3.x*width+width/2,p3.y*height+height/2,p2.x*width+width/2,p2.y*height+height/2, lineColor);break;default:break;super.onDraw(canvas);Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) Log.e(gametest,sizechanged);width=w/row;height=h/col;/getRect(1,1,selRect);fillImage(this.getContext();super.onSizeChanged(w, h, oldw, oldh);public void initGrid()Log.e(gametest,initGrid);Random ad=new Random();for(int i=0;irow;i+)for(int j=0;j0)int index=ad.nextInt(type.size();gridij=type.get(index);type.remove(index);第二部分:package com.automan;import java.util.ArrayList;import java.util.LinkedList;import java.util.List;import java.util.Random;import android.content.Context;import android.os.Handler;import android.os.Message;import android.util.AttributeSet;import android.view.MotionEvent;public class CtrlView extends GameViewpublic final int GAMETIME=300;public final int UPTIME=1;public int PROCESS_VALUE=300;public static boolean CURRENT_CH=false;public int CURRENT_TYPE=0;private Point C_POINT;private Point P_POINT;LinkedList li;public CtrlView(Context context, AttributeSet attrs) super(context, attrs); initType();initGrid();much=(row-2)*(col-2); public CtrlView(Context context, AttributeSet attrs, int defStyle) super(context, attrs, defStyle); initType();initGrid();much=(row-2)*(col-2); public boolean onTouchEvent(MotionEvent event) if (event.getAction()!=MotionEvent.ACTION_DOWN)return super.onTouchEvent(event);int selX=(int)(event.getX()/width);int selY=(int)(event.getY()/height);if(gridselXselY=0)return true;elseif(CURRENT_CH=false)select(selX,selY);CURRENT_CH=true;P_POINT =new Point(selX,selY);elseC_POINT =new Point(selX,selY);lineType=0;if(checkLink(P_POINT,C_POINT)isLine=true;much=much-2;if(0PROCESS_VALUE & (PROCESS_VALUE+UPTIME)GAMETIME)PROCESS_VALUE=PROCESS_VALUE+UPTIME;invalidate();mRedrawHandler.sleep(300);CURRENT_CH=false;return true;public void reset()CURRENT_CH=false;CURRENT_TYPE=0;C_POINT=null;P_POINT=null;lineType=0;isLine=false;Point p=null;initType();initGrid();much=(row-2)*(col-2);invalidate();public void rearrange()CURRENT_CH=false;CURRENT_TYPE=0;C_POINT=null;P_POINT=null;lineType=0;isLine=false;Point p=null;List temp=new ArrayList();for(int i=0;irow;i+)for(int j=0;jcol;j+)if(gridij!=0)temp.add(gridij);type.clear();Random ad=new Random();for(int i=0;itemp.size();i+)type.add(temp.get(i);temp.clear();temp=null;for(int i=0;irow;i+)for(int j=0;jcol;j+)if(gridij!=0)int index=ad.nextInt(type.size();gridij=type.get(index);type.remove(index);invalidate();private RefreshHandler mRedrawHandler = new RefreshHandler(); class RefreshHandler extends Handler Override public void handleMessage(Message msg) isLine=false; gridP_POINT.xP_POINT.y=0;gridC_POINT.xC_POINT.y=0; CtrlView.this.invalidate(); public void sleep(long delayMillis) this.removeMessages(0);/移除信息队列中最顶部的信息(从顶部取出信息) sendMessageDelayed(obtainMessage(0), delayMillis);/获得顶部信息并延时发送 ;public class Pointpublicint x;publicint y;public Point(int newx,int newy)this.x=newx;this.y=newy;public boolean equals(Point p)if(p.x=x & p.y=y)return true;elsereturn false;private boolean horizon(Point a, Point b) if(a.x = b.x & a.y = b.y) return false; int x_start = a.y = b.y ? a.y : b.y; int x_end = a.y = b.y ? b.y : a.y; for(int x = x_start + 1; x x_end; x+) if(grida.xx != 0) return false; p=new Pointa,b; lineType=H_LINE; return true; private boolean vertical(Point a, Point b) if(a.x = b.x & a.y = b.y) return false; int y_start = a.x = b.x ? a.x : b.x; int y_end = a.x = b.x ? b.x : a.x; for(int y = y_start + 1; y y_end; y+) if(gridya.y != 0) return false; p=new Pointa,b; lineType=V_LINE; return true; private boolean oneCorner(Point a, Point b) Point c = new Point(a.x, b.y); Point d = new Point(b.x, a.y); if(gridc.xc.y = 0) boolean method1 = horizon(a, c) & vertical(b, c); p=new Pointa,new Point(c.x,c.y),b; lineType=ONE_C_LINE; return method1; if(gridd.xd.y = 0) boolean method2 = vertical(a, d) & horizon(b, d); p=new Pointa,new Point(d.x,d.y),b; lineType=ONE_C_LINE; return method2; else return false; class Line public Point a; public Point b; public int direct; public Line() public Line(int direct, Point a, Point b) this.direct = direct; this.a = a; this.b = b; private LinkedList scan(Point a, Point b) li = new LinkedList(); for(int y = a.y; y = 0; y-) if(grida.xy = 0 & gridb.xy = 0 & vertical(new Point(a.x, y), new Point(b.x, y) li.add(new Line(0, new Point(a.x, y), new Point(b.x, y); for(int y = a.y; y = 0; x-) if(gridxa.y = 0 & gridxb.y =0 & horizon(new Point(x, a.y), new Point(x, b.y) li.add(new Line(1, new Point(x, a.y), new Point(x, b.y); for(int x = a.x; x col; x+) if(gridxa.y = 0 & gridxb.y = 0 & horizon(new Point(x, a.y), new Point(x, b.y) li.add(new Line(1, new Point(x, a.y), new Point(x, b.y); return li; private boolean twoCorner(Point a, Point b) li = scan(a, b); if(li.isEmpty() return false; for(int index = 0; index 0 & cv.much!=0) cv.PROCESS_VALUE-; pb.setProgress(cv.PROCESS_VALUE); mRedrawHandler.sleep(1000); else if(cv.PROCESS_VALUE=0 & cv.much!=0) cv.setEnabled(false); Toast.makeText(ConnectGame.this,时间耗尽了,你输了 :(, Toast.LENGTH_SHORT).show();
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 钢材公司的合同范本
- 委托转租门面合同范本
- 2017租房协议合同范本
- 青少年读本出版合同
- 新租赁厂房合同范本
- 入户空间租房合同范本
- 公路承包开挖合同范本
- 混合型肠易激综合征护理查房
- 成套电器销售合同范本
- 2008租赁合同范本
- 英汉互译单词练习打印纸
- 四川JS-004竣工验收报告
- 花卉栽植施工方案
- 水工闸门课件
- 水泥生产企业生产安全事故综合应急预案
- 全自动血液细胞分析仪产品技术要求深圳迈瑞
- 找对英语学习方法的第一本书
- 安徽涵丰科技有限公司年产6000吨磷酸酯阻燃剂DOPO、4800吨磷酸酯阻燃剂DOPO衍生品、12000吨副产品盐酸、38000吨聚合氯化铝、20000吨固化剂项目环境影响报告书
- 《诺丁山》经典台词
- 对铁路机车乘务员规章培训的探讨与实践
- 临床医学实验室 仪器设备一览表格模板
评论
0/150
提交评论