欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > DOCX文档下载  

    基于Android系统的连连看详细设计说明书.docx

    • 资源ID:3384736       资源大小:41.51KB        全文页数:14页
    • 资源格式: DOCX        下载积分:6.99金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要6.99金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    基于Android系统的连连看详细设计说明书.docx

    基于Android系统的连连看详细设计说明书基于Android系统的连连看 详细设计说明书 1、引言 1.1、编写目的 本文档用于说明本游戏开发的详细过程,使委托方了解软件的内部结构,从而对连连看有更深入的了解,便于后期的维护和修改工作。 1.2、背景说明: a 待开发软件系统的名称:基于Android系统的连连看游戏设计 b 本项目的任务提出者:学校 开发者:游戏开发小组 用户:喜欢玩游戏的人 项目开发环境:eclipse、Android系统平台 1.3、定义 Android 连连看 详细设计 1.4、参考资料 Android开发指南 2、程序系统的结构 连连看游戏结构如下: 菜单设计 规游 结则戏 束说设 游明 置 戏 连连看 界面设计 算法设计 消息响应设计 开始游戏 框架设计 进度条设计 消除算法设计 画线设计 鼠标响应 时间响应 绘图响应 主要有四个大类: class GameView /游戏视类,处理游戏中的情况,包括界面生成,算法,一部分消息响应。 class GameActivity /用于处理游戏中的消息提示 class StartActivity /用于菜单的设计 Class SetActivity /用于菜单中游戏难度的设定 3、菜单设计说明 3.1、程序描述 主要功能:用于为玩家提供操作提示,便于玩家了解游戏的规则。 可扩展性:能够适应应用要求的变化和修改,具有灵活的可扩充性。 3.2、功能 主要有开始游戏、游戏设置、游戏规则、退出游戏等几个选项 游戏设置的菜单 3.3、性能 当用户选择菜单时能够快速反应,以满足用户的要求。 3.4、输人项 用户点击按钮 3.5、输出项 五个菜单选项 3.6、算法 /定义菜单类,接口为OnClickListener,用于接收用户的单击消息。 public class StartActivity extends Activity implements View.OnClickListener /设计5个按钮用于接收按钮消息: private Button btnStart; private Button btnSet; private Button btnRole; private Button btnAbout; private Button btnExit; /在OnCreate函数中将它们初始化: /获取按钮 btnStart = (Button)findViewById(R.id.btnStart); btnSet = (Button)findViewById(R.id.btnSet); btnRole = (Button)findViewById(R.id.btnRole); btnAbout = (Button)findViewById(R.id.btnAbout); btnExit = (Button)findViewById(R.id.btnExit); /注册点击事件 btnStart.setOnClickListener(this); btnSet.setOnClickListener(this); btnRole.setOnClickListener(this); btnAbout.setOnClickListener(this); btnExit.setOnClickListener(this); 在OnClick函数中对响应进行处理: setContentView(new GameView(this); /进入游戏,游戏在GameView类中进行了封装 /说明游戏规则 new AlertDialog.Builder(this).setMessage("1. 将相同的两张图片用三根以内的直线连在一起就可以消除n" + "2. 每消除一次图片,都会使可用时间增加n" + "3. 每隔一段时间,当前的界面中的图片会进行重排列n" + "4. 在规定的时间里,当所有的图片都消除时,即为胜利n" + "5. 规定的时间内有图片未消去,即为失败n") .setPositiveButton("确定", null).show; /结束游戏 this.finish; /进行游戏设置,设置游戏的难度,调用了SetActivity类 intent.setClass(this, SetActivity.class); 3.7、接口 API函数 3.8、限制条件 无明显限制条件 4、界面设计说明 4.1、程序描述 主要功能:用于为玩家提供可视化的游戏界面,增加了游戏的可玩性。 可扩展性:能够适应应用要求的变化和修改,具有灵活的可扩充性。 4.2、功能 生成游戏界面,生成进度条。如下图: 4.3、性能 能够快速的随机生成符合用户需要的界面 4.4、输人项 无输入 4.5、输出项 游戏界面 4.6、算法 /定义游戏视图类 public class GameView extends View /存储素材图片 public int imageType /保存所有小格子中的图片 public int grid = new introwcol; /初始化加载图片的类型 public void initType /总共要加载的图片 int size = (row-2)*(col-2); /64 /每类图片加载的次数 要为偶数 int count=size/imageType.length; /imageType.length=16 即,16种图片 for(int i=0; i<imageType.length; i+) for(int j=0; j<count;j+) type.add(imageTypei); /初始化网格的设计 private void initGrid Random r = new Random; for(int i=0; i<row;i+) for(int j=0; j<col;j+) if(i=0 | i=row-1 | j=0 |j=col-1) gridij=0; /四周不设置图片 else int index=r.nextInt(type.size); gridij=type.get(index); type.remove(index); /设置位图的大小 private void ititmBitmap(Context context) int typeLength=imageType.length; image=new BitmaptypeLength; /重新绘制 for(int i=0;i<typeLength;i+) /创建一个Bitmap的对象 Bitmap bitmap=Bitmap.createBitmap(int)width, (int)height, Bitmap.Config.ARGB_8888); /对Bitmap进行绘制 Canvas canvas = new Canvas(bitmap); Drawable dwr = context.getResources.getDrawable(imageTypei); dwr.setBounds(1, 1, 30, 30); dwr.draw(canvas); imagei=bitmap; /在OnDraw函数中画出框格,每次进行重绘操作 /设置背景颜色: Paint backGround = new Paint; backGround.setColor(Color.WHITE); /画一个矩形 canvas.drawRect(0, 0, getWidth, getHeight, backGround); /设置网格线条的颜色 Paint higth= new Paint; higth.setColor(Color.BLUE); /画网格 for(int i=0;i<10;i+) /画横线、纵线 canvas.drawLine(0, height*i, getWidth, height*i, higth); canvas.drawLine(width*i, 0, width*i, getHeight, higth); /画image图片 boolean test=true; /检测图片是否肖完 for(int i=0;i<row;i+) for(int j=0;j<col;j+) if(gridij!=0) canvas.drawBitmap(imageArrays.binarySearch(imageType, gridij), i*width, j*height, null); test=false; /还有图片,说明未赢 4.7、接口 API函数 4.8、限制条件 无明显限制条件 5、主要算法设计说明 5.1、程序描述 主要功能:完成图片的消除功能,消除时画线功能,重新排列功能。 可扩展性:能够适应应用要求的变化和修改,具有灵活的可扩充性。 5.2、功能 完成连连看游戏的核心算法。 5.3、性能 能够快速判断两图片是否能消除,并能在消除时进行画线操作。隔一段时间,能够打乱顺序进行重新排列。 5.4、输人项 用户点击、时间条 5.5、输出项 消除匹配的图片 5.6、算法 5.6.1、图片的连接判断 对于选中的两个方块的销毁,它们必须符合下面3个条件: 1、选中的两个方块图案相同。 2、选中的两个方块之间没有障碍物阻碍的情况下,可以用若干个垂直的直线线段连接起来。 3、这些将它们连接起来的直线线段的折点不超过两个。 我们进行分情况分析: 无拐点、一个拐点、两个拐点,设置flag进行标记这三种情况。 以下是相关代码: /获得一个点可向上下左右走的范围 public int extend(Point a) int i; int aLoc = new int4; /向上 for(i=a.y-1;i>=0 && grida.xi=0;i-) aLoc0=i+1; /向下 for(i=a.y+1;i<row && grida.xi=0;i+) aLoc1=i-1; /向左 for(i=a.x-1;i>=0 && gridia.y=0;i-) aLoc2=i+1; /向右 for(i=a.x+1;i<col && gridia.y=0;i+) aLoc3=i-1; return aLoc; /用于判断水平方向是否连通 private boolean horizon(Point a, Point b) if(a.x = b.x && a.y = b.y) /如果点击的是同一个图案,直接返回false return false; int x_start = a.x <= b.x ? a.x : b.x; int x_end = a.x <= b.x ? b.x : a.x; for(int x = x_start + 1; x < x_end; x+)/只要一个不是-1,直接返回false if(gridxa.y != 0) return false; return true; /用于判断垂直方向是否连通 private boolean vertical(Point a, Point b) if(a.x = b.x && a.y = b.y) return false; int y_start = a.y <= b.y ? a.y : b.y; int y_end = a.y <= b.y ? b.y : a.y; for(int y = y_start + 1; y < y_end; y+) if(grida.xy != 0) return false; 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(b, c) && vertical(a, c); if(method1) corner=new Point(c.x, c.y); return method1; if(gridd.xd.y = 0) boolean method2 = horizon(a, d) && vertical(b, d); if(method2) corner=new Point(d.x, d.y); return method2; else return false; /有两个拐点的情况 private boolean twoCorner(Point a, Point b) ll = scan(a, b); if(ll.isEmpty) return false; for(int index = 0; index < ll.size; index+) Line line = (Line)ll.get(index); if(line.direct = 1) if(horizon(a, line.a) && horizon(b, line.b) corner=new Point(line.a); corner2=new Point(line.b); return true; else if(vertical(a, line.a) && vertical(b, line.b) corner=new Point(line.a); corner2=new Point(line.b); return true; return false; /上面设计了一个类来判断两个拐点的情况 /类的定义,构造函数如下 class Line public Point a; public Point b; public int direct; public Line a = new Point; b = new Point; public Line(int direct, Point a, Point b) this.direct = direct; this.a = a; this.b = b; /对两个拐点的情况进行扫描,将扫描线放入Line类型的数组中 private LinkedList scan(Point a, Point b) ll = new LinkedList<Line> /Point c = new Point(a.x, b.y); /Point d = new Point(b.x, a.y); for(int y = a.y; y >= 0; y-) if(grida.xy = 0 && gridb.xy = 0 && horizon(new Point(a.x, y), new Point(b.x, y) ll.add(new Line(0, new Point(a.x, y), new Point(b.x, y); for(int y = a.y; y < row; y+) if(grida.xy = 0 && gridb.xy = 0 && horizon(new Point(a.x, y), new Point(b.x, y) ll.add(new Line(0, new Point(a.x, y), new Point(b.x, y); for(int x = a.x; x >= 0; x-) if(gridxa.y = 0 && gridxb.y = 0 && vertical(new Point(x, a.y), new Point(x, b.y) ll.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 && vertical(new Point(x, a.y), new Point(x, b.y) ll.add(new Line(1, new Point(x, a.y), new Point(x, b.y); return ll; /最后做总体判断,flag表示拐点的数目 public boolean checkLink(Point a,Point b) if(grida.xa.y != gridb.xb.y)/如果图案不同,直接为false return false; if(a.y = b.y && horizon(a, b) flag=0; return true; if(a.x = b.x && vertical(a, b) flag=0; return true; if(oneCorner(a, b) flag=1; return true; if(twoCorner(a, b) flag=2; return true; else return false; 5.6.2、图片消除的画线 根据flag的值分情况分析: Flag=0时,从起点到终点画一条线即可 Flag=1时,从起点到拐点,从拐点到终点画两条线 Flag=2时,从起点到拐点,从拐点到拐点,从拐点到终点画三条线。 在做连接判断时就将路径保存下来。 /画线操作写在OnDraw函数中,corner、corner2保存拐点坐标 /每次都sleep(50)后重绘 switch(flag) case 0: canvas.drawLine(width*(former.x + 0.5f), height*(former.y+0.5f), width*(current.x+ 0.5f), height*(current.y + 0.5f), p); flag=-1; SystemClock.sleep(50); invalidate; break; case 1: canvas.drawLine(width*(former.x + 0.5f), height*(former.y+0.5f), width*(corner.x+ 0.5f), height*(corner.y + 0.5f), p); canvas.drawLine(width*(corner.x + 0.5f), height*(corner.y+0.5f), width*(current.x+ 0.5f), height*(current.y + 0.5f), p); flag=-1; SystemClock.sleep(50); invalidate; break; case 2: canvas.drawLine(width*(former.x + 0.5f), height*(former.y+0.5f), width*(corner.x + 0.5f), height*(corner.y + 0.5f), p); canvas.drawLine(width*(corner.x + 0.5f), height*(corner.y+0.5f), width*(corner2.x+ 0.5f), height*(corner2.y + 0.5f), p); canvas.drawLine(width*(corner2.x + 0.5f), height*(corner2.y+0.5f), width*(current.x+ 0.5f), height*(current.y + 0.5f), p); flag=-1; SystemClock.sleep(50); invalidate; break; default: break; 5.6.3、重新排列 隔一段时间后,将原有的排列随机打乱,进行重新排列 /对当前界面中的图片进行重新排列 public void reDraw Random r = new Random; type= new ArrayList<Integer> for(int i=0;i<row; i+) for(int j=0; j <col;j+) if(gridij!=0) 5.7、接口 API函数 5.8、限制条件 无明显限制条件 5.9、尚未解决的问题 不能进行死锁判断,但是有重新排列的功能,可以很大程度上避免死锁。 没有加分功能。 没有提示功能。 type.add(gridij); for(int i=0;i<row; i+) for(int j=0; j <col;j+) if(gridij!=0) int index = r.nextInt(type.size); gridij = type.get(index); type.remove(index); former_i=former_j=0; former.x=former.y=0; invalidate; /重新排列界面中的图片 private void reStart GameActivity.refresh=true; initType; initGrid; invalidate;

    注意事项

    本文(基于Android系统的连连看详细设计说明书.docx)为本站会员(小飞机)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开