收藏 分销(赏)

Android贪吃蛇专业课程设计方案报告.doc

上传人:w****g 文档编号:2864556 上传时间:2024-06-07 格式:DOC 页数:35 大小:1.24MB
下载 相关 举报
Android贪吃蛇专业课程设计方案报告.doc_第1页
第1页 / 共35页
Android贪吃蛇专业课程设计方案报告.doc_第2页
第2页 / 共35页
Android贪吃蛇专业课程设计方案报告.doc_第3页
第3页 / 共35页
Android贪吃蛇专业课程设计方案报告.doc_第4页
第4页 / 共35页
Android贪吃蛇专业课程设计方案报告.doc_第5页
第5页 / 共35页
点击查看更多>>
资源描述

1、综 合 实 践 报 告课程名称 计算机系统综合实训 课题名称 贪吃蛇游戏开发 专 业 计算机科学和技术 班 级 学 号 姓 名 指导老师 12月 20日湖南工程学院课 程 设 计 任 务 书 课程名称 计算机系统综合实训 课 题 贪吃蛇游戏开发 专业班级 计算机1202 学生姓名 学 号 指导老师 审 批 任务书下达日期 年 12月 20 日 任务完成日期 1月 11日 任务书一、实训内容1.贪吃蛇游戏开发(1)设计内容:在手机屏幕上设计一个贪吃蛇游戏,屏幕四面被绿色苹果包围,中间有贪吃蛇和随机产生苹果,贪吃蛇头是黄色,身子是红色。玩家按上、下、左、右键盘控制贪吃蛇在屏幕上向上、下、左、右移动

2、,贪吃蛇只能向左、右方向90度转弯,当吃到一个苹果贪吃蛇就长一节,分数加一分,同时屏幕上又随机产生一个黄色苹果,一旦碰到墙壁或自己尾巴就失败。提醒游戏得到分数。贪吃蛇游戏规则:游戏初始化:在本游戏中,采取以下策略进行初始化:将贪吃蛇基础初始化在屏幕中央,初始移动方向和贪吃蛇节点排列次序一致,食物坐标固定位置。贪吃蛇移动:除第一个节点以外,其它每个节点跟随前一个节点移动贪吃蛇方向控制:贪吃蛇方向控制需要依据玩家按键改变贪吃蛇方向变量,在改变时需要注意,不能改变为目前方向相反方向,比如目前方向是向下时,按向上方向键是无效。(2) 设计要求:按任务书设计要求进行撰写。其中游戏关键数据结构设计要求为:

3、关键是界面控制信息和逻辑控制信息, 界面控制信息关键包含两个部分:贪吃蛇位置信息,存放贪吃蛇具体位置,另外一个就是闪烁食物位置。而逻辑控制信息关键包含三个部分:贪吃蛇移动方向、闪烁控制和程序暂停控制。碰撞和处理,包含贪吃蛇和食物碰撞和处理,贪吃蛇和四面碰撞和处理,贪吃蛇头和身碰撞和处理,二、综合实训时间安排具体时间及要求安排以下:综合实训时间为1718周,包含上机和查资料。17周安排(12月28日开始)星期一(12月28日)早晨星期二(12月29日)下午星期三(12月30日)早晨星期四(12月31日)早晨第18周星期一至星期三早晨 风华科技老师来校讲课星期三下午去九华参观星期四至星期五,卓京来

4、校讲课三、综合实训汇报撰写要求正文内容:1、课程实训目标及要求;2、设计思绪(需求分析、功效介绍、模块划分);3、关键功效实现(最少要有一个关键模块步骤图);4、程序调试;5、总结;6、附件(全部程序源代码,要求对程序写出必需注释)。正文总字数要求在5000字以上(不含程序原代码)附:课程实训汇报装订次序:封面、任务书、目录、正文、评分、附件(A4大小图纸及程序清单)。 正文格式:一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;行距为22。目录一、课程实训目标及要求11.1、课程实训目标11.2、课程实训要求1二、设计思绪12.1、需求分析12.1.1、游戏界面分析12.1.2、

5、游戏角色分析12.1.3、游戏控制分析22.1.4、可行性分析22.2、功效介绍22.3、模块划分32.3.1、系统功效模块层次32.3.2、运行机制4三、关键功效实现53.1、功效步骤图 5四、程序调试64.1、功效测试64.2、测试结果6五、总结6六、 附件86.1、源代码8一、课程实训目标及要求1.1、课程实训目标计算机系统综合实训能培养学生独立进行资料搜集,综合利用所学多门课程知识,培养分析问题和处理问题能力。验证和巩固充实所学理论知识,加深对相关内容了解,能利用所学知识为社会服务,在实训中学习和锻炼,增加才能。此次实训采取项目制,要求学生深入了解和掌握软件工程方法和技术,培养合作意识

