连连看项目设计分析报告Word格式.docx

上传人:b****8 文档编号:22571742 上传时间:2023-02-04 格式:DOCX 页数:37 大小:41.93KB
下载 相关 举报
连连看项目设计分析报告Word格式.docx_第1页
第1页 / 共37页
连连看项目设计分析报告Word格式.docx_第2页
第2页 / 共37页
连连看项目设计分析报告Word格式.docx_第3页
第3页 / 共37页
连连看项目设计分析报告Word格式.docx_第4页
第4页 / 共37页
连连看项目设计分析报告Word格式.docx_第5页
第5页 / 共37页
点击查看更多>>
下载资源
资源描述

连连看项目设计分析报告Word格式.docx

《连连看项目设计分析报告Word格式.docx》由会员分享,可在线阅读,更多相关《连连看项目设计分析报告Word格式.docx(37页珍藏版)》请在冰豆网上搜索。

连连看项目设计分析报告Word格式.docx

序·

-3-

3.2.3、程序代

码·

4、课程设计总

结·

22

5、参考文

献·

23

1.需求分析

1.1 

功能分析

每次用户选择两个图形,如果图形满足一定条件(两个图形一样,且这两

个图形之间存在转弯少于 

的路径),则两个图形都能消掉。

给定任意具有相同

图形的两个格子,我们需要寻找这两个格子之间在转弯最少的情况下,经过格

子数目最少的路径。

如果这个最优路径的转弯数目少于 

,则这两个格子可以

消去。

将界面中相同的图片消去,游戏限时 

1000 

秒,如果在规定的时间内没有

完成,就会跳出对话框“时间耗尽了,你输了:

(”的字样。

如果玩家赢了这局,

则弹出“非常棒,你赢了!

” 

在经典的最短路问题中,我们需要求出经过格子

数目最少的路径。

而这里,要保证转弯数目最少,需要把最短路问题的目标函

数修改为从一个点到另一个点的转弯次数。

虽然,目标函数修改了,但算法的

框架仍然可以保持不变。

广度优先搜索是解决经典最短路问题的一个思路。

们看看在新的目标函数(转弯数目最少)下,如何用广度优先搜索来解决图形

A(x1,y1)和图形 

B(x2,y2)之间的最短路问题。

1.2 

设计任务

1、明确软件实用性,设计本次软件;

2、深入学习和理解 

android 

开发平台,掌握 

软件开发机制和方法;

3、深入分析连连看软件功能流程图;

4、应用软件工程思想,小组合作完成需求分析到代码设计并完成测试;

-4-

5、按照格式要求撰写设计报告

2.设计正文

2.1 

设计分析

2.1.1 

连连看算法设计

在检验两个方块能否消掉的时候,我们要让两个方块同时满足两个条件才

行,就是两者配对并且连线成功。

分 

种情况:

(从下面的这三种情况,我们可

以知道,需要三个检测,这三个检测分别检测一条直路经。

这样就会有三条路

经。

若这三条路经上都是空按钮,那么就刚好是三种直线(两个转弯点)把两

个按钮连接起来了。

1) 

相邻

2) 

若不相邻的先在第一个按钮的同行找一个空按钮。

1).找到后看第二个

按钮横向到这个空按钮所在的列是否有按钮。

2).没有的话再看第一个按钮到与

它同行的那个空按钮之间是否有按钮。

3).没有的话,再从与第一个按钮同行的

那个空按钮竖向到与第二个按钮的同行看是否有按钮。

没有的话路经就通了,可

以消了.

3) 

若 

失败后,再在第一个按钮的同列找一个空按钮。

1).找到后看第二

个按钮竖向到这个空按钮所在的行是否有按钮 

2).没有的话,再看第一个按钮

到与它同列的那个空按钮之间是否有按钮。

没有的话,再从与第一个按钮同列

的那个空按钮横向到与第二个按钮同列看是否有按钮。

没有的话路经就通了,

