当前位置:文档之家› Android-贪吃蛇源码分析[1]

Android-贪吃蛇源码分析[1]

Android-贪吃蛇源码分析[1]
Android-贪吃蛇源码分析[1]

Android ---snake源代码分析

代码结构分析:

Snake :主游戏窗口

SnakeV iew :游戏视图类,是实现游戏的主体类

TileView :一个处理图片或其它

Coordinate :这是一个包括两个参数,用于记录X轴和Y轴简单类,其中包括一个比较函数.

RefshHandler :用于更新视图

Snake

这个类是游戏的主游戏窗口,是框架容器,

1.游戏的开始:oncreate此外的亮点是:setContentV iew(https://www.doczj.com/doc/3b1745114.html,yout.snake_layout);设置窗口的

布局文件,这里Android123给大家说明的是,这里的snake_layout使用了自定义资源标签的方式,大家注意学习:这里我们可以看到来自SnakeView这个派生类的名称,由于Android内部的R.资源不包含SnakeView类,所以我们必须写清楚Package,比如com.exmple.android.snake.SnakeV iew 然后和其他控件使用一样,都是一个id然后宽度、高度、以及自定义的标签tileSize(尾巴长度),如下:

android:id="@+id/snake"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

tileSize="12"

/>

2.onPause:关于这点,大家可以参考下在我blog中关于active生命周期

https://www.doczj.com/doc/3b1745114.html,/admin/blogs/379826

在玩游戏过程中,如果有来电或是其它事件中断,这时应该把当前状态保存。以便返回时,还可以继续玩游戏。这就使用onSaveInstanceState实现保存当前状态。

TileView

注:此部分解析来自: Android示例程序Snake贪食蛇代码分析(三)

TileView,从名称上不难看出这是一个方砖类,就是生成一个方块。 TileView使用了Android平台的显示基类View,View类是直接从https://www.doczj.com/doc/3b1745114.html,ng.Object派生出来的,是各种

控件比如 TextView、EditView的基类,当然包括我们的窗口Activity类,这些在SDK文档中都说的比较清楚。

这里定义了 5个int型全局的变量,分别是方砖的数量mTileSize;方砖水平x防线的数量mXTileCount;以及竖直y方向上的方砖数量 mYTileCount,下面是一个相对偏移位置mXOffset和mYOffset;这里android123主让要大家了解如何自定义View在 Android

开发中,在一个View类中主要是重写onSizeChanged方法来控制改变部分,以及onDraw 实现画布的修改,实现的简写如下:

@Override

protected void onSizeChanged(int w, int h, int oldw, int oldh) {} @Override

public void onDraw(Canvas canvas) { super.onDraw(canvas);} 我们自定义的TileView类需要自己添加一个构造方法,根据需要,我们还重载了一种包含样式的方法,这里大家可以多看下Gallery控件的实现,就好理解了,下面是基本框架。public TileView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);}

public TileView(Context context, AttributeSet attrs) { super(context, attrs);}

在贪食蛇游戏中我们知道Snake是移动的,所以加入了一个清除显示的clearTiles方法,通过一个二维数组保存一个gird网格型的运动轨迹,下一次我们将会讲解android贪食蛇的游戏逻辑和完整的关联拼接实现。

SnakeView

在这个类中实现的游戏的实体,从游戏需求的角色,这个游戏包括了如下方面:

1.随机产生小苹果,apples这里是复数,当然是是大于1个苹果,所以代码中产生了两个苹果。

2.游戏状态管理

3.画蛇,view的更新

4.吃掉苹果后小蛇状态的变化

5.画围墙

如果实现吃掉苹果小蛇速度变快?

关键是:mMoveDelay这个变量,以下是涉及到这个变量的函数,

每次吃掉苹果后,就会updateSnake一下,里面就把时间处理了:mMoveDelay *= 0.9;

小蛇其实就是一个数组,google的代码就是好注释写的清楚:

/**

*mSnakeTrail:a list of Coordinates that make up the snake's body *mAppleList:the secret location of the juicy apples the snake craves.

*/

