Android贪吃蛇课程设计报告.docx

上传人:小飞机 文档编号:4882863 上传时间:2023-05-21 格式:DOCX 页数:27 大小:183.11KB
返回 下载 相关 举报
Android贪吃蛇课程设计报告.docx_第1页
第1页 / 共27页
Android贪吃蛇课程设计报告.docx_第2页
第2页 / 共27页
Android贪吃蛇课程设计报告.docx_第3页
第3页 / 共27页
Android贪吃蛇课程设计报告.docx_第4页
第4页 / 共27页
Android贪吃蛇课程设计报告.docx_第5页
第5页 / 共27页
亲,该文档总共27页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《Android贪吃蛇课程设计报告.docx》由会员分享,可在线阅读,更多相关《Android贪吃蛇课程设计报告.docx(27页珍藏版)》请在三一办公上搜索。

1、XXXX学院计算机科学系Android程序设计课程设计报告题专班学姓Q目:贪吃蛇业:计算机科学与技术 级:B11计科班号: 名:一凌波微步 Q : 2446872525指导教师:2014年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 类19

2、4.5界面设计20第五章测试245.1功能测试245.4测试结果25第六章结论25第一章绪论1.1游戏简介贪吃蛇游戏是一款手机游戏,同时也是一款比较需要耐心的游戏。贪吃蛇游 戏是一条蛇,不停地在手机屏幕上游走,吃在手机屏幕上出现的食物。当蛇吃掉 1个食物后会变长,并且吃完食物时食物会消失,并立即随机生成1个新的食物, 只要蛇头碰到屏幕四周或者碰到自己的身子,蛇就立即毙命。1.2开发目的及意义通过本次课程设计,了解android软件的开发过程,熟悉并掌握JAVA语言, 程序关键在于表示蛇的图形及蛇的移动。用一个小矩形块表示蛇的一节身体,身 体每长一节,增加一个矩形块,蛇头用一节表示。移动时必须从

3、蛇头开始,所以 蛇不能向相反的方向移动,如果不按任意键,蛇自行在当前方向上前移,但按下 有效方向键后,蛇头朝着该方向移动,一步移动一节身体,所以按下有效方向键 后,先确定蛇头的位置,而后蛇的身体随蛇头移动。意义是方便人们在休闲时通 过玩手机游戏获得一点快乐,同时锻炼自己的大脑。1.3开发环境及工具在Window8下进行,采用eclipse开发工具,基于安卓2.2操作系统。环境搭建:1. JDK安装2. Eclipse 安装3. Android SDK 安装4. ADT安装创建AVD第二章需求分析2.1游戏界面分析操作界面应该人性化设计,提示玩家按什么按键开始游戏,开始游戏之后,在游 戏界面中,

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

5、的位置也是随机产生的 蛇的移动原理是后一矩形块覆盖前一个矩形块。当一个食物被吃掉的时候,要自 动随机生成并显示下一个食物的位置。这些都是在设计过程中需要实现的。2.3游戏控制分析游戏中需要通过按键对蛇的移动方位进行控制,共需要设置四个方位,分别是“东”“西”“南”“北”,在按键上用“上”“下”“左”“右”,按键与执行部分涉 及到监听,通过监听指示蛇的运动,此外,要设置蛇移动是的默认方向为“右” ,蛇的移动只能是90度偏转,不能进行180度偏转。此外还要设置游戏的状态, 有运行和结束两种状态,蛇体变长的时候用静态变量进行加分。2.4可行性分析贪吃蛇游戏是一种简单的大众的游戏,自从进入现代化以来,

6、深受广大电脑 和手机玩家的喜爱,所以做一个简单的贪吃蛇小游戏是有用的。本次设计我主要运用Java语言来完成。Java语言是一种跨平台,适合于分 布式计算环境的面向对象编程语言,用Java写的应用程序不用修改就可在不同 的软硬件平台上运行。由于Java主要用于网络应用程序开发,因此对安全性有较高的要求。如果 没有安全保证,用户从网络下载程序执行就非常危险。Java通过自己的安全机制 防止了病毒程序的产生和下载程序对本地系统的威胁破坏。第三章总体设计3.1系统功能模块层次图工程中包括4个类,分别为SnakeActivity (主界面)、MyTile (游戏界面)、 NextActivity (游戏

7、结束界面)和SysApplication类,通过不同Activity之间的 转换实现不同界面之间的切换。SnakeActivity和NextActivity继承了 Activity类, MyTile 类继承了 View 类,SysApplication 类继承了 Application 类。SnakeActivity 类是这个游戏的入口点,MyTile类进行游戏的绘画和对游戏控制操作的处理。 Coordinate, MyHandler是2个辅助类,是 MyTile类中的内部类。其中, Coordinate 是-个点的坐标(x,y),MyHandler将 MyHandler对象绑定某个线 程并给

8、它发送消息。如下图:ViewA A!+onDraw : voidonSizeChanged() : void po:nKey&own 0 : voidanCreate 0 : v-o i dNeMtActivity -fcnshuStringSyriAppli 口HISysApplicat ion U : void + synclironised( : void laddA!tivitsF() : void +eKit) ; voidWvTile-sizs : int -xCount : int j/Count : int KOffset : int : int -map : int +MyT

