【贪吃蛇—Java程序员写Android游戏】系列 1.Android SDK

合集下载

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

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

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.用户可以开始/暂停游戏

基于Android贪吃蛇游戏_本科毕业设计(论文)

基于Android贪吃蛇游戏_本科毕业设计(论文)

本科毕业设计(论文)题目名称:基于Android贪吃蛇游戏学院:计算机科学技术专业年级:计算机科学与技术08(师)级摘要本课题是利用java语言在Android平台上进行手机游戏的开发,由于本人知识的有限,以及客观条件的限制,本人打算开发一个单机版的游戏。

本人在手机上玩过贪吃蛇的游戏,曾经为了和别人比赛,苦苦的玩了好多次,追求高分!后来得知这个小小的游戏是nokia当年很成功的一款手机游戏,许多人都玩过,也很喜欢。

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

Google公司2007年11月5日发布的开源的Android 平台——一款包括操作系统(基于Linux内核)、中间件和关键应用的手机平台,并组建了开放手机联盟(Open Handset Alliance),包括Google、中国移动、T-Mobile、宏达电、高通、摩托罗拉等领军企业。

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

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

重点说明了这个贪吃蛇程序所用到的一些类和控件,包括Drawable,Canvas, Thread,等等。

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

本程序将老少皆宜的经典作品移植到手机上来,为更流行的硬件平台提供应用软件。

这些都将能很好的满足未来人们对手机游戏的需求。

吞吃蛇游戏基于Android平台编写,满足一般手机用户的娱乐需求。

关键词:Android系统; 贪食蛇游戏; 手机游戏Abstract.This topic is using java language on the Android platform mobile phone game development, I limited knowledge, and objective constraints, I intend to develop a stand-alone game. I played the game of Snake, on the phone once in order to match with others, struggling to play many times, the pursuit of high scores! Later learned that this little game nokia was very successful mobile phone games, many people have played, and also enjoyed. Version of the game has been developed to the third edition, mobile phone manufacturers continue to develop this game, it seems that this game is a great market. Open-source Android platform, Google's released on November 5, 2007 - an operating system (Linux kernel), middleware and key applications-based mobile phone platform, and the formation of the Open Handset Alliance (Open Handset Alliance), includingGoogle, China Mobile, T-Mobile, HTC, Qualcomm, Motorola and other leading enterprisesSo, I decided to use the knowledge learned in his college, in the instructor's help, the independent development of this game.This article first details some of the basic java knowledge, on this basis leads to Android, the basis of the Android and its characteristics, and then introduces the Android future prospects and development. Highlights this Snake procedures used and controls, including the Drawable Canvas, Thread, and so on. Describes the general use, as well as the program is how to use these classes to the development of the game. The ages of the classic works transplantation in this program to the phone up, to provide application software for the more popular hardware platforms. These will be well positioned to meet future demand for mobile games. Devour the snake game based on the Android platform, prepared to meet the entertainment needs of the general mobile phone users.Key words: Android system; Gluttony snake game; Mobile game目录摘要 (I)Abstract (II)第1章绪论 (1)1.1 Android简介 (1)1.1.1 Android的来源及发展 (1)1.1.2 Android系统的特点 (2)1.2 项目目的与意义 (2)1.2.1 开发目的 (2)1.2.2 开发意义 (3)1.3 国内外现状分析 (3)1.3.1 国内外手机系统现状 (3)1.3.2 国内外手机应用现状 (4)1.3.3 发展趋势 (5)第2章方案论证 (6)2.1 经济可行性分析 (6)2.2 技术可行性分析 (6)2.2.1 Android平台特性 (6)2.2.2 Android平台架构 (6)2.2.3 Android应用程序组件 (7)2.3 本项目的开发方法 (8)2.4 开发工具及环境简介 (10)2.4.1 开发工具Eclipse简介 (10)2.4.2 开发环境简介 (10)第3章需求分析 (11)3.1 系统开发目标 (11)3.2 系统需求分析 (11)3.2.1 业务需求分析 (11)3.2.2 用户需求分析 (12)3.2.3 功能需求分析 (12)第4章过程论述............................................................................. 错误!未定义书签。

JAVA开放性实验报告贪吃蛇

JAVA开放性实验报告贪吃蛇

JAVA开放性实验报告贪吃蛇实验目的:本实验旨在利用Java语言实现一个经典的贪吃蛇游戏,通过实践提升对面向对象程序设计的理解和应用能力,加深对Java语言的熟练程度,并提高解决问题的能力和编程实践经验。

实验内容:1.设计游戏界面:通过Java中的Swing库实现游戏窗口的设计,包括游戏区域、游戏开始按钮、得分显示等。

2.实现游戏逻辑:设计贪吃蛇的移动规则,食物的生成和吃掉判定,碰撞检测等游戏逻辑。

同时实现游戏的主循环,控制游戏的进行。

3.实现键盘控制:通过监听键盘事件,实现玩家控制贪吃蛇的移动方向。

4.设计游戏机制:设置游戏的难度等级,增加贪吃蛇的移动速度、食物生成间隔等参数,使游戏更具挑战性。

5.设计游戏结束逻辑:当贪吃蛇头碰到墙壁或自身时,游戏结束并显示得分。

玩家可以选择重新开始游戏或退出。

实验步骤:1.设计游戏界面:创建一个JFrame窗口,在窗口中添加游戏画布,开始按钮和得分显示等组件。

2.实现游戏逻辑:设计Snake类和Food类,表示贪吃蛇和食物。

通过ArrayList存储贪吃蛇的身体节点,并实现移动、吃食物等方法。

3.实现键盘控制:通过实现KeyListener接口来监听键盘事件,根据按键控制贪吃蛇的移动方向。

4.设计游戏机制:设置贪吃蛇的移动速度、食物生成间隔等参数,根据难度级别逐步增加,使游戏更具挑战性。

5.设计游戏结束逻辑:当贪吃蛇头碰到墙壁或自身时,游戏结束并显示得分。

提供重新开始游戏和退出游戏的选项。

实验结果:经过实验设计和编码实现,成功完成了Java贪吃蛇游戏的开发。

游戏界面美观,操作流畅,游戏逻辑完整,玩家能够通过控制贪吃蛇吃到食物并获得得分。

随着游戏的进行,贪吃蛇会不断变长,玩家需要避开障碍,控制蛇头移动,体验游戏的乐趣和挑战。

实验总结:通过本次实验,我深入学习了Java语言的面向对象编程思想和应用,掌握了Swing库的使用方法,加深了对Java语言的理解和应用。

java贪吃蛇毕业论文

java贪吃蛇毕业论文

java贪吃蛇毕业论文本文将介绍贪吃蛇游戏的设计与实现,该游戏的主要功能包括游戏开始、游戏暂停、游戏结束、得分统计等。

基于Java 语言,采用面向对象的程序设计方法,构建了具有良好交互性的贪吃蛇游戏系统。

一、引言贪吃蛇是一个经典的小游戏,它在全世界范围内都受到玩家们的喜欢。

贪吃蛇这个小游戏有着简单的规则和良好的互动性,因此成为了许多程序员学习编程的入门教材。

本文旨在通过对贪吃蛇游戏的设计和实现,加深对Java编程语言的理解,提升面向对象程序设计的能力。

本文将介绍贪吃蛇游戏的整体框架设计、游戏流程设计、源代码分析等内容,希望对同学们学习Java编程有所帮助。

二、贪吃蛇游戏的设计与实现2.1整体框架设计首先,我们来看一下贪吃蛇游戏的整体框架设计。

贪吃蛇游戏的界面分为左右两部分,左边显示游戏画面,右边显示得分情况。

游戏开始后,蛇会出现在游戏画面的中央位置,游戏画面上还会随机出现食物。

如果蛇吃到了食物,那么得分就会增加,同时蛇也会变长。

如果蛇撞到了游戏画面的边界或者自己的身体,则游戏失败,游戏画面会出现“Game over”的提示。

贪吃蛇游戏的设计可以分为两个模块:游戏画面显示模块和游戏逻辑实现模块。

其中,游戏画面显示模块是用来将游戏运行时的状态显示在界面上,游戏逻辑实现模块则是通过对用户的操作产生游戏效果。

2.2游戏流程设计当用户点击游戏开始按钮后,游戏画面会显示出蛇的头部,然后蛇会按照一定的规则向前移动。

此时,用户可以通过按键控制蛇的移动方向,蛇吃到食物时,得分会增加,同时蛇的长度增加。

如果蛇撞到了游戏画面的边界或自己的身体,则游戏失败,游戏画面会出现“Game over”的提示。

如果用户点击游戏暂停按钮,则游戏就会暂停,并且再次点击按钮游戏就会恢复进行。

