连连看项目设计分析报告Word格式.docx
《连连看项目设计分析报告Word格式.docx》由会员分享,可在线阅读,更多相关《连连看项目设计分析报告Word格式.docx(37页珍藏版)》请在冰豆网上搜索。
序·
-3-
3.2.3、程序代
码·
4、课程设计总
结·
22
5、参考文
献·
23
1.需求分析
1.1
功能分析
每次用户选择两个图形,如果图形满足一定条件(两个图形一样,且这两
个图形之间存在转弯少于
3
的路径),则两个图形都能消掉。
给定任意具有相同
图形的两个格子,我们需要寻找这两个格子之间在转弯最少的情况下,经过格
子数目最少的路径。
如果这个最优路径的转弯数目少于
,则这两个格子可以
消去。
将界面中相同的图片消去,游戏限时
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)
若
2
失败后,再在第一个按钮的同列找一个空按钮。
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,
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);
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