智能终端软件开发课程方案设计书报告.docx
《智能终端软件开发课程方案设计书报告.docx》由会员分享,可在线阅读,更多相关《智能终端软件开发课程方案设计书报告.docx(27页珍藏版)》请在冰豆网上搜索。
智能终端软件开发课程方案设计书报告
中国地质大学(武汉)
智能终端软件开发
标题:
智能终端课程设计
指导老师:
徐战亚
班级:
116101
学号:
20101002130
学生:
高亚兵
2014年1月13日
摘要
本次课程设计主要内容是双人五子棋游戏的开发。
主要内容是界面布局、判断输赢,记录输赢次数。
开发想法来源,纯属娱乐。
关键词:
益智游戏Android
第一部分分析游戏
一、游戏功能简述
1、界面布局
按照象棋的表格图案绘制布局,在画布上设计表格,并标记红黑方位置。
2、棋子连线分析
标明五子棋的颜色,记录分析棋子的位置,判断是否取胜。
3、记录输赢次数
记录红黑双方输赢次数。
二、游戏核心技术
1、基本技术组成
判断路径,数据结构算法。
2、关键技术难点分析
1、技术难点
分析棋子连线是否可以取胜。
2、作为难点的原因
棋子之间有三种连线情况,横向连续连接、纵向连续连接、对角线连续连接。
3、准备突破方法
将同类棋子之间,有位置关系的棋子进行进栈处理,如果在棋盘范围内,有连续的五个棋子则为取胜。
第二部分设计与开发
一、前期准备工作
软件环境:
Windows
AndroidSDK;
Eclipse(windows版)
环境配置:
Windows下AndroidSDK安装。
安装步骤:
1、下载SDK包,Android-SDK,下载地址:
2、配置SDK
导入sdk文件
二、游戏预期效果
1、UI设计
背景画布选择恰当,布局清晰,结构清晰,使用简单。
2、棋盘设计
方格大小,连线之间的距离适中,确保棋子在连线上,避免棋子在棋盘上混乱摆放。
3、提示框
出现下棋位置不在棋盘内或者不在合法范围内是出现错误提示
当由一方取得胜利时,出现提示框。
三、开发过程
1、布局设计
packagecn.m.xys。
//Downloadby
importandroid.app.Activity。
importandroid.os.Bundle。
importandroid.view.Display。
importandroid.view.KeyEvent。
importandroid.view.Window。
importandroid.view.WindowManager。
publicclassFiveChessActivityextendsActivity
{
GameViewgameView=null。
@Override
publicvoidonCreate(BundlesavedInstanceState)
{
super.onCreate(savedInstanceState)。
//隐藏标题栏
requestWindowFeature(Window.FEATURE_NO_TITLE)。
//全屏显示
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN)。
//获取屏幕宽高
Displaydisplay=getWindowManager().getDefaultDisplay()。
//现实GameView
GameView.init(this,display.getWidth(),display.getHeight())。
gameView=GameView.getInstance()。
setContentView(gameView)。
}
@Override
publicbooleanonKeyDown(intkeyCode,KeyEventevent)
{
returnsuper.onKeyDown(keyCode,event)。
}
}
2、算法设计
packagecn.m.xys。
//Downloadby
importandroid.app.Activity。
importandroid.content.Context。
importandroid.content.res.Resources。
importandroid.graphics.Bitmap。
importandroid.graphics.BitmapFactory。
importandroid.graphics.Canvas。
importandroid.graphics.Color。
importandroid.graphics.Matrix。
importandroid.graphics.Paint。
importandroid.graphics.Rect。
importandroid.view.MotionEvent。
importandroid.view.SurfaceHolder。
importandroid.view.SurfaceView。
/**
*@authorAdministrator
*
*/
publicclassGameViewextendsSurfaceViewimplementsConst,SurfaceHolder.Callback,Runnable
{
staticGameViewsInstance=null。
publicstaticvoidinit(ActivitymActivity,intscreenWidth,intscreenHeight)
{
sInstance=newGameView(mActivity,screenWidth,screenHeight)。
}
publicstaticGameViewgetInstance()
{
returnsInstance。
}
//控制循环
booleanmbLoop=false。
//定义SurfaceHolder对象
SurfaceHoldermSurfaceHolder=null。
publicstaticPaintsPaint=null。
publicstaticCanvassCanvas=null。
publicstaticResourcessResources=null。
privateintmGameState=0。
privateintmScreenWidth=0。
privateintmScreenHeight=0。
publicint[][]mGameMap=null。
privateintmMapHeightLengh=0。
privateintmMapWidthLengh=0。
privateintmMapIndexX=0。
privateintmMapIndexY=0。
publicintmCampTurn=0。
publicintmCampWinner=0。
privatefloatmTitleSpace=0。
privateintmTitleHeight=0。
privatefloatmTitleIndex_x=0。
privatefloatmTitleIndex_y=0。
BitmapbitmapBg=null。
BitmapmBlack=null。
BitmapmWhite=null。
ContextmContext=null。
publicGameView(Activityactivity,intscreenWidth,intscreenHeight)
{
super(activity)。
sPaint=newPaint()。
sPaint.setAntiAlias(true)。
sResources=getResources()。
mContext=activity。
mScreenWidth=screenWidth。
mScreenHeight=screenHeight。
mSurfaceHolder=this.getHolder()。
mSurfaceHolder.addCallback(this)。
setFocusable(true)。
mbLoop=true。
bitmapBg=CreatMatrixBitmap(R.drawable.status,mScreenWidth,mScreenHeight)。
mBlack=BitmapFactory.decodeResource(GameView.sResources,R.drawable.ai)。
mWhite=BitmapFactory.decodeResource(GameView.sResources,R.drawable.human)。
mTitleSpace=(float)mScreenWidth/CHESS_WIDTH。
mTitleHeight=mScreenHeight/3。
mTitleIndex_x=(float)(mTitleSpace/2)。
mTitleIndex_y=(float)(mTitleSpace/2)。
setGameState(GS_GAME)。
}
publicvoidsetGameState(intnewState)
{
mGameState=newState。
switch(mGameState)
{
caseGS_GAME:
mGameMap=newint[CHESS_HEIGHT][CHESS_WIDTH]。
mMapHeightLengh=mGameMap.length。
mMapWidthLengh=mGameMap[0].length。
mCampTurn=CAMP_HERO。
break。
}
}
protectedvoidDraw()
{
sCanvas=mSurfaceHolder.lockCanvas()。
if(mSurfaceHolder==null||sCanvas==null)
{
return。
}
RenderGame()。
mSurfaceHolder.unlockCanvasAndPost(sCanvas)。
}
privatevoidRenderGame()
{
switch(mGameState)
{
caseGS_GAME:
DrawRect(Color.WHITE,0,0,mScreenWidth,mScreenHeight)。
RenderMap()。
break。
caseGS_END:
DrawRect(Color.RED,0,0,mScreenWidth,mScreenHeight)。
DrawString(Color.WHITE,sResources.getString(mCampWinner)+"胜利点击继续游戏",50,50)。
break。
}
}
privatevoidRenderMap()
{
inti,j。
DrawImage(bitmapBg,0,0,0)。
for(i=0。
ii++)
{
for(j=0。
jj++)
{
intCampID=mGameMap[i][j]。
floatx=(j*mTitleSpace)+mTitleIndex_x。
floaty=(i*mTitleSpace)+mTitleHeight+mTitleIndex_y。
if(CampID==CAMP_HERO)
{
DrawImage(mBlack,x,y,ALIGN_VCENTER|ALIGN_HCENTER)。
}
elseif(CampID==CAMP_ENEMY)
{
DrawImage(mWhite,x,y,ALIGN_VCENTER|ALIGN_HCENTER)。
}
}
}
}
privatevoidDrawRect(intcolor,intx,inty,intwidth,intheight)
{
sPaint.setColor(color)。
sCanvas.clipRect(x,y,width,height)。
sCanvas.drawRect(x,y,width,height,sPaint)。
}
privatevoidDrawString(intcolor,Stringstr,intx,inty)
{
sPaint.setColor(color)。
sCanvas.drawText(str,x,y,sPaint)。
}
@Override
publicbooleanonTouchEvent(MotionEventevent)
{
intx=(int)event.getX()。
inty=(int)event.getY()。
switch(event.getAction())
{
caseMotionEvent.ACTION_DOWN:
UpdateTouchEvent(x,y)。
break。
caseMotionEvent.ACTION_MOVE:
break。
caseMotionEvent.ACTION_UP:
break。
}
returnsuper.onTouchEvent(event)。
}
publicbooleanCheckPiecesMeet(intCamp)
{
intMeetCount=0。
//横向
for(inti=0。
ii++)
{
intindex=mMapIndexX-CALU_SINGLE_COUNT+i。
if(index<0||index>=mMapWidthLengh)
{
if(MeetCount==CALU_SINGLE_COUNT)
{
returntrue。
}
MeetCount=0。
continue。
}
if(mGameMap[mMapIndexY][index]==Camp)
{
MeetCount++。
if(MeetCount==CALU_SINGLE_COUNT)
{
returntrue。
}
}else
{
MeetCount=0。
}
}
//纵向
MeetCount=0。
for(inti=0。
ii++)
{
intindex=mMapIndexY-CALU_SINGLE_COUNT+i。
if(index<0||index>=mMapHeightLengh)
{
if(MeetCount==CALU_SINGLE_COUNT)
{
returntrue。
}
MeetCount=0。
continue。
}
if(mGameMap[index][mMapIndexX]==Camp)
{
MeetCount++。
if(MeetCount==CALU_SINGLE_COUNT)
{
returntrue。
}
}else
{
MeetCount=0。
}
}
//右斜
MeetCount=0。
for(inti=0。
ii++)
{
intindexX=mMapIndexX-CALU_SINGLE_COUNT+i。
intindexY=mMapIndexY-CALU_SINGLE_COUNT+i。
if((indexX<0||indexX>=mMapWidthLengh)||(indexY<0||indexY>=mMapHeightLengh))
{
if(MeetCount==CALU_SINGLE_COUNT)
{
returntrue。
}
MeetCount=0。
continue。
}
if(mGameMap[indexY][indexX]==Camp)
{
MeetCount++。
if(MeetCount==CALU_SINGLE_COUNT)
{
returntrue。
}
}else
{
MeetCount=0。
}
}
//左斜
MeetCount=0。
for(inti=0。
ii++)
{
intindexX=mMapIndexX-CALU_SINGLE_COUNT+i。
intindexY=mMapIndexY+CALU_SINGLE_COUNT-i。
if((indexX<0||indexX>=mMapWidthLengh)||(indexY<0||indexY>=mMapHeightLengh))
{
if(MeetCount==CALU_SINGLE_COUNT)
{
returntrue。
}
MeetCount=0。
continue。
}
if(mGameMap[indexY][indexX]==Camp)
{
MeetCount++。
if(MeetCount==CALU_SINGLE_COUNT)
{
returntrue。
}
}else
{
MeetCount=0。
}
}
returnfalse。
}
privatevoidUpdateTouchEvent(intx,inty)
{
switch(mGameState)
{
caseGS_GAME:
if(x>0&&y>mTitleHeight)
{
mMapIndexX=(int)(x/mTitleSpace)。
mMapIndexY=(int)((y-mTitleHeight)/mTitleSpace)。
if(mMapIndexX>mMapWidthLengh)
{
mMapIndexX=mMapWidthLengh。
}
if(mMapIndexX<0)
{
mMapIndexX=0。
}
if(mMapIndexY>mMapHeightLengh)
{
mMapIndexY=mMapHeightLengh。
}
if(mMapIndexY<0)
{
mMapIndexY=0。
}
if(mGameMap[mMapIndexY][mMapIndexX]==CAMP_DEFAULT)
{
if(mCampTurn==CAMP_HERO)
{
mGameMap[mMapIndexY][mMapIndexX]=CAMP_HERO。
if(CheckPiecesMeet(CAMP_HERO))
{
mCampWinner=R.string.Role_black。
setGameState(GS_END)。
}
else
{
mCampTurn=CAMP_ENEMY。
}
}
else
{
mGameMap[mMapIndexY][mMapIndexX]=CAMP_ENEMY。
if(CheckPiecesMeet(CAMP_ENEMY))
{
mCampWinner=R.string.Role_white。
setGameState(GS_END)。
}else
{
mCampTurn=CAMP_HERO。
}
}
}
}
break。
caseGS_END:
setGameState(GS_GAME)。
break。
}
}
publicbooleanisCheckInvite(Stringbod