6、、团体精神和技术文档编写能力。为了让同学们愈加好地了解3G现在应用情况,我们将邀请风华科技和卓京老师进行五天实训培训。1.2、课程实训要求实训要求采取“项目小组”形式,结合具体开发项目进行设计。具体要求以下:1.每个项目小组人数在49人,项目小组组员自行组织。2.项目小组按开发计划书任务进行实训。3.依据进度安排着实开展实训活动,按时完成每部分工作。4.每个项目小组必需根据计划书要求提交文档。6.综合实训集中在510#和512#机房进行。二、设计思绪2.1、需求分析2.1.1、游戏界面分析操作界面应该人性化设计,提醒玩家按什么按键开始游戏,开始游戏以后,在游戏界面中,以坐标形式对整体界面进行划

7、分,将界面划分为网格,还应设计蛇样式,食物样式和墙样式,在蛇吃到食物后样式,还有游戏结束时界面显示,游戏结束后,要显示所得分数。2.1.2、游戏角色分析设置游戏贪吃蛇初始时由固定小矩形块组成,在游戏中,要随机出现由单个矩形块组成食物,而且设置随机出现食物不要出现在蛇身体中,在蛇吃到食物时候,蛇身体加长。另外,要判定游戏成功和失败条件,当蛇头和尾相撞或蛇头部撞到了墙上,则游戏失败,此时游戏结束,界面显示所得分数。另外蛇移动原理,由外部按键设置监听控制蛇头移动方向,在方向指导下进行移动,蛇及食物位置全部是由坐标数组确定,食物位置也是随机产生蛇移动原理是后一矩形块覆盖前一个矩形块。当一个食物被吃掉时

8、候,要自动随机生成并显示下一个食物位置。这些全部是在设计过程中需要实现。2.1.3、游戏控制分析游戏中需要经过按键对蛇移动方位进行控制,共需要设置四个方位,分别是“东”“西”“南”“北”,在按键上用“上”“下”“左”“右”,按键和实施部分包含到监听,经过监听指示蛇运动,另外,要设置蛇移动是默认方向为“右”,蛇移动只能是90度偏转,不能进行180度偏转。另外还要设置游戏状态,有运行和结束两种状态,蛇体变长时候用静态变量进行加分。2.1.4、可行性分析 贪吃蛇游戏是一个简单大众游戏,自从进入现代化以来,深受广大电脑和手机玩家喜爱,所以做一个简单贪吃蛇小游戏是有用。此次设计我关键利用Java语言来完

9、成。Java语言是一个跨平台,适合于分布式计算环境面向对象编程语言,用Java写应用程序不用修改就可在不一样软硬件平台上运行。因为Java关键用于网络应用程序开发,所以对安全性有较高要求。假如没有安全确保,用户从网络下载程序实施就很危险。Java经过自己安全机制预防了病毒程序产生和下载程序对当地系统威胁破坏。2.2、功效介绍贪吃蛇游戏是一款手机游戏,同时也是一款比较需要耐心游戏。贪吃蛇游戏是一条蛇,不停地在手机屏幕上游走,吃在手机屏幕上出现食物。当蛇吃掉1个食物后会变长,而且吃完食物时食物会消失,并立即随机生成1个新食物,只要蛇头碰到屏幕四面或碰到自己身子,蛇就立即毙命。用一个小矩形块表示蛇一

10、节身体,身体每长一节,增加一个矩形块,蛇头用一节表示。移动时必需从蛇头开始,所以蛇不能向相反方向移动,假如不按任意键,蛇自行在目前方向上前移,但按下有效方向键后,蛇头朝着该方向移动,一步移动一节身体,所以按下有效方向键后,先确定蛇头位置,以后蛇身体随蛇头移动。意义是方便大家在休闲时经过玩手机游戏取得一点愉快,同时锻炼自己大脑。2.3、模块划分2.3.1、系统功效模块层次工程中包含4个类,分别为SnakeActivity(主界面)、MyTile(游戏界面)NextActivity(游戏结束界面)和SysApplication类,经过不一样Activity之间转换实现不一样界面之间切换。Snake

11、Activity和NextActivity继承了Activity类,MyTile类继承了View类,SysApplication类继承了Application类。 SnakeActivity类是这个游戏入口点, MyTile类进行游戏绘画和对游戏控制操作处理。 Coordinate, MyHandler是 2个辅助类,是MyTile类中内部类。其中, Coordinate是一个点坐标( x,y), MyHandler将 MyHandler对象绑定某个线程并给它发送消息。图2.1:系统功效模块层次图2.3.2、运行机制任何游戏全部需要有个引擎来推进游戏运行,在贪吃蛇这个游戏中,辅助类 MyHan