private ArrayList mSnakeTrail= new ArrayList(); private ArrayList mAppleList= new ArrayList();

mSnakeTrail:一个由Coordinates列表组织的蛇身.

mAppleList:存放鲜美多汁的苹果列表

通过这个数组画出小蛇不难,问题是如何判断游戏是否结束?

问题是如何判断游戏的状态

所有以下的代码来自updateSnake

1.吃了苹果

// Look for apples

int applecount = mAppleList.size();

for (int appleindex = 0; appleindex < applecount; appleindex++) {

Coordinate c = mAppleList.get(appleindex);

if (c.equals(newHead)) {

mAppleList.remove(c);

addRandomApple();

mScore++;

mMoveDelay *= 0.9;

growSnake = true;

}

}

2.碰到了自己

// Look for collisions with itself

int snakelength = mSnakeTrail.size();

for(int snakeindex = 0; snakeindex < snakelength; snakeindex++) {

Coordinate c = mSnakeTrail.get(snakeindex);

if (c.equals(newHead)) {

setMode(LOSE);

return;

}

}

3.碰到墙了

// Collision detection

// For now we have a 1-square wall around the entire arena

if((newHead.x< 1) || (newHead.y< 1) || (newHead.x> mXTileCount- 2) || (newHead.y > mYTileCount - 2)) {

setMode(LOSE);

return;

}

源代码分析

Snake状态分析:

在snakeView中定义了snake游戏的几种状态:

private int mMode = READY;

public static final int PAUSE = 0; //暂定

public static final int READY = 1; //准备好了

public static final int RUNNING = 2;//正在运行

public static final int LOSE = 3; //结束,输了游戏

各种游戏状态

rady running

paused lose 以上状态是通过:void setMode(int newMode)函数实现。

如何实现画出小方块:

参看:https://www.doczj.com/doc/3b1745114.html,/blog/206706

public class DrawView extends View {

private final int mTileSize = 12;

private final String TAG="DEMO";

private Paint pa = new Paint();

private Bitmap mTileArray;

void loadImage(){

Resources r = this.getContext().getResources();

Drawable tile = r.getDrawable(R.drawable.redstar);

Bitmap bitmap = Bitmap.createBitmap(mTileSize, mTileSize,

Bitmap.Config.ARGB_8888);

Canvas canvas = new Canvas(bitmap);

tile.setBounds(0, 0, mTileSize, mTileSize);

tile.draw(canvas);

mTileArray = bitmap;

}

public DrawView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle);

// TODO Auto-generated constructor stub

loadImage();

x = 10;

y = 10;

Log.i(TAG, "DrawView 2");

}

//如果没有这段代码,大家可以试一下,改用上面的代码,程序能否通过。

public DrawView(Context context, AttributeSet attrs) {

super(context, attrs);

// TODO Auto-generated constructor stub

loadImage();

Log.i(TAG, "DrawView 3");

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

Log.i(TAG, "onDraw 1");

canvas.drawBitmap(mTileArray, x, y, pa);

}

}

通过上面的文章可以画出小方块,但注意到SnakeView一共有两构造函数,那个函数才真正起作用呢?

●public SnakeView(Context context, AttributeSet attrs)

●public SnakeView(Context context, AttributeSet attrs, int defStyle)

通过加log的方式,判断是第一个构造函数起作用。

在第一个构造函数上方有一段注释:通过XML文件构造出SnakeView

*Constructs a SnakeView based on inflation from XML 如果不使用这个构造函数,将会造成错误,可以试一下,看一下结果是怎样!本人得到如下的错误提示:

05-21 14:13:26.079: ERROR/AndroidRuntime(711): Caused by:

https://www.doczj.com/doc/3b1745114.html,ng.NoSuchMethodException: DrawView

按键处理:

public boolean onKeyDown(int keyCode, KeyEvent event) {

// TODO Auto-generated method stub

if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {

Log.i(TAG, "KEYCODE_DPAD_UP");

}

return super.onKeyDown(keyCode, event);

}

如何让我们的小方块动起来?

实现小方块动起来的秘密在于view的public void invalidate ()

大家可以参看SDK文档中关于View中Drawing中的一小段话

