欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    课程实训报告(共21页).doc

    • 资源ID:13503631       资源大小:443KB        全文页数:21页
    • 资源格式: DOC        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    课程实训报告(共21页).doc

    精选优质文档-倾情为你奉上一、设计内容与设计要求1设计内容:在手机屏幕上设计一个五子棋游戏,屏幕有棋盘,可人与人对奕,人与机对弈。双方交替下棋,如果某方在水平、垂直或45度方向有连续的5个棋子,就算胜利,结束比赛,提示游戏得到的分数。2设计要求:(1)论述课题的性质、内容以及本次课程实训的目的和要求。(2)说明Android系统对计算机软、硬件环境的基本要求,对Android应用程序作简要的说明。(3)界面设计和游戏操作设计:界面要求美观和友好(可使用图片资源文件),使用手机键盘上的2个方向键控制方向,按照手机上的操作习惯进行设计。(4)游戏核心数据结构设计主要是界面控制信息:五子棋的位置信息,双方已经下棋子的具体位置。逻辑控制信息主要双方交替下棋。下棋子和处理, 棋子只能下到棋盘的指定位置(棋盘的格子上)并不能下到已经有棋子位置,(5)胜负判断:双方每个已下点的3个方向判断它们是否构成五连、五连就胜利。(6)编写代码、上机输入、调试、修改并运行通过。(7)编写实训说明书。说明书是总结性的技术文件,应全面叙述整个设计的内容及过程(可参考上述6条),发现的问题及解决方法等。(8)源代码和参考书目应作为说明书的附录。(9)说明书应采用A4纸张,文字说明不少于4000字。说明书中应包括系统结构示意图。二、进度安排第十五周 星期一 上午8:3011:30, 星期二 下午2:305:00,星期三 上午8:3011:30,星期四 上午8:3011:30,第十六周 星期一 一天, 星期二 一天 星期三 上午8:3011:30,星期四 上午8:3011:30, 目 录一、 课程实训的目的及要求-6二、 游戏设计思路-7三、 主要功能实现-9四、 程序调试-12五、 程序源代码-13六、 总结-21七、 课程设计评分表-22一、课程实训的目的及要求 本次课程实训是专门针对大四学生的一次项目实践,当前3G移动互联网发展迅速,而Android系统已经成为当前时期移动终端设备的主流操作系统之一,在这样的条件下计算机与通信学院组织这次基于Android系统的手机项目实战,紧跟当前时代电子通信业的发展,让学生学习当前主流的新技术,扩展学生们的视野,为即将大学毕业的我们进入社会求职开辟了一条新道路。 通过这次课程实训我们主要了解和掌握了以下内容:(1) 会在eclipse下搭建Android系统的开发环境;(2) 熟悉Android系统应用程序架构和代码编写;(3) 了解游戏开发的原理,能够解决游戏在不同屏幕上的移植问题;(4) 熟悉Android系统的线程机制和绘图原理;(5) 能够在eclipse中对Android系统应用程序进行调试;二、 游戏设计思路 1、游戏功能介绍五子棋游戏通过黑白双方在固定大小的方格棋盘上进行交替落子,直到有一方在落下一棋子后在该棋子的周围形成垂直方向、水平方向、左上到右下方向或左下到右上方向形成有大于等于5个同样颜色棋子的一条直线,则执该颜色棋子的玩家赢得该棋局。在我所设计的游戏中,主要的功能为:人与人对弈,给出当前该谁进行落棋子的提示,在游戏结束时给出游戏结束的提示对话框,实现在游戏过程中(未结束)重新开始游戏的功能,实现游戏过程中退出游戏的功能。2、 游戏模块的划分 该游戏由于是人与人之间的对弈,因此逻辑比较简单,因而实现的模块划分也较简单。这里的主要的模块有三部分:一是坐标转换模块,将屏幕点击位置的像素坐标位置转换为棋盘上的棋子的坐标位置;二是绘图模块,根据用户点击屏幕的位置,判断应该做出的响应并进行屏幕的重绘;三是游戏结束的判断模块,当用户点击落下一个棋子后,立刻判断该棋子的落下是否决定了该棋局的胜负。其它的小模块还有游戏的初始化,游戏的重置,游戏的退出模块。3、 游戏运行的界面如下所示:4、 游戏结束时的界面三、 主要功能模块的实现1、 坐标转换模块的实现用户输入的操作为用户对屏幕的点击操作,而游戏中的棋盘为9*9方格落子点。棋盘是一张填充整个屏幕的背景图片,为了使用户点击的位置能够与图片上的棋盘的位置相对应,这里需要对图片进行等比例缩放以适应不同分辨率的屏幕。在我的开发过程中,我使用的屏幕的分辨率为320*480,在该屏幕的分辨率下求得缩放的比例。背景图片如下: 图一:背景图片棋子图片如下(两个图片时分开的): 图二:棋子图片 在求解缩放比例需要获知以下信息:(1)棋盘左上角落子位置的像素坐标(x0,y0);(2)棋盘水平相邻两个落子点的距离unitx;(3)棋盘垂直相邻两个落子点的距离unity;(4)手机屏幕的分辨率大小width,height;我的比例数据的获取是在分辨率为320*480即width=320,height=480的环境下获取的缩放比例。求解其他的数值过程如下:【1】原点坐标比例的求解过程将背景图片在手机屏幕上进行全屏显示,然后用点击屏幕上棋盘原点(左上角落棋子点),记录该点的水平和垂直方向的像素坐标,同样操作10次,求得平均值。我的操作结果为:水平像素值为:x=16,垂直像素值为:y=175.8;则求得水平的比例为:320/16=20,垂直比例为:480/175.8=2.73;在程序中的书写为: /原点位置的缩放比例 private final static float scaleX0=20f; private final static float scaleY0=2.73f; 则得原点坐标值为: x0=width/scaleX0; y0=height/scaleY0; 【2】棋盘格子的长(unitx)与宽(unity)的求解过程:沿左上到右下对角线方向,从离棋盘原点一个格子的位置开始,依次点击落棋子的位置,分别对水平和垂直方向的格子求值,最后进行求平均值即可得到棋盘格子的大小。在我的操作中最后求得的棋盘格子的缩放比为: /棋盘点间距的缩放比例private final static float scaleUnitx=8.858f;private final static float scaleUnity=13.278f;得棋盘格子的单元长度像素值为: unitx=width/scaleUnitx;unity=height/scaleUnity;其他的一些缩放比例信息为:(1) 棋子图片一半的大小 chessHx,chessHy;用于绘制棋子图片时确定绘制点里棋子中心点的距离;其求解过程为: /设置棋子图片的一半的大小值chessHx=whiteChess.getWidth()/2.0f;chessHy=whiteChess.getHeight()/2.0f;(2) 提示棋子的绘制坐标位置(notex,notey);其求解过程为: /设置提示棋子的位置notex=x0+(map0.length/2)*unitx-chessHx;notey=y0-2*unity-chessHy/2;/这里为了视觉效果,减去了图片的1/4长度2、 绘图模块的实现绘图模块是在独立的线程中完成,绘图顺序为:先绘制背景(棋盘)图片,然后绘制提示棋子的图片,最后绘制已经落下的棋子的图片。对于落下的棋子图片的绘制,这里根据棋子的棋盘坐标然后转换成屏幕的像素坐标来进行绘制。这是因为在该游戏中,棋盘被抽象成了一个二维矩阵,每落下一子,就相应的修改矩阵的值,然后由绘图线程根据矩阵中的值进行相应的图片绘制。由于绘制图片是根据图片的左上角坐标来绘制的,而我求解的棋盘落子的坐标是以棋子中心为参照的,因此绘制图片时需要减去棋子图片的1/2长度,这样图片才能被绘制到棋盘的正确位置。3、 游戏结束判断模块的实现每一颗棋子的落下,都要对其对棋局的影响作出判断,以经过当前落子位置向水平方向、垂直方向、左上到右下方向和左下到右上方向向外扩展,若有一个方向上有连续的大于等于5个同样的棋子,则认为当前落子的用户赢得游戏。对于每一个方向的判断是分为两部分的,例如对于水平方向,先统计当前落子点超左边方向上连续的棋子数,然后统计当前棋子超右边方向的连续的同种棋子的个数,最后将在两个数据加起来,如果和大于等于5,则认为赢。四、 程序调试在调试的程序中我遇到了各种各样的问题,其中最典型的问题有:(1) 背景图片与SurfaceView画图问题。(2) 像素坐标到棋盘矩阵数组的转换问题。(3) 线程终止与同步问题。在程序设计时,我本来的思路是为SurfaceView设置背景图片,这样在下棋操作中只需要对棋子进行绘制而不必重新绘制背景图片,但是这样做并不能达到效果,在程序运行中,背景图片会一直显示在屏幕上,但绘制的棋子确并不能够显示出来。而在其他线程又是不能更改主线程的界面的数据的,所以只能在其他线程中对背景图片进行重绘。在绘制背景图片的过程中,如果不对图片进行缩放绘制,即指定图片原始大小和绘制后的大小,那么就会导致背景图片在大于图片尺寸的屏幕上图片不能充满整个屏幕的问题。像素坐标到二维数组的转换是另外一个问题,在转换的过程中很可能对坐标系的x/y与数组中的行和列相混淆。坐标系中的x对应着二维数组的列,坐标系中的y对应着二维数组的行。由于这个应用程序的棋盘是一个方形的棋盘(行和列相等),因此这个错误并不会明显对程序的运行造成结果,但如果该应用程序棋盘不是方形的,那么程序运行就会出现错误。在一盘棋结束后,应用程序会让用户选择将要采取的动作,是再玩儿一次还是退出应用程序。在退出应用程序之前,必须要停止绘图的线程。而通过Thread类的interupte方法是不能够停止线程的运行的,因此在程序中,我使用了一个棋局状态标志,绘图线程每次重绘之前都判断当前棋局是否结束,如果棋局已经结束,就不会进入绘图循环,从而跳出run()方法,结束线程的运行。在线程同步方面,还有一个问题,如果下棋子太快,在已经有5个棋子连成一条线(即游戏处理结束状态)时,继续下棋子,还会有一个棋子显示在棋盘上,然后才会给出该棋局结束的提示。这是由于棋子落下后,判断输赢状态耗费时间较长所导致的。对于用户的每一次落子,都会判断该棋子的落下对棋局的影响。如果该判断还未结束,而用户又下了另一个棋子,则该棋子就会改变棋盘上棋子的覆盖状态。而绘图线程对棋盘的绘制是很快的,如果棋局已经结束而消息并为及时发送到绘图线程并且用户的下一次点击操作又已经改变了棋盘的状态,那么就会出现多绘一个棋子,甚至几个棋子的情况。这种情况我现在还未找到适合的解决方法。五、 程序源代码1、 主Activity的代码如下:package hnie.zj.fivechess;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.Display;import android.view.Window;import android.view.WindowManager;public class MainActivity extends Activity /* Called when the activity is first created. */ Override public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); / 隐藏标题栏 requestWindowFeature(Window.FEATURE_NO_TITLE); / 全屏显示 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); / 获取屏幕宽高 Display display = getWindowManager().getDefaultDisplay(); GameView gameView=new GameView(this,display.getWidth(),display.getHeight(); setContentView(gameView); 2、 游戏界面操作View如下:(GameView)package hnie.zj.fivechess;import android.app.AlertDialog;import android.content.Context;import android.content.DialogInterface;import android.content.res.Resources;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.Rect;import android.graphics.RectF;import android.view.MotionEvent;import android.view.SurfaceHolder;import android.view.SurfaceView;public class GameView extends SurfaceView implements SurfaceHolder.Callback,Runnable private SurfaceHolder holder;private Paint paint;private Resources res;private Context context;boolean winState=false;private Bitmap backgroundPicture;private Bitmap whiteChess;private Bitmap blackChess;private Canvas mCanvas;private float x0,y0;/原点坐标的像素值private float unitx,unity;/每个单元的横、竖像素值大小/原点位置的缩放比例private final static float scaleX0=20f;private final static float scaleY0=2.73f;/棋盘点间距的缩放比例private final static float scaleUnitx=8.858f;private final static float scaleUnity=13.278f;/设置棋子图片的一半的大小private static float chessHx=0f;private static float chessHy=0f;/设置提示棋子的位置坐标private static float notex=0f;private static float notey=0f;private Rect src;private RectF des;/地图棋子分布数组private int map;public GameView(Context context,int width,int height)super(context);this.context=context;x0=width/scaleX0;y0=height/scaleY0;unitx=width/scaleUnitx;unity=height/scaleUnity;des=new RectF(0,0,width,height);map=new int99;holder=this.getHolder();holder.addCallback(this);/设置画笔paint=new Paint();paint.setAntiAlias(true);/消除锯齿res=getResources();init();setFocusable(true);private void init()/初始化3张位图图片backgroundPicture=BitmapFactory.decodeResource(res, R.drawable.status);/初始化背景图片原始矩形大小src=new Rect(0,0,backgroundPicture.getWidth(),backgroundPicture.getHeight();whiteChess=BitmapFactory.decodeResource(res, R.drawable.human);blackChess=BitmapFactory.decodeResource(res, R.drawable.ai);/设置棋子图片的一半的大小值chessHx=whiteChess.getWidth()/2.0f;chessHy=whiteChess.getHeight()/2.0f;/设置提示棋子的位置notex=x0+(map0.length/2)*unitx-chessHx;notey=y0-2*unity-chessHy/2;/这里为了视觉效果,减去了图片的1/4长度Overridepublic void run() while(!winState)mCanvas=holder.lockCanvas();/画背景图片mCanvas.drawBitmap(backgroundPicture, src, des, paint);/画提示棋子图片if(isWhite) mCanvas.drawBitmap(whiteChess, notex, notey, paint);else mCanvas.drawBitmap(blackChess, notex, notey, paint);for(int i=0;i<map.length;i+)for(int j=0;j<map0.length;j+)if(mapij=1)drawAt(mCanvas, whiteChess, i, j);else if(mapij=2)drawAt(mCanvas, blackChess, i, j);holder.unlockCanvasAndPost(mCanvas);Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) / TODO Auto-generated method stubOverridepublic void surfaceCreated(SurfaceHolder holder) / TODO Auto-generated method stubnew Thread(this).start();Overridepublic void surfaceDestroyed(SurfaceHolder holder) / TODO Auto-generated method stubOverridepublic boolean onTouchEvent(MotionEvent event) / TODO Auto-generated method stubfloat x=event.getX();float y=event.getY();if(x>x0+unitx*5.5)&&(y<1.4*unity)/点击了”退出“位置stop();if(x<x0+2.5*unitx)&&(y<1.4*unity)/点击了”重玩“位置reset();if(x>x0+2.5*unitx)&&(x<x0+unitx*5.5)&&(y<1.4*unity)/点击了”选项“位置的处理/System.out.println("option");/if(!setCurXY(x,y)/若已经有一方赢了,给出游戏结束对话框/winState=true;showWinDialog();return true;/return super.onTouchEvent(event);/棋局结束后的提示对话框private void showWinDialog()AlertDialog.Builder builder = new AlertDialog.Builder(context);String text;if(isWhite)text="游戏结束!白棋赢了!"elsetext="游戏结束!黑棋赢了"builder.setMessage(text) .setCancelable(false) .setPositiveButton("再来一次", new DialogInterface.OnClickListener() public void onClick(DialogInterface dialog, int id) reset(); dialog.cancel(); ) .setNegativeButton("退出", new DialogInterface.OnClickListener() public void onClick(DialogInterface dialog, int id) dialog.cancel(); stop(); );AlertDialog alert = builder.create();alert.show();private void drawAt(Canvas canvas,Bitmap bitmap, int x,int y)float xx=x0+y*unitx-chessHx;float yy=y0+x*unity-chessHy;canvas.drawBitmap(bitmap, xx, yy, paint);private boolean isWhite=true;/初始为白子下/为地图数组赋值private boolean setCurXY(float x,float y)int roundx=Math.round(x-x0)/unitx);int roundy=Math.round(y-y0)/unity);/当前位置在棋盘上且还未下过棋子且当前状态为未分胜负状态if(roundx>=0)&&(roundy>=0)&&(roundx<map0.length)&&(roundy<map.length)&&(maproundyroundx=0)if(isWhite)maproundyroundx=1;if(checkWin(roundy,roundx,1)return false;isWhite=false;/该黑子下了elsemaproundyroundx=2;if(checkWin(roundy,roundx,2) return false;isWhite=true;/该白子下了 return true;/判断赢状态private boolean checkWin(int x,int y,int status)int count=0;int tempx=x,tempy=y;while(tempx>=0)&&(maptempxy=status)/计数正上方自己连续的棋子数count+;tempx-;tempx=x+1;/处理正下方连续的棋子while(tempx<9)&&(maptempxy=status)count+;tempx+;if(count>=5)return true;/处理水平的一条线,分两段处理,左边一部分和右边一部分count=0;tempx=x;tempy=y;while(tempy>=0)&&(mapxtempy=status)/左边部分count+;tempy-;tempy=y+1;while(tempy<9)&&(mapxtempy=status)/右边部分count+;tempy+;if(count>=5)return true;/处理左上到右下的斜线方向count=0;tempx=x;tempy=y;while(tempx>=0)&&(tempy>=0)&&(maptempxtempy=status)/左上方向count+;tempx-;tempy-;tempx=x+1;tempy=y+1;while(tempx<9)&&(tempy<9)&&(maptempxtempy=status)/右下方向count+;tempx+;tempy+;if(count>=5)return true;/判断左下到右上方向的棋子count=0;tempx=x;tempy=y;while(tempx>=0)&&(tempy<9)&&(maptempxtempy=status)/右上方向count+;tempx-;tempy+;tempx=x+1;tempy=y-1;while(tempx<9)&&(tempy>=0)&&(maptempxtempy=status)/左下方向count+;tempx+;tempy-;if(count>=5)return true;return false;/游戏重置private void reset()isWhite=true;for(int i=0;i<map.length;i+)for(int j=0;j<map0.length;j+)mapij=0;private void stop()winState=true;(MainActivity) context).finish();六、总结这次课程设计让我学到了很多安卓的知识。本学期的知识应用到了很多,让我的安卓知识从理论和实际上得到了更好的结合。原来在书本上并不熟悉的知识,得到了非常好的锻炼。这次课程设计的时间为两周,两周内一个人开发一个大型的软件是比较困难的。因此我从一些简单的方面入手,例如本次我的课题是五子棋的游戏。既然是一个小型的游戏,就不需要太全面的功能。只需完成五子棋的基本功能即可,例如下的位置,如何防止对手完成等。从基本的地方入手,既能完成课题的要求,又能在规定的时间内完成,一举两得。一开始我便开始五子棋的结构。经过不断的修改最终才成,每次回顾总觉得有不完善的地方。接着便做了数据字典和子模块的划分,把大的模块划分成为小的。使得局部问题局部分析。当前期工作完成才,便开始了五子棋的编码。一开始对一些基础有些遗忘,便上网查询了资料。这使得我对安卓知识有了一定的加深。 通过两周的课程设计,让我加强了原来的安卓知识,掌握了原来不了解的一些知识,让我对安卓有了更深层次的认识。课程设计评分表课程名称: 软件测试 项 目评 价设计方案的合理性与创造性设计与调试结果设计说明书的质量答辩陈述与回答问题情况课程设计周表现情况综合成绩 教师签名: 日 期: 附:课程实训报告装订顺序:封面、任务书、目录、正文、评分、附件(A4大小的图纸及程序清单)。 正文的格式:一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;行距为22。正文的内容:一、课程实训目的及要求;二、设计思路(需求分析、功能介绍、模块划分);三、主要功能的实现(至少要有一个主要模块的流程图);四、程序调试;五、总结;六、附件(所有程序的源代码,要求对程序写出必要的注释)。正文总字数要求在5000字以上(不含程序原代码)。专心-专注-专业

    注意事项

    本文(课程实训报告(共21页).doc)为本站会员(飞****2)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开