初学者android项目—贪吃蛇游戏开发

合集下载

Android贪吃蛇课程设计报告

Android贪吃蛇课程设计报告

XXXX学院计算机科学系《Android程序设计》课程设计报告题目:贪吃蛇专业:计算机科学与技术!班级: B11计科班学号: 0姓名:凌波微步Q Q :25指导教师:,2014年6月,目录第一章绪论 (2)游戏简介 (2)开发目的及意义 (3)开发环境及工具 (3)第二章需求分析 (4)游戏界面分析 (4)游戏角色分析 (4)—游戏控制分析 (4)第三章总体设计 (5)系统功能模块层次图 (5)运行机制 (6)贪吃蛇功能流程图 (7)第四章详细设计与实现 (9)SnakeActivity类 (9)MyTile类 (10):NextActivity类 (18)SysApplication类 (19)界面设计 (20)第五章测试 (26)功能测试 (26)测试结果 (27)第六章结论 (27)第一章绪论@游戏简介贪吃蛇游戏是一款手机游戏,同时也是一款比较需要耐心的游戏。

贪吃蛇游戏是一条蛇,不停地在手机屏幕上游走,吃在手机屏幕上出现的食物。

当蛇吃掉1个食物后会变长,并且吃完食物时食物会消失,并立即随机生成1个新的食物,只要蛇头碰到屏幕四周或者碰到自己的身子,蛇就立即毙命。

开发目的及意义通过本次课程设计,了解android软件的开发过程,熟悉并掌握JAVA语言,程序关键在于表示蛇的图形及蛇的移动。

用一个小矩形块表示蛇的一节身体,身体每长一节,增加一个矩形块,蛇头用一节表示。

移动时必须从蛇头开始,所以蛇不能向相反的方向移动,如果不按任意键,蛇自行在当前方向上前移,但按下有效方向键后,蛇头朝着该方向移动,一步移动一节身体,所以按下有效方向键后,先确定蛇头的位置,而后蛇的身体随蛇头移动。

意义是方便人们在休闲时通过玩手机游戏获得一点快乐,同时锻炼自己的大脑。

开发环境及工具在Window8下进行,采用eclipse开发工具,基于安卓操作系统。