T o force a view to draw, call invalidate().//为了让view重画,可以调用invalidate函数方法:

1.在DrawView类中添加两个成员:

private int x,y;

同时实现get,set方法,

2.在构造函数中添加他们的初始值,

3.修改onDraw

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

Log.i(TAG, "onDraw 1");

canvas.drawBitmap(mTileArray, x, y, pa);

}

4.修改onKeyDown函数

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub

if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {

Log.i(TAG, "KEYCODE_DPAD_UP");

dv.setX(dv.getX()+10);

dv.invalidate();

}

return super.onKeyDown(keyCode, event);

}

最后运行结果如下图:

附:网络上关于snake分析的三篇文章

上一次我们大概讲解了下Android SDK中的演示程序Snake游戏的主框架,今天我看来看下实现的基础类TileView,从名称上不难看出这是一个方砖类,就是生成一个方块。TileView 使用了Android平台的显示基类V iew,View类是直接从https://www.doczj.com/doc/3b1745114.html,ng.Object派生出来的,是各种控件比如TextV iew、EditView的基类,当然包括我们的窗口Activity类,这些在SDK文档中都说的比较清楚。

这里定义了5个int型全局的变量,分别是方砖的数量mTileSize;方砖水平x防线的数量mXTileCount;以及竖直y方向上的方砖数量mYTileCount,下面是一个相对偏移位置mXOffset和mYOffset;这里android123主让要大家了解如何自定义View在Android开发中,

在一个View类中主要是重写onSizeChanged方法来控制改变部分,以及onDraw实现画布

的修改,实现的简写如下:

@Override

protected void onSizeChanged(int w, int h, int oldw, int oldh) {}

@Override

public void onDraw(Canvas canvas) { super.onDraw(canvas);}

我们自定义的TileView类需要自己添加一个构造方法,根据需要,我们还重载了一种包含样式的方法,这里大家可以多看下Gallery控件的实现,就好理解了,下面是基本框架。public TileView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);}

public TileView(Context context, AttributeSet attrs) { super(context, attrs);}

在贪食蛇游戏中我们知道Snake是移动的,所以加入了一个清除显示的clearTiles方法,通过一个二维数组保存一个gird网格型的运动轨迹,下一次我们将会讲解android贪食蛇的游戏逻辑和完整的关联拼接实现。

今天我们分析下最复杂的SnakeView的设计,它是派生于TileView方砖类,TileView构建是基于Android直接的显示类View,如果不明白的可以查看Android示例程序Snake贪食蛇代码分析(二)一文有关TileView类的实现,首先我们看到整个游戏分 READY、PAUSE 、RUNNING 、LOSE四种mMode状态模式,分别对应准备、暂停、运行中、结束(死亡),毕竟贪食蛇没有胜利这个结果。

整个Snake的运行分4个方向,NORTH、SOUTH 、EAST、WEST分别对应了北、南、东、西四个方向,其中变量mDirection对应当前的方向,而mNextDirection 对应下个运行时的位置。这里星星分3种,使用的是一个Drawable图片,分RED_STAR、 YELLOW_STAR和GREEN_STAR三种颜色,游戏的星星出现位置由Random 随机数生成器来决定,这里Random一般和Timer系统时钟来随机生成更真实一些,通过一个Handler对象来控制画面的更新,使用了this.update();和this.invalidate();这两个本地方法,Update和invaildate均为

android.view.View类的本地方法。这里资源的使用通过Resources r =

this.getContext().getResources();获取了r对象的实例,通过

r.getDrawable(R.drawable.redstar)获取资源名为redstar的资源,返回的是一个Drawable对象。

对于按键信息,直接重写View类的onKeyDown方法,这里KeyEvent传递的是按键的映射,比如KEYCODE_DPAD_UP向上,KeyEvent.KEYCODE_DPAD_DOWN向下等等,详细的查看SDK中的onKeyDown

@Override

public boolean onKeyDown(int keyCode, KeyEvent msg) {

if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {}

}

