基于Android系统的连连看详细设计说明书Word格式.doc
《基于Android系统的连连看详细设计说明书Word格式.doc》由会员分享,可在线阅读,更多相关《基于Android系统的连连看详细设计说明书Word格式.doc(14页珍藏版)》请在冰点文库上搜索。
classGameActivity//用于处理游戏中的消息提示
classStartActivity //用于菜单的设计
ClassSetActivity//用于菜单中游戏难度的设定
3、菜单设计说明
3.1、程序描述
主要功能:
用于为玩家提供操作提示,便于玩家了解游戏的规则。
可扩展性:
能够适应应用要求的变化和修改,具有灵活的可扩充性。
3.2、功能
主要有开始游戏、游戏设置、游戏规则、退出游戏等几个选项
游戏设置的菜单
3.3、性能
当用户选择菜单时能够快速反应,以满足用户的要求。
3.4、输人项
用户点击按钮
3.5、输出项
五个菜单选项
3.6、算法
//定义菜单类,接口为OnClickListener,用于接收用户的单击消息。
publicclassStartActivityextendsActivityimplementsView.OnClickListener
//设计5个按钮用于接收按钮消息:
privateButtonbtnStart;
privateButtonbtnSet;
privateButtonbtnRole;
privateButtonbtnAbout;
privateButtonbtnExit;
//在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(newGameView(this));
//进入游戏,游戏在GameView类中进行了封装
//说明游戏规则
newAlertDialog.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、算法
//定义游戏视图类
publicclassGameViewextendsView
//存储素材图片
publicint[]imageType
//保存所有小格子中的图片
publicint[][]grid=newint[row][col];
//初始化加载图片的类型
publicvoidinitType(){
//总共要加载的图片
intsize=(row-2)*(col-2);
//64
//每类图片加载的次数(张数)要为偶数
intcount=size/imageType.length;
//imageType.length=16即,16种图片
for(inti=0;
i<
imageType.length;
i++){
for(intj=0;
j<
count;
j++){
type.add(imageType[i]);
}
}
}
//初始化网格的设计
privatevoidinitGrid(){
Randomr=newRandom();
row;
i++){
col;
if(i==0||i==row-1||j==0||j==col-1){
grid[i][j]=0;
//四周不设置图片
}else{
intindex=r.nextInt(type.size());
grid[i][j]=type.get(index);
type.remove(index);
}
//设置位图的大小
privatevoidititmBitmap(Contextcontext){
inttypeLength=imageType.length;
image=newBitmap[typeLength];
//重新绘制
i<
typeLength;
//创建一个Bitmap的对象
Bitmapbitmap=Bitmap.createBitmap((int)width,(int)height,Bitmap.Config.ARGB_8888);
//对Bitmap进行绘制
Canvascanvas=newCanvas(bitmap);
Drawabledwr=context.getResources().getDrawable(imageType[i]);
dwr.setBounds(1,1,30,30);
dwr.draw(canvas);
image[i]=bitmap;
//在OnDraw函数中画出框格,每次进行重绘操作
//设置背景颜色:
PaintbackGround=newPaint();
backGround.setColor(Color.WHITE);
//画一个矩形
canvas.drawRect(0,0,getWidth(),getHeight(),backGround);
//设置网格线条的颜色
Painthigth=newPaint();
higth.setColor(Color.BLUE);
//画网格
10;
//画横线、纵线
canvas.drawLine(0,height*i,getWidth(),height*i,higth);
canvas.drawLine(width*i,0,width*i,getHeight(),higth);
//画image图片
booleantest=true;
//检测图片是否肖完
j<
if(grid[i][j]!
=0){
canvas.drawBitmap(image[Arrays.binarySearch(imageType,grid[i][j])],
i*width,j*height,null);
test=false;
////还有图片,说明未赢
4.7、接口
4.8、限制条件
5、主要算法设计说明
5.1、程序描述
完成图片的消除功能,消除时画线功能,重新排列功能。
5.2、功能
完成连连看游戏的核心算法。
5.3、性能
能够快速判断两图片是否能消除,并能在消除时进行画线操作。
隔一段时间,能够打乱顺序进行重新排列。
5.4、输人项
用户点击、时间条
5.5、输出项
消除匹配的图片
5.6、算法
5.6.1、图片的连接判断
对于选中的两个方块的销毁,它们必须符合下面3个条件:
1、选中的两个方块图案相同。
2、选中的两个方块之间没有障碍物阻碍的情况下,可以用若干个垂直的直线线段连接起来。
3、这些将它们连接起来的直线线段的折点不超过两个(连接线由x轴和y轴的平行线组成)。
我们进行分情况分析:
无拐点、一个拐点、两个拐点,设置flag进行标记这三种情况。
以下是相关代码:
//获得一个点可向上下左右走的范围
publicint[]extend(Pointa){
inti;
int[]aLoc=newint[4];
//向上
for(i=a.y-1;
i>
=0&
&
grid[a.x][i]==0;
i--){
}
aLoc[0]=i+1;
//向下
for(i=a.y+1;
row&
i++){
aLoc[1]=i-1;
//向左
for(i=a.x-1;
grid[i][a.y]==0;
aLoc[2]=i+1;
//向右
for(i=a.x+1;
col&
aLoc[3]=i-1;
returnaLoc;
}
//用于判断水平方向是否连通
privatebooleanhorizon(Pointa,Pointb){
if(a.x==b.x&
a.y==b.y)//如果点击的是同一个图案,直接返回false
returnfalse;
intx_start=a.x<
=b.x?
a.x:
b.x;
intx_end=a.x<
b.x:
a.x;
for(intx=x_start+1;
x<
x_end;
x++)//只要一个不是-1,直接返回false
if(grid[x][a.y]!
=0){
returnfalse;
}
returntrue;
//用于判断垂直方向是否连通
privatebooleanvertical(Pointa,Pointb){
a.y==b.y)
inty_start=a.y<
=b.y?
a.y:
b.y;
inty_end=a.y<
b.y:
a.y;
for(inty=y_start+1;
y<
y_end;
y++)
if(grid[a.x][y]!
=0)
//只有一个拐点的情况
privatebooleanoneCorner(Pointa,Pointb){
Pointc=newPoint(a.x,b.y);
Pointd=newPoint(b.x,a.y);
if(grid[c.x][c.y]==0){
booleanmethod1=horizon(b,c)&
vertical(a,c);
if(method1){
corner=newPoint(c.x,c.y);
returnmethod1;
}
if(grid[d.x][d.y]==0){
booleanmethod2=horizon(a,d)&
vertical(b,d);
if(method2){
corner=newPoint(d.x,d.y);
returnmethod2;
}else{
//有两个拐点的情况
privatebooleantwoCorner(Pointa,Pointb)
{
ll=scan(a,b);
if(ll.isEmpty())
for(intindex=0;
index<
ll.size();
index++){
Lineline=(Line)ll.get(index);
if(line.direct==1){
if(horizon(a,line.a)&
horizon(b,line.b)){
corner=newPoint(line.a);
corner2=newPoint(line.b);
returntrue;
}
}else{
if(vertical(a,line.a)&
vertical(b,line.b)){
corner=newPoint(line.a);
returntrue;
}
returnfalse;
//上面设计了一个类来判断两个拐点的情况
//类的定义,构造函数如下
classLine{
publicPointa;
publicPointb;
publicintdirect;
publicLine(){
a=newPoint();
b=newPoint();
publicLine(intdirect,Pointa,Pointb){
this.direct=direct;
this.a=a;
this.b=b;
}
//对两个拐点的情况进行扫描,将扫描线放入Line类型的数组中
privateLinkedListscan(Pointa,Pointb){
ll=newLinkedList<
Line>
();
//Pointc=newPoint(a.x,b.y);
//Pointd=newPoint(b.x,a.y);
for(inty=a.y;
y>
=0;
y--)
if(grid[a.x][y]==0&
grid[b.x][y]==0&
horizon(newPoint(a.x,y),newPoint(b.x,y)))
ll.add(newLine(0,newPoint(a.x,y),newPoint(b.x,y)));
row;
for(intx=a.x;
x>
x--)
if(grid[x][a.y]==0&
grid[x][b.y]==0&
vertical(newPoint(x,a.y),newPoint(x,b.y)))
ll.add(newLine(1,newPoint(x,a.y),newPoint(x,b.y)));
col;
x++)
returnll;
//最后做总体判断,flag表示拐点的数目
publicbooleancheckLink(Pointa,Pointb){
if(grid[a.x][a.y]!
=grid[b.x][b.y])//如果图案不同,直接为false
returnfalse;
if(a.y==b.y&
horizon(a,b)){
flag=0;
returntrue;
if(a.x==b.x&
vertical(a,b)){
if(oneCorner(a,b)){
flag=1;
returntrue;
if(twoCorner(a,b)){
flag=2;
}else{
returnfalse;
5.6.2、图片消除的画线
根据flag的值分情况分析:
Flag=0时,从起点到终点画一条线即可
Flag=1时,从起点到拐点,从拐点到终点画两条线
Flag=2时,从起点到拐点,从拐点到拐点,从拐点到终点画三条线。
在做连接判断时就将路径保存下来。
//画线操作写在OnDraw函数中,corner、corner2保存拐点坐标
//每次都sleep(50)后重绘
switch(flag){
case0:
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;
case1:
width*(corner.x+0.5f),height*(corner.y+0.5f),p);
canvas.drawLine(width*(corner.x+0.5f),height*(corner.