环境搭建:1. JDK安装[2. Eclipse安装3. Android SDK安装4. ADT安装创建AVD-第二章需求分析游戏界面分析操作界面应该人性化设计,提示玩家按什么按键开始游戏,开始游戏之后,在游戏界面中,以坐标的形式对整体界面进行划分,将界面划分为网格,还应设计蛇的样式,食物的样式和墙的样式,在蛇吃到食物后的样式,还有游戏结束时的界面显示,游戏结束后,要显示所得的分数。

项目实训—贪吃蛇Snake(一)

项目实训—贪吃蛇Snake(一)

本讲内容:本项目源自Android的一个Sample:Snake,一共分为三讲,这是第一讲,讲对项目本身做一个整体的介绍。

a、开始画面c、游戏结束三、代码总体分析1、布局方面:我们使用一个FrameLayout绝对定位,在里面放两个和父元素一样大的子元素,一个是我们自定义的View:snake,这个元素就是游戏界面,我们通过不停的操纵和重绘该View来完成游戏交互,一个是在中间有蓝色文本的相对定位布局框架,它用来显示游戏状态。

2、类设计方面:贪吃蛇游戏使用了三个主类和两个内部类。

TitleView :一个游戏贴片(Tile)类,是我们的自定义View。

是它实现游戏画面的贴片计算、贴片的种类定义、贴片的绘制等和Tile相关的方法。

SnakeView :是TileView的子类,是游戏的主体类。

定义游戏状态、操作方式、游戏规则、初始化游戏、刷新视图、处理打电话导致游戏暂停时保存状态,接收焦点时恢复状态等等工作都在这个类中进行,注意它还是个View 。

MainActivity :游戏窗口类,负责载入SnakeView ,为SnakeView 服务。

Snake.RefreshHandler : Handler 类,刷新ViewSnake.Coordinate : 坐标类,简化问题四、代码阅读:为了你阅读方便,我对原有代码做了简化、汉化和增加注释这三件事。

你读起来应该会轻松许多。

废话不说了,还是多给你一些时间消化代码。

我提几个问题你看代码时不妨思考思考。

1、AndroidManifest.xml请留意android:configChanges=”keyboardHidden|orientation”这句话,这里有一个onConfigurationChanged()方法的用法问题,你了解吗?是不是自己先研究一下?当然,你也可以等我下一讲讲解这个问题。

2、res/values/strings.xml我们在以往很少用Strings.xml 来管理字符串资源,都是自己写死进去了,这次为什么单独写了?3、res/layout/main.xml4、TileView1<?xml version ="1.0" encoding ="utf-8"?>1<?xml version ="1.0" encoding ="utf-8"?>2 3 贪吃蛇\n 按“向上”键开始4 暂停中\n 按“向上”键恢复5 游戏结束\n 得分:6 \n 按“向上”键开始1<?xml version ="1.0" encoding ="utf-8"?>001package android.basic.lesson48;002 003import android.content.Context;004import android.graphics.Bitmap;005import android.graphics.Canvas;006import android.graphics.Paint;007import android.graphics.drawable.Drawable;008import android.util.AttributeSet;009import android.util.Log;010import android.view.View;011 012public class TileView extends View {013 014 private static final String tag = "yao";015 016 // 贴片大小017 protected static int mTileSize = 20;018 019 // X 轴的贴片数量020 protected static int mXTileCount;021 // Y 轴的贴片数量022 protected static int mYTileCount;023 024 // X 偏移量025 private static int mXOffset;026 // Y 偏移量027 private static int mYOffset;028 029 // 三种贴片图像的图像数组030 private Bitmap[] mTileArray;031 032 // 存每个贴片的索引033 private int [][] mTileGrid;034 035 // Paint 对象(画笔、颜料)036 private final Paint mPaint = new Paint();037 038 // 构造函数039 public TileView(Context context, AttributeSet attrs) {040 super (context, attrs);041 Log.i(tag, "TileView Constructor");042 Log.i(tag, "mTileSize=" + mTileSize);043 }044045// 设置贴片图片数组046public void resetTiles(int tilecount) {047 mTileArray = new Bitmap[tilecount];048 }049050// 当该View的尺寸改变时调用,在onDraw()方法调用之前就会被调用,所以用来设置一些变量的初始值051@Override052protected void onSizeChanged(int w, int h, int oldw, int oldh) {053054 Log.i(tag, "onSizeChanged," + "w=" + w + " h=" + h + " oldw=" + oldw + "oldh=" + oldh);055056// 定义X轴贴片数量057 mXTileCount = (int) Math.floor(w / mTileSize);058 mYTileCount = (int) Math.floor(h / mTileSize);059 Log.i(tag, "mXTileCount=" + mXTileCount);060 Log.i(tag, "mYTileCount=" + mYTileCount);061062// X轴偏移量063 mXOffset = ((w - (mTileSize * mXTileCount)) / 2);064065// Y轴偏移量066 mYOffset = ((h - (mTileSize * mYTileCount)) / 2);067068 Log.i(tag, "mXOffset=" + mXOffset);069 Log.i(tag, "mYOffset=" + mYOffset);070071// 定义贴片的二维数组072 mTileGrid = new int[mXTileCount][mYTileCount];073074// 清空所有切片075 clearTiles();076 }077078// 给mTileArray这个Bitmap图片数组设置值079public void loadTile(int key, Drawable tile) {080 Bitmap bitmap = Bitmap.createBitmap(mTileSize, mTileSize, Bitmap.Config.ARGB_8888);081 Canvas canvas = new Canvas(bitmap);082 tile.setBounds(0, 0, mTileSize, mTileSize);083//把一个drawable转成一个Bitmap084 tile.draw(canvas);085//在数组里存入该Bitmap086 mTileArray[key] = bitmap;087 }088089// 清空所有贴片090public void clearTiles() {091 Log.i(tag, "TileView.clearTiles");092for (int x = 0; x < mXTileCount; x++) {093for (int y = 0; y < mYTileCount; y++) {094// 全部设置为0095 setTile(0, x, y);096 }097 }098 }099100// 给某个贴片位置设置一个状态索引101public void setTile(int tileindex, int x, int y) {102 mTileGrid[x][y] = tileindex;103 }104105// onDraw106@Override107public void onDraw(Canvas canvas) {108109 Log.i(tag, "onDraw");110super.onDraw(canvas);111112 Bitmap bmp;113float left;114float top;115116for (int x = 0; x < mXTileCount; x++) {117for (int y = 0; y < mYTileCount; y++) {118// 当索引大于零,也就是不空时119if (mTileGrid[x][y] > 0) {120 bmp = mTileArray[mTileGrid[x][y]];121 left = x * mTileSize + mXOffset;122 top = y * mTileSize + mYOffset;5、SnakeView123 // mTileGrid 中不为零时画此贴片124 canvas.drawBitmap(bmp, left, top, mPaint);125 }126 }127 }128 129 }130}001package android.basic.lesson48;002 003import java.util.ArrayList;004import java.util.Random;005 006import android.content.Context;007import android.content.res.Resources;008import android.os.Bundle;009import android.os.Handler;010import android.os.Message;011import android.util.AttributeSet;012import android.util.Log;013import android.view.KeyEvent;014import android.view.View;015import android.widget.TextView;016 017public class SnakeView extends TileView {018 019 private static final String tag = "yao";020 021 // 游戏状态,默认值是准备状态022 private int mMode = READY;023 024 // 游戏的四个状态 暂停 准备 运行 和 失败025 public static final int PAUSE = 0;026 public static final int READY = 1;027 public static final int RUNNING = 2;028 public static final int LOSE = 3;029 030 // 游戏中蛇的前进方向,默认值北方031 private int mDirection = NORTH;032 // 下一步的移动方向,默认值北方033 private int mNextDirection = NORTH;034 035 // 游戏方向设定 北 南 东 西036 private static final int NORTH = 1;037 private static final int SOUTH = 2;038 private static final int EAST = 3;039 private static final int WEST = 4;040 041 // 三种游戏元042 private static final int RED_STAR = 1;043 private static final int YELLOW_STAR = 2;044 private static final int GREEN_STAR = 3;045 046 // 游戏得分047 private long mScore = 0;048 049 // 移动延迟050 private long mMoveDelay = 600;051 052 // 最后一次移动时的毫秒时刻053 private long mLastMoveTime;054 055 // 显示游戏状态的文本组件056 private TextView mStatusTextView;057 058 // 蛇身数组(数组以坐标对象为元素)059 private ArrayList mSnakeTrail = new ArrayList();060 061 // 苹果数组(数组以坐标对象为元素)062 private ArrayList mAppleList = new ArrayList();063 064 //随机数065 private static final Random RNG = new Random();066 067 //068 private RefreshHandler mRedrawHandler = new RefreshHandler();069 070 //一个Handler 071 class RefreshHandler extends Handler {072 073 //处理消息队列074@Override075public void handleMessage(Message msg) {076//更新View对象077 SnakeView.this.update();078//强制重绘079 SnakeView.this.invalidate();080//081 Log.i(tag, "handleMessage|ThreadName="+Thread.currentThread().getName());082 }083084//延迟发送消息085public void sleep(long delayMillis) {086this.removeMessages(0);087 Log.i(tag, "sleep|Thread Name="+Thread.currentThread().getName()); 088 sendMessageDelayed(obtainMessage(0), delayMillis);089 }090 };091092// 构造函数093public SnakeView(Context context, AttributeSet attrs) {094super(context, attrs);095 Log.i(tag, "SnakeView Constructor");096// 构造时初始化097 initSnakeView();098099 }100101// 初始化102private void initSnakeView() {103104 Log.e(tag, "initSnakeView");105106// 可选焦点107 setFocusable(true);108109 Resources r = this.getContext().getResources();110111// 设置贴片图片数组112 resetTiles(4);113114// 把三种图片存到Bitmap对象数组115 loadTile(RED_STAR, r.getDrawable(R.drawable.redstar));116 loadTile(YELLOW_STAR, r.getDrawable(R.drawable.yellowstar));117 loadTile(GREEN_STAR, r.getDrawable(R.drawable.greenstar));118119 }120121// 设置游戏状态122public void setMode(int newMode) {123124// 把当前游戏状态存入oldMode125int oldMode = mMode;126// 把游戏状态设置为新状态127 mMode = newMode;128129 Resources res = getContext().getResources();130 CharSequence str = "";131132// 如果新状态是运行状态,且原有状态为不运行,那么就开始游戏133if (newMode == RUNNING & oldMode != RUNNING) {134// 设置mStatusTextView隐藏135 mStatusTextView.setVisibility(View.INVISIBLE);136// 更新137 update();138return;139 }140141// 如果新状态是暂停状态,那么设置文本内容为暂停内容142if (newMode == PAUSE) {143 str = res.getText(R.string.mode_pause);144 }145146// 如果新状态是准备状态,那么设置文本内容为准备内容147if (newMode == READY) {148 str = res.getText(R.string.mode_ready);149 }150151// 如果新状态时失败状态,那么设置文本内容为失败内容152if (newMode == LOSE) {153// 把上轮的得分显示出来154 str = res.getString(R.string.mode_lose_prefix) + mScore155 + res.getString(R.string.mode_lose_suffix);156 }157158// 设置文本159 mStatusTextView.setText(str);160// 显示该View161 mStatusTextView.setVisibility(View.VISIBLE);162 }163164// 设置状态显示View165public void setStatusTextView(TextView newView) {166 mStatusTextView = newView;167 }168169// 按键170public boolean onKeyDown(int keyCode, KeyEvent msg) {171172// 向上键173if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {174// 准备状态或者失败状态时175if (mMode == READY | mMode == LOSE) {176// 初始化游戏177 initNewGame();178// 设置游戏状态为运行179 setMode(RUNNING);180// 更新181 update();182// 消费掉183return (true);184 }185186// 暂停状态时187if (mMode == PAUSE) {188// 设置成运行状态189 setMode(RUNNING);190 update();191// 消费掉192return (true);193 }194195// 如果是运行状态时,如果方向原有方向不是向南,那么方向转右196if (mDirection != SOUTH) {197 mNextDirection = NORTH;198 }199return (true);200 }201202// 向下键203if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {204// 原方向不是向上时,方向转右205if (mDirection != NORTH) {206 mNextDirection = SOUTH;207 }208// 消费掉209return (true);210 }211212// 向左键213if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {214// 原方向不是向右时,方向转右215if (mDirection != EAST) {216 mNextDirection = WEST;217 }218// 消费掉219return (true);220 }221222// 向右键223if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {224// 原方向不是向左时,方向转右225if (mDirection != WEST) {226 mNextDirection = EAST;227 }228// 消费掉229return (true);230 }231232// 按其他键时按原有功能返回233return super.onKeyDown(keyCode, msg);234 }235236// 更新237public void update() {238// 如果是处于运行状态239if (mMode == RUNNING) {240241long now = System.currentTimeMillis();242243// 如果当前时间距离最后一次移动的时间超过了延迟时间244if (now - mLastMoveTime > mMoveDelay) {245//246 clearTiles();247 updateWalls();248 updateSnake();249 updateApples();250 mLastMoveTime = now;251 }252//会话进程睡一个延迟时间单位253 mRedrawHandler.sleep(mMoveDelay);254 }255256 }257258// 更新墙259private void updateWalls() {260 Log.i(tag, "updateWalls");261for (int x = 0; x < mXTileCount; x++) {262// 给上边线的每个贴片位置设置一个绿色索引标识263 setTile(GREEN_STAR, x, 0);264// 给下边线的每个贴片位置设置一个绿色索引标识265 setTile(GREEN_STAR, x, mYTileCount - 1);266 }267for (int y = 1; y < mYTileCount - 1; y++) {268// 给左边线的每个贴片位置设置一个绿色索引标识269 setTile(GREEN_STAR, 0, y);270// 给右边线的每个贴片位置设置一个绿色索引标识271 setTile(GREEN_STAR, mXTileCount - 1, y);272 }273 }274275// 更新苹果276private void updateApples() {277 Log.i(tag, "updateApples");278279for (Coordinate c : mAppleList) {280 setTile(YELLOW_STAR, c.x, c.y);281 }282 }283284// 更新蛇285private void updateSnake() {286// 生长标志287boolean growSnake = false;288289// 得到蛇头坐标290 Coordinate head = mSnakeTrail.get(0);291// 初始化一个新的蛇头坐标292 Coordinate newHead = new Coordinate(1, 1);293294// 当前方向改成新的方向295 mDirection = mNextDirection;296297// 根据方向确定蛇头新坐标298switch (mDirection) {299// 如果方向向东(右),那么X加1300case EAST: {301 newHead = new Coordinate(head.x + 1, head.y);302break;303 }304// 如果方向向西(左),那么X减1305case WEST: {306 newHead = new Coordinate(head.x - 1, head.y);307break;308 }309// 如果方向向北(上),那么Y减1310case NORTH: {311 newHead = new Coordinate(head.x, head.y - 1);312break;313 }314// 如果方向向南(下),那么Y加1315case SOUTH: {316 newHead = new Coordinate(head.x, head.y + 1);317break;318 }319 }320321// 冲突检测新蛇头是否四面墙重叠,那么游戏结束322if ((newHead.x < 1) || (newHead.y < 1) || (newHead.x > mXTileCount - 2) 323 || (newHead.y > mYTileCount - 2)) {324// 设置游戏状态为Lose325 setMode(LOSE);326// 返回327return;328329 }330331// 冲突检测新蛇头是否和自身坐标重叠,重叠的话游戏也结束332int snakelength = mSnakeTrail.size();333334for (int snakeindex = 0; snakeindex < snakelength; snakeindex++) { 335 Coordinate c = mSnakeTrail.get(snakeindex);336if (c.equals(newHead)) {337// 设置游戏状态为Lose338 setMode(LOSE);339// 返回340return;341 }342 }343344// 看新蛇头和苹果们是否重345int applecount = mAppleList.size();346for (int appleindex = 0; appleindex < applecount; appleindex++) { 347 Coordinate c = mAppleList.get(appleindex);348if (c.equals(newHead)) {349// 如果重叠,苹果坐标从苹果列表中移除350 mAppleList.remove(c);351// 再立刻增加一个新苹果352 addRandomApple();353// 得分加一354 mScore++;355// 延迟是以前的90%356 mMoveDelay *= 0.9;357// 蛇增长标志改为真358 growSnake = true;359 }360 }361362// 在蛇头的位置增加一个新坐标363 mSnakeTrail.add(0, newHead);364// 如果没有增长365if (!growSnake) {366// 如果蛇头没增长则删去最后一个坐标,也就相当于蛇向前走了一步^_^ 367 mSnakeTrail.remove(mSnakeTrail.size() - 1);368 }369370int index = 0;371// 重新设置一下颜色,蛇头式黄色的,蛇身是红色的372for (Coordinate c : mSnakeTrail) {373if (index == 0) {374 setTile(YELLOW_STAR, c.x, c.y);375 } else {376 setTile(RED_STAR, c.x, c.y);377 }378 index++;379 }380381 }382383// 定义坐标内部类384private class Coordinate {385386public int x;387public int y;388389// 构造函数390public Coordinate(int newX, int newY) {391 x = newX;392 y = newY;393 }394395// 重写equals396public boolean equals(Coordinate other) {397if (x == other.x && y == other.y) {398return true;399 }400return false;401 }402403// 重写toString404@Override405public String toString() {406return"Coordinate: [" + x + "," + y + "]";407 }408 }409410// 添加苹果411private void addRandomApple() {412// 新的坐标413 Coordinate newCoord = null;414//415boolean flag = true;416// 为真的话在循环体内一直循环417while (flag) {418// 为苹果再找一个坐标,先随机一个X值419int newX = 1 + RNG.nextInt(mXTileCount - 2);420// 再随机一个Y值421int newY = 1 + RNG.nextInt(mYTileCount - 2);422// 新坐标423 newCoord = new Coordinate(newX, newY);424425// 下面确保新苹果不在蛇身下,先假设没发生冲突426boolean collision = false;427428int snakelength = mSnakeTrail.size();429// 和蛇占据的所有坐标比较430for (int index = 0; index < snakelength; index++) {431// 只要和蛇占据的任何一个坐标相同,即认为发生冲突了432if (mSnakeTrail.get(index).equals(newCoord)) {433 collision = true;434 }435 }436// 如果有冲突就继续循环,如果没冲突flag的值就是false,那么自然会退出循环,新坐标也就诞生了437 flag = collision;438 }439440if (newCoord == null) {441 Log.e(tag, "Somehow ended up with a null newCoord!");442 }443// 生成一个新苹果放在苹果列表中(两个苹果可能会重合吧)444 mAppleList.add(newCoord);445 }446447// 初始化游戏448private void initNewGame() {449450 Log.e(tag, "initNewGame!");451452// 清空ArrayList列表453 mSnakeTrail.clear();454 mAppleList.clear();455456// 创建蛇身457 mSnakeTrail.add(new Coordinate(7, 7));458 mSnakeTrail.add(new Coordinate(6, 7));459 mSnakeTrail.add(new Coordinate(5, 7));460 mSnakeTrail.add(new Coordinate(4, 7));461 mSnakeTrail.add(new Coordinate(3, 7));462 mSnakeTrail.add(new Coordinate(2, 7));463464// 新的方向:北方465 mNextDirection = NORTH;466467// 开始都时候有2个苹果468 addRandomApple();469 addRandomApple();470471// 设置移动延迟472 mMoveDelay = 600;473// 得分0474 mScore = 0;475 }476477// 保存状态478public Bundle saveState() {479480 Bundle bundle = new Bundle();481482 bundle.putIntArray("mAppleList", coordArrayListToArray(mAppleList));483 bundle.putIntArray("mSnakeTrail", coordArrayListToArray(mSnakeTrail)); 484485 bundle.putInt("mDirection", Integer.valueOf(mDirection));486 bundle.putInt("mNextDirection", Integer.valueOf(mNextDirection));487488 bundle.putLong("mMoveDelay", Long.valueOf(mMoveDelay));489 bundle.putLong("mScore", Long.valueOf(mScore));490491return bundle;6、MainActivity492 }493 494 // 恢复状态495 public void restoreState(Bundle icicle) {496 497 setMode(PAUSE);498 499 mAppleList = coordArrayToArrayList(icicle.getIntArray("mAppleList"));500 mDirection = icicle.getInt("mDirection");501 mNextDirection = icicle.getInt("mNextDirection");502 mMoveDelay = icicle.getLong("mMoveDelay");503 mScore = icicle.getLong("mScore");504 mSnakeTrail = coordArrayToArrayList(icicle.getIntArray("mSnakeTrail"));505 }506 507 // 整数数组转坐标数组508 private ArrayList coordArrayToArrayList(int [] rawArray) {509 ArrayList coordArrayList = new ArrayList();510 511 int coordCount = rawArray.length;512 for (int index = 0; index < coordCount; index += 2) {513 Coordinate c = new Coordinate(rawArray[index], rawArray[index + 1]);514 coordArrayList.add(c);515 }516 return coordArrayList;517 }518 519 // 坐标数组转整数数组520 private int [] coordArrayListToArray(ArrayList cvec) {521 int count = cvec.size();522 int [] rawArray = new int [count * 2];523 for (int index = 0; index < count; index++) {524 Coordinate c = cvec.get(index);525 rawArray[2 * index] = c.x;526 rawArray[2 * index + 1] = c.y;527 }528 return rawArray;529 }530 531}01package android.basic.lesson48;02 03import android.app.Activity;04import android.os.Bundle;05import android.widget.TextView;06 07public class MainActivity extends Activity {08 09 private SnakeView mSnakeView;10 11 private static String ICICLE_KEY = "snake-view";12 13 /** Called when the activity is first created. */14 @Override 15 public void onCreate(Bundle savedInstanceState) {16 17 super .onCreate(savedInstanceState);18 setContentView(yout.main);19 20 mSnakeView = (SnakeView) findViewById(R.id.snake);21 TextView tv = (TextView) findViewById(R.id.text);22 23 mSnakeView.setStatusTextView(tv);24 25 //检查存贮状态以确定是重新开始还是恢复状态26 if (savedInstanceState == null ) {27 //存储状态为空,说明刚启动可以切换到准备状态28 mSnakeView.setMode(SnakeView.READY);29 } else {30 //已经保存过,那么就去恢复原有状态31 Bundle bundle = savedInstanceState.getBundle(ICICLE_KEY);32 if (bundle != null ) {33 //恢复状态34 mSnakeView.restoreState(bundle);35 } else {36 //设置状态为暂停37 mSnakeView.setMode(SnakeView.PAUSE);38 }39 }40 }41你自己继续研究代码,本节课就到这里吧。

贪吃蛇开发与设计

贪吃蛇开发与设计

贪吃蛇游戏的开发与设计一、需求分析1.功能需求“贪吃蛇”游戏的总体需求就是能够正常玩游戏并能够观察到自己的得分。

具体的功能性需求如下:(1)玩家只能在屏幕上固定的区域内玩游戏,区域周围用墙壁状的图形来标识;(2)蛇的身体由一个个小方块来构成,蛇头由两个小方块构成;(3)食物由一个方块构成,食物要随机出现在游戏区域(4)玩家可用键盘上的上、下、左、右四个方向键来控制蛇的运行方向;(5)当蛇向前移动过程中,碰上了食物,则蛇身增长一节,当前食物消失,并且在令一处游戏区内随机出现一个食物;(6)蛇每增长一节,则得分相应增加;(7)得分实时显示在屏幕顶部(游戏区域边框处的某个位置);(8)蛇在移动的过程中,蛇头不能撞上蛇身,蛇头也不能撞上周围墙壁,若这两种情形发生,则认为蛇已死,在游戏区域内显示“GAME OVER”信息,并在顶部显示所得分数,游戏结束;(9)在游戏过程中,玩家可随时按“ESC”键结束游戏;2.非功能需求(1)界面友好,图形界面,游戏开始前有游戏的简单使用说明,方便玩家使用;(2)具有较好的容错能力,玩家在游戏过程中,除了规定的按键外,其他按键均忽略,不予处理;(3)发布游戏时,将图形驱动加载到程序中,使系统具有良好的可扩展性和平台适应性,可在任何PC机上运行。

二、系统设计1.设计思路程序关键在于表示蛇的图形及蛇的移动。

用一个小矩形块表示蛇的一节身体,身体每长一节,增加一个矩形块,蛇头用两节表示。

移动时必须从蛇头开始,所以蛇不能向相反的方向移动,如果不按任意键,蛇自行在当前方向上前移,但按下有效方向键后,蛇头朝着该方向移动,一步移动一节身体,所以按下有效方向键后,先确定蛇头的位置,而后蛇的身体虽蛇头移动,图形的实现是从蛇头新位置开始画出蛇,这是,由于未清屏的原因,原来的蛇的位置和新蛇的位置差一个单位,所以看起来蛇多一节身体,所以将蛇的身体,所以将蛇的最后一节用背景色覆盖。

食物的出现与消失也是画矩形块和覆盖矩形块。

贪吃蛇实习报告范文

贪吃蛇实习报告范文

一、实习背景随着计算机技术的不断发展,编程技能已经成为现代社会人才必备的能力之一。

为了提高自己的编程能力,我在某科技公司进行了为期一个月的贪吃蛇游戏开发实习。

通过这次实习,我对贪吃蛇游戏有了更深入的了解,并掌握了相关编程技能。

二、实习目的1. 学习和掌握贪吃蛇游戏的基本原理和开发流程;2. 提高自己的编程能力,特别是C语言编程能力;3. 熟悉游戏开发工具和开发环境;4. 培养团队合作和沟通能力。

三、实习内容1. 游戏设计在实习过程中,我首先对贪吃蛇游戏进行了详细的设计。

游戏分为以下几部分:(1)游戏界面:包括标题界面、游戏界面、游戏结束界面等;(2)游戏规则:蛇在游戏区域内吃食物,蛇身会逐渐变长,蛇头撞到墙壁或自身则游戏结束;(3)游戏控制:通过键盘上的四个方向键控制蛇的移动方向;(4)游戏得分:蛇每吃一个食物,得分增加10分;(5)游戏难度:随着游戏进行,食物出现速度逐渐加快。

2. 程序开发在游戏设计完成后,我开始进行程序开发。

主要使用了C语言进行编程,以下是程序的主要模块:(1)初始化游戏环境:设置游戏窗口、绘制游戏界面等;(2)生成食物:在游戏区域内随机生成食物,确保食物不与蛇身重叠;(3)蛇的移动:根据用户输入的方向键,控制蛇的移动方向;(4)检测碰撞:检测蛇头是否撞到墙壁或自身,如果碰撞则游戏结束;(5)更新分数:根据蛇吃食物的次数,更新游戏分数;(6)游戏结束:当蛇头撞到墙壁或自身时,显示游戏结束界面。

3. 调试与优化在程序开发过程中,我遇到了一些问题,如蛇的移动速度不均匀、食物生成位置不合理等。

针对这些问题,我进行了以下优化:(1)调整蛇的移动速度,使其更加均匀;(2)优化食物生成算法,确保食物生成位置合理;(3)调整游戏界面,使界面更加美观。

四、实习成果通过一个月的实习,我成功完成了贪吃蛇游戏开发,并取得以下成果:1. 掌握了贪吃蛇游戏的基本原理和开发流程;2. 提高了C语言编程能力,特别是结构体、函数、数组等知识的应用;3. 熟悉了游戏开发工具和开发环境;4. 培养了团队合作和沟通能力。

贪吃蛇项目个人总结

贪吃蛇项目个人总结

贪吃蛇项目个人总结
贪吃蛇项目是一个经典的游戏项目,对于个人的学习和编程能力提升有很大的帮助。

在我完成这个项目的过程中,我收获了许多经验和教训,下面是我的个人总结:
1. 学习了基本的游戏开发原理和技术。

贪吃蛇项目涉及到很多游戏开发的基本概念,
如游戏循环、碰撞检测、事件处理等。

通过实践这个项目,我深入了解了这些原理和
技术,并将它们应用到了实际项目中。

2. 锻炼了问题解决的能力。

在项目的开发过程中,我遇到了很多问题,比如游戏速度
控制、界面设计等。

通过分析问题、查找资料、尝试不同的解决方案,我逐渐学会了
如何解决这些问题,锻炼了自己的问题解决能力。

3. 加深了对面向对象编程的理解。

贪吃蛇项目中,我使用了面向对象的编程方式进行
开发,将蛇、食物、游戏界面等抽象为对象,通过它们之间的交互来实现游戏逻辑。

这样的开发方式使得代码结构清晰、易于维护,并且更符合现实世界的模型。

4. 体验了开发一个完整项目的过程。

在贪吃蛇项目中,我从项目的需求分析、设计到
最终的实现和测试,全程参与了整个项目的开发过程。

通过这个过程,我学会了如何
规划和组织一个项目,如何分配时间和资源,以及如何与团队成员合作。

综上所述,贪吃蛇项目对于个人的学习和成长有着很大的帮助。

通过这个项目,我不
仅学会了游戏开发的基本原理和技术,还提高了问题解决能力和面向对象编程的理解。

希望在未来的学习和工作中能够继续运用这些经验和技巧,不断提升自己的能力。

贪吃蛇安卓课程设计

贪吃蛇安卓课程设计

贪吃蛇安卓课程设计一、课程目标知识目标:1. 学生能理解贪吃蛇游戏的原理和基本规则。

2. 学生能掌握安卓开发环境的基本操作和界面设计。

3. 学生能了解和运用Java编程语言实现贪吃蛇游戏的功能。

技能目标:1. 学生能运用安卓开发工具,独立设计和开发一款简易的贪吃蛇游戏。

2. 学生能通过调试和优化,提高贪吃蛇游戏的性能和用户体验。

3. 学生能运用所学的编程知识,解决开发过程中遇到的问题。

情感态度价值观目标:1. 培养学生对编程的兴趣,激发他们的创新精神和探究欲望。

2. 培养学生的团队协作能力,学会在项目中分工合作、共同解决问题。

3. 培养学生面对挑战时的积极态度,提高他们克服困难的信心和决心。

本课程针对初中年级学生,结合他们好奇心强、动手能力强、善于合作等特点,设计具有挑战性和趣味性的贪吃蛇游戏开发课程。

课程旨在让学生在掌握编程知识的同时,提高实践能力和创新能力,培养他们良好的团队合作精神。

通过本课程的学习,学生能够将所学的编程知识运用到实际项目中,从而提升他们的综合素质。

二、教学内容1. 安卓开发环境搭建:介绍Android Studio的安装与配置,熟悉开发工具的使用。

- 章节关联:课本第二章《Android开发环境搭建》2. 简单的界面设计:学习并应用XML布局文件,设计贪吃蛇游戏的界面。

- 章节关联:课本第三章《Android界面设计基础》3. Java编程基础:回顾和巩固Java基本语法,为游戏编程打下基础。

- 章节关联:课本第四章《Java编程基础》4. 贪吃蛇游戏逻辑实现:学习游戏循环、碰撞检测、分数统计等核心功能。

- 章节关联:课本第五章《Android事件处理》与第六章《Android动画与游戏开发》5. 游戏调试与优化:介绍日志输出、性能分析及优化方法,提高游戏体验。

- 章节关联:课本第七章《Android性能优化》6. 项目实践:分组进行项目实践,将所学知识综合运用到贪吃蛇游戏的开发中。

Android贪吃蛇课程设计分析报告

Android贪吃蛇课程设计分析报告

姓名指导教师2015年12月20日湖南工程学院课程设计任务书课程名称计算机系统综合实训任务完成日期2016年1月11日任务书一、实训的内容1.贪吃蛇游戏开发(1)设计内容:在手机屏幕上设计一个贪吃蛇游戏,屏幕四周被绿色苹果包围,中间有贪吃蛇和随机产生的苹果,贪吃蛇的头是黄色的,身子是红色的。

玩家按上、下、左、右键盘控制贪吃蛇在屏幕上向上、注意,不能改变为当前方向的相反方向,例如当前方向是向下时,按向上的方向键是无效的。

(2) 设计要求:按任务书的设计要求进行撰写。

其中游戏核心数据结构设计要求为:主要是界面控制信息和逻辑控制信息, 界面控制信息主要包含两个部分:贪吃蛇的位置信息,存储贪吃蛇的具体位置,另外一个就是闪烁的食物的位置。

而逻辑控制信息主要包含三个部分:贪吃蛇的移动方向、闪烁控制以及程序暂停控制。

碰撞和处理,包括贪吃蛇和食物的碰撞和处理,贪吃蛇和四周的碰撞和处理,贪吃蛇的头和身的碰撞和处理,二、综合实训时间安排具体时间及要求安排如下:5、总结;6、附件(所有程序的源代码,要求对程序写出必要的注释)。

正文总字数要求在5000字以上(不含程序原代码)附:课程实训报告装订顺序:封面、任务书、目录、正文、评分、附件(A4大小的图纸及程序清单)。

正文的格式:一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;行距为22。

目录一、课程实训目的及要求 01.1、课程实训目的 01.2、课程实训要求 0二、设计思路 (1)2.1、需求分析 (1) (1) (1)一、课程实训目的及要求1.1、课程实训目的计算机系统综合实训能培养学生独立进行资料收集,综合运用所学的多门课程知识,培养分析问题和解决问题能力。

验证和巩固充实所学理论知识,加深对相关内容的理解,能运用所学知识为社会服务,在实训中学习和锻炼,增长才干。

本次实训采用项目制,要求学生进一步理解和掌握软件工程的方法和技术,培养操作界面应该人性化设计,提示玩家按什么按键开始游戏,开始游戏之后,在游戏界面中,以坐标的形式对整体界面进行划分,将界面划分为网格,还应设计蛇的样式,食物的样式和墙的样式,在蛇吃到食物后的样式,还有游戏结束时的界面显示,游戏结束后,要显示所得的分数。

基于android的贪吃蛇游戏设计与开发

基于android的贪吃蛇游戏设计与开发
if(newMode == READY){}
}
苹果的实现
声明:
private ArrayList<Position> mAppleTrail = new ArrayList<Position>();
用于存储苹果的坐标位置
根据游戏的需要,苹果的位置应该是随机产生的,使用java.util.Random类中提供的随机数实现苹果坐标的随机。
if (c.equals(newHead.x,newHead.y))
{
setMode(LOSE);
return;
}}
蛇吃苹果的实现
蛇所经过的每一个坐标,他们都要在苹果所在的ArrayList<Position>mAppleList=newArrayList<Position>())坐标集里面集依次判断,若是坐标相同,那个这个苹果就被蛇吃了。
{ flag = true; }
}
墙的冲突检测方法与上同;当产生的新坐标没有问题时,则把新坐标加入到mAppleTrail中。
蛇的实现
声明:
private ArrayList<Position> mAppleTrail = new ArrayList<Position>();
用于存储苹果的坐标位置
蛇的初始化
2、游戏中蛇的构成,以及苹果的构成;
3、游戏中障碍物的构成;
4、游戏中分数显示以及关卡显示。
2.4
(1)游戏开始控制:
我们的程序是使用上键开始游戏,启动游戏后会有一个初始菜单界面,我们点击“开始游戏”,弹出一句话“请按上键开始游戏”。游戏开始后蛇向下移动,然后由控制上下左右键来控制蛇的移动。在程序中我们重新建了一个activity来控制游戏的开始,使游戏的开始界面更美观。