整个游戏的控制流程就是上面这些,对于游戏的逻辑而言比较简单,这个贪食蛇并没有包含3D设计和类似Nokia的能量走廊、6边形轨迹,有空了我们一起来完善一个3D的贪食蛇游戏

Android Hotfix 新方案——Amigo 源码解读

Android Hotfix 新方案——Amigo 源码解读 首先我们先来看看如何使用这个库。 用法 在project 的build.gradle中 dependencies { classpath 'me.ele:amigo:0.0.3' } 在module 的build.gradle中 apply plugin: 'me.ele.amigo' 就这样轻松的集成了Amigo。 生效补丁包 补丁包生效有两种方式可以选择: ? 稍后生效补丁包 ? 如果不想立即生效而是用户第二次打开App 时才打入补丁包,则可以将新的Apk 放到/data/data/{your pkg}/files/amigo/demo.apk,第二次打开时就会自动生效。可以通过这个方法 ? File hotfixApk = Amigo.getHotfixApk(context); ?

获取到新的Apk。 同时,你也可以使用Amigo 提供的工具类将你的补丁包拷贝到指定的目录当中。 ? FileUtils.copyFile(yourApkFile, amigoApkFile); ? ? 立即生效补丁包 ? 如果想要补丁包立即生效,调用以下两个方法之一,App 会立即重启, 并且打入补丁包。 ? Amigo.work(context); ? Amigo.work(context, apkFile); ? 删除补丁包 如果需要删除掉已经下好的补丁包,可以通过这个方法 Amigo.clear(context); 提示:如果apk 发生了变化,Amigo 会自动清除之前的apk。 自定义界面 在热修复的过程中会有一些耗时的操作,这些操作会在一个新的进程中的Activity 中执行,所以你可以通过以下方式来自定义这个Activity。

Android源码下载方法详解

Android: Android源码下载方法详解 分类:Android平台 安卓源码下载地址:https://www.doczj.com/doc/3b1745114.html,/source/downloading.html 相信很多下载过内核的人都对这个很熟悉 git clone git://https://www.doczj.com/doc/3b1745114.html,/kernel/common.git kernel 但是这是在以前,现在如果这么执行的话,会显示如下内容 Initialized empty Git repository in /home/star/working/kernel/.git/ https://www.doczj.com/doc/3b1745114.html,[0: 149.20.4.77]: errno=Connection refused fatal: unable to connect a socket (Connection refused) 通过浏览器输入https://www.doczj.com/doc/3b1745114.html,/,发现该网站已经被重定向为 https://www.doczj.com/doc/3b1745114.html,/source/downloading.html 可以在该页面的最后发现内核的下载方法。 下面我们介绍一下Android源码下载的步骤。 工作环境: 操作系统:Ubuntu 10.04 或Ubuntu10.10 git程序:1.7.0.4 或1.7.1 转载请注明出处:https://www.doczj.com/doc/3b1745114.html,/pku_android 方法一: 1.1 初始化安装环境 参考网页https://www.doczj.com/doc/3b1745114.html,/source/initializing.html 主要要做的就是安装jdk和安装一些软件包 $ sudo apt-get install git-core gnupg flex bison gperf build-essential \ zip curl zlib1g-dev libc6-dev libncurses5-dev x11proto-core-dev \ libx11-dev libreadline6-dev libgl1-mesa-dev tofrodos python-markdown \ libxml2-utils 如果已经安装了,就不许要这步了 1.2 无论下载内核和源码,都需要进行如下操作 参考网页https://www.doczj.com/doc/3b1745114.html,/source/downloading.html $ mkdir ~/bin $ PATH=~/bin:$PATH $ curl https://https://www.doczj.com/doc/3b1745114.html,/dl/googlesource/git-repo/repo > ~/bin/repo 如果出现: repo init error: could not verify the tag 'v1.12.7',

贪吃蛇小游戏源代码

