Android课程设计连连看小游戏Word文件下载.docx
《Android课程设计连连看小游戏Word文件下载.docx》由会员分享,可在线阅读,更多相关《Android课程设计连连看小游戏Word文件下载.docx(18页珍藏版)》请在冰豆网上搜索。
![Android课程设计连连看小游戏Word文件下载.docx](https://file1.bdocx.com/fileroot1/2022-12/30/a18262d6-bb61-45d4-80dc-aa8dd41794b5/a18262d6-bb61-45d4-80dc-aa8dd41794b51.gif)
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、尚未解决的问题
不能进行死锁判断,但是又重新排列的功能,可以很大程度上的避免死锁
没有加分功能
没有提示功能