12、dler继承自 Handler,用来把 MyHandler和目前线程进行绑定,从而能够直接给线程发送消息并处理消息。注意一点: Handle对消息处理全部是异步。 MyHandler在 Handler基础上增加 sleep()接口,用来每隔一个时间段后给目前线程发送一个消息。handleMessage()方法在接收消息后,依据目前游戏状态重绘界面。update()和 sleep()间接相互调用就组成了一个循环。因为 sleep()是个异步函数,所以 update()和 sleep()之间相互调用才没有组成死循环。图2.2:运行机制三、关键功效实现 3.1、功效步骤图 开始始初化蛇和食物屏幕显示

13、蛇和食物位置蛇开始移动,后坐标覆盖前坐标是否有按键否依据上次方向更新坐标是依据按键不一样在原坐标基础上改变蛇坐标位置更新方向是否吃到食物是蛇身加1否是否越界或撞到蛇身是游戏结束否图3.1:功效步骤图四、程序调试4.1、功效测试经过在模拟器上测试,本软件能实现其功效,达成了小蛇在屏幕上移动,小蛇吃食物,食物随机出现功效,当小蛇头尾相撞或和墙相撞时,游戏结束.这些均在测试中得到验证。 图4.1:运行时截图4.2、测试结果经过对游戏软件功效测试,控制测试和界面测试。对游戏开始新游戏、退出和统计分数功效进行测试,并测试程序键盘点击事件,结论是该游戏软件能正确实现功效要求。要求输出效果和预期输出效果完全

14、一致。五、总结 此次Java课程设计我们这组做课题是设计贪吃蛇游戏,刚开始拿到题目我们组员全部不知怎样下手,经过小组组员一起查找资料,而且开会讨论,我们确定了设计设计目标和具体实现方法,包含怎样将Java思想利用到实际系统具体设计之中。试验过程中,首先要将系统要实现功效分为几大模块,然后每个组员分别完成,在此过程中使我加深了对Java了解,和怎样进行团体工作划分,学会发觉各组员优点并将其发挥出来。即使大家没怎么学过Java,但大家全部有C语言基础,所以经过努力试验,深入培养我们利用Java语言进行编程和调试程序能力,同时使我们能够学会将C语言和Java语言结合起来编写较复杂含有实际意义和算法复

15、杂度较小程序。和此同时熟练掌握Java语言编辑,编译,调试程序,并将算法转变为程序实现。正确了解多种数据结构逻辑特征和存放表示和基础操作算法实现。掌握算法时间分析和空间分析技术。针对问题特点选择适宜数据结构,设计实用高效算法,提升大家算法设计能力和动手试验技能。六、附件6.1、源代码SnakeActivity类:程序入口,程序界面。代码以下:package com.daYu.mysnake;import android.app.Activity;import android.os.Bundle;public class SnakeActivity extends Activity Overri

16、deprotected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.activity_snake);SysApplication.getInstance().addActivity(this);MyTile类:MyTile基类是View,包含了贪吃蛇游戏画面各个设定参数,关键负责绘制游戏画面。还定义了游戏运行时画面改变及蛇体和食物更新方法。MyTile类定义以下:package com.daYu.mysnake;import java.ut

17、il.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.D

18、rawable;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

19、 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

20、= 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

21、= new MyHandler();/ 线程 /private TextView snakeView;private Context myTileContext;private int isContinue=0;/停止游戏public static long score=0;/游戏分数/ 从布局文件读取图片public MyTile(Context context, AttributeSet attrs) super(context, attrs);System.out.println(MyTile(Context context, AttributeSet attrs) );myTileCo

22、ntext=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+

23、) for (int y = 0; y 0) / 判定已赋值地图数组/ mapxy=1/ 绘制墙canvas.drawBitmap(picsmapxy,/ picsmapxy=1 /绿色xOffset + x * size, yOffset + y * size, myPaint);/ 屏幕发生改变时自动实施/屏幕宽和高,在程序一开始就获取屏幕宽和高。Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) / TODO Auto-generated method stubsuper.onSizeChanged

24、(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;

25、/ 地图总格子initGame();/ 初始化游戏/ 初始化游戏public void initGame() System.out.println(initGame();snakeList.clear();/清空蛇appleList.clear();/清空食物score=;/初始化分数pics = new Bitmap4;/ 实例化图片数组Resources resources = getContext().getResources();/ 获取资源loadPic(GERRN_STAR, resources.getDrawable(R.drawable.greenstar);/ 加载图片loa

26、dPic(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;/ 蛇默认方向:右addRandomA

27、pple();/ 生成一个随机位置苹果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

28、);/ 设置位置大小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 yCo

29、unt; 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;

30、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

31、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| newHead

32、er.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 (

33、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

34、) / 假如没有增加 / 假如蛇头没增加则删去最终一个坐标,相当于蛇向前走了一步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.set

35、Class(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;brea

36、k;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

37、= 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();

38、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 pri

39、vate 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

40、) / 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);NextActivity类:游戏结束界面,游戏结束显示游戏分数,游戏提醒,是否继续,是否退出。代码以下:package com.daYu.mysnake;import android.app.Activity;import android.content.Intent;import android.os.Bun

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服