可以消了。

4) 

若以上三步都失败,说明这两个按钮不可以消去。

2.2 

类的实现方法

2.2.1 

成员变量

成员变量也叫类的属性,一般带有访问控制属性的,而全局变量虽然也有

类的属性,但全局变量严重影响了封装和模块化,一般的全局变量前面要加上

static 

和 

fina 

属性其中,static 

使该变量任何类都可用(方法 

ClassName.全

局变量名) 

,而 

则使得变量不可更改,基本上算是常量了,这也在一定

程度上防止对变量的非法修改。

成员变量描述变量类型名称

文件FileFile

文件区JtextareaTextarea

菜单项JmenuitemMenuitem_copy

菜单UmenuitemUmenuitem

标签JlabelLabel_seek

文件名StringSeel

图一 

2.2.2 

方法设计

-5-

方法名称为任何合乎语法的识别字,返回值类型是方法执行结果返回给调

用者的数据类型,void 

表示没有返回值,参数行(parameter 

list)是调用时给

予的参数声明,两个以上的参数声明以逗号隔开,若没有参数则参数行为空白,

调用时每一个参数对应一个参数值(argument)大括号内为方法本体,也称为方

法程序模块(block),包含声明(declarations)和语句(statements),声明也可

以掺杂在语句之间。

一个方法不能声明在另一个方法内。

方法名功能备注

MyTextEditor创建文本编辑器构造方法

Dialog创建对话框

addMenu添加菜单栏菜单项

writeToFile向文本区写文件

readFromFile读文件

openDialog打开文件

saveDialog保存对话框

actionPerformed事件处理

itemStateChangedItemListener 

事件处理

mouseClicked鼠标处理事件接口方法

mouseEvent鼠标处理事件接口方法

mouseReleased鼠标处理事件接口方法

mouseEntered鼠标处理事件接口方法

mouseExit鼠标处理事件接口方法

mouseDragged鼠标处理事件接口方法

图二方法定义

2.2.3 

设计流程图

-6-

进入主函数

开始游戏

接受用户点击

两张图片是否相同

Y

两张图片是否可以相连

程序是否还有图片没消

N

结束

3.测试分析

3.1 

程序运行情况

连连看游戏规则很简单,就是点中两个互相匹配并且可以通过不多于两个

折点的折线连在一起的方块后,这两个方块就可以消掉。

-7-

-8-

-9-

3.2 

测试计划及分析

3.2.1路径分析

在检测两张图片是否可以消除之前首先要判断两图之间的路径,因为图于

图之间可以有很多条路径有些路径是可行的有些路径是不可行的,在检测中当

路径不满足游戏条件时,则继续检测,一直到检测到一条满足游戏条件的路径

时,停止检测并按此路径进行连接。

当找到满足游戏条件的路径时,立刻按检测到的路径进行图片的连接,之

后便消除连接的两张图片。

3.2.2 

检验的先后顺序

所以,这里应该先检验配对,如果该条件不

成立的话,就不要再进行连线检查了,这样可以避免很多不必要的复杂运算。

当然,如果你在做这个游戏的时候,配对规则不够如此简单的话,那么就看哪

个算起来麻烦就把它放在后面。

3.2.3 

程序代码

ackage 

com.automan;

//画出网格,并对应的画上分不好的图像

import 

java.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.AttributeSet;

android.util.Log;

android.view.View;

public 

class 

GameView 

extends 

View 

{

final 

int 

row=10;

col=10;

float 

width;

height;

private 

selY;

selX;

10 

-

boolean 

isLine=false;

grid[][]=new 

int[row][col];

Rect 

selRect 

new 

Rect();

lineType=0;

V_LINE=1;

H_LINE=1;

ONE_C_LINE=2;

TWO_C_LINE=3;

much=0;

Point[] 

p;

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;

List<

Integer>

type=new 

ArrayList<

();

GameView(Context 

context, 

AttributeSet 

attrs) 

{super(context,

attrs);

this.setFocusable(true);

this.setFocusableInTouchMode(true);

}

attars, 

defStyle) 