基于android的贪吃蛇游戏设计与开发

基于android的贪吃蛇游戏设计与开发

基于a n d r o i d的贪吃蛇游戏设计与开发LG GROUP system office room 【LGA16H-LGYY-LGUA8Q8-LGA162】课程实训报告课程名称计算机系统综合实训课题名称基于Android的贪吃蛇游戏开发专业计算机科学与技术班级学号姓名指导教师2013年 12 月 4 日湖南工程学院课程实训任务书课程名称计算机系统综合实训课题基于Android的贪吃蛇游戏开发专业班级学生姓名学号指导老师审批任务书下达日期 2013 年 12 月 4 日任务完成日期 2013 年 12 月 20日目录1、程序构思....................................................2、程序设计....................................................游戏功能..................................................总设计模块的划分..........................................游戏主界面模块............................................游戏控制模块..............................................类模块设计.................................................3、程序实现....................................................、游戏界面的实现..........................................、游戏整个框架的构建......................................、实现键盘响应事件.........................................、刷新.....................................................、实现页面的切换...........................................、加载游戏................................................、游戏背景界面的改进.......................................、添加音效.................................................、游戏本身的完善...........................................3、类模块具体设计 ...................................................................................................................................................................4. 程序结果 ...................................................5. 总结与展望 .................................................6. 附录........................................................1、程序构思贪吃蛇游戏是一款非常经典的手机游戏,贪吃蛇游戏的设计比较复杂,它涉及面广、牵涉方面多,如果不好好考虑和设计,将难以成功开发出这个游戏。