2.3源代码分析以下是源代码的分析,采用了面向对象的编程方式,将游戏画面、蛇、食物等各个元素都抽象成了对象。

下面我们就来看一下其中的一部分代码。

(1)GamePanel.java```javapublic class GamePanel extends JPanel {private Snake snake;//蛇private Food food;//食物private int score;//分数private int speed;//移动速度private Timer timer;//计时器public GamePanel() {snake = new Snake();food = new Food();score = 0;speed = 200;timer = new Timer(speed, new ActionListener() { @Overridepublic void actionPerformed(ActionEvent e) { snake.move();//蛇移动check();//检查游戏是否结束或吃到食物repaint();//重新绘制}});timer.start();//开始计时器}public void paint(Graphics g) {super.paint(g);snake.draw(g);//绘制蛇food.draw(g);//绘制食物g.drawString(\。

JAVA小程序—贪吃蛇源代码

JAVA小程序—贪吃蛇源代码

JAVA贪吃蛇源代码SnakeGame。

javapackage SnakeGame;import javax.swing。

*;public class SnakeGame{public static void main( String[]args ){JDialog。

setDefaultLookAndFeelDecorated( true ); GameFrame temp = new GameFrame();}}Snake.javapackage SnakeGame;import java。

awt.*;import java。

util。

*;class Snake extends LinkedList{public int snakeDirection = 2;public int snakeReDirection = 4;public Snake(){this。

add( new Point( 3, 3 ));this。

add(new Point(4, 3 ));this.add( new Point(5,3 ) );this。

add( new Point(6,3 ) );this。

add(new Point(7,3 ));this。

add( new Point( 8,3 ) );this。

add( new Point( 9, 3 ));this。

add( new Point( 10,3 ));}public void changeDirection( Point temp, int direction ) {this。

snakeDirection = direction;switch(direction ){case 1://upthis.snakeReDirection = 3;this。

add( new Point(temp.x,temp.y - 1 ));break;case 2://rightthis。

java贪吃蛇毕业设计

java贪吃蛇毕业设计

java贪吃蛇毕业设计Java贪吃蛇毕业设计毕业设计是大学生们在校园生活的最后一道考验,也是他们展示自己所学知识和能力的机会。

对于计算机科学专业的学生而言,选择一个合适的主题进行毕业设计是至关重要的。

本文将探讨一个有趣且具有挑战性的毕业设计主题:Java贪吃蛇。

1. 贪吃蛇的背景介绍贪吃蛇是一款经典的游戏,最早出现在20世纪70年代。

游戏的玩法简单,玩家控制一条蛇在有限的空间内移动,吃掉食物以增加身体长度,同时要避免碰到自己的身体或是墙壁。

随着时间的推移,蛇的移动速度会逐渐加快,增加游戏的难度。

2. 设计思路在设计Java贪吃蛇毕业项目时,需要考虑以下几个方面:2.1 游戏界面设计游戏界面是玩家与游戏进行交互的窗口,需要设计一个美观且易于操作的界面。

可以使用Java的图形库,如Swing或JavaFX来实现。

2.2 蛇的移动和控制蛇的移动是游戏的核心,需要设计合适的算法来控制蛇的移动方向和速度。

可以使用键盘监听器来捕捉玩家的按键操作,并根据按键来改变蛇的方向。

2.3 食物生成和吃掉食物的生成和吃掉是游戏的重要元素。

需要设计一个随机生成食物的算法,并判断蛇是否吃到了食物。

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

2.4 碰撞检测碰撞检测是游戏的关键部分,需要判断蛇是否碰到了自己的身体或是墙壁。

如果蛇碰到了自己的身体或是墙壁,游戏结束。

3. 实现过程在实现Java贪吃蛇毕业项目时,可以按照以下步骤进行:3.1 确定游戏界面和基本功能首先,设计游戏界面,包括蛇、食物和墙壁的显示。

然后,实现蛇的移动和控制功能,包括键盘监听器和蛇的移动算法。

3.2 实现食物生成和吃掉功能接下来,设计食物的生成算法,并判断蛇是否吃到了食物。

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

3.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. 项目实践:分组进行项目实践,将所学知识综合运用到贪吃蛇游戏的开发中。

贪吃蛇

贪吃蛇

【贪吃蛇—Java程序员写Android游戏】系列 1.Android SDK Sample-Snake详解Snake也是一个经典游戏了,Nokia蓝屏机的王牌游戏之一。

Android SDK 1.5就有了它的身影。

我们这里就来详细解析一下Android SDK Sample中的Snake 工程。

本工程基于SDK 2.3.3版本中的工程,路径为:%Android_SDK_HOME%/samples/android-10/Snake一、Eclipse工程通过File-New Project-Android-Android Project,选择“Create project from existing sample”创建自己的应用SnakeAndroid,如下图:运行效果如下图:二、工程结构和类图其实Snake的工程蛮简单的,源文件就三个:Snake.java SnakeView.java TileView.java。

Snake类是这个游戏的入口点,TitleView类进行游戏的绘画,SnakeView类则是对游戏控制操作的处理。

Coordinate,RefreshHandler是2个辅助类,也是SnakeView类中的内部类。

其中,Coordinate是一个点的坐标(x,y),RefreshHandler将RefreshHandler对象绑定某个线程并给它发送消息。

如下图:任何游戏都需要有个引擎来推动游戏的运行,最简化的游戏引擎就是:在一个线程中While循环,检测用户操作,对用户的操作作出反应,更新游戏的界面,直到用户退出游戏。

在Snake这个游戏中,辅助类RefreshHandler继承自Handler,用来把RefreshHandler与当前线程进行绑定,从而可以直接给线程发送消息并处理消息。

注意一点:Handle对消息的处理都是异步。

RefreshHandler在Handler的基础上增加sleep()接口,用来每隔一个时间段后给当前线程发送一个消息。

小游戏贪吃蛇课程设计报告

小游戏贪吃蛇课程设计报告
使用随机数生成器生 成蛇和食物的位置
Java小游戏贪吃蛇课程设计报告
使用键盘事件 监听器实现蛇 的移动和转向
Java小游戏贪吃蛇课程设计报告
通过碰撞检测类实现碰 撞和游戏结束条件
Java小游戏贪吃蛇课程设计报告
使用Java Timer类实现分数和时间的更新
在实现过程中,我们遇到了以下问题和解决方案
在本次课程设计中,我们选择了一个经典的小游戏——贪吃蛇。贪吃蛇是一款简单而有趣 的游戏,玩家需要控制一条蛇在屏幕上移动,吃掉食物并避免撞到墙壁或自己的尾巴 在开始设计之前,我们首先对游戏进行了需求分析。我们需要实现以下功能
Java小游戏贪吃蛇课程设计报告
创建游戏窗口和背景
Java小游戏贪吃蛇课程设计报告
Java小游戏贪吃蛇 课程设计报告
-
1 创建游戏窗口和背景 2 生成蛇和食物 3 实现蛇的移动和转向 4 检测碰撞和游戏结束条件 5 分数和时间的显示 6 使用随机数生成器生成蛇和食物的位置 7 使用键盘事件监听器实现蛇的移动和转向 8 通过碰撞检测类实现碰撞和游戏结束条件
Java小游戏贪吃蛇课程设计报告
分数和时间显示不准确:解决方案:使用Java Timer类定期更新分数和时间,确保它 们与游戏进度同步
Java小游戏贪吃蛇课程设计报告
r
xxxxx
最终,我们成功实现了贪吃蛇游戏的基 本功能,包括创建游戏窗口、生成蛇和 食物、实现蛇的移动和转向、检测碰撞 和游戏结束条件以及分数和时间的显示
同时,我们还优化了游戏的性能和 用户体验,使其更加流畅和有趣
生成蛇和食物
Java小游戏贪吃蛇课程设计报告
Java小游戏贪吃蛇课程设计报告
检测碰撞和游 戏结束条件
Java小游戏贪吃蛇课程设计报告

Java程序设计报告《贪吃蛇》

Java程序设计报告《贪吃蛇》

《Java程序设计》课程设计报告题目:贪吃蛇游戏的设计与实现指导老师:沈泽刚专业:计算机科学与技术班级:10-3姓名:梁潇一、课程设计目的贪吃蛇游戏一款非常经典的手机游戏,因为它比较简单有趣,无论老少都比较适合。

目的是更好地了解和掌握java语言,并熟练的运用java语言来实现项目。

培养自主学习的能力。

本软件在设计方面本着方便、实用及娱乐性高的宗旨,在外界进行设计的过程中,始终坚持清晰明了,在性能方面能够实现效率高,不易出错等优点。

二、课程设计要求贪吃蛇游戏设计与实现,主要分为以下二个模块:游戏主界面模块、游戏控制模块。

三、课程设计报告内容(一) 系统设计1、程序概述本程序是一个利用Java应用软件制作的贪吃蛇小游戏。

在游戏过程中,用户通过点击小键盘区的方向键来控制蛇的运行方向;当蛇没有吃到食物且碰到墙壁或自己的身体时游戏结束。

本程序的另一个功能是在程序运行窗口的左上角显示,用户在游戏过程中所得的分数,不过缺点就是在退处程序后,下次打开程序时无法保存。

2、游戏的主界面设计游戏的主界面是进入游戏后,能够给玩家第一感官的部分,主要包括游戏图形区域界面、游戏的速度选择更新界面、游戏分数的显示更新界面、游戏开始按钮、暂停游戏按钮、退出游戏按钮以及游戏排行榜按钮。

3、游戏控制模块设计这个模块是游戏的中心环节,主要完成控制游戏的开始、暂停、退出等功能。

为了能够给玩家一个很好的游戏环境,这部分应该做到易懂、易操作。

(二)主界面设计游戏界面主框架主要包括游戏图形区域界面、游戏的开始按钮、暂停按钮、游戏的退出按钮、困难程度、积分排行、关于作者。

(三)代码设计import java.awt.Color;import java.awt.Container;import java.awt.Graphics;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.InputEvent;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import javax.swing.*;public class TanChiShe extends JFrame implements ActionListener, KeyListener,Runnable{private JMenuBar menuBar;private JMenu youXiMenu,nanDuMenu,fenShuMenu,guanYuMenu;private JMenuItem kaiShiYouXi,exitItem,zuoZheItem,fenShuItem;private JCheckBoxMenuItem cJianDan,cPuTong,cKunNan;private int length = 6;private Toolkit toolkit;private int i,x,y,z,objectX,objectY,object=0,growth=0,time;private int difficult=2;private int m[]=new int[50];private int n[]=new int[50];private Thread she = null;private int life=0;private int foods = 0;private int fenshu=0;public void run() //运行{time=500;for(i=0;i<=length-1;i++){m[i]=90-i*10;n[i]=60;}x=m[0];y=n[0];z=4;while(she!=null){check();try{she.sleep(time);}catch(Exception ee){System.out.println(z+"");}}}public TanChiShe(){//***************创建新对象**************setVisible(true);menuBar = new JMenuBar();Container con=getContentPane();toolkit=getToolkit();//**************游戏菜单对象*****************youXiMenu = new JMenu("游戏");kaiShiYouXi = new JMenuItem("开始游戏");exitItem = new JMenuItem("退出游戏");//***************困难程度对象****************nanDuMenu = new JMenu("困难程度");cJianDan = new JCheckBoxMenuItem("简单");cPuTong = new JCheckBoxMenuItem("普通");cKunNan = new JCheckBoxMenuItem("困难");//*****************分数菜单对象****************fenShuMenu = new JMenu("积分排行");fenShuItem = new JMenuItem("最高记录");//****************关于对象*********************guanYuMenu = new JMenu("关于");zuoZheItem = new JMenuItem("关于作者");//***************设置关于菜单*******************guanYuMenu.add(zuoZheItem);//****************设置困难程度菜单**************nanDuMenu.add(cJianDan);nanDuMenu.add(cPuTong);nanDuMenu.add(cKunNan);//******************设置分数菜单***************fenShuMenu.add(fenShuItem);//*****************设置游戏菜单****************youXiMenu.add(kaiShiYouXi);youXiMenu.add(exitItem);//******************设置主菜单********************menuBar.add(youXiMenu);menuBar.add(nanDuMenu);menuBar.add(fenShuMenu);menuBar.add(guanYuMenu);//*********************监听注册*****************zuoZheItem.addActionListener(this);kaiShiYouXi.addActionListener(this);exitItem.addActionListener(this);addKeyListener(this);fenShuItem.addActionListener(this);//*********************加快捷键********************KeyStroke keyOpen = KeyStroke.getKeyStroke('O',InputEvent.CTRL_DOWN_MASK);kaiShiYouXi.setAccelerator(keyOpen);KeyStroke keyExit = KeyStroke.getKeyStroke('X',InputEvent.CTRL_DOWN_MASK); exitItem.setAccelerator(keyExit);//*****************设置框架**********************setJMenuBar(menuBar);setTitle("贪吃蛇");setResizable(false);setBounds(300,200,400,400);validate();setDefaultCloseOperation(EXIT_ON_CLOSE);}public static void main(String args[]){new TanChiShe();}//******************菜单监听******************************public void actionPerformed(ActionEvent e){if(e.getSource()==kaiShiYouXi){length = 6;life = 0;foods = 0;if(she==null){she=new Thread(this);she.start();}else if(she!=null){she=null;she= new Thread(this);she.start();}}if(e.getSource()==exitItem){System.exit(0);}if(e.getSource()==zuoZheItem){JOptionPane.showMessageDialog(this, "梁潇"+"\n\n");}if(e.getSource()==fenShuItem){JOptionPane.showMessageDialog(this,"最高记录为"+fenshu+""); }}//**************检查一下******************************* public void check(){isDead();if(she!=null){if(growth==0){reform();}else{upgrowth();}if(x==objectX&&y==objectY){object=0;growth=1;toolkit.beep();}//****************产生食物坐标**********************if(object==0){object=1;objectX=(int)Math.floor(Math.random()*39)*10;objectY=(int)Math.floor(Math.random()*29)*10+50;}this.repaint();}}void isDead(){if(z==4){x=x+10;}else if(z==3){x=x-10;}else if(z==2){y=y+10;}else if(z==1){y=y-10;}if(x<0||x>390||y<50||y>390) {she=null;}for(i=1;i<length;i++){if(m[i]==x&&n[i]==y){she=null;}}}public void upgrowth(){if(length<50){length++;}growth--;time=time-10;reform();life+=100;if(fenshu<life){fenshu = life;}foods++;}public void reform(){for(i=length-1;i>0;i--){m[i]=m[i-1];n[i]=n[i-1];if(z==4){m[0]=m[0]+10;}if(z==3){m[0]=m[0]-10;}if(z==2){n[0]=n[0]+10;}if(z==1){n[0]=n[0]-10;}}public void keyPressed(KeyEvent e){if(she!=null){if(e.getKeyCode()==KeyEvent.VK_UP){if(z!=2){z=1;check();}}else if(e.getKeyCode()==KeyEvent.VK_DOWN) {if(z!=1){z=2;check();}}else if(e.getKeyCode()==KeyEvent.VK_LEFT){if(z!=4){z=3;check();}else if(e.getKeyCode()==KeyEvent.VK_RIGHT){if(z!=3){z=4;check();}}}}public void keyReleased(KeyEvent e){// TODO自动生成方法存根}public void keyTyped(KeyEvent e){// TODO自动生成方法存根}public void paint(Graphics g){//*******************画图********************** g.setColor(Color.DARK_GRAY);g.fillRect(0,50,400,400);g.setColor(Color.pink);for(i=0;i<=length-1;i++){g.fillRect(m[i],n[i],10,10);}g.setColor(Color.green);g.fillRect(objectX,objectY,10,10);g.setColor(Color.white);g.drawString("当前分数"+this.life,6,60);g.drawString("当前已吃食物数"+this.foods,6,72);}}(四)测试(五)使用说明在游戏过程中,用户通过点击小键盘区的方向键来控制蛇的运行方向;当蛇没有吃到食物且碰到墙壁或自己的身体时游戏结束。

基于Java的游戏设计——贪吃蛇

基于Java的游戏设计——贪吃蛇

毕业设计论文基于Java的游戏设计——贪吃蛇毕业设计(论文)中文摘要毕业设计(论文)外文摘要目录1 绪论 (1)1.1J AVA语言的特点 (1)1.2开发工具E CLIPSE介绍 (2)1.3开发工具JDK介绍 (3)1.4应用环境 (3)2 系统需求分析 (3)2.1需求分析 (4)2.2可行性分析 (4)3 系统概要设计 (5)3.1游戏流程图 (5)3.2设计目标 (6)3.3系统功能模块 (6)3.4系统数据结构设计 (8)4 系统详细设计 (12)4.1程序设计 (12)4.2贪吃蛇游戏各功能界面截图 (16)5 系统测试 (19)5.1测试的意义 (19)5.2测试过程 (19)5.3测试结果 (20)结论 (21)致谢 (22)参考文献 (23)1 绪论贪吃蛇是世界知名的益智类小游戏,选择这个题目一方面是为了将我们自己的所学知识加以运用;另一方面,我希望通过自己的所学知识把它剖析开来,通过自己的动手实践,真正的了解它的本质和精髓。

希望通过这次实践,能从中提高自己的编程能力。

并从中学会从零开始分析设计程序,达到学以致用,活学活用的目的。

另外,通过本游戏的开发,达到学习Java技术和熟悉软件开发流程的目的。

本游戏的开发语言为Java,开发工具选用Eclipse。

Java是一种简单的,面向对象的,分布式的,解释型的,健壮安全的,结构中立的,可移植的,性能优异、多线程的动态语言。

这里采用Java作为开发语言主要是基于Java的面向对象和可移植性。

Eclipse 是一个开放源代码的、基于Java 的可扩展开发平台。

就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。

1.1 Java语言的特点1.1.1 简单性Java与C++语言非常相近,但Java比C++简单,它抛弃了C++中的一些不是绝对必要的功能,如头文件、预处理文件、指针、结构、运算符重载、多重继承以及自动强迫同型。

贪吃蛇java毕业设计

贪吃蛇java毕业设计

贪吃蛇java毕业设计贪吃蛇是一款经典的游戏,它在20世纪70年代诞生于贪吃蛇机器上,随后在各种游戏平台上得到了广泛的传播和演变。

如今,贪吃蛇已经成为了一个不可或缺的元素,出现在了各种手机应用和网页游戏中。

因此,我选择了贪吃蛇作为我的Java毕业设计题目。

在开始设计之前,我首先进行了一番调研,了解了贪吃蛇游戏的基本规则和特点。

贪吃蛇游戏的核心玩法是控制一条蛇在一个有界的区域内移动,吃掉食物以增长身体长度,同时要避免碰到自己的身体或者墙壁。

游戏的难度会随着蛇的身体长度的增加而增加,给玩家带来更大的挑战。

在设计过程中,我首先考虑了游戏的界面。

我采用了Java的图形界面库Swing 来构建游戏界面,使用了适当的颜色和图形元素,使得游戏界面看起来简洁而又美观。

我还添加了一些动画效果,如蛇的身体在移动时的流畅过渡和食物被吃掉时的消失效果,以增加游戏的可玩性和趣味性。

接下来,我着重考虑了游戏的逻辑部分。

首先,我设计了一个蛇类,包含了蛇的身体长度、移动方向和位置等属性,以及蛇的移动、吃食物和碰撞检测等方法。

然后,我设计了一个食物类,包含了食物的位置和生成方法。

在游戏的主循环中,我通过不断调用蛇的移动方法和碰撞检测方法,来实现游戏的动态效果。

同时,我还加入了一些额外的功能,如计分系统和游戏结束的判断,以增加游戏的可玩性和挑战性。

在整个设计过程中,我遇到了不少挑战和问题。

例如,如何确保蛇的移动是流畅而且不会出现闪烁的问题;如何设计一个合适的算法来生成食物,并确保食物不会出现在蛇的身体上;以及如何处理用户输入和游戏状态的切换等等。

为了解决这些问题,我进行了大量的调试和优化工作,不断地修改和完善我的代码,最终实现了一个功能完善且稳定的贪吃蛇游戏。

通过这个毕业设计,我不仅学到了如何运用Java编程语言来实现一个小游戏,还学到了如何设计和优化一个软件系统。

我深刻体会到了软件开发的复杂性和挑战性,也明白了团队合作和不断学习的重要性。

JAVA设计贪吃蛇游戏

JAVA设计贪吃蛇游戏

JAVA设计贪吃蛇游戏下面是一个简单的贪吃蛇游戏的JAVA设计示例,该示例包括游戏画面的显示、控制蛇的移动、食物的生成与吃掉、以及游戏的结束等基本功能。

首先,我们需要创建一个Snake类来表示蛇的身体。

Snake类包括一个ArrayList作为蛇的身体部分,以及一个方向变量来表示蛇的移动方向。

Snake类还有一个方法来控制蛇的移动,根据方向变量移动蛇的身体。

```javaimport java.util.ArrayList;public class Snakeprivate ArrayList<Cell> body;private Direction direction;public Snakbody = new ArrayList<>(;body.add(new Cell(10, 10)); // 初始化蛇的初始位置direction = Direction.RIGHT; // 蛇的初始方向为向右}public void movCell head = body.get(0); // 蛇头Cell newHead;//根据方向变量移动蛇头的位置switch (direction)case UP:newHead = new Cell(head.getX(, head.getY( - 1); break;case DOWN:newHead = new Cell(head.getX(, head.getY( + 1); break;case LEFT:newHead = new Cell(head.getX( - 1, head.getY(); break;case RIGHT:newHead = new Cell(head.getX( + 1, head.getY(); break;default:newHead = head; // 默认不移动}//添加新的蛇头body.add(0, newHead);//删除尾部,即移动效果body.remove(body.size( - 1);}// getter和setter方法```接下来,我们创建一个Cell类来表示每一个游戏格子的位置。

java编写的贪吃蛇游戏源码[1]

java编写的贪吃蛇游戏源码[1]

一、函数程序结构图注释:贪吃蛇Draw reAppear getM setM getN setNpaintScoreCheck.stopgetscoresetscoreprocessKeyMian函数DeadifTailaddDeltailHeadaddTailadd()Deltail()HeadadddrawmoveeatkeyPressedRunPauseRestartgo_onisPausesetPauseinstall定义方向变量L,U,D,RDrawKeypressedYardTextSnakePaintThreadNodeKeyMonitorFoodDirection类名方法名MapDraw二、题目分析通过分析该程序基本需要以下几个类:Text(Main方法)、Snake(蛇)、Food (食物)、Yard(窗口)、Map(地图)、Node(节点)、PaintThread(线程)、Dir(方向)、KeyMonitor(键盘监听)。

主要实现蛇运动的基本操作和一些事件反应、游戏分数的记录、暂停、重新开始、更改蛇蛇颜色,蛇的移动速度,地图、死亡模式的改变等功能。

本程序运用Java语言知识,用面向对象的思维设计“贪吃蛇”游戏。

三、结果分析运行程序出现游戏界面,蛇(Snake)头自动向前移动,用键盘的上(Up)下(Down)左(Left)右(Right)键控制蛇头的移动方向。

游戏窗体中在随机位置出现紫色的食物(Food)。

1、每吃一个加5分2、默认撞墙不死3、默认速度34、默认地图15、默认普通蛇身6、默认30分提升一个速度档次7、默认每个速度都走完后更换地图并且速度恢复默认,积分归零功能键:1、按F1重新开始2、按空格键暂停/继续3、按1/2/3/4/5数字键设置蛇的移动速度(逐渐变快)4、按F2更换地图(3种)5、按F3普通蛇/彩蛇的切换6、按F4更换游戏模式(蛇撞到最外围为死亡还是从另一端返回)该程序初步完成了“贪吃蛇”的游戏雏形,但是缺乏完善。

贪吃蛇小游戏编程实现

贪吃蛇小游戏编程实现

贪吃蛇小游戏编程实现贪吃蛇(Snake)游戏是一种经典的益智游戏,原理是控制一个蛇在有限的游戏区域中移动并吃食物,蛇的身体随着吃的食物长度增加,游戏目标是使蛇吃到尽可能多的食物并避免撞到边界或自身身体。

本文将介绍如何使用编程语言实现一个贪吃蛇小游戏。

一、游戏环境设置为了实现贪吃蛇小游戏,我们首先需要创建一个游戏环境。

游戏环境可以是一个矩形区域,根据游戏需求,可以自定义其大小。

在游戏环境中,我们需要绘制蛇、食物以及游戏得分等元素。

二、蛇的移动控制实现贪吃蛇游戏的关键是控制蛇的移动。

蛇的移动通常由用户输入的方向控制,例如使用键盘的上、下、左、右键控制蛇的移动方向。

在每一次蛇的移动中,我们需要更新蛇的位置并判断是否吃到了食物或者撞到了边界或自身身体。

三、食物的生成与吃掉在游戏中,随机生成食物是必要的。

当蛇吃到食物时,蛇的长度会增加,并且在游戏区域中生成一个新的食物。

为了触发吃食物的事件,我们需要判断蛇的头部是否与食物的位置重合,如果重合则表示蛇吃到了食物。

四、游戏结束条件判断游戏在满足某些条件下结束,例如蛇撞到了边界或自身的身体。

当蛇的头部位置超过了游戏区域或者与自己的身体发生碰撞时,游戏结束,玩家可以选择重新开始游戏或者退出游戏。

五、计分系统为了增加游戏的挑战性,我们可以加入计分系统。

在每次吃到食物时,玩家得分增加,并在游戏界面显示得分。

可以根据得分的高低设置等级,并随着游戏的进行提高速度或其他难度。

六、游戏界面设计为了提升游戏的体验,我们可以对游戏界面进行设计美化。

可以使用不同颜色和图案来绘制游戏元素,使游戏界面更加美观。

同时,我们还可以为游戏界面添加音效或背景音乐,增加游戏的趣味性。

七、总结通过编程实现贪吃蛇小游戏,我们可以提升自己的编程能力,并享受自己设计的游戏带来的乐趣。

贪吃蛇小游戏不仅简单有趣,而且可以帮助我们锻炼思维敏捷性和逻辑思维能力。

希望本文对你有所帮助,让你更好地实现贪吃蛇小游戏的编程实现。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

*Snake为主Activity类。

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

Java贪吃蛇系统简历

Java贪吃蛇系统简历

Java贪吃蛇系统简历
“贪吃蛇大作战”游戏是一个经典的游戏,它因操作简单、娱乐性强,自从计算机实现以来,深受广大电脑玩家的喜爱,本项目基于Java技术,开发了一个操作简单、界面美观、功能较齐全的“贪吃蛇”游戏。

通过本游戏的开发,达到学习Java技术和熟悉软件开发流程的目的。

本系统主要是完成贪吃蛇游戏的基本操作,用户可自己练习和娱乐。

需要满足以下几点要求:
(1)利用方向键来改变蛇的运行方向。

(2)空格键暂停或继续游戏,并在随机的地方产生食物。

(3)吃到食物就变成新的蛇体(蛇身长度变长,游戏继续)。

实现过程
(1)绘制窗体对象。

(2)静态UI设计(包括小蛇,食物,游戏区域和标题区域)。

(3)使用键盘监听事件和定时器实现小蛇的移动。

(4)小蛇与食物碰撞的实现。

(5)定义变量存放小蛇长度,遍历数组实现小蛇身体的增加功能。

(6)退出条件:当游戏积分到达指定分数,游戏退出。

总结
本游戏的设计思路类似于游戏“贪吃蛇大作战”,程序在一些功能的实现上还存在许多不足,但该项目的实现对Java新手的实战能力有很大
的提升。

在使用Java编写该项目时遇到了很多问题,在解决问题时,可以对java的面向对象编程有更加深入的理解和认识。

Android SDK中的贪吃蛇游戏

Android SDK中的贪吃蛇游戏

Android SDK中的贪吃蛇游戏贪吃蛇,打开了手机游戏的先河。

是NOKIA公司在发展手机游戏上的一次成功尝试。

让手机游戏玩家们爱不释手,引起了手机游戏的开发风暴,各个手机厂商纷纷加入这个阵营。

手机游戏开发从此拉开了序幕。

Android, OPhone OS作为手机开发的后起之秀,肯定不会错过这份蛋糕的分享。

它不仅解决了以住手机游戏的不足(屏幕分辨率小,内存少)的毛病。

而且还在手机游戏软件开发上提供更全,更新的API ,更大的内存,而且还可以用JAVA的泛形,提高他的开发速度。

现在我们就以ANDROID SDK 里面自带的贪吃蛇作为例子,去看看这个贪吃蛇是怎么去开发。

开发过手机游戏的人就知道手机开发的三要素:画布(用来绘画游戏的画面)键盘事件,实时刷新。

我们知道一般的游戏画面都是由地图,精灵(由游戏的主角,怪物组成),那我们现在就看看贪吃蛇是怎样他的地图的:一、实现游戏的界面:1、先声明用来存放绘画图像的X,Y轴的位置的数组:private int[][] mTileGrid;///***************Tileindex 图片的索引X轴的位置:Y轴的位置:**************/2、编写存放图片索引用图片的X,Y轴位置;public void setTile(int tileindex, int x, int y) {mTileGrid[x][y] = tileindex;}3、调用以上的方法以循环的方式位置数组赋值以及图片的索引,private void updateWalls() {for (int x = 0; x < mXTileCount; x++) {setTile(GREEN_STAR, x, 0);//设置顶部的界线的位置setTile(GREEN_STAR, x, mYTileCount - 1);// 设置底部界线的}for (int y = 1; y < mYTileCount - 1; y++) {setTile(GREEN_STAR, 0, y);/设置左边的界线的位置setTile(GREEN_STAR, mXTileCount - 1, y);/设置右边的界线的位置}}4、重写VIEW 类里面的方法。

JAVA程序源代码(贪吃蛇)

JAVA程序源代码(贪吃蛇)

贪吃蛇源代码将Location、LocationRO、SnakeFrame、SnakeModel、SnakePanel放到命名为snake的文件夹里,主函数MainApp放到外面运行主函数即可实现。

主函数package snake;import javax.swing.*;import snake.*;public class MainApp {public static void main(String[] args) {JFrame.setDefaultLookAndFeelDecorated(true);SnakeFrame frame=new SnakeFrame();frame.setSize(350,350);frame.setResizable(false);frame.setLocation(330,220);frame.setTitle("贪吃蛇");frame.setV isible(true);}}package snake;public class Location {private int x;private int y;Location(int x,int y){this.x=x;this.y=y;}int getX(){return x;}int getY(){return y;}void setX(int x){this.x=x;}void setY(int y){this.y=y;}public boolean equalOrRev(Location e){return ((e.getX()==getX())&&(e.getY()==getY()))||((e.getX()==getX())&&(e.getY()==-1*getY()))||((e.getX()==-1*getX())&&(e.getY()==getY()));}public boolean equals(Location e){return(e.getX()==getX())&&(e.getY()==getY());}public boolean reverse(Location e){return ((e.getX()==getX())&&(e.getY()==-1*getY()))||((e.getX()==-1*getX())&&(e.getY()==getY()));}}package snake;public class LocationRO{private int x;private int y;LocationRO(int x,int y){this.x=x;this.y=y;}int getX(){return x;}int getY(){return y;}public boolean equalOrRev(LocationRO e){return ((e.getX()==getX())&&(e.getY()==getY()))||((e.getX()==getX())&&(e.getY()==-1*getY()))||((e.getX()==-1*getX())&&(e.getY()==getY()));}public boolean equals(LocationRO e){return(e.getX()==getX())&&(e.getY()==getY());}public boolean reverse(LocationRO e){return ((e.getX()==getX())&&(e.getY()==-1*getY()))||((e.getX()==-1*getX())&&(e.getY()==getY()));}}package snake;import java.awt.*;import java.awt.event.*;import javax.swing.*;class SnakeFrame extends JFrame implements ActionListener{final SnakePanel p=new SnakePanel(this);JMenuBar menubar=new JMenuBar();JMenu fileMenu=new JMenu("文件");JMenuItem newgameitem=new JMenuItem("开始");JMenuItem stopitem=new JMenuItem("暂停");JMenuItem runitem=new JMenuItem("继续");JMenuItem exititem=new JMenuItem("退出");//"设置"菜单JMenu optionMenu=new JMenu("设置");//等级选项ButtonGroup groupDegree = new ButtonGroup();JRadioButtonMenuItem oneItem= new JRadioButtonMenuItem("初级");JRadioButtonMenuItem twoItem= new JRadioButtonMenuItem("中级");JRadioButtonMenuItem threeItem= new JRadioButtonMenuItem("高级");JMenu degreeMenu=new JMenu("等级");JMenu helpMenu=new JMenu("帮助");JMenuItem helpitem=new JMenuItem("操作指南");final JCheckBoxMenuItem showGridItem = new JCheckBoxMenuItem("显示网格");JLabel scorelabel;public JTextField scoreField;private long speedtime=200;private String helpstr = "游戏说明:\n1 :方向键控制蛇移动的方向."+"\n2 :单击菜单'文件->开始'开始游戏."+"\n3 :单击菜单'文件->暂停'或者单击键盘空格键暂停游戏."+"\n4 :单击菜单'文件->继续'继续游戏."+"\n5 :单击菜单'设置->等级'可以设置难度等级."+"\n6 :单击菜单'设置->显示网格'可以设置是否显示网格."+ "\n7 :红色为食物,吃一个得10分同时蛇身加长."+"\n8 :蛇不可以出界或自身相交,否则结束游戏.";SnakeFrame(){setJMenuBar(menubar);fileMenu.add(newgameitem);fileMenu.add(stopitem);fileMenu.add(runitem);fileMenu.add(exititem);menubar.add(fileMenu);oneItem.setSelected(true);groupDegree.add(oneItem);groupDegree.add(twoItem);groupDegree.add(threeItem);degreeMenu.add(oneItem);degreeMenu.add(twoItem);degreeMenu.add(threeItem);optionMenu.add(degreeMenu);// 风格选项showGridItem.setSelected(true);optionMenu.add(showGridItem);menubar.add(optionMenu);helpMenu.add(helpitem);menubar.add(helpMenu);Container contentpane=getContentPane();contentpane.setLayout(new FlowLayout());contentpane.add(p);scorelabel=new JLabel("得分: ");scoreField=new JTextField("0",15);scoreField.setEnabled(false);scoreField.setHorizontalAlignment(0);JPanel toolPanel=new JPanel();toolPanel.add(scorelabel);toolPanel.add(scoreField);contentpane.add(toolPanel);oneItem.addActionListener(this);twoItem.addActionListener(this);threeItem.addActionListener(this);newgameitem.addActionListener(this);stopitem.addActionListener(this);runitem.addActionListener(this);exititem.addActionListener(this);helpitem.addActionListener(this);showGridItem.addActionListener(this);}public void actionPerformed(ActionEvent e){try{if(e.getSource()==helpitem){JOptionPane.showConfirmDialog(p,helpstr,"操纵说明",JOptionPane.PLAIN_MESSAGE);}else if(e.getSource()==exititem)System.exit(0);else if(e.getSource()==newgameitem)p.newGame(speedtime);else if(e.getSource()==stopitem)p.stopGame();else if(e.getSource()==runitem)p.returnGame();else if(e.getSource()==showGridItem){if(!showGridItem.isSelected()){p.setBackground(Color.lightGray);}else{p.setBackground(Color.darkGray);}}else if(e.getSource()==oneItem) speedtime=200;else if(e.getSource()==twoItem) speedtime=100;else if(e.getSource()==threeItem) speedtime=50;}catch(Exception ee){ee.printStackTrace();}}}package snake;import java.util.*;import javax.swing.JOptionPane;public class SnakeModel {private int rows,cols;//行列数private Location snakeHead,runingDiriction;//运行方向private LocationRO[][] locRO;//LocationRO类数组private LinkedList snake,playBlocks;//蛇及其它区域块private LocationRO snakeFood;//目标食物private int gameScore=0; //分数private boolean AddScore=false;//加分// 获得蛇头public LocationRO getSnakeHead(){return (LocationRO)(snake.getLast());}//蛇尾public LocationRO getSnakeTail(){return (LocationRO)(snake.getFirst());}//运行路线public Location getRuningDiriction(){return runingDiriction;}//获得蛇实体区域public LinkedList getSnake(){return snake;}//其他区域public LinkedList getOthers(){return playBlocks;}//获得总分public int getScore(){return gameScore;}//获得增加分数public boolean getAddScore(){return AddScore;}//设置蛇头方向private void setSnakeHead(Location snakeHead){ this.snakeHead=snakeHead;}//获得目标食物public LocationRO getSnakeFood(){return snakeFood;}//随机设置目标食物private void setSnakeFood(){snakeFood=(LocationRO)(playBlocks.get((int)(Math.random()*playBlocks.size()))); }//移动private void moveTo(Object a,LinkedList fromlist,LinkedList tolist){fromlist.remove(a);tolist.add(a);}//初始设置public void init(){playBlocks.clear();snake.clear();gameScore=0;for(int i=0;i<rows;i++){for(int j=0;j<cols;j++){playBlocks.add(locRO[i][j]);}}//初始化蛇的形状for(int i=4;i<7;i++){moveTo(locRO[4][i],playBlocks,snake);}//蛇头位置snakeHead=new Location(4,6);//设置随机块snakeFood=new LocationRO(0,0);setSnakeFood();//初始化运动方向runingDiriction=new Location(0,1);}//Snake构造器public SnakeModel(int rows1,int cols1){rows=rows1;cols=cols1;locRO=new LocationRO[rows][cols];snake=new LinkedList();playBlocks=new LinkedList();for(int i=0;i<rows;i++){for(int j=0;j<cols;j++){locRO[i][j]=new LocationRO(i,j);}}init();}/**定义布尔型move方法,如果运行成功则返回true,否则返回false*参数direction是Location类型,*direction 的值:(-1,0)表示向上;(1,0)表示向下;*(0,-1)表示向左;(0,1)表示向右;**/public boolean move(Location direction){//判断设定的方向跟运行方向是不是相反if (direction.reverse(runingDiriction)){snakeHead.setX(snakeHead.getX()+runingDiriction.getX());snakeHead.setY(snakeHead.getY()+runingDiriction.getY());}else{snakeHead.setX(snakeHead.getX()+direction.getX());snakeHead.setY(snakeHead.getY()+direction.getY());}//如果蛇吃到了目标食物try{if ((snakeHead.getX()==snakeFood.getX())&&(snakeHead.getY()==snakeFood.getY())){moveTo(locRO[snakeHead.getX()][snakeHead.getY()],playBlocks,snake);setSnakeFood();gameScore+=10;AddScore=true;}else{AddScore=false;//是否出界if((snakeHead.getX()<rows)&&(snakeHead.getY()<cols)&&(snakeHead.getX()>=0&&(snak eHead.getY()>=0))){//如果不出界,判断是否与自身相交if(snake.contains(locRO[snakeHead.getX()][snakeHead.getY()])){//如果相交,结束游戏JOptionPane.showMessageDialog(null, "Game Over!", "游戏结束",RMA TION_MESSAGE);return false;}else{//如果不相交,就把snakeHead加到snake里面,并且把尾巴移出moveTo(locRO[snakeHead.getX()][snakeHead.getY()],playBlocks,snake);moveTo(snake.getFirst(),snake,playBlocks);}}else{//出界,游戏结束JOptionPane.showMessageDialog(null, "Game Over!", "游戏结束", RMA TION_MESSAGE);return false;}}}catch(ArrayIndexOutOfBoundsException e){return false;}//设置运行方向if (!(direction.reverse(runingDiriction)||direction.equals(runingDiriction))){runingDiriction.setX(direction.getX());runingDiriction.setY(direction.getY());}return true;}}package snake;import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.util.*;public class SnakePanel extends JPanel implements Runnable,KeyListener{JFrame parent=new JFrame();private int row=20; //网格行数private int col=30; //列数private JPanel[][] gridsPanel; //面板网格private Location direction;//方向定位private SnakeModel snake; //贪吃蛇private LinkedList snakeBody; //蛇的身体private LinkedList otherBlocks; //其他区域private LocationRO snakeHead; //蛇的头部private LocationRO snakeFood; //目标食物private Color bodyColor=Color.orange;//蛇的身体颜色private Color headColor=Color.black; //蛇的头部颜色private Color foodColor=Color.red; //目标食物颜色private Color othersColor=Color.lightGray;//其他区域颜色private int gameScore=0; //总分private long speed; //速度(难度设置)private boolean AddScore; //加分private Thread t; //线程private boolean isEnd; //暂停private static boolean notExit;// 构造器,初始化操作public SnakePanel(SnakeFrame parent){this.parent=parent;gridsPanel=new JPanel[row][col];otherBlocks=new LinkedList();snakeBody=new LinkedList();snakeHead=new LocationRO(0,0);snakeFood=new LocationRO(0,0);direction=new Location(0,1);// 布局setLayout(new GridLayout(row,col,1,1));for(int i=0;i<row;i++){for(int j=0;j<col;j++){gridsPanel[i][j]=new JPanel();gridsPanel[i][j].setBackground(othersColor);add(gridsPanel[i][j]);}}addKeyListener(this);}// 开始游戏public void newGame(long speed){this.speed=speed;if (notExit) {snake.init();}else{snake=new SnakeModel(row,col);notExit=true;t=new Thread(this);t.start();}requestFocus();direction.setX(0);direction.setY(1);gameScore=0;updateTextFiled(""+gameScore);isEnd=false;}// 暂停游戏public void stopGame(){requestFocus();isEnd=true;}// 继续public void returnGame(){requestFocus();isEnd=false;}// 获得总分public int getGameScore(){return gameScore;}//更新总分private void updateTextFiled(String str){((SnakeFrame)parent).scoreField.setText(str); }//更新各相关单元颜色private void updateColors(){// 设定蛇身颜色snakeBody=snake.getSnake();Iterator i =snakeBody.iterator();while(i.hasNext()){LocationRO t=(LocationRO)(i.next());gridsPanel[t.getX()][t.getY()].setBackground(bodyColor);}//设定蛇头颜色snakeHead=snake.getSnakeHead();gridsPanel[snakeHead.getX()][snakeHead.getY()].setBackground(headColor);//设定背景颜色otherBlocks=snake.getOthers();i =otherBlocks.iterator();while(i.hasNext()){LocationRO t=(LocationRO)(i.next());gridsPanel[t.getX()][t.getY()].setBackground(othersColor);}//设定临时块的颜色snakeFood=snake.getSnakeFood();gridsPanel[snakeFood.getX()][snakeFood.getY()].setBackground(foodColor); }public boolean isFocusTraversable(){return true;}//实现Runnable接口public void run(){while(true){try{Thread.sleep(speed);}catch (InterruptedException e){}if(!isEnd){isEnd=!snake.move(direction);updateColors();if(snake.getAddScore()){gameScore+=10;updateTextFiled(""+gameScore);}}}}//实现KeyListener接口public void keyPressed(KeyEvent event){int keyCode = event.getKeyCode();if(notExit){if (keyCode == KeyEvent.VK_LEFT) { //向左direction.setX(0);direction.setY(-1);}else if (keyCode == KeyEvent.VK_RIGHT) { //向右direction.setX(0);direction.setY(1);}else if (keyCode == KeyEvent.VK_UP) { //向上direction.setX(-1);direction.setY(0);}else if (keyCode == KeyEvent.VK_DOWN) { //向下direction.setX(1);direction.setY(0);}else if (keyCode == KeyEvent.VK_SPACE){ //空格键isEnd=!isEnd;}}}public void keyReleased(KeyEvent event){}public void keyTyped(KeyEvent event){}}。

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

【贪吃蛇—Java程序员写Android游戏】系列 1.Android SDKSample-Snake详解分类:1.Android【贪吃蛇—Java程序员写Android游戏】2011-03-31 16:18 7307人阅读评论(13) 收藏举报Snake也是一个经典游戏了, Nokia蓝屏机的王牌游戏之一。

Android SDK 1.5就有了它的身影。

我们这里就来详细解析一下 Android SDK Sample中的 Snake工程。

本工程基于 SDK 2.3.3版本中的工程,路径为:%Android_SDK_HOME% /samples/android-10/Snake一、 Eclipse工程通过 File-New Project-Android-Android Project,选择“ Create project from existing sample”创建自己的应用 SnakeAndroid,如下图:运行效果如下图:二、工程结构和类图其实 Snake的工程蛮简单的,源文件就三个: Snake.java SnakeView.javaTileView.java。

Snake类是这个游戏的入口点, TitleView类进行游戏的绘画, SnakeView类则是对游戏控制操作的处理。

Coordinate,RefreshHandler是 2个辅助类,也是 SnakeView类中的内部类。

其中, Coordinate是一个点的坐标( x, y),RefreshHandler将 RefreshHandler对象绑定某个线程并给它发送消息。

如下图:任何游戏都需要有个引擎来推动游戏的运行,最简化的游戏引擎就是:在一个线程中 While循环,检测用户操作,对用户的操作作出反应,更新游戏的界面,直到用户退出游戏。

在 Snake这个游戏中,辅助类 RefreshHandler继承自 Handler,用来把 RefreshHandler与当前线程进行绑定,从而可以直接给线程发送消息并处理消息。

注意一点: Handle对消息的处理都是异步。

RefreshHandler在Handler的基础上增加 sleep()接口,用来每隔一个时间段后给当前线程发送一个消息。

handleMessage()方法在接受消息后,根据当前的游戏状态重绘界面,运行机制如下:这比较类似定时器的概念,在特定的时刻发送消息,根据消息处理相应的事件。

update()与 sleep()间接的相互调用就构成了一个循环。

这里要注意: mRedrawHandle绑定的是 Avtivity所在的线程,也就是程序的主线程;另外由于 sleep()是个异步函数,所以 update()与 sleep()之间的相互调用才没有构成死循环。

最后分析下游戏数据的保存机制,如下:这里考虑了 Activity的生命周期:如果用户在游戏期间离开游戏界面,游戏暂停;或者由于内存比较紧张,Android关闭游戏释放内存,那么当用户返回游戏界面的时候恢复到上次离开时的界面。

三、源码解析详细解析下源代码,由于代码量不大,以注释的方式列出如下:1、 Snake.java[java]view plaincopy1./**2. * <p>Title: Snake</p>3. * <p>Copyright: (C) 2007 The Android Open Source Project. Licensed under the Apache License, Version 2.0 (the "License")</p>4. * @author Gavin 标注5. */6.package com.deaboway.snake;7.import android.app.Activity;8.import android.os.Bundle;9.import android.widget.TextView;10./**11. * Snake: a simple game that everyone can enjoy.12. *13. * This is an implementation of the classic Game "Snake", in which you control a14. * serpent roaming around the garden looking for apples. Be careful, though,15. * because when you catch one, not only will you become longer, but you'll move16. * faster. Running into yourself or the walls will end the game.17. *18. */19.// 贪吃蛇:经典游戏,在一个花园中找苹果吃,吃了苹果会变长,速度变快。

碰到自己和墙就挂掉。

20.public class Snake extends Activity {21.private SnakeView mSnakeView;22.private static String ICICLE_KEY = "snake-view";23./**24. * Called when Activity is first created. Turns off the title bar, sets up25. * the content views, and fires up the SnakeView.26. *27. */28.// 在 activity 第一次创建时被调用29.@Override30.public void onCreate(Bundle savedInstanceState) {31.super.onCreate(savedInstanceState);32. setContentView(yout.snake_layout);33. mSnakeView = (SnakeView) findViewById(R.id.snake);34. mSnakeView.setTextView((TextView) findViewById(R.id.text));35.// 检查存贮状态以确定是重新开始还是恢复状态36.if (savedInstanceState == null) {37.// 存储状态为空,说明刚启动可以切换到准备状态38. mSnakeView.setMode(SnakeView.READY);39. } else {40.// 已经保存过,那么就去恢复原有状态41. Bundle map = savedInstanceState.getBundle(ICICLE_KEY);42.if (map != null) {43.// 恢复状态44. mSnakeView.restoreState(map);45. } else {46.// 设置状态为暂停47. mSnakeView.setMode(SnakeView.PAUSE);48. }49. }50. }51.// 暂停事件被触发时52.@Override53.protected void onPause() {54.super.onPause();55.// Pause the game along with the activity56. mSnakeView.setMode(SnakeView.PAUSE);57. }58.// 状态保存59.@Override60.public void onSaveInstanceState(Bundle outState) {61.// 存储游戏状态到View里62. outState.putBundle(ICICLE_KEY, mSnakeView.saveState());63. }64.}2、 SnakeView.java[java]view plaincopy1./**2. * <p>Title: Snake</p>3. * <p>Copyright: (C) 2007 The Android Open Source Project. Licensed under the Apache License, Version 2.0 (the "License")</p>4. * @author Gavin 标注5. */6.package com.deaboway.snake;7.import java.util.ArrayList;8.import java.util.Random;9.import android.content.Context;10.import android.content.res.Resources;11.import android.os.Handler;12.import android.os.Message;13.import android.util.AttributeSet;14.import android.os.Bundle;15.import android.util.Log;16.import android.view.KeyEvent;17.import android.view.View;18.import android.widget.TextView;19./**20. * SnakeView: implementation of a simple game of Snake21. *22. *23. */24.public class SnakeView extends TileView {25.private static final String TAG = "Deaboway";26./**27. * Current mode of application: READY to run, RUNNING, or you have already28. * lost. static final ints are used instead of an enum for performance29. * reasons.30. */31.// 游戏状态,默认值是准备状态32.private int mMode = READY;33.// 游戏的四个状态暂停准备运行和失败34.public static final int PAUSE = 0;35.public static final int READY = 1;36.public static final int RUNNING = 2;37.public static final int LOSE = 3;38.// 游戏中蛇的前进方向,默认值北方39.private int mDirection = NORTH;40.// 下一步的移动方向,默认值北方41.private int mNextDirection = NORTH;42.// 游戏方向设定北南东西43.private static final int NORTH = 1;44.private static final int SOUTH = 2;45.private static final int EAST = 3;46.private static final int WEST = 4;47./**48. * Labels for the drawables that will be loaded into the TileView class49. */50.// 三种游戏元51.private static final int RED_STAR = 1;52.private static final int YELLOW_STAR = 2;53.private static final int GREEN_STAR = 3;54./**55. * mScore: used to track the number of apples captured mMoveDelay: number of56. * milliseconds between snake movements. This will decrease as apples are57. * captured.58. */59.// 游戏得分60.private long mScore = 0;61.// 移动延迟62.private long mMoveDelay = 600;63./**64. * mLastMove: tracks the absolute time when the snake last moved, and is65. * used to determine if a move should be made based on mMoveDelay.66. */67.// 最后一次移动时的毫秒时刻68.private long mLastMove;69./**70. * mStatusText: text shows to the user in some run states72.// 显示游戏状态的文本组件73.private TextView mStatusText;74./**75. * mSnakeTrail: a list of Coordinates that make up the snake's body76. * mAppleList: the secret location of the juicy apples the snake craves.77. */78.// 蛇身数组(数组以坐标对象为元素)79.private ArrayList<Coordinate> mSnakeTrail = new ArrayList<Coordinate>();80.// 苹果数组(数组以坐标对象为元素)81.private ArrayList<Coordinate> mAppleList = new ArrayList<Coordinate>();82./**83. * Everyone needs a little randomness in their life84. */85.// 随机数86.private static final Random RNG = new Random();87./**88. * Create a simple handler that we can use to cause animation to happen. We89. * set ourselves as a target and we can use the sleep() function to cause an90. * update/invalidate to occur at a later date.91. */92.// 创建一个Refresh Handler来产生动画:通过sleep()来实现93.private RefreshHandler mRedrawHandler = new RefreshHandler();94.// 一个Handler95.class RefreshHandler extends Handler {96.// 处理消息队列97.@Override98.public void handleMessage(Message msg) {99.// 更新View对象100. SnakeView.this.update();101.// 强制重绘102. SnakeView.this.invalidate();103. }104.// 延迟发送消息105.public void sleep(long delayMillis) {106.this.removeMessages(0);107. sendMessageDelayed(obtainMessage(0), delayMillis);108. }109. };110./**111. * Constructs a SnakeView based on inflation from XML112. *113. * @param context114. * @param attrs116.// 构造函数117.public SnakeView(Context context, AttributeSet attrs) {118.super(context, attrs);119.// 构造时初始化120. initSnakeView();121. }122.public SnakeView(Context context, AttributeSet attrs, int defStyle) { 123.super(context, attrs, defStyle);124. initSnakeView();125. }126.// 初始化127.private void initSnakeView() {128.// 可选焦点129. setFocusable(true);130. Resources r = this.getContext().getResources();131.// 设置贴片图片数组132. resetTiles(4);133.// 把三种图片存到Bitmap对象数组134. loadTile(RED_STAR, r.getDrawable(R.drawable.redstar));135. loadTile(YELLOW_STAR, r.getDrawable(R.drawable.yellowstar));136. loadTile(GREEN_STAR, r.getDrawable(R.drawable.greenstar));137. }138.// 开始新的游戏——初始化139.private void initNewGame() {140.// 清空ArrayList列表141. mSnakeTrail.clear();142. mAppleList.clear();143.// For now we're just going to load up a short default eastbound snake 144.// that's just turned north145.// 创建蛇身146. mSnakeTrail.add(new Coordinate(7, 7));147. mSnakeTrail.add(new Coordinate(6, 7));148. mSnakeTrail.add(new Coordinate(5, 7));149. mSnakeTrail.add(new Coordinate(4, 7));150. mSnakeTrail.add(new Coordinate(3, 7));151. mSnakeTrail.add(new Coordinate(2, 7));152.// 新的方向:北方153. mNextDirection = NORTH;154.// 2个随机位置的苹果155. addRandomApple();156. addRandomApple();157.// 移动延迟158. mMoveDelay = 600;159.// 初始得分0160. mScore = 0;161. }3、 TileView.java[java]view plaincopy1./**2. * <p>Title: Snake</p>3. * <p>Copyright: (C) 2007 The Android Open Source Project. Licensed under the Apache License, Version 2.0 (the "License")</p>4. * @author Gavin 标注5. */6.package com.deaboway.snake;7.import android.content.Context;8.import android.content.res.TypedArray;9.import android.graphics.Bitmap;10.import android.graphics.Canvas;11.import android.graphics.Paint;12.import android.graphics.drawable.Drawable;13.import android.util.AttributeSet;14.import android.view.View;15./**16. * TileView: a View-variant designed for handling arrays of "icons" or other17. * drawables.18. *19. */20.// View 变种,用来处理一组贴片——“icons”或其它可绘制的对象21.public class TileView extends View {22./**23. * Parameters controlling the size of the tiles and their range within view.24. * Width/Height are in pixels, and Drawables will be scaled to fit to these25. * dimensions. X/Y Tile Counts are the number of tiles that will be drawn.26. */27.protected static int mTileSize;28.// X轴的贴片数量29.protected static int mXTileCount;30.// Y轴的贴片数量31.protected static int mYTileCount;32.// X偏移量33.private static int mXOffset;34.// Y偏移量35.private static int mYOffset;36./**37. * A hash that maps integer handles specified by the subclasser to the38. * drawable that will be used for that reference39. */40.// 贴片图像的图像数组41.private Bitmap[] mTileArray;42./**43. * A two-dimensional array of integers in which the number represents the44. * index of the tile that should be drawn at that locations45. */46.// 保存每个贴片的索引——二维数组47.private int[][] mTileGrid;48.// Paint对象(画笔、颜料)49.private final Paint mPaint = new Paint();50.// 构造函数51.public TileView(Context context, AttributeSet attrs, int defStyle) {52.super(context, attrs, defStyle);53. TypedArray a = context.obtainStyledAttributes(attrs,54. R.styleable.TileView);55. mTileSize = a.getInt(R.styleable.TileView_tileSize, 12);56. a.recycle();57. }58.public TileView(Context context, AttributeSet attrs) {59.super(context, attrs);60. TypedArray a = context.obtainStyledAttributes(attrs,61. R.styleable.TileView);62. mTileSize = a.getInt(R.styleable.TileView_tileSize, 12);63. a.recycle();64. }65./**66. * Rests the internal array of Bitmaps used for drawing tiles, and sets the67. * maximum index of tiles to be inserted68. *69. * @param tilecount70. */71.// 设置贴片图片数组72.public void resetTiles(int tilecount) {73. mTileArray = new Bitmap[tilecount];74. }75.// 回调:当该View的尺寸改变时调用,在onDraw()方法调用之前就会被调用,所以用来设置一些变量的初始值76.// 在视图大小改变的时候调用,比如说手机由垂直旋转为水平77.@Override78.protected void onSizeChanged(int w, int h, int oldw, int oldh) {79.// 定义X轴贴片数量80. mXTileCount = (int) Math.floor(w / mTileSize);81. mYTileCount = (int) Math.floor(h / mTileSize);82.// X轴偏移量83. mXOffset = ((w - (mTileSize * mXTileCount)) / 2);84.// Y轴偏移量85. mYOffset = ((h - (mTileSize * mYTileCount)) / 2);86.// 定义贴片的二维数组87. mTileGrid = new int[mXTileCount][mYTileCount];88.// 清空所有贴片89. clearTiles();90. }91./**92. * Function to set the specified Drawable as the tile for a particular93. * integer key.94. *95. * @param key96. * @param tile97. */98.// 给mTileArray这个Bitmap图片数组设置值99.public void loadTile(int key, Drawable tile) {100. Bitmap bitmap = Bitmap.createBitmap(mTileSize, mTileSize,101. Bitmap.Config.ARGB_8888);102. Canvas canvas = new Canvas(bitmap);103. tile.setBounds(0, 0, mTileSize, mTileSize);104.// 把一个drawable转成一个Bitmap105. tile.draw(canvas);106.// 在数组里存入该Bitmap107. mTileArray[key] = bitmap;108. }109./**110. * Resets all tiles to 0 (empty)111. *112. */113.// 清空所有贴片114.public void clearTiles() {115.for (int x = 0; x < mXTileCount; x++) {116.for (int y = 0; y < mYTileCount; y++) {117.// 全部设置为0118. setTile(0, x, y);119. }120. }121. }122./**123. * Used to indicate that a particular tile (set with loadTile and referenced124. * by an integer) should be drawn at the given x/y coordinates during the125. * next invalidate/draw cycle.126. *127. * @param tileindex128. * @param x129. * @param y130. */131.// 给某个贴片位置设置一个状态索引132.public void setTile(int tileindex, int x, int y) {133. mTileGrid[x][y] = tileindex;134. }135.// onDraw 在视图需要重画的时候调用,比如说使用invalidate刷新界面上的某个矩形区域136.@Override137.public void onDraw(Canvas canvas) {138.super.onDraw(canvas);139.for (int x = 0; x < mXTileCount; x += 1) {140.for (int y = 0; y < mYTileCount; y += 1) {141.// 当索引大于零,也就是不空时142.if (mTileGrid[x][y] > 0) {143.// mTileGrid中不为零时画此贴片144. canvas.drawBitmap(mTileArray[mTileGrid[x][y]], mXOffset + x 145. * mTileSize, mYOffset + y * mTileSize, mPaint);146. }147. }148. }149. }150.}四、工程文件下载为了方便大家阅读,可以到如下地址下载工程源代码:/source/3145349五、小结及下期预告:本次详细解析了 Android SDK 自带 Sample—— Snake的结构和功能。

相关文档
最新文档