{sup

er(context, 

attrs, 

defStyle);

void 

reset()

fillImage(Context 

context)

lth=imageType.length;

image=new 

Bitmap[lth];

for(int 

i=0;

i<

lth;

i++)

bitmap=

Bitmap.createBitmap((int)width, 

(int)height, 

Bitmap.Config.ARGB_8888);

Drawable 

drw;

Canvas 

canvas 

Canvas(bitmap);

drw=context.getResources().getDrawable(imageType[i]);

drw.setBounds(1,1, 

30, 

30);

drw.draw(canvas);

image[i] 

bitmap;

initType()

Log.e("

gametest"

"

inittype"

);

size=(row-2)*(col-2);

count=size/imageType.length;

j=0;

j<

imageType.length;

j++)

count;

type.add(imageType[j]);

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);

getRect(int 

y,Rect 

rect)

rect.set((int)(x*width),(int)( 

y*height), 

(int)(x*width+width),(int) 

(y*heig

ht+height));

@Override

protected 

onDraw(Canvas 

canvas){

Paint 

background= 

Paint();

background.setColor(Color.WHITE);

12 

canvas.drawRect(0, 

0,getWidth(),getHeight(),background);

hilite= 

hilite.setColor(getResources().getColor(R.color.hilite));

light= 

light.setColor(getResources().getColor(R.color.light));

for 

(int 

9;

canvas.drawLine(0, 

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);

width+1,0,i 

width+1,getHeight(),hilite);

if(CtrlView.CURRENT_CH)

selected= 

selected.setColor(getResources().getColor(R.color.puzzle_selected));

canvas.drawRect(selRect, 

selected);

if(grid[i][j]!

=0)

canvas.drawBitmap(image[Arrays.binarySearch(imageType, 

grid[i][j])

], 

i*width,

j*height, 

null);

if(isLine)

lineColor= 

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*widt

h+width/2,p[1].y*height+height/2, 

lineColor);

break;

ONE_C_LINE:

13 

canvas.drawLine(p[0].x*width+width/2,iip[0].y*height+height/2,p[1].x*widt

h+width/2,ip[1].y*height+height/2, 

canvas.drawLine(p[1].x*width+width/2i,p[1].y*height+height/2,p[2].x*widt

h+width/2,p[2].y*height+height/2, 

TWO_C_LINE:

canvas.drawLine(p[1].x*width+width/2,p[1].y*height+height/2,p[2].x*widt

canvas.drawLine(p[3].x*width+width/2,p[3].y*height+height/2,p[2].x*widt

default:

super.onDraw(canvas);

onSizeChanged(int 

w, 

h, 

oldw, 

oldh) 

sizechanged"

width=w/row;

height=h/col;

//getRect(1,1,selRect);

fillImage(this.getContext());

super.onSizeChanged(w, 

oldh);

initGrid()

initGrid"

Random 

ad=new 

Random();

row;

col;

if(i==0 

|| 

i==row-1 

j==0 

j==col-1)

14 

grid[i][j]=0;

else

if(type!

=null 

&

type.size()>

0)

index=ad.nextInt(type.size());

grid[i][j]=type.get(index);

type.remove(index);

第二部分

package 

java.util.LinkedList;

android.os.Handler;

android.os.Message;

android.view.MotionEvent;

CtrlView 

GameView{

GAMETIME=300;

UPTIME=1;

PROCESS_VALUE=300;

CURRENT_CH=false;

CURRENT_TYPE=0;

Point 

C_POINT;

P_POINT;

LinkedList<

Line>

li;

CtrlView(Context 

super(context, 

initType();

initGrid();

15 

much=(row-2)*(col-2);

onTouchEvent(MotionEvent 

event){

if 

(event.getAction()!

=Mo

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 实习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1