Android游戏-贪吃蛇开发V2.0

Android游戏-贪吃蛇开发V2.0

地图布局定位
把屏幕划分成一个二维的点阵, 把屏幕划分成一个二维的点阵,用int[][]来记录 来记录 每一个方格状态
计算横、纵向排下图形 方格 方格)的个数 计算横、纵向排下图形(方格 的个数 计算横纵向偏移量, 计算横纵向偏移量,用来绘制每个方格时定位 初始化二维数组
方法执行顺序
构造方法 onSizeChanged()
蛇的走动
每次重绘前, 每次重绘前,需清除地图上所有的图
clearTiles()
upSnake()
要根据键盘监听事件, 要根据键盘监听事件,改变蛇头的坐标
键盘监听事件onKeyDown 键盘监听事件
需在构造方法中 setFocusable(true);
原因: 被显示时, 原因:View被显示时,没有获取焦点。也就是说, 被显示时 没有获取焦点。也就是说, 按键动作没有发送给View 按键动作没有发送给
蛇的移动
蛇的移动考虑
实现不断的重绘 蛇的位置变化,形成走动 蛇的位置变化, 蛇的长度不断变化, 蛇的长度不断变化,用ArrayList 要记录蛇的位置, 要记录蛇的位置,需要一个坐标类 Coordinate
private ArrayList<Coordinate> snakeTrail = new ArrayList<Coordinate>();
Android游戏基础 游戏基础
贪吃蛇
简介 了解Android图形绘制 图形绘制 了解 了解游戏的基本逻辑
图形绘制View onDraw() 图形绘制
创建一个类,继承 创建一个类,继承View或SurfaceView,覆盖 或 , onDraw()方法 方法 构造方法
View(Context context) View(Context context, AttributeSet attrs) View(Context context, AttributeSet attrs, int defStyle)

android游戏开发入门:贪吃蛇源代码分析

android游戏开发入门:贪吃蛇源代码分析

android游戏开发入门: 贪吃蛇 源代码分析贪吃蛇是一款足够经典的游戏。

它的经典,在于用户操作的简单,在于技术实现的简介,在于他的经久不衰。

这里的贪吃蛇的android实现,是SDK Samples中的开源例程。

可能各位都有看过~界面如下图啦~作为一个刚入门或者还没入门的新手,着实花了我一些力气来理解这段代码。

对于各种不懂的地方,慢慢查询资料,对于新的方法,通过修改代码尝试效果。

到现在终于能算个一知半解。

在代码中,对于自己有所收获的地方,我都做了相应的注释。

回过头来,觉得从这段代码中,能学到不少东西~~包括android应用的基本架构,他的面向对象的思想,以及代码的简洁明了。

于是,我想到,何不将这些东西分享出来,如果碰巧对感兴趣的朋友们有搜帮助,那就更好了~好了,闲话不说~代码和注释如下(处于对源码的敬意,原本的英文注释部分都没有删去~大家可以配合理解):PS:最近我正在写自己的“贪吃蛇”,说事贪吃蛇,其实完全颠覆了这个经典版本的设计理念和操作方式。

具体细节先卖一个关子,作品准备参加这次第二届大学生android应用开发大赛。

应该一个月内能完成,到时候也会开源出代码来~欢迎大家讨论指正·~*************************************************************************************************************************** *****Snake工程中,总共有三个文件: *TileView是基于Android的View类实现的方块图类,用来支撑上层类的调用,绘制方块图的显示界面。

通过这些代码,能打之了解如何 扩展View,实现特色的界面效果。

*SnakeView调用了TileView,实现了游戏逻辑 和 具体的显示。

*Snake为主Activity类。

建议大家按照上面的顺序看三个文件,可能逻辑上更舒服一点~~下面贴上代码和注释。

安卓大作业 贪吃蛇

安卓大作业 贪吃蛇

实训报告实训项目名称基于安卓贪吃蛇游戏的开发与测试二级学院信息工程学院专业班级11级计科(2)班姓名操玮康、方刚、聂顺涛、肖洋学号1142151201、05、17、27日期摘要Google公司2007年11月5日发布Android平台——一款包括操作系统(基于Linux 内核)、中间件和关键应用的手机平台,并组建了开放手机联盟(Open Handset Alliance),包括Google、中国移T-Mobile、宏达电、高通、摩托罗拉等领军企业。

本课题是利用java语言在Android平台上进行手机游戏的开发,由于本人知识的有限,以及客观条件的限制,本人打算开发一个单机版的游戏。

后来得知这个小小的游戏是nokia当年很成功的一款手机游戏,许多人都玩过,也很喜欢。

现在这款游戏的版本已经发展到第三版了,手机生产厂商继续开发这个游戏,看来这个游戏还是有很大的市场的。

于是,我决定利用自己大学所学的知识,自己在指导老师的帮助下,独立开发这个小游戏。

本文首先详细介绍了java的一些基本的知识点,在此基础上引出了Android,介绍了Android 的基础以及其特点,然后介绍了一下Android将来的一些前景和发展。

重点说明了这个贪吃蛇程序所用到的一些类和控件。

介绍了这些类的一般的使用方法,以及本程序是如何使用这些类来进行游戏的开发的。

关键词:Android系统; 贪食蛇游戏目录1.绪论 (4)1.1开发背景 (4)1.1.1安卓系统简介 (4)1.1.2游戏简介 (4)1.2开发目的及意义 (4)1.3开发环境及工具 (5)1.4游戏系统开发平台及搭建 (5)2.需求分析 (7)2.1游戏界面分析 (7)2.2游戏角色分析 (7)2.3游戏控制分析 (7)2.4可行性分析 (7)3.总体设计 (8)3.1贪吃蛇流程图 (8)3.2总设计模块的划分 (9)3.2.1主要界面 (9)3.2.2 游戏控制模块 (9)4.详细实现 (10)4.1 游戏窗口Snake类 (10)4.2 生成方块TileView类 (11)4.3 游戏实体SnakeView类 (13)5.测试 (15)5.1测试用列 (15)5.2测试用列展示图 (15)6.结论 (20)附录 (22)1.绪论1.1开发背景1.1.1安卓系统简介安卓系统作为新兴的手机操作系统,在问世不久,变风靡全球,占领手机操作系统里很大的市场份额,与苹果,诺基亚三分天下,Android是基于Linux开放性内核的操作系统,是Google公司在2007年11月5日公布的手机操作系统。

安卓贪吃蛇游戏设计

安卓贪吃蛇游戏设计

安卓贪吃蛇游戏设计实习实训手册专业: 10嵌入式系统工程实训名称:Android贪吃蛇游戏设计班级:姓名:_________________________学号:指导教师:起止时间:201 年月日至201 年月日信息工程系2 时间安排消化资料、系统调查1天系统分析、总体设计,实施计划 5天撰写报告2天演示、验收1天3 具体要求1、明确课程设计的目的和重要性,认真领会课程设计的题目,读懂课程设计指导书的要求,学会设计的基本方法与步骤,学会如何运用前修知识与收集、归纳相关资料解决具体问题的方法。

严格要求自己,要独立思考,按时、独立完成课程设计任务。

2、设计报告:要求层次清楚、整洁规范、不得相互抄袭,凡正文内容有整段完全相同者一律以抄袭论处。

4设计与实现具体实现过程分为以下3步:项目框架、游戏类图设计、界面设计。

○1项目框架新建一个Eclipse工程并命名为Snake,工程如下图所示:图1.1 Snake工程工程中包括4个Activity,分别为Snake(主界面)、Game(游戏界面)、Help(游戏说明界面)、AuthorView(作者信息界面),通过不同Activity之间的转换实现不同界面之间的切换。

游戏主界面如下图所示:图1.2 游戏主界面○2游戏类图设计Game(Activity)继承了SnakeView类,SnakeView类继承了TileView类。

TileView 类继承了View,如下图所示:Game(Activity)SnakeViewTileViewView图1.3 类图TiltView的基类是View,包含了贪吃蛇游戏画面的各个设定参数,主要负责绘制游戏画面。

TileView类定义如下:public class TileView extends View {private static final String tag = "yao";protected static int mTileSize = 20;//方格的边长protected static int mXTileCount;//X轴上方格的个数protected static int mYTileCount;//Y轴上方格的个数private static int mXOffset;//绘图时X轴上的起始坐标private static int mYOffset;//绘图时Y轴上的起始坐标private Bitmap[] mTileArray;//位图数组private int[][] mTileGrid;//映射整个游戏画面的数组private final Paint mPaint = new Paint();//画笔public TileView(Context context, AttributeSet attrs) {super(context, attrs);Log.i(tag, "TileView Constructor");Log.i(tag, "mTileSize=" + mTileSize);}//重置位图数组的长度public void resetTiles(int tilecount) {mTileArray = new Bitmap[tilecount];}@Override//适应各种分辨率的屏幕,当改变屏幕大小尺寸时,同时修改tile的相关计数指标protected void onSizeChanged(int w, int h, int oldw, int oldh) {Log.i(tag, "onSizeChanged," + "w=" + w + " h=" + h + " oldw=" + oldw + " oldh=" + oldh);mXTileCount = (int) Math.floor(w / mTileSize);mYTileCount = (int) Math.floor(h / mTileSize);Log.i(tag, "mXTileCount=" + mXTileCount);Log.i(tag, "mYTileCount=" + mYTileCount);mXOffset = ((w - (mTileSize * mXTileCount)) / 2);mYOffset = ((h - (mTileSize * mYTileCount)) / 2);Log.i(tag, "mXOffset=" + mXOffset);Log.i(tag, "mYOffset=" + mYOffset);mTileGrid = new int[mXTileCount][mYTileCount];clearTiles();}//这里做了一个Drawable 到bitmap 的转换public void loadTile(int key, Drawable tile) {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[key] = bitmap;}//清空图形显示public void clearTiles() {Log.i(tag, "TileView.clearTiles");for (int x = 0; x < mXTileCount; x++) {for (int y = 0; y < mYTileCount; y++) {setTile(0, x, y);}}}//在相应的坐标位置绘制相应的砖块public void setTile(int tileindex, int x, int y) {mTileGrid[x][y] = tileindex;}// onDraw@Override//将直接操作的画布绘制到手机界面上public void onDraw(Canvas canvas) {Log.i(tag, "onDraw");super.onDraw(canvas);Bitmap bmp;float left;float top;for (int x = 0; x < mXTileCount; x++) {for (int y = 0; y < mYTileCount; y++) {if (mTileGrid[x][y] > 0) {bmp = mTileArray[mTileGrid[x][y]];left = x * mTileSize + mXOffset;top = y * mTileSize + mYOffset;canvas.drawBitmap(bmp, left, top, mPaint);}}}}}SnakeView类定义了游戏运行时的画面改变及蛇体和果子的更新方法。

安卓贪吃蛇课程设计

安卓贪吃蛇课程设计

安卓贪吃蛇课程设计一、课程目标知识目标:1. 学生理解并掌握安卓应用开发的基础知识,包括活动(Activity)、视图(View)和意图(Intent)的使用。

2. 学生掌握贪吃蛇游戏的逻辑和算法,包括蛇的移动、食物的生成和碰撞检测。

3. 学生了解如何在安卓应用中实现用户界面设计,使用布局(Layout)和控件(Control)。

技能目标:1. 学生能够独立创建安卓项目,并设置虚拟设备进行调试。

2. 学生能够编写代码实现贪吃蛇游戏的核心功能,包括蛇的自动移动、方向控制以及食物的随机生成。

3. 学生能够利用安卓开发工具进行问题调试,解决开发过程中遇到的问题。

情感态度价值观目标:1. 培养学生对编程的兴趣,激发探究精神和创新意识。

2. 培养学生团队合作意识,学会在团队中发挥个人优势,共同解决问题。

3. 增强学生面对困难的勇气和毅力,培养良好的编程习惯和解决问题的方法。

分析课程性质、学生特点和教学要求:1. 课程性质:实践性、综合性、创新性。

2. 学生特点:具备一定的计算机操作能力,对编程有一定了解,对游戏开发有浓厚兴趣。

3. 教学要求:注重理论与实践相结合,关注学生个体差异,提供个性化的指导,确保学生能够将所学知识应用于实际项目中。

二、教学内容1. 安卓应用开发基础:- 活动的生命周期及状态管理- 视图和布局的使用,包括线性布局、相对布局等- 控件的使用,如按钮(Button)、文本框(TextView)等- 意图(Intent)的使用及数据传递2. 贪吃蛇游戏逻辑与算法:- 蛇的移动逻辑及方向控制- 食物的随机生成及碰撞检测- 游戏分数记录及结束条件3. 安卓界面设计与实现:- 游戏界面的布局设计- 蛇和食物的控件定制- 用户交互界面的实现,如按钮控制蛇的方向4. 教学大纲与进度安排:- 第一周:安卓应用开发基础学习,了解活动、视图、控件和意图的使用- 第二周:学习贪吃蛇游戏逻辑,编写移动算法和方向控制- 第三周:实现食物的生成和碰撞检测,设计游戏界面- 第四周:整合游戏功能,进行调试与优化教材章节关联:- 《Android基础教程》第3章:Android应用界面设计- 《Android基础教程》第4章:Android组件和事件处理- 《Android游戏开发实战》第2章:游戏开发基础及游戏循环- 《Android游戏开发实战》第5章:游戏界面绘制与用户交互教学内容确保科学性和系统性,结合教学大纲和教材章节,使学生能够逐步掌握安卓贪吃蛇游戏的开发技能。

贪吃蛇小游戏开发指南

贪吃蛇小游戏开发指南

贪吃蛇小游戏开发指南贪吃蛇是一款经典的游戏,它简单易懂且充满乐趣。

本篇文章将向您介绍如何开发一个贪吃蛇小游戏,让您亲身体验游戏开发的乐趣。

游戏环境设置在开始游戏开发之前,我们需要准备一个合适的开发环境。

您可以选择使用Python等编程语言进行开发。

首先,您需要安装相应的开发工具和软件库。

在Python中,您可以使用pygame库来构建贪吃蛇小游戏。

确保您已经安装好了pygame库,并且具备基本的编程知识。

游戏画面设计在贪吃蛇小游戏中,游戏画面是非常重要的,因为它直接影响到游戏的可玩性和用户体验。

您可以使用pygame库提供的绘制函数来创建游戏画面。

可以设置背景色、蛇的颜色和食物的颜色等。

通过控制游戏画面的设计,您可以提高游戏的可玩性和视觉效果。

游戏逻辑设计贪吃蛇小游戏的逻辑设计是实现游戏关键功能的核心。

在游戏逻辑设计中,您需要定义蛇的移动规则、食物生成的规则以及游戏结束的条件等。

可以使用循环结构控制蛇的移动,并判断蛇是否与墙壁或者自身碰撞,若碰撞则游戏结束。

同时,当蛇吃到食物时,需要增加蛇的长度并生成新的食物。

通过合理的逻辑设计,您可以实现贪吃蛇小游戏的基本功能。

游戏控制设置游戏控制是贪吃蛇小游戏中设置的关键部分。

玩家可以通过键盘上的方向键来控制蛇的移动方向。

通过监听玩家的输入,并根据输入来改变蛇的运动方向,从而使玩家能够操控蛇的移动。

在游戏控制设置中,您可以设置键盘事件监听以及相应的键盘控制逻辑。

游戏分数与排名为了增加游戏的挑战性和竞争性,您还可以为贪吃蛇小游戏添加分数和排名功能。

每当蛇吃到食物时,可以增加玩家的得分,并及时更新游戏窗口中的分数显示。

同时,您可以设置一个排行榜来记录玩家的最高分数,并在游戏结束后显示排行榜。

游戏音效与音乐通过添加音效和音乐,您可以让游戏更加生动有趣。

可以设置背景音乐来为游戏增添氛围,并在蛇吃到食物、游戏结束等关键时刻添加特定的音效。

通过合理使用音效与音乐,可以使游戏更加有趣且令人愉悦。

移动设备平台开发app-课程设计-贪吃蛇

移动设备平台开发app-课程设计-贪吃蛇

移动设备平台开发
App开发详解
项目名称:贪吃蛇
院系:计算机学院
专业班级:XXXX
学号:XXXXXXX
学生姓名:XXX
APP文档说明
一、需求分析说明
这是一个手机小游戏,在日常休闲娱乐的时候可以用来放松身心,在手机上安装后也非常方便实用,随点随玩。

二、开发技术参数
硬件:微型计算机
软件:Eclipse、JDK、SDK、ADT
三、界面及功能介绍
1.用户登录界面
描述:
点击屏幕上的句子“点击这里开始哦”就可以开始游戏了,相当于登录界面,特别方便,也不需要输入密码和用户名,就直接进入游
戏正式界面。

2.用户界面
描述:
点击进入之后,出现一条“小蛇”,同时屏幕上会出现上下左右四个方向键,用来控制“小蛇”方向。

3.游戏过程
描述:
利用屏幕上的上下左右方向键来控制方向,来寻着里面的黄色点点,可以增长“小蛇”的长度,用来增加游戏积分。

4.游戏展示。

手机贪吃蛇游戏的开发

手机贪吃蛇游戏的开发

手机贪吃蛇游戏的开发随着手机和智能设备的普及和智能化,手机游戏成为了人们休闲娱乐的主要方式之一。

而贪吃蛇游戏作为最受欢迎的游戏之一,在手机游戏市场占有着不可忽视的地位。

那么,如何开发一款优秀的手机贪吃蛇游戏呢?本文将从游戏规则制定、界面设计、操作体验和游戏定位等方面进行探讨。

一、游戏规则制定贪吃蛇游戏最基本的游戏规则是让玩家控制一只蛇,不断地吃食物,随着食物数量的增加,蛇的身体不断变长,同时要避免碰到墙壁或撞到自己的身体,直到游戏结束。

但仅有这样的规则显然不能吸引人们的注意力,需要通过创新和改良来增加游戏性。

首先,可以增加不同种类的食物,有些食物可增加蛇的生命值,有些食物可加速蛇的移动等等。

其次,可以增加障碍物,增加游戏难度;也可以增加减速、加速、反向等陷阱,使游戏更加有趣。

最后,还可以增加多个游戏模式,玩家可以根据自己的喜好进行选择,如单人模式、多人模式、竞技模式等,从而增加游戏的乐趣和可玩性。

二、界面设计游戏界面的设计对于游戏的成功非常重要。

对于手机贪吃蛇游戏,简洁明了、清晰易懂的界面设计能够给玩家带来更好的游戏体验。

首先,游戏界面需要有明显、醒目的游戏标题和LOGO,让人一眼就能识别出游戏的品牌和主题。

其次,需要有良好的色彩搭配和图形元素,使界面不仅美观、大方,还需要具有很好的可读性和视觉冲击。

最后,游戏界面需要简洁,不要过于繁琐,保证玩家可以轻松地找到自己所需要的功能,不断地提升游戏速度和响应速度,让游戏过程更加顺畅。

三、操作体验本质上,贪吃蛇游戏的操作方法就是控制蛇的移动。

在手机贪吃蛇游戏中,如何提供更好的操作体验至关重要。

为了方便操作,需要对游戏进行响应式设计,即玩家在触碰屏幕时,游戏应该迅速给出反馈,提高游戏的感觉与还原度。

此外,还要考虑到不同尺寸屏幕的设备,支持多种操作模式,如摇杆、虚拟按键等,从而满足不同设备和不同游戏玩家的需求,增强用户体验。

四、游戏定位市面上已有很多类似的贪吃蛇游戏,作为开发者,如果想成功推出一款手机贪吃蛇游戏,需要根据不同的用户群体进行定位。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

TextView
SurfaceView
AbsoluteLayout
WebView
Widget Layout
RelativeLayout
TabWidget
...
. . .
View
• View是所有UI元素的基类。
• View包含的内容很多,包括:
• UI视图显示需要的数据内容,View所在矩形区域的位置信息等。 • 计算View及其所有子View尺寸的方法 • 排布View的所有子View的方法贪吃蛇课程录讨论 设计编码
测试
讨论阶段
贪吃蛇我们之前做过两个版本,一个Windows版本,一
个Wince版本,本次开发的任务基本上也仅仅是将原来
的贪吃蛇移植到Android平台上。 在进行设计之前,我想请大家回顾一下贪吃蛇游戏具有 一些什么功能,有一些什么技术要点,这些技术要点中 哪些你自己可以实现,哪些你还不知道如何实现。
Canvas绘制方法——点
• 绘制点
drawPoint(float x,float y,Paint paint)
• x,y 点的坐标
• paint,画笔对象。
Canvas绘制方法——线
• 绘制线
void drawLine(float startX, float startY, float stopX, float stopY, Paint paint)
讨论阶段
请大家做一个简单的文档,总结:
1.贪吃蛇的功能
2.贪吃蛇的技术要点 3.其中哪些技术要点,在Android这个平台上你不知道如 何实现
讨论阶段
贪吃蛇的基本功能:
1.通过键盘的控制可以让蛇进行定时的游动
2.当蛇吃了食物之后,蛇的身体长度发生变化 3.当蛇撞了自己或者撞墙后,游戏结束 4.用户可以开始/暂停游戏
Bitmap
• Bitmap是位图,实际上是存储了颜色信息的二维数 组。 • Bitmap.createBitmap()可以创建一个空白的位图对象 。 • 使用BitmapFactory的相关方法可以从文件或者输入 流中创建Bitmap对象
Bitmap bg = Bitmap.createBitmap(200, 200, Config.ARGB_8888); Canvas canvas = new Canvas(bg); Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); String label = "Hello OPhone"; canvas.drawText(label, 10, 10, paint);
图形绘制的要素
• Bitmap,一个位图对象,绘制的内容最终体现在此 对象中。 • Canvas,实现具体绘制操作的对象。 • Paint,画笔对象定义了绘制过程中的样式。 • 绘制的内容,需要显示的内容。
Bitmap bg = Bitmap.createBitmap(200, 200, Config.ARGB_8888); Canvas canvas = new Canvas(bg); Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); String label = "Hello OPhone"; canvas.drawText(label, 10, 10, paint);
6.食物的随机生成
课程目录
讨论 设计
编码
测试
程序界面
MainActivity
SnakeView
程序界面
程序界面由两部分组成
1.MainActivity主界面
开始按钮/暂停按钮/SnakeView 2.SnakeView自定义的控件 一个封装蛇的所有行为的控件(其实就是一个类)
(绘制蛇/定时移动/审判官)
• 现有View、Layout无法直接满足应用程序的需要,需要重新从View开 始创建一个完全崭新的UI控件。
• 需要组合多个已有的Widget,形成一个具有更加完整组合功能的UI控
件。 • 需要完全控制某个控件的图形绘制方法,展现不同于现有Widget的外 观。 • 需要修改某个控件的现有事件处理方法。
• startX,startY标记了起始点的位置。
• stopX,stopY标记了终点的位置。
• paint,画笔对象。 void drawLines(float[] pts, Paint paint) void drawLines(float[] pts, int offset, int count, Paint paint)
FrameLayout AbsoluteLayout LinearLayout TableLayout RelativeLayout SlidingDrawer 使用区域内的相对坐标来排布其子View 简单排布的Layout,所有子View被显示在其所在位置的左上角 用线性对齐的排布方式显示子View,可能是水平排列或垂直排列。 用表格对齐的方式显示所有子View,每个子View被横向、纵向对齐显示在一 个表格中。 使用位置相关的排布方式显示子View,可以指定一个子View与其他任何View 之间的位置相对关系。这是最灵活使用的一个Layout。 一种特殊Layout,用于封装一个平时被隐藏为一个标签的子View,可点击或 者拖动标签来显示、隐藏子View。
程序界面
MainActivity
Button开始
Button暂停
SnakeView
派生自
View
课程目录
讨论 设计1-自定义View
编码
测试
View和ViewGroup
• OPhone应用的用户界面构成
• OPhone应用的程序界面由View和ViewGroup对象构成。 • 有很多类型的View和ViewGroup,他们全部直接或间接继承自同一 个父类View。 View ImageView ViewGroup
ImageView TextView
MyListItemView
ImageView TextView
MyListItemView是一个自定义View,在列表List的 一行中同时显示一个图标和一段文字。
Widget
• Widget的概念,继承自View,并且封装完整,具有独 立UI交互功能的类被称为Widget。Widget就是实际可 使用的UI控件。 • OPhone提供了非常多的Widget,方便UI开发 Button, CheckBox, EditText, DatePicker, • 包含系统提供的Widget的大量类位于android.widget 包。
扩展View的步骤
1、扩展已有的Widget 2、结合多个已有的Widget 3、实现完全自定义的View
扩展View的步骤
• 自定义View
• 在已有View的基础上继承、集成或者开发封装出完全崭新的View。
• 自定义生成的View一般是一个功能独立的Widget。
• 为什么要自定义View
事件处理
焦点
绑定
屏幕触摸事件响应方法 当View获得焦点或者失去焦点时,该方法被调用 当View所在窗口获得焦点或者失去焦点时,该方法被调用 当View被嵌入某个窗口时,该方法被调用 当View从某个窗口移除时,该方法被调用 当View所在窗口改变可见性时 onWindowVisibilityChanged (GONE,INVISIBLE,和VISIBLE),该方法被调用
继承扩展已有的Widget
/* 创建一个继承自ImageView的匿名类, * 使其具有自动点击后更换图片的功能 */ ImageView myImageView = new ImageView(myContext) { // 重定义onKeyUp事件响应
public boolean onTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent. ACTION_UP) { // 使用某个自定义的方法,获取需要切换的下一张图片 Bitmap nextImage = getNextImage(); // 使用ImageView提供的方法显示新的图片 setImageBitmap(nextImage);
扩展View的三种方式
• 继承扩展已有的Widget • 组合多个已有的Widget • 实现完全自定义的View
继承扩展已有的Widget
• 继承扩展已有的控件类
• 在已有Widget的基础上继承出新的类,并对类的某些方法做少量修改。 • 特点 • 实现容易,甚至经常以内部类或者匿名类形式,局部使用。 • 改动很小,仅仅对已有控件做某个方面的少量更改。 • 步骤 1) 重写覆盖View类的任务方法函数,一般这样的函数以“on”开头, 比如“onDraw()”、“onMeasure()”、“onKeyDown()”等。 2) 使用新的被继承子类,作为一个UI单元,构建自己的应用程序界面
布局 绘制
描述 View可以通过Java代码或者Layout XML被创建,两种创建方 式下分别有独立的构造函数。 当一个View通过Layout XML方式被创建结束,该方法被调用 。 被调用来计算一个View显示的宽度和高度。 被调用来计算一个View被显示位置的坐标和尺寸大小。 当View显示的尺寸变化,该方法被调用。 当View需要绘制自身内容时,该方法被调用。 按键事件响应方法 轨迹球运动事件响应方法
• 绘制View及其所有子View的方法
• 当前激活焦点改变的处理方法 • 窗口滚动方法 • 按键和手势的处理方法等
自定义View需要主要从以上几个方面完成View的开发
ViewGroup
• ViewGroup是一类特殊类型的View,它一般没有自己的实质性被显示内容, 而仅仅用作组合并排布显示其他View。 • ViewGroup是一个抽象类,由它继承出多个Layout,用作不同方式的View 组合排布。
相关文档
最新文档