9、ile 0: void +initGame() : void +lcadPLc() ; 7DLd update 0 : if id +clearTilr () ! void ksetTileO : void +buildWall 0 ; gid +updateSnake() : void +game threr () : void +addRandomApp1e() : void +updateApple) : voidCoordinate一x : int y i int Coordinate 0 : void equals() : boolHandlerhand1eMessage U : v

10、oidA+3 1ccp() : voidA类图3.2运行机制任何游戏都需要有个引擎来推动游戏的运行,在贪吃蛇这个游戏中,辅助类MyHandler继承自Handler,用来把MyHandler与当前线程进行绑定,从而可以 直接给线程发送消息并处理消息。注意一点:Handle对消息的处理都是异步。MyHandler在Handler的基础上增加sleep()接口,用来每隔一个时间段后给当前 线程发送一个消息。handleMessage()方法在接受消息后,根据当前的游戏状态重 绘界面。update()与sleep()间接的相互调用就构成了一个循环。由于sleep()是个 异步函数,所以update(

11、)与sleep()之间的相互调用才没有构成死循环。运行机制如下:活动图3.3贪吃蛇功能流程图是否有按键是否吃到食物是否越界或撞到蛇身开始始初化蛇和食物*屏幕显示蛇和食物位置否蛇开始移动,后坐标覆盖前坐标否根据上次方向更新坐标是更新方向否是蛇身加1是游戏结束根据按键不同在原坐标基础上 改变蛇的坐标位置第四章详细设计与实现4.1 SnakeActivity 类程序的入口,程序的界面。 代码如下:package com.daYu.mysnake;import android.app.Activity;import android.os.Bundle;public class SnakeActivit

12、y extends Activity Overrideprotected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.0ctivity_swke);SysApplication.getInstance().addActivity(this);4.2 MyTile 类MyTile的基类是View,包含了贪吃蛇游戏画面的各个设定参数,主要负责绘制 游戏画面。还定义了游戏运行时的画面改变及蛇体和食物的更新方法。MyTile 类定义如下:packa

13、ge 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;

14、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; / 横向格子pri

15、vate 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; /

16、 键盘上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(

17、);/ 苹果数组 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 con

18、text, 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();/ 生成一个画

19、笔/循环绘制墙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-gen

20、erated method stub super.onSizeChanged(w, h, oldw, oldh);System.out.println(*onSizeChanged(int w, int h, int oldw, int oldh)*);xCount = (int) yCount = (int) xOffset = (w - yOffset = (h -Math.floor(w / Math. floor(h / xCount * size) yCount * size)size); /四舍五入/取整/x轴格子总数 size); /四舍五入/取整/y轴格子总数 / 2;/原点坐

21、标/ 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(GERR、SL4R, resour

22、ces.getDrawable(R.drawable.greenstar);/ 加载图片 loadPic(RE七SL4R, 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 Coor

23、dinate(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 Ca

24、nvas(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(*c

25、learTile()*);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,

26、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 newHea

27、der = 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, hea

28、der.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) gameOv

29、er();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;/ 蛇增长标志改为真/

30、当蛇吃掉苹果后,增加长度snakeList.add(0, newHeader);/在蛇头的位置增加一个新坐标 if (!growSnake) (/如果没有增长/如果蛇头没增长则删去最后一个坐标,相当于蛇向前走了一步snakeList.remove(snakeList.size() - 1);/重新设置一下颜色,蛇头是黄色的,蛇身是红色的int index = 0;for (Coordinate c : snakeList) if (index = 0) setTile(YELLOW_STAR3 c.x, c.y); else setTile(RED_STAR, c.x, c.y);index+

31、;/游戏结束提示public void gameOver()Intent intent= new Intent();intent.setClass(myTileContext, NextActivity.class);intent.setFlags(Intent.FLAG_ACT7VTT七NEW_TASK);myTileContext.startActivity(intent);isContinue=100;Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) / TODO Auto-generated method stu

32、bswitch (keyCode) case KeyEvent.KEYCOO七DPAD_ UP:direction = UP;break;case KeyEvent.KEYCOD七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);/产生随机苹果,需要进行冲突检查privat

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

34、n = 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 : app

35、leList) setTile(YELLOW_5TAR, 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:可以定时处理或者分发消息c

36、lass 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

37、();/ 实现重绘 刷新页面 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.a

38、pp.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 tu

39、ichuButton;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);tuichuButt

40、on=(Button)findViewById(R.id.tuic人u);fenshuTextView=(TextView)findViewById(R.id.fenshu);fenshuString=分数:+MyTile.sco尸e+”;fenshuTextView.setText(fenshuString);jixuButton.setOnClickListener(new JiXuButtonListener();/注册监听器 tuichuButton.setOnClickListener(new TuiChuButtonListener();SysApplication.getInst

41、ance().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 imple

42、ments 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;

43、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 Activitypublic void

44、 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 Systemexit(0); 最终执行 4.5界面设计界面设计包括游戏主界面、游戏结束界面的设计。界面的设计采用的是xml文档 形式,在xml文档中规划好界面布局布局后,分别在java文件中声明。(1)游戏主界面,主界面采用线性布局设定,指定自定义的控件。其activity_snake.xml 文档如下:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号