#include #include #include #include int head=3 ,tail=0; int main() { int i,j,k=0; int zuobiao[2][80]; long start; int direction=77; int gamespeed; int timeover; int change(char qipan[20][80],int zuobiao[2][80],char direction); zuobiao[0][tail]=1;zuobiao[1][tail]=1;zuobiao[0][1]=1;zuobiao[1][1]=2;zuobiao[0][2]=1;zuobiao[ 1][2]=3;zuobiao[0][head]=1;zuobiao[1][head]=4; /*处理棋盘*/ char qipan[20][80];//定义棋盘 for(i=0;i<20;i++) for(j=0;j<80;j++) qipan[i][j]=' ';//初始化棋盘 for(i=0;i<80;i++) qipan[0][i]='_'; for(i=0;i<20;i++) qipan[i][0]='|'; for(i=0;i<20;i++) qipan[i][79]='|'; for(i=0;i<80;i++) qipan[19][i]='_'; qipan[1][1]=qipan[1][2]=qipan[1][3]='*';//初始化蛇的位置 qipan[1][4]='#'; printf("This is a game of a SNAKE.\nGOOD LUCK TO YOU !\n"); printf("Input your game speed,please.(e.g.300)\n"); scanf("%d",&gamespeed); while(direction!='q') { system("cls"); for(i=0;i<20;i++)//打印出棋盘 for(j=0;j<80;j++) printf("%c",qipan[i][j]); timeover=1;

Android源代码结构分析

目录 一、源代码结构 (2) 第一层次目录 (2) bionic目录 (3) bootloader目录 (5) build目录 (7) dalvik目录 (9) development目录 (9) external目录 (13) frameworks目录 (19) Hardware (20) Out (22) Kernel (22) packages目录 (22) prebuilt目录 (27) SDK (28) system目录 (28) Vendor (32)

