连连看项目设计分析报告.docx
《连连看项目设计分析报告.docx》由会员分享,可在线阅读,更多相关《连连看项目设计分析报告.docx(33页珍藏版)》请在冰点文库上搜索。
![连连看项目设计分析报告.docx](https://file1.bingdoc.com/fileroot1/2023-5/8/51cd426b-1080-441f-b7f1-03bd6c192f77/51cd426b-1080-441f-b7f1-03bd6c192f771.gif)
连连看项目设计分析报告
芜湖职业技术学院
信息工程学院
电子信息工程技术
智能路径检索系统
(2013/2014学年第一学期)
小组成员:
组长:
熊韩玉
组员:
李明杰任欢庆潘宾宾
陶志超欧俊杰
指导老师:
李长波
2013年11月20日
目录
1、需求分析·········································3
1.1、功能分析·····································3
1.2、设计任务·····································3
2、设计正文·········································3
2.1、设计分析·····································3
2.1.1、连连看算法设计····························3
2.2、类的实现方法·································4
2.2.1、成员变量··································4
2.2.2、设计方法··································4
2.2.3、设计流程图································5
3、测试分析·········································5
3.1、程序运行情况·································5
3.2、测试计划与分析·······························8
3.2.1、路径分析··································8
3.2.2、检验的先后顺序····························8
3.2.3、程序代码··································8
4、课程设计总结·····································22
5、参考文献·········································23
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则使得变量不可更改,基本上算是常量了,这也在一定程度上防止对变量的非法修改。
成员变量描述 变量类型 名称
文件 File File
文件区 Jtextarea Textarea
菜单项 Jmenuitem Menuitem_copy
菜单 Umenuitem Umenuitem
标签 Jlabel Label_seek
文件名 String Seel
图一 成员变量
2.2.2 方法设计
方法名称为任何合乎语法的识别字,返回值类型是方法执行结果返回给调用者的数据类型,void表示没有返回值,参数行(parameter list)是调用时给予的参数声明,两个以上的参数声明以逗号隔开,若没有参数则参数行为空白,调用时每一个参数对应一个参数值(argument)大括号内为方法本体,也称为方法程序模块(block),包含声明(declarations)和语句(statements),声明也可以掺杂在语句之间。
一个方法不能声明在另一个方法内。
方法名 功能 备注
MyTextEditor 创建文本编辑器 构造方法
Dialog 创建对话框
addMenu 添加菜单栏菜单项
writeToFile 向文本区写文件
readFromFile 读文件
openDialog 打开文件
saveDialog 保存对话框
actionPerformed 事件处理
itemStateChanged ItemListener事件处理
mouseClicked 鼠标处理事件 接口方法
mouseEvent 鼠标处理事件 接口方法mouseReleased 鼠标处理事件 接口方法mouseEntered 鼠标处理事件 接口方法
mouseExit 鼠标处理事件 接口方法
mouseDragged 鼠标处理事件 接口方法
图二 方法定义
2.2.3 设计流程图
3.测试分析
3.1 程序运行情况
连连看游戏规则很简单,就是点中两个互相匹配并且可以通过不多于两个折点的折线连在一起的方块后,这两个方块就可以消掉。
3.2 测试计划及分析
3.2.1路径分析
在检测两张图片是否可以消除之前首先要判断两图之间的路径,因为图于图之间可以有很多条路径有些路径是可行的有些路径是不可行的,在检测中当路径不满足游戏条件时,则继续检测,一直到检测到一条满足游戏条件的路径时,停止检测并按此路径进行连接。
当找到满足游戏条件的路径时,立刻按检测到的路径进行图片的连接,之后便消除连接的两张图片。
3.2.2 检验的先后顺序
在检验两个方块能否消掉的时候,我们要让两个方块同时满足两个条件才行,就是两者配对并且连线成功。
所以,这里应该先检验配对,如果该条件不成立的话,就不要再进行连线检查了,这样可以避免很多不必要的复杂运算。
当然,如果你在做这个游戏的时候,配对规则不够如此简单的话,那么就看哪个算起来麻烦就把它放在后面。
3.2.3 程序代码
ackage 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 int[row][col];
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 int[]{
R.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 attars, 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 Bitmap[lth];
for(int i=0;i{
Bitmap bitmap = Bitmap.createBitmap((int)width, (int)height, Bitmap.Config.ARGB_8888);
Drawable drw;
Canvas canvas = new Canvas(bitmap);
drw=context.getResources().getDrawable(imageType[i]);
drw.setBounds(1,1, 30, 30);
drw.draw(canvas);
image[i] = bitmap;
}
}
public void initType()
{
Log.e("gametest","inittype");
int size=(row-2)*(col-2);
int count=size/imageType.length;
for(int j=0;j{
for(int i=0;i{
type.add(imageType[j]);
}
}
}
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));
}
@Override
protected 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;i<9;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;i<9;i++)
{
for (int j=0;j<9;j++)
{
if(grid[i][j]!
=0)
{
canvas.drawBitmap(image[Arrays.binarySearch(imageType, grid[i][j])], i*width,
j*height, null);
}
}
}
if(isLine)
{
Paint lineColor= new Paint();
lineColor.setColor(Color.RED);
switch(lineType)
{
case V_LINE:
canvas.drawLine(p[0].x*width+width/2,p[0].y*height+height/2,p[1].x*width+width/2,p[1].y*height+height/2, lineColor);
break;
case ONE_C_LINE:
canvas.drawLine(p[0].x*width+width/2,iip[0].y*height+height/2,p[1].x*width+width/2,ip[1].y*height+height/2, lineColor);
canvas.drawLine(p[1].x*width+width/2i,p[1].y*height+height/2,p[2].x*width+width/2,p[2].y*height+height/2, lineColor);
break;
case TWO_C_LINE:
canvas.drawLine(p[0].x*width+width/2,p[0].y*height+height/2,p[1].x*width+width/2,p[1].y*height+height/2, lineColor);
canvas.drawLine(p[1].x*width+width/2,p[1].y*height+height/2,p[2].x*width+width/2,p[2].y*height+height/2, lineColor);
canvas.drawLine(p[3].x*width+width/2,p[3].y*height+height/2,p[2].x*width+width/2,p[2].y*height+height/2, lineColor);
break;
default:
break;
}
}
super.onDraw(canvas);
}
@Override
protected 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;i{
for(int j=0;j
{
if(i==0 || i==row-1 || j==0 || j==col-1)
{
grid[i][j]=0;
}
else
{
if(type!
=null && type.size()>0)
{
int index=ad.nextInt(type.size());
grid[i][j]=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 GameView{
public 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) {
su
|