Android课程设计连连看小游戏Word文件下载.docx

上传人:b****6 文档编号:18800449 上传时间:2023-01-01 格式:DOCX 页数:18 大小:407.36KB
下载 相关 举报
Android课程设计连连看小游戏Word文件下载.docx_第1页
第1页 / 共18页
Android课程设计连连看小游戏Word文件下载.docx_第2页
第2页 / 共18页
Android课程设计连连看小游戏Word文件下载.docx_第3页
第3页 / 共18页
Android课程设计连连看小游戏Word文件下载.docx_第4页
第4页 / 共18页
Android课程设计连连看小游戏Word文件下载.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

Android课程设计连连看小游戏Word文件下载.docx

《Android课程设计连连看小游戏Word文件下载.docx》由会员分享,可在线阅读,更多相关《Android课程设计连连看小游戏Word文件下载.docx(18页珍藏版)》请在冰豆网上搜索。

Android课程设计连连看小游戏Word文件下载.docx

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

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;

i++){//创建一个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;

//检测图片是否消除完

for(intj=0;

j<

if(grid[i][j]!

=0){

canvas.drawBitmap(image[Arrays.binarySearch(imageType,grid[i][j])],

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、这些将它们连接起来的直线线段的折点不超过两个(连接线由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&

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

if(a.x==b.x&

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

if(vertical(a,line.a)&

vertical(b,line.b)){

//上面设计了一个类来判断两个拐点的情况

//类的定义,构造函数如下

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

ll.add(newLine(1,newPoint(x,a.y),newPoint(x,b.y)));

returnll;

//最后做总体判断,flag表示拐点的数目

publicbooleancheckLink(Pointa,Pointb){

if(grid[a.x][a.y]!

=grid[b.x][b.y])//如果图案不同,直接为false

if(a.y==b.y&

horizon(a,b)){

flag=0;

vertical(a,b)){

returntrue;

if(oneCorner(a,b)){

flag=1;

if(twoCorner(a,b)){

flag=2;

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:

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

case2:

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

default:

5.6.3、重新排列

隔一段时间后,将原有的排列随机打乱,进行重新排列

//对当前界面中的图片进行重新排列

publicvoidreDraw(){

type=newArrayList<

Integer>

j<

if(grid[i][j]!

type.add(grid[i][j]);

intindex=r.nextInt(type.size());

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

former_i=former_j=0;

former.x=former.y=0;

//重新排列界面中的图片

privatevoidreStart(){

GameActivity.refresh=true;

initType();

initGrid();

5.7、接口

5.8、限制条件

5.9、尚未解决的问题

不能进行死锁判断,但是又重新排列的功能,可以很大程度上的避免死锁

没有加分功能

没有提示功能

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

当前位置:首页 > 经管营销

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

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