一、源代码结构 第一层次目录 Google提供的Android包含了原始Android的目标机代码,主机编译工具、仿真环境,代码包经过解压缩后,第一级别的目录和文件如下所示: . |-- Makefile (全局的Makefile) |-- bionic (Bionic含义为仿生,这里面是一些基础的库的源代码) |-- bootloader (引导加载器),我们的是bootable, |-- build (build目录中的内容不是目标所用的代码,而是编译和配置所需要的脚本和工具) |-- dalvik (JAVA虚拟机) |-- development (程序开发所需要的模板和工具) |-- external (目标机器使用的一些库) |-- frameworks (应用程序的框架层) |-- hardware (与硬件相关的库) |-- kernel (Linux2.6的源代码) |-- packages (Android的各种应用程序) |-- prebuilt (Android在各种平台下编译的预置脚本) |-- recovery (与目标的恢复功能相关) `-- system (Android的底层的一些库)

Android USB 驱动分析

Android USB 驱动分析 一、USB驱动代码架构和使用 1、代码简介 USB驱动代码在/drivers/usb/gadget下,有三个文件:android.c, f_adb.c, f_mass_storage.c;g_android.ko 是由这三个文件编译而来,其中android.c 依赖于 f_adb.c 和 f_mass_storage.c(这两个文件之间无依赖关系)。 可在android.c中看到: static int __init android_bind_config(struct usb_configuration *c) { struct android_dev *dev = _android_dev; int ret; printk(KERN_DEBUG "android_bind_config\n"); ret = mass_storage_function_add(dev->cdev, c, dev->nluns); if (ret) return ret; return adb_function_add(dev->cdev, c); } 2、驱动使用 要使USB mass storage连接到主机: 打开/sys/devices/platform/usb_mass_storage/lun0/file文件,向 file文件写入一个存储 设备的路径,例如/dev/block/vold/179:0 (major:minor)路径; 这里的usb_mass_storage根据实际应用可以改的,由 platform_device_register函数的参数决 定。 例如: static struct platform_device fsg_platform_device = { .name = "usb_mass_storage", .id = -1, }; static void __init tegra_machine_init(void) { .... (void) platform_device_register(&fsg_platform_device); .... }

贪吃蛇游戏安卓源代码

附录1.SnakeView类 package com.example.android_snake.view; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.Timer; import java.util.TimerTask; import com.example.android_snake.R; import com.example.android_snake.food.Food; import com.example.android_snake.snake.Body; import com.example.android_snake.snake.Head; import com.example.android_snake.snake.Snake; import com.example.android_snake.snake.SnakeDirection; import com.example.android_snake.stone.Stone; import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Paint.Style; import android.os.Handler; import android.util.DisplayMetrics; import android.view.Display; import android.view.MotionEvent; import android.view.View; import android.view.ViewManager; import android.view.WindowManager; import android.widget.Toast; public class SnakeView extends View { private Context context; private Bitmap headBitmap; private Bitmap bodyBitmap; private Bitmap foodBitmap; private Bitmap stoneBitmap; // 屏幕的高度和宽度 private int screenHeight; private int screenWidth; // 每个小格子的高度和宽度 private int eachHeight;

Android 串口编程原理和实现方式附源码

提到串口编程,就不得不提到JNI,不得不提到JavaAPI中的文件描述符类:。下面我分别对JNI、以及串口的一些知识点和实现的源码进行分析说明。这里主要是参考了开源项目android-serialport-api。 串口编程需要了解的基本知识点:对于串口编程,我们只需对串口进行一系列的设置,然后打开串口,这些操作我们可以参考串口调试助手的源码进行学习。在Java中如果要实现串口的读写功能只需操作文件设备类:即可,其他的事都由驱动来完成不用多管!当然,你想了解,那就得看驱动代码了。这里并不打算对驱动进行说明,只初略阐述应用层的实现方式。 (一)JNI: 关于JNI的文章网上有很多,不再多做解释,想详细了解的朋友可以查看云中漫步的技术文章,写得很好,分析也很全面,那么在这篇拙文中我强调3点: 1、如何将编译好的SO文件打包到APK中?(方法很简单,直接在工程目录下新建文件夹libs/armeabi,将SO文件Copy到此目录即可) 2、命名要注意的地方?(在编译好的SO文件中,将文件重命名为:lib即可。其中是编译好后生成的文件) 3、MakeFile文件的编写(不用多说,可以直接参考package/apps目录下用到JNI的相关项目写法) 这是关键的代码: [cpp]view plaincopy

(二):

文件描述符类的实例用作与基础机器有关的某种结构的不透明句柄,该结构表示开放文件、开放套接字或者字节的另一个源或接收者。文件描述符的主要实际用途是创建一个包含该结构的或。这是API的描述,不太好理解,其实可简单的理解为:就是对一个文件进行读写。 (三)实现串口通信细节 1) 建工程:SerialDemo包名:org.winplus.serial,并在工程目录下新建jni和libs两个文件夹和一个org.winplus.serial.utils,如下图: 2) 新建一个类:SerialPortFinder,添加如下代码: [java]view plaincopy 1.package org.winplus.serial.utils; 2. 3.import java.io.File; 4.import java.io.; 5.import java.io.IOException; 6.import java.io.LineNumberReader; 7.import java.util.Iterator; 8.import java.util.Vector; 9. 10.import android.util.Log; 11. 12.public class SerialPortFinder { 13. 14.private static final String TAG = "SerialPort"; 15.

App工程结构搭建:几种常见Android代码架构分析

App工程结构搭建:几种常见Android代码架构分析 关于Android架构,因为手机的限制,目前我觉得也确实没什么大谈特谈的,但是从开发的角度,看到整齐的代码,优美的分层总是一种舒服的享受的。 从艺术的角度看,其实我们是在追求一种美。 本文先分析几个当今比较流行的android软件包,最后我们汲取其中觉得优秀的部分,搭建我们自己的通用android工程模板。 1. 微盘 微盘的架构比较简单,我把最基本,最主干的画了出来: 第一层:com.sina.VDisk:com.sina(公司域名)+app(应用程序名称) 。 第二层:各模块名称(主模块VDiskClient和实体模块entities)第三层:各模块下具体子包,实现类。 从图中我们能得出上述分析中一个最简单最经典的结构,一般在应用程序包下放一些全局的包或者类,如果有多个大的模块,可以分成多个包,其中包括一个主模块。 在主模块中定义基类,比如BaseActivity等,如果主模块下还有子模块,可以在主模块下建立子模块相应的包。说明一点,有的时候如果只有一个主模块,我们完全可以省略掉模

块这一层,就是BaseActivity.java及其子模块直接提至第二层。 在实体模块中,本应该定义且只定义相应的实体类,供全局调用(然而实际情况可能不是这样,后面会说到)。在微盘应用中,几乎所有的实体类是以xxx+info命名的,这种命名也是我赞成的一种命名,从语义上我觉得xxxModel.java这种命名更生动更真实,xxxModel给我一种太机械太死板的感觉,这点完全是个人观点,具体操作中以个人习惯为主。还有一点,在具体的xxxInfo,java中有很多实体类中是没有get/set的方法,而是直接使用public的字段名。这一点,我是推荐这种方式的,特别是在移动开发中,get/set方法很多时候是完全没有必要的,而且是有性能消耗的。当然如果需要对字段设置一定的控制,get/set方法也是可以酌情使用的。 2. 久忆日记 相比于微盘的工程结构,久忆日记的结构稍微复杂了一些。如下图: 1).第一层和前面微盘一样的. 2).第二层则没有模块分类,直接把需要的具体实现类都放在下面,主要日记的一些日记相关的Activity。 3).第二层的实体包命令为model包,里面不仅存放了实体类

C语言课程设计报告——贪吃蛇源程序

C 语言课程设计 (小游戏贪吃蛇的程序设计报告)

设计人: 班级: 201 年月号

目录一:概述 1:研究背景及意义 2:设计的任务与需要知识点 3:具体完成设计内容 二:需求分析 1:功能需求 2:操作方法 三:总体设计 1:模块划分 2:数据结构设计 四:详细设计 1:主空摸块设计 2:绘制游戏界面 3:游戏的具体过程 4:游戏的结束处理 5:显示排行榜信息模块 五:程序的调试与测试 1:动画与音乐同步 2:蛇的运行 3:终止程序 六:结论 七::结束语 八:程序清单 九:参考文献

一.概述 本课程设计以软件工程方法为指导,采用了结构化,模块化的程序设计方法,以C 语言技术为基础,使用Turbo C++3.0为主要开发工具,对贪吃蛇游戏进行了需求分析,总体设计,详细设计,最终完成系统的实现与测试。 1.1 研究的背景及意义 随着社会的发展,人们生活的节奏日益加快,越来越多的人加入了全球化的世界。人们不再拘泥与一小块天地,加班,出差成了现代人不可避免的公务。而此时一款可以随时随地娱乐的游戏成为了人们的需要。此次课程设计完成的贪吃蛇小游戏,正是为了满足上述需求而设计出来的。贪吃蛇游戏虽小,却设计诸多的知识点。通过开发贪吃蛇游戏系统,可使读者初步了解使用软件工程的和那个发,技术和工具开发软件的过程,进一步掌握结构化,模块化的程序设计方法和步骤,进一步掌握总体数据结构设计,模块划分方法,掌握局部变量,全局变量,结构体,共用体,数组,指针,文件等数据结构的使用方法,掌握图形,声音,随机数等多种库函数的使用方法,学习动画,音乐,窗口,菜单,键盘等多项编程技术,进一步学会软件调试,测试,组装等软件测试方法,为后续课程的学习和将来实际软件开发打下坚实的基础。 1.2 设计的任务和需要的知识点 1.2.1 课程设计主要完成的任务 1). 通过编写“贪吃蛇游戏”程序,掌握结构化,模块块化程序设计的思想,培养解决实际问题的能力。 2) 有同步播放动画,声音效果。 3) 设计好数组元素与蛇,食物的对应关系。 4) 随机产生食物。 5) 有分数统计,排行榜,分数存储等功能。 通过此次课程设计,希望使读者能更深入的理解和掌握课程教学中的基本概念,培养读者应用基本技术解决实际问题的能力,从而进一步提高分析问题和解决问题的能力。 1.2.2需要掌握和运用的知识点 1.2.3本次课程设计需要掌握和运用如下的知识点: 1) 数组的应用。 2) 全局变量的使用。 3) 按键处理。 4)结构体的应用。 5)图形,音乐和动画的有关知识。 6)随即函数的使用。 7)文件的基本出操作。

html5实现贪吃蛇源代码

Insert title here