吴雨豪2014035470贪吃蛇课程设计报告.doc

上传人:jian****018 文档编号:9005011 上传时间:2020-04-02 格式:DOC 页数:27 大小:739KB
返回 下载 相关 举报
吴雨豪2014035470贪吃蛇课程设计报告.doc_第1页
第1页 / 共27页
吴雨豪2014035470贪吃蛇课程设计报告.doc_第2页
第2页 / 共27页
吴雨豪2014035470贪吃蛇课程设计报告.doc_第3页
第3页 / 共27页
点击查看更多>>
资源描述
四川城市职业学院汽车与信息工程系Android程序设计课程设计报告题 目: 贪吃蛇 专 业: 软件技术 班 级: 1班 学 号: 2014035470 姓 名: 吴雨豪 2016年6月目录第一章 绪论21.1游戏简介21.2开发目的及意义31.3开发环境及工具3第二章 需求分析42.1游戏界面分析42.2游戏角色分析42.3游戏控制分析4第三章 总体设计53.1系统功能模块层次图53.2运行机制63.3贪吃蛇功能流程图7第四章 详细设计与实现94.1 SnakeActivity类94.2 MyTile类104.3 NextActivity类184.4 SysApplication类194.5界面设计20第五章 测试265.1功能测试265.4测试结果27第六章 结论27第一章 绪论1.1游戏简介贪吃蛇游戏是一款手机游戏,同时也是一款比较需要耐心的游戏。贪吃蛇游戏是一条蛇,不停地在手机屏幕上游走,吃在手机屏幕上出现的食物。当蛇吃掉1个食物后会变长,并且吃完食物时食物会消失,并立即随机生成1个新的食物,只要蛇头碰到屏幕四周或者碰到自己的身子,蛇就立即毙命。1.2开发目的及意义通过本次课程设计,了解android软件的开发过程,熟悉并掌握JAVA语言, 程序关键在于表示蛇的图形及蛇的移动。用一个小矩形块表示蛇的一节身体,身体每长一节,增加一个矩形块,蛇头用一节表示。移动时必须从蛇头开始,所以蛇不能向相反的方向移动,如果不按任意键,蛇自行在当前方向上前移,但按下有效方向键后,蛇头朝着该方向移动,一步移动一节身体,所以按下有效方向键后,先确定蛇头的位置,而后蛇的身体随蛇头移动。意义是方便人们在休闲时通过玩手机游戏获得一点快乐,同时锻炼自己的大脑。1.3开发环境及工具在Window8下进行,采用eclipse开发工具,基于安卓2.2操作系统。环境搭建:1. JDK安装2. Eclipse安装3. Android SDK安装4. ADT安装创建AVD第二章 需求分析2.1游戏界面分析操作界面应该人性化设计,提示玩家按什么按键开始游戏,开始游戏之后,在游戏界面中,以坐标的形式对整体界面进行划分,将界面划分为网格,还应设计蛇的样式,食物的样式和墙的样式,在蛇吃到食物后的样式,还有游戏结束时的界面显示,游戏结束后,要显示所得的分数。2.2游戏角色分析设置游戏贪吃蛇初始时由固定小矩形块组成,在游戏中,要随机出现由单个矩形块构成的食物,并且设置随机出现的食物不要出现在蛇的身体中,在蛇吃到食物的时候,蛇的身体加长。此外,要判定游戏成功与失败的条件,当蛇的头和尾相撞或者蛇的头部撞到了墙上,则游戏失败,此时游戏结束,界面显示所得分数。另外蛇的移动原理,由外部按键设置监听控制蛇头的移动方向,在方向的指引下进行移动,蛇及食物的位置都是由坐标数组确定的,食物的位置也是随机产生的蛇的移动原理是后一矩形块覆盖前一个矩形块。当一个食物被吃掉的时候,要自动随机生成并显示下一个食物的位置。这些都是在设计过程中需要实现的。2.3游戏控制分析游戏中需要通过按键对蛇的移动方位进行控制,共需要设置四个方位,分别是“东”“西”“南”“北”,在按键上用“上”“下”“左”“右”,按键与执行部分涉及到监听,通过监听指示蛇的运动,此外,要设置蛇移动是的默认方向为“右”,蛇的移动只能是90度偏转,不能进行180度偏转。此外还要设置游戏的状态,有运行和结束两种状态,蛇体变长的时候用静态变量进行加分。2.4 可行性分析 贪吃蛇游戏是一种简单的大众的游戏,自从进入现代化以来,深受广大电脑和手机玩家的喜爱,所以做一个简单的贪吃蛇小游戏是有用的。本次设计我主要运用Java语言来完成。Java语言是一种跨平台,适合于分布式计算环境的面向对象编程语言,用Java写的应用程序不用修改就可在不同的软硬件平台上运行。由于Java主要用于网络应用程序开发,因此对安全性有较高的要求。如果没有安全保证,用户从网络下载程序执行就非常危险。Java通过自己的安全机制防止了病毒程序的产生和下载程序对本地系统的威胁破坏。第三章 总体设计3.1系统功能模块层次图工程中包括4个类,分别为SnakeActivity(主界面)、MyTile(游戏界面)、NextActivity(游戏结束界面)和SysApplication类,通过不同Activity之间的转换实现不同界面之间的切换。SnakeActivity和NextActivity继承了Activity类,MyTile类继承了View类,SysApplication类继承了Application类。 SnakeActivity类是这个游戏的入口点, MyTile类进行游戏的绘画和对游戏控制操作的处理。 Coordinate, MyHandler是 2个辅助类,是MyTile类中的内部类。其中, Coordinate是一个点的坐标( x,y), MyHandler将 MyHandler对象绑定某个线程并给它发送消息。如下图:类图3.2运行机制任何游戏都需要有个引擎来推动游戏的运行,在贪吃蛇这个游戏中,辅助类 MyHandler继承自 Handler,用来把 MyHandler与当前线程进行绑定,从而可以直接给线程发送消息并处理消息。注意一点: Handle对消息的处理都是异步。 MyHandler在 Handler的基础上增加 sleep()接口,用来每隔一个时间段后给当前线程发送一个消息。handleMessage()方法在接受消息后,根据当前的游戏状态重绘界面。update()与 sleep()间接的相互调用就构成了一个循环。由于 sleep()是个异步函数,所以 update()与 sleep()之间的相互调用才没有构成死循环。运行机制如下: 活动图3.3贪吃蛇功能流程图 开始始初化蛇和食物屏幕显示蛇和食物位置蛇开始移动,后坐标覆盖前坐标是否有按键否根据上次方向更新坐标是根据按键不同在原坐标基础上改变蛇的坐标位置更新方向是否吃到食物是蛇身加1否是否越界或撞到蛇身是游戏结束否第4章 详细设计与实现4.1 SnakeActivity类程序的入口,程序的界面。代码如下:package com.daYu.mysnake;import android.app.Activity;import android.os.Bundle;public class SnakeActivity extends Activity Overrideprotected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.activity_snake);SysApplication.getInstance().addActivity(this);4.2 MyTile类MyTile的基类是View,包含了贪吃蛇游戏画面的各个设定参数,主要负责绘制游戏画面。还定义了游戏运行时的画面改变及蛇体和食物的更新方法。MyTile类定义如下:package com.daYu.mysnake;import java.util.ArrayList;import java.util.Random;import android.annotation.SuppressLint;import android.content.Context;import android.content.Intent;import android.content.res.Resources;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.drawable.Drawable;import android.os.Handler;import android.os.Message;import android.util.AttributeSet;import android.view.KeyEvent;import android.view.View;SuppressLint(DrawAllocation)public class MyTile extends View private int size = 12; / 图片大小private int xCount; / 横向格子private int yCount; / 纵向格子private int xOffset; / 原点坐标private int yOffset; / 原点坐标private int map; / 地图数组private Bitmap pics; / 图片数组private static final int GERRN_STAR = 1; / 绿色图片private static final int RED_STAR = 2; / 红色图片private static final int YELLOW_STAR = 3; / 黄色图片public static final int UP = 1; / 键盘上public static final int RIGHT = 2; / 键盘右public static final int DOWN = 3; / 键盘下public static final int LEFT = 4; / 键盘左public int direction; / 方向private static final Random RANDOM = new Random();/ 随机变量private ArrayList snakeList = new ArrayList();/ 蛇身数组private ArrayList appleList = new ArrayList();/ 苹果数组private MyHandler handler = new MyHandler();/ 线程/private TextView snakeView;private Context myTileContext;private int isContinue=0;/停止游戏public static long score=0;/游戏分数/ 1 从布局文件读取图片public MyTile(Context context, AttributeSet attrs) super(context, attrs);System.out.println(*MyTile(Context context, AttributeSet attrs)*);myTileContext=context;setFocusable(true);/ TODO Auto-generated constructor stub/ 绘图方法 Canvas:画布Overrideprotected void onDraw(Canvas canvas) / TODO Auto-generated method stubsuper.onDraw(canvas);System.out.println(*onDraw(Canvas canvas)*);Paint myPaint = new Paint();/ 生成一个画笔/ 循环绘制墙for (int x = 0; x xCount; x+) for (int y = 0; y 0) / 判断已赋值的地图数组/ mapxy=1/ 绘制墙canvas.drawBitmap(picsmapxy,/ picsmapxy=1 /绿色xOffset + x * size, yOffset + y * size, myPaint);/ 2 屏幕发生变化时自动执行/屏幕的宽和高,在程序一开始就获取屏幕的宽和高。Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) / TODO Auto-generated method stubsuper.onSizeChanged(w, h, oldw, oldh);System.out.println(*onSizeChanged(int w, int h, int oldw, int oldh)*);xCount = (int) Math.floor(w / size); / 四舍五入/取整/x轴格子总数yCount = (int) Math.floor(h / size); / 四舍五入/取整/y轴格子总数xOffset = (w - xCount * size) / 2;/ 原点坐标yOffset = (h - yCount * size) / 2;/ 原点坐标map = new intxCountyCount;/ 地图总格子initGame();/ 初始化游戏/ 初始化游戏public void initGame() System.out.println(*initGame()*);snakeList.clear();/清空蛇appleList.clear();/清空食物score=1000000000;/初始化分数pics = new Bitmap4;/ 实例化图片数组Resources resources = getContext().getResources();/ 获取资源loadPic(GERRN_STAR, resources.getDrawable(R.drawable.greenstar);/ 加载图片loadPic(RED_STAR, resources.getDrawable(R.drawable.redstar);loadPic(YELLOW_STAR, resources.getDrawable(R.drawable.yellowstar);snakeList.add(new Coordinate(5, 7);snakeList.add(new Coordinate(4, 7);snakeList.add(new Coordinate(3, 7);snakeList.add(new Coordinate(2, 7);direction = RIGHT;/ 蛇的默认方向:右addRandomApple();/ 生成一个随机位置的苹果update();/ 实现重绘一次/ 加载图片public void loadPic(int key, Drawable drawable) System.out.println(*loadPic(int key, Drawable drawable)*);Bitmap bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);/ 图片大小Canvas canvas = new Canvas(bitmap);/ 画布drawable.setBounds(0, 0, size, size);/ 设置位置大小drawable.draw(canvas);picskey = bitmap;public void update() System.out.println(*update()*);clearTile(); / 清空buildWall(); / 重绘墙updateSnake(); / 更新蛇updateApple(); / 更新苹果handler.sleep(200);public void clearTile() System.out.println(*clearTile()*);for (int x = 0; x xCount; x+) for (int y = 0; y yCount; y+) setTile(0, x, y);/ 不给图形/ 为地图数组赋值public void setTile(int picIndex, int x, int y) mapxy = picIndex;/ 根据mapxy=1,初始化时再赋值/ 绘制墙public void buildWall() System.out.println(*buildWall()*);for (int x = 0; x xCount; x+) setTile(GERRN_STAR, x, 0); / 上setTile(GERRN_STAR, x, yCount - 1); / 下for (int y = 0; y yCount; y+) setTile(GERRN_STAR, 0, y); / 左setTile(GERRN_STAR, xCount - 1, y); / 右public void updateSnake() boolean growSnake = false;/ 蛇的生长标志System.out.println(*updateSnake()*);Coordinate header = snakeList.get(0);Coordinate newHeader = new Coordinate(1, 1);switch (direction) case UP:newHeader = new Coordinate(header.x, header.y - 1);break;case RIGHT:newHeader = new Coordinate(header.x + 1, header.y);break;case DOWN:newHeader = new Coordinate(header.x, header.y + 1);break;case LEFT:newHeader = new Coordinate(header.x - 1, header.y);break;/ 游戏结束if (newHeader.x 1 | newHeader.y xCount - 2| newHeader.y yCount - 2) gameOver();return;/ 冲突检测新蛇头是否和自身坐标重叠,重叠的话游戏也结束int snakelength = snakeList.size();for (int snakeindex = 0; snakeindex snakelength; snakeindex+) Coordinate c = snakeList.get(snakeindex);if (c.equals(newHeader) gameOver();return;/ 蛇吃掉苹果、新蛇头和苹果是否重叠int appleLength = appleList.size();for (int appleIndex = 0; appleIndex appleLength; appleIndex+) Coordinate c = appleList.get(appleIndex);if (c.equals(newHeader) appleList.remove(c); / 如果重叠,苹果坐标从苹果列表中移除addRandomApple();/ 再立刻增加一个新苹果score += 10;growSnake = true;/ 蛇增长标志改为真/ 当蛇吃掉苹果后,增加长度snakeList.add(0, newHeader);/ 在蛇头的位置增加一个新坐标if (!growSnake) / 如果没有增长 / 如果蛇头没增长则删去最后一个坐标,相当于蛇向前走了一步snakeList.remove(snakeList.size() - 1);/ 重新设置一下颜色,蛇头是黄色的,蛇身是红色的int index = 0;for (Coordinate c : snakeList) if (index = 0) setTile(YELLOW_STAR, c.x, c.y); else setTile(RED_STAR, c.x, c.y);index+;/游戏结束提示public void gameOver()Intent intent= new Intent();intent.setClass(myTileContext, NextActivity.class);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);myTileContext.startActivity(intent);isContinue=100;Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) / TODO Auto-generated method stubswitch (keyCode) case KeyEvent.KEYCODE_DPAD_UP:direction = UP;break;case KeyEvent.KEYCODE_DPAD_RIGHT:direction = RIGHT;break;case KeyEvent.KEYCODE_DPAD_DOWN:direction = DOWN;break;case KeyEvent.KEYCODE_DPAD_LEFT:direction = LEFT;break;return super.onKeyDown(keyCode, event);/ 产生随机苹果,需要进行冲突检查private void addRandomApple() Coordinate newCoor = null;/ 新的坐标boolean found = false;/ 防止苹果出现在蛇的身上while (!found) / 没有找到合适的苹果,就在循环体内一直循环,直到找到合适的苹果int newX = 1 + RANDOM.nextInt(xCount - 2);/ 随机生成食物的X坐标int newY = 1 + RANDOM.nextInt(yCount - 2);/ 随机生成食物的Y坐标newCoor = new Coordinate(newX, newY);boolean collision = false;/ 确保新苹果不在蛇身下,先假设没有发生冲突for (int index = 0; index snakeList.size(); index+) / 只要和蛇占据的任何一个坐标相同,即认为发生冲突了if (snakeList.get(index).equals(newCoor) collision = true;/ 发生冲突found = !collision;/ false,推出循环appleList.add(newCoor);/ 生成一个新苹果放在苹果列表中/ 苹果的图形public void updateApple() for (Coordinate c : appleList) setTile(YELLOW_STAR, c.x, c.y);/ 坐标类 记录蛇的位置private class Coordinate private int x;private int y;public Coordinate(int x, int y) super();this.x = x;this.y = y;/ 冲突检查,蛇是否吃到苹果public boolean equals(Coordinate other) if (x = other.x & y = other.y) return true;return false;/ 类似线程 Handler:可以定时处理或者分发消息class MyHandler extends Handler Overridepublic void handleMessage(Message msg) / TODO Auto-generated method stubSystem.out.println(*handleMessage(Message msg)+msg+*);/* * 收到下面的sleep发送回来的消息时执行 */if(isContinue=100)return ;elsesuper.handleMessage(msg);/ 发送消息update();/ 更新蛇/ 调用onDraw方法重绘MyTile.this.invalidate();/ 实现重绘 刷新页面public void sleep(int delay) System.out.println(*sleep(int delay)*);this. / 发送空消息激活handleMessage /发送空消息激活handleMessage (0);/ 发送空消息激活handleMessagesendMessageDelayed(obtainMessage(0), delay);4.3 NextActivity类游戏结束界面,游戏结束显示游戏的分数,游戏提示,是否继续,是否退出。代码如下:package com.daYu.mysnake;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;public class NextActivity extends ActivityString fenshuString=0;private Button jixuButton;private Button tuichuButton;private TextView fenshuTextView;Overrideprotected void onCreate(Bundle savedInstanceState) / TODO Auto-generated method stubSystem.out.println(提示Activity!);super.onCreate(savedInstanceState);this.setContentView(R.layout.nextactivity);jixuButton=(Button)findViewById(R.id.jixu);tuichuButton=(Button)findViewById(R.id.tuichu);fenshuTextView=(TextView)findViewById(R.id.fenshu);fenshuString=分数:+MyTile.score+;fenshuTextView.setText(fenshuString);jixuButton.setOnClickListener(new JiXuButtonListener();/注册监听器tuichuButton.setOnClickListener(new TuiChuButtonListener();SysApplication.getInstance().addActivity(this);class JiXuButtonListener implements OnClickListenerOverridepublic void onClick(View v) / TODO Auto-generated method stubIntent intent=new Intent();intent.setClass(NextActivity.this, SnakeActivity.class);NextActivity.this.startActivity(intent);class TuiChuButtonListener implements OnClickListenerOverridepublic void onClick(View v) / TODO Auto-generated method stubSysApplication.getInstance().exit();4.4 SysApplication类退出游戏时,推出整个应用程序。代码如下:package com.daYu.mysnake;import java.util.LinkedList;import java.util.List;import android.app.Activity;import android.app.Application; public class SysApplication extends Application private List mList = new LinkedList(); private static SysApplication instance; private SysApplication() public synchronized static SysApplication getInstance() if (null = instance) instance = new SysApplication(); return instance; / add Activity public void addActivity(Activity activity) mList.add(activity); public void exit() try for (Activity activity : mList) if (activity != null) activity.finish(); catch (Exception e) e.printStackTrace(); finally System.exit(0); /最终执行 4.5界面设计界面设计包括游戏主界面、游戏结束界面的设计。界面的设计采用的是xml文档形式,在xml文档中规划好界面布局布局后,分别在java文件中声明。(1)游戏主界面,主界面采用线性布局设定,指定自定义的控件。其activity_snake.xml文档如下:(2) 游戏结束界面,其nextactivity.xml文档定义如下: (3) 界面设计完成,但还有最重要的一步,就是将所有的Activity注册到AndroidManifest.xml中。AndroidManifest.xml文档如下: 第五章 测试5.1功能测试经过在模拟器上的测试,本软件能实现其功能,达到了小蛇在屏幕上的移动,小蛇吃食物,食物随机出现的功能,当小蛇头尾相撞或与墙相撞时,游戏结束.这些均在测试中得到验证。(1) 游戏时(2)结束时5.4测试结果通过对游戏软件的功能测试,控制测试和界面测试。对游戏的开始新游戏、退出和统计分数功能进行测试,并测试程序的键盘点击事件,结论是该游戏软件能正确实现功能要求。要求输出的效果与预期的输出效果完全一致。第六章 结论这次Android课程设计让我重新熟悉了Android工程的框架及设计的步骤,以及每个文件的作用,稍微掌握了一些View类的方法,同时也学到了更多的界面设计的方法,比如如何自定义视图等。在学习、使用Java的过程中,进一步在总体上让我对编程语言有了新的认识。在设计、调试、修改的过程当中,我对程序的设计与构架在整体上有了进步。这次通过做Android课程设计,我完成了小游戏贪吃蛇的任务。在整个过程中遇到了一些问题,如蛇头怎样移动,蛇的尾巴怎样跟着移动,还有在默认情况下怎样让蛇自行移动、时间处理的机制和界面的设计问题,但最终部分被解决了,还有一些自己想到的功能,已经去做了但还是出现问题,还没能做出来,如暂停游戏、完成游戏获得分数、存档、游戏排名、蛇无效方向处理和加快蛇移动速度等,后面有时间的话,在继续深入把没有完成的功能做出来。在这一次的课设过程中,我查阅了相关的资料,对Android有了进一步的认识,希望以后可以用Android做出一款大型软件,而不只是小游戏。Android让我比较头疼的是有些只是知道代码的作用,却不是很清楚硬件的工作原理,还有遇到一些问题就想放弃了,这是我今后要克服的。通过这次编程,还让我认识到了自己的不足,在编程方面,我发现自己是刚刚入门,对代码还不是很熟悉,需要我不断的充实自己,这样才能在程设计方面有所收获。参考文献 1 Android应用开发教程.清华大学出版社,2013
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 大学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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