安卓小游戏--附加标准源代码(吃豆豆)

合集下载

吃豆豆手机游戏毕业设计说明书

吃豆豆手机游戏毕业设计说明书

毕业设计说明书吃豆豆手机游戏的设计与开发学专 指导教师:2010年 6 月吃豆豆手机游戏的设计与开发摘要随着移动电话的普及率越来越高,手机已经成为人们生活中的必需品。

同时,随着科技的发展,移动电话的功能也越来越强,手机娱乐已经成为一项充满发展前景和商机的产业。

虽然目前手机的处理能力与个人计算机的标准处理能力相比很有限,但是足够运行一个相对小型的游戏。

本文先从Java手机游戏的背景出发,介绍了Java手机游戏的发展现状,然后从整体上介绍本吃豆人游戏开发的模型、结构分析和具体功能实现,游戏的接口和运作方式。

通过对手机游戏开发,MIDP 2.0,以及JSR-184的研究,采用立即模式,运用深度优先遍历算法来随机生成游戏地图,并尽力模拟手机游戏的普遍性形式,实现一个操作简单,并有一定可玩性的完整3D手机迷宫游戏。

关键词:J2ME;MIDP 2.0;Pac-Man;立即模式(immediate mode);深度优先遍历。

Eat doug cellular phone game design and development.AbstractWith mobile phone penetration rate increasing, mobile phones have become a necessity in people's lives. At the same time, with the development of technology, the functions of mobile phones more and more strong, mobile entertainment has become a full development prospects and business opportunities in the industry. Although at present the handling capacity of mobile phones and personal computer processing power than the standard is very limited, but enough of a relatively small operation of the game.This article start with the background of Java mobile phone games based on the Java development of mobile phone games, and then a whole game on thePac-Man model of development, structural analysis and specific functions to achieve, the game's interface and mode of operation. Through the development of mobile games, MIDP 2.0, and JSR-184 research, using the depth-first traversal algorithms to generate random map games, and to try to simulate the universal form of mobile games, to realize a simple operation, and funny Pac-Man maze game on mobile phone.KEY WORDS:J2ME; MIDP 2.0; Pac-Man; Immediate mode; The depth-first traversal algorithms目录1 绪论 (6)1.1研究背景 (6)1.2研究内容 (6)2 手机游戏简介 (7)2.1 手机游戏的发展 (7)2.2 手机游戏的特点 (7)2.2.1 手机设备的优点 (7)2.2.2 手机设备的缺点 (8)2.3 手机游戏的开发 (9)2.3.1与传统游戏开发的区别 (9)2.3.2 扬长避短的开发策略 (10)3 Java和J2ME概述 (13)3.1 Java概述 (13)3.1.1 Java的历史 (13)3.1.2 Java语言特点 (14)3.2 J2ME及其体系结构概述 (14)3.2.1 J2ME简介 (14)3.2.2 J2ME 体系结构 (15)4 开发环境简介 (16)4.1 Wireless Tool Kit 简介 (16)4.2 Eclipse 开发环境的建立 (17)4.2.1 什么是Eclipse? (17)4.2.2 Eclipse的主要组成 (17)4.2.3 什么是EclipseME? (18)4.3 MIDP 2.0简介 (18)5 游戏的设计 (19)5.1 任务介绍 (19)5.1.1 目标 (19)5.1.2 项目背景 (19)5.1.3 运行环境 (20)5.2 功能需求 (20)5.2.1 游戏菜单设置 (20)5.2.2 游戏界面的需求 (20)5.2.3 游戏简介 (21)5.2.4 手机键盘处理事件需求 (21)5.3 游戏的具体设计 (21)5.3.1 游戏导读 (21)5.3.2 游戏目的 (21)5.3.3 设计思路 (21)5.3.4 游戏创意 (21)6 详细设计 (21)6.1程序系统结构 (21)6.2 程序结构、思想 (22)6.2.1 本程序需要解决的主要技术问题 (22)6.2.2 程序流程 (23)6.3 相关技术 (27)6.3.1 内存的优化 (27)6.3.2 内存检测器 (27)6.3.3 关于混淆器 (28)7 测试 (28)7.1 测试的过程 (28)7.1.1 测试环境 (28)7.1.2 系统测试 (28)7.2 发现的BUG及解决情况 (29)8 总结 (29)8.1 本程序的总结和展望 (29)8.2 感想 (30)参考文献 (31)致谢 (33)1 绪论1.1研究背景JAVA自从20世纪90年代早期诞生以来,以其强大的功能迅速为广大程序员们所接受。

吃豆豆课程设计

吃豆豆课程设计

吃豆豆课程设计一、课程目标知识目标:1. 学生能理解并掌握“吃豆豆”游戏中涉及的数学基本概念,如分数、概率等。

2. 学生能运用数学知识分析游戏策略,提高解决问题的能力。

技能目标:1. 学生通过观察、分析游戏过程,培养逻辑思维和推理能力。

2. 学生能运用所学知识,设计并优化游戏策略,提高实际操作能力。

情感态度价值观目标:1. 学生在游戏中体验数学的乐趣,激发学习数学的兴趣和积极性。

2. 学生通过团队合作,培养沟通协作能力和团队精神。

3. 学生在游戏过程中,学会遵守规则、尊重对手,培养良好的道德品质。

课程性质:本课程以数学知识为基础,结合趣味游戏,提高学生的数学素养和实际操作能力。

学生特点:四年级学生具备一定的数学基础和逻辑思维能力,对游戏有浓厚兴趣,喜欢动手操作。

教学要求:结合学生特点,通过游戏教学,让学生在轻松愉快的氛围中掌握数学知识,提高解决问题的能力。

将课程目标分解为具体的学习成果,便于教学设计和评估。

二、教学内容1. 教学大纲:a. 分数的基本概念与运算b. 概率的基本概念与应用c. 游戏策略设计与优化2. 教学内容安排与进度:a. 分数基本概念与运算(第1-2课时)- 简单分数的定义与表示- 分数的大小比较- 分数的加减运算b. 概率基本概念与应用(第3-4课时)- 概率的定义与计算- 事件发生的可能性- 概率在实际问题中的应用c. 游戏策略设计与优化(第5-6课时)- 分析“吃豆豆”游戏中的数学问题- 设计有效的游戏策略- 优化策略,提高游戏胜率3. 教材章节与内容:a. 《数学》四年级上册:分数章节b. 《数学》四年级下册:可能性章节c. 结合游戏教学,拓展相关数学知识教学内容确保科学性和系统性,结合课程目标,让学生在掌握基础知识的同时,学会运用数学知识解决实际问题。

通过游戏策略设计与优化,培养学生的创新意识和实际操作能力。

三、教学方法1. 讲授法:- 对于分数、概率等基本概念和运算规则的教学,采用讲授法进行系统讲解,确保学生掌握基础知识。

java吃豆子游戏课程设计

java吃豆子游戏课程设计

java吃豆子游戏课程设计一、课程目标知识目标:1. 学生能理解Java语言中面向对象编程的基本概念,掌握类与对象的关系。

2. 学生能运用Java中的图形用户界面(GUI)组件,实现游戏界面的设计。

3. 学生了解并掌握Java中的事件处理机制,实现游戏逻辑控制。

技能目标:1. 学生能够运用所学知识,设计并编写出一个简单的“吃豆子”游戏程序。

2. 学生通过编程实践,提高问题分析、程序设计和调试的能力。

情感态度价值观目标:1. 学生通过游戏编程,培养对计算机编程的兴趣和热情,增强学习动力。

2. 学生在团队合作中,学会相互沟通、协作,培养集体荣誉感和责任感。

3. 学生通过编程实践,认识到编程在生活中的应用,激发创新思维,提高解决实际问题的能力。

课程性质分析:本课程为Java编程实践课,通过设计一个简单的吃豆子游戏,让学生将所学的Java编程知识运用到实际项目中,提高编程实践能力。

学生特点分析:学生处于初中或高中年级,对计算机编程有一定的基础,对游戏编程有较高的兴趣,但编程实践经验不足。

教学要求:1. 课程内容要与教材知识紧密结合,注重实践操作,提高学生的编程技能。

2. 教学过程中,关注学生的个体差异,给予个性化指导,提高学生的学习效果。

3. 通过团队合作,培养学生的沟通能力和协作精神,提高解决问题的能力。

二、教学内容1. 面向对象编程基础:- 类的定义与对象创建- 成员变量与方法的封装- 继承与多态2. Java图形用户界面(GUI)设计:- Swing图形用户界面组件- 布局管理器- 事件监听器与事件处理3. 游戏逻辑设计:- 游戏场景与角色绘制- 角色移动与碰撞检测- 分数统计与生命值管理4. 编程实践:- 设计吃豆子游戏角色类与游戏场景类- 编写游戏逻辑控制代码- 调试与优化游戏程序教学内容安排与进度:1. 第1-2课时:面向对象编程基础,学习类与对象的概念,完成角色类的设计。

2. 第3-4课时:Java图形用户界面设计,掌握Swing组件的使用,绘制游戏场景。

吃豆豆小游戏

吃豆豆小游戏

吃豆豆小游戏吃豆豆小游戏是一款经典的街机游戏,目标是控制一个角色吃掉所有的豆子并躲避敌人。

以下是游戏的玩法和规则:目标:游戏的目标是通过控制角色吃掉所有的豆子,同时避免被敌人捉到。

规则:1. 游戏的地图是一个迷宫,由许多小格子组成。

每个格子上都有一个豆子,可以被角色吃掉。

2. 角色可以通过按键控制上下左右移动,以便吃掉豆子。

3. 敌人是一些怪物,它们会在地图上移动,并试图捉到角色。

如果角色被敌人捉到,游戏结束。

4. 角色可以吃掉特殊的大豆子,这会使敌人变得虚弱,一段时间内无法捉到角色。

5. 游戏有限定的时间,如果在时间结束前没有吃掉所有的豆子,游戏也会结束。

术语和技巧:1. 豆子:地图上的小格子上有豆子,角色需要吃掉它们来获得分数。

2. 敌人:怪物会在地图上移动,角色需要躲避它们,否则游戏会结束。

3. 大豆子:特殊的豆子,角色吃掉它们后,敌人会变得虚弱,角色可以安全地靠近它们一段时间。

4. 分数:每吃掉一个豆子,角色会获得一定的分数,玩家可以通过吃豆子来提高自己的分数。

5. 时间:游戏有限定的时间,玩家需要在规定时间内吃掉所有的豆子,否则游戏会结束。

创造性和想象力:1. 尝试不同的策略:可以尝试不同的路径和移动方式,以躲避敌人并高效地吃掉豆子。

2. 利用大豆子的效果:当吃掉大豆子时,敌人会变得虚弱,可以趁机吃掉更多的豆子,或者主动追逐敌人。

3. 挑战高分:尝试在规定时间内吃掉尽可能多的豆子,挑战自己的最高分数。

希望以上的详细解释能够帮助你完全理解吃豆豆小游戏的玩法和规则。

祝你玩得愉快!。

游戏《超级吃豆豆》开发文档-Read

游戏《超级吃豆豆》开发文档-Read

游戏《超级吃豆豆》开发文档C++/OOP大作业Mal L. Fox02/10/01 - 02/12/01按照作业的要求,最终系统必须体现OOP的几种基本特点:封装、继承、多态以及抽象。

能同时具备这几种的软件,可以是一个学籍管理系统。

但是如无意外将会有一堆这类软件在学期末诞生(笑),同时这种软件做了出来也是废的,学校才不会用这些学生搞出来的“作业”软件来管理学籍呢!对自己又没有用处,到最后只能成为鸡肋,放在硬盘里占空间,扔掉又可惜。

所以呢,做点别的。

做一个游戏,或者说做一个游戏引擎就比较实际一点了。

虽然“吃豆豆”是一个早在PC机诞生以前就存在的老游戏,开发了出来也没兴趣玩,但是游戏里面已经具备了当代游戏的一系列雏形。

如键盘事件设计、AI设计,图形引擎设计等等的课题都已经渗透其中。

因此,做好这样一个老软件是能切实地打好进阶游戏设计的基础的。

第一次进行这种规模的软件开发,不知从何入手,求助于机械工业出版社出版的《软件工程–实践者的研究方法》(‘Software Engineering – A Practitioner’s Approach Fourth Edition’)中关于面向对象的软件工程部分。

这一次的软件开发划分为以下各阶段:OO分析阶段 -> OO设计阶段 -> OO编程阶段 -> OO测试阶段而在实际的制作过程中,这些过程是交替地发生的,并不一定就按照以上的顺序。

通常几个相关的类是平行开发的,有些可能处于设计阶段,而有些就已经在编程阶段,而测试用例也相应地建立起来。

游戏过程描述游戏定名为Ultra Pac Man,进入系统后,主菜单显示以让用户选择开始游戏、游戏设定、游戏帮助以及退出游戏。

用户选择开始游戏后,进入一个迷宫地图,小精灵在地图中预先设定的初始重生点出现,用户使用游戏设定中设定的按键控制小精灵在迷宫中以某一指定速度左右上下移动。

迷宫中过道上摆放着豆豆,小精灵经过时即被吃掉,小精灵获得豆豆对应的分值。

c课程设计小游戏吃豆

c课程设计小游戏吃豆

c 课程设计小游戏吃豆一、教学目标本课程的教学目标是使学生掌握C语言编程的基础知识,学会使用C语言编写简单的程序,培养学生逻辑思维能力和问题解决能力。

具体目标如下:1.了解C语言的基本语法和数据类型。

2.掌握变量声明、赋值和运算符的使用。

3.学会控制流程,包括条件判断和循环。

4.理解函数的定义和调用。

5.能够使用C语言编写简单的程序。

6.能够阅读和理解简单的C语言程序。

7.能够运用C语言解决实际问题。

情感态度价值观目标:1.培养学生对计算机编程的兴趣和热情。

2.培养学生勇于探索和解决问题的精神。

3.培养学生的团队合作意识和沟通能力。

二、教学内容教学内容主要包括C语言的基本语法、数据类型、变量声明、运算符、控制流程和函数。

具体安排如下:1.第一章:C语言概述,介绍C语言的发展和特点。

2.第二章:基本数据类型和变量声明,介绍整型、浮点型、字符型数据类型和变量的声明和使用。

3.第三章:运算符和表达式,介绍算术运算符、关系运算符、逻辑运算符和赋值运算符等。

4.第四章:控制流程,介绍条件判断和循环的使用。

5.第五章:函数,介绍函数的定义、声明和调用。

三、教学方法本课程采用讲授法、案例分析法和实验法相结合的教学方法。

1.讲授法:通过讲解和示例,使学生掌握C语言的基本语法和数据类型。

2.案例分析法:通过分析典型的C语言程序,使学生理解控制流程和函数的使用。

3.实验法:通过编写和运行C语言程序,使学生掌握C语言编程的技巧和方法。

四、教学资源教学资源包括教材、参考书、多媒体资料和实验设备。

1.教材:《C程序设计语言》(K&R)2.参考书:《C Primer Plus》、《C和指针》3.多媒体资料:教学PPT、视频教程4.实验设备:计算机、编程环境五、教学评估教学评估主要包括平时表现、作业和考试三个部分,以全面、客观、公正地评价学生的学习成果。

1.平时表现:通过观察学生在课堂上的参与度、提问和回答问题的表现,了解学生的学习态度和理解程度。

儿童编程scratch初级24:吃豆子游戏教案

儿童编程scratch初级24:吃豆子游戏教案

少儿编程教学资料,仅供参考,需要可下载并修改后使用!教案式少儿编程教程【初级:第24课】吃豆子游戏【本课说明】吃豆子游戏是两个人分别操作红嘴巴(用W、S、A、D四个键分别代表上移、下移、左移、右移)和蓝嘴巴(用上移键、下移键、左移键、右移键控制)吃豆子。

总共有20颗豆子,谁吃得多谁就胜利,当红嘴巴或蓝嘴巴碰到黄嘴巴时,就死了,死了的对方获胜。

【知识技能】(1)循环的嵌套控制。

(2)按键检测控制。

(3)变量的建立及其应用。

(4)侦测指令。

(5)角色的移动及定位。

(6)数字和逻辑运算指令。

(7)造型的切换、显示与隐藏。

【课程引入】小朋友,类似吃豆子的小游戏大家都玩过吧,玩别人的游戏多没有意思啊!我们自己动手设计一款吃豆子游戏,是不是很有成就感啊,还可以分享给你的小伙伴。

问题分析:(1)用按键控制角色“红嘴巴”和“蓝嘴巴”的移动。

(2)记录红嘴巴和蓝嘴巴吃豆子的数量,并判断吃豆子多者获胜。

(3)判断:当红嘴巴或蓝嘴巴碰到黄嘴巴时,就死了,死了的对方获胜。

(4)红嘴巴和蓝嘴巴吃豆子的数量等于豆子总数时游戏结束。

(5)设计游戏背景。

【教学步骤】(1)打开Scratch离线系统,显示Scratch编程主界面。

(2)下面是“背景”的脚本。

(3)选择主界面左下方“新建背景”第三个图标显示“从本地文件中上传背景”,将预先准备好的“背景”上传。

(4)选择主界面中间“脚本”中的“数据”,点击“新建变量”,建立三个变量,分别是“总豆子数”、“红嘴巴吃豆数”、“蓝嘴巴吃豆数”。

在三个“变量名”中分别输入“总豆子数”、“红嘴巴吃豆数”、“蓝嘴巴吃豆数”点击确定。

“总豆子数”、“红嘴巴吃豆数”、“蓝嘴巴吃豆数”左侧有一个小方块,若不选择(不出现√),舞台中间就没有矩形框。

(5)选择主界面中间“脚本”中的“事件”,将其中的“当...小绿旗...被点击”拖动到脚本空白区域。

(6)选择主界面中间“脚本”中的“数据”,将其中的“将…设定为0”拖动到“当...小绿旗...被点击”的下面,点击其中的倒三角选择“总豆子数”,价格其中的参数“0”修改为20。

Pygame做一期吃豆子游戏的示例代码

Pygame做一期吃豆子游戏的示例代码

Pygame做⼀期吃⾖⼦游戏的⽰例代码Pygame的历史Pygame是⼀个利⽤SDL库的写就的游戏库,SDL呢,全名Simple DirectMedia Layer,是⼀位叫做Sam Lantinga的⼤⽜写的,据说他为了让Loki(致⼒于向Linux上移植Windows的游戏的⼀家⼤好⼈公司,可惜已经倒闭,唉好⼈不长命啊……)更有效的⼯作,创造了这个东东。

SDL是⽤C写的,不过它也可以使⽤C++进⾏开发,当然还有很多其它的语⾔,Pygame就是Python中使⽤它的⼀个库。

Pygame已经存在很多时间了,许多优秀的程序员加⼊其中,把Pygame做得越来越好。

开发⼯具:Python版本:3.6.4相关模块:pygame模块;以及⼀些Python⾃带的模块。

安装Python并添加到环境变量,pip安装需要的相关模块即可。

游戏简介:玩家通过↑↓←→键控制游戏的主⾓吃⾖⼈吃掉藏在迷宫内的所有⾖⼦,并且不能被⿁魂抓到。

若能顺利吃完迷宫内的所有⾖⼦并且不被⿁魂抓到,则游戏胜利,否则游戏失败。

Step1:定义游戏精灵类①墙类:②⾷物类:③⾓⾊类:⾓⾊类包括吃⾖⼈和⿁魂,⿁魂由电脑控制其运动轨迹,吃⾖⼈由玩家控制其运动轨迹。

显然,其均需具备更新⾓⾊位置和改变⾓⾊运动⽅向的能⼒,其源代码如下:Step2:设计游戏地图①创建墙:②创建门:③创建⾓⾊:④创建⾷物:Step3:设计游戏主循环接下来开始设计游戏主循环。

⾸先是初始化:然后定义主函数:其中startLevelGame函数⽤于开始某⼀关游戏,其源代码如下:showText函数⽤于在游戏结束或关卡切换时在游戏界⾯中显⽰提⽰性⽂字,其源代码如下:源代码:#吃⾖⼦import os,sysimport sysimport pygameimport randomBLACK = (0, 0, 0)WHITE = (255, 255, 255)BLUE = (0, 0, 255)GREEN = (0, 255, 0)RED = (255, 0, 0)YELLOW = (255, 255, 0)PURPLE = (255, 0, 255)SKYBLUE = (0, 191, 255)if getattr(sys, 'frozen', False):cur_path = sys._MEIPASSelse:cur_path = os.path.dirname(__file__)BGMPATH = os.path.join(cur_path, 'resources/sounds/bg.mp3') ICONPATH = os.path.join(cur_path,'resources/images/icon.png') FONTPATH = os.path.join(cur_path,'resources/font/ALGER.TTF') HEROPATH = os.path.join(cur_path,'resources/images/pacman.png') BlinkyPATH = os.path.join(cur_path,'resources/images/Blinky.png') ClydePATH = os.path.join(cur_path,'resources/images/Clyde.png') InkyPATH = os.path.join(cur_path,'resources/images/Inky.png') PinkyPATH = os.path.join(cur_path,'resources/images/Pinky.png') NUMLEVELS = 1class Wall(pygame.sprite.Sprite):def __init__(self, x, y, width, height, color, **kwargs):pygame.sprite.Sprite.__init__(self)self.image = pygame.Surface([width, height])self.image.fill(color)self.rect = self.image.get_rect()self.rect.left = xself.rect.top = yclass Food(pygame.sprite.Sprite):def __init__(self, x, y, width, height, color, bg_color, **kwargs):pygame.sprite.Sprite.__init__(self)self.image = pygame.Surface([width, height])self.image.fill(bg_color)self.image.set_colorkey(bg_color)pygame.draw.ellipse(self.image, color, [0, 0, width, height])self.rect = self.image.get_rect()self.rect.left = xself.rect.top = yclass Player(pygame.sprite.Sprite):def __init__(self, x, y, role_image_path):pygame.sprite.Sprite.__init__(self)self.role_name = role_image_path.split('/')[-1].split('.')[0]self.base_image = pygame.image.load(role_image_path).convert() self.image = self.base_image.copy()self.rect = self.image.get_rect()self.rect.left = xself.rect.top = yself.prev_x = xself.prev_y = yself.base_speed = [30, 30]self.speed = [0, 0]self.is_move = Falseself.tracks = []self.tracks_loc = [0, 0]def changeSpeed(self, direction):if direction[0] < 0:self.image = pygame.transform.flip(self.base_image, True, False)elif direction[0] > 0:self.image = self.base_image.copy()elif direction[1] < 0:self.image = pygame.transform.rotate(self.base_image, 90)elif direction[1] > 0:self.image = pygame.transform.rotate(self.base_image, -90)self.speed = [direction[0] * self.base_speed[0], direction[1] * self.base_speed[1]]return self.speeddef update(self, wall_sprites, gate_sprites):if not self.is_move:return Falsex_prev = self.rect.lefty_prev = self.rect.topself.rect.left += self.speed[0]self.rect.top += self.speed[1]is_collide = pygame.sprite.spritecollide(self, wall_sprites, False)if gate_sprites is not None:if not is_collide:is_collide = pygame.sprite.spritecollide(self, gate_sprites, False)if is_collide:self.rect.left = x_prevself.rect.top = y_prevreturn Falsereturn Truedef randomDirection(self):return random.choice([[-0.5, 0], [0.5, 0], [0, 0.5], [0, -0.5]])class Level1():def __init__(self): = 'level1'def setupWalls(self, wall_color):self.wall_sprites = pygame.sprite.Group()wall_positions = [[0, 0, 6, 600],[0, 0, 600, 6],[0, 600, 606, 6],[600, 0, 6, 606],[300, 0, 6, 66],[60, 60, 186, 6],[360, 60, 186, 6],[60, 120, 66, 6],[60, 120, 6, 126],[180, 120, 246, 6],[300, 120, 6, 66],[480, 120, 66, 6],[540, 120, 6, 126],[120, 180, 126, 6],[120, 180, 6, 126],[360, 180, 126, 6],[480, 180, 6, 126],[180, 240, 6, 126],[180, 360, 246, 6],[420, 240, 6, 126],[240, 240, 42, 6],[324, 240, 42, 6],[240, 240, 6, 66],[240, 300, 126, 6],[360, 240, 6, 66],[0, 300, 66, 6],[540, 300, 66, 6],[60, 360, 66, 6],[60, 360, 6, 186],[480, 360, 66, 6],[540, 360, 6, 186],[120, 420, 366, 6],[120, 420, 6, 66],[480, 420, 6, 66],[180, 480, 246, 6],[300, 480, 6, 66],[120, 540, 126, 6],[360, 540, 126, 6]]for wall_position in wall_positions:wall = Wall(*wall_position, wall_color)self.wall_sprites.add(wall)return self.wall_spritesdef setupGate(self, gate_color):self.gate_sprites = pygame.sprite.Group()self.gate_sprites.add(Wall(282, 242, 42, 2, gate_color))return self.gate_spritesdef setupPlayers(self, hero_image_path, ghost_images_path):self.hero_sprites = pygame.sprite.Group()self.ghost_sprites = pygame.sprite.Group()self.hero_sprites.add(Player(287, 439, hero_image_path))for each in ghost_images_path:role_name = each.split('/')[-1].split('.')[0]if role_name == 'Blinky':player = Player(287, 199, each)player.is_move = Trueplayer.tracks = [[0, -0.5, 4], [0.5, 0, 9], [0, 0.5, 11], [0.5, 0, 3], [0, 0.5, 7], [-0.5, 0, 11], [0, 0.5, 3], [0.5, 0, 15], [0, -0.5, 15], [0.5, 0, 3], [0, -0.5, 11], [-0.5, 0, 3], [0, -0.5, 11], [-0.5, 0, 3],[0, -0.5, 3], [-0.5, 0, 7], [0, -0.5, 3], [0.5, 0, 15], [0, 0.5, 15], [-0.5, 0, 3], [0, 0.5, 3],[-0.5, 0, 3], [0, -0.5, 7], [-0.5, 0, 3], [0, 0.5, 7], [-0.5, 0, 11], [0, -0.5, 7], [0.5, 0, 5]]self.ghost_sprites.add(player)elif role_name == 'Clyde':player = Player(319, 259, each)player.is_move = Trueplayer.tracks = [[-1, 0, 2], [0, -0.5, 4], [0.5, 0, 5], [0, 0.5, 7], [-0.5, 0, 11], [0, -0.5, 7],[-0.5, 0, 3], [0, 0.5, 7], [-0.5, 0, 7], [0, 0.5, 15], [0.5, 0, 15], [0, -0.5, 3],[-0.5, 0, 11], [0, -0.5, 7], [0.5, 0, 3], [0, -0.5, 11], [0.5, 0, 9]]self.ghost_sprites.add(player)elif role_name == 'Inky':player = Player(255, 259, each)player.is_move = Trueplayer.tracks = [[1, 0, 2], [0, -0.5, 4], [0.5, 0, 10], [0, 0.5, 7], [0.5, 0, 3], [0, -0.5, 3],[0.5, 0, 3], [0, -0.5, 15], [-0.5, 0, 15], [0, 0.5, 3], [0.5, 0, 15], [0, 0.5, 11],[-0.5, 0, 3], [0, -0.5, 7], [-0.5, 0, 11], [0, 0.5, 3], [-0.5, 0, 11], [0, 0.5, 7],[-0.5, 0, 3], [0, -0.5, 3], [-0.5, 0, 3], [0, -0.5, 15], [0.5, 0, 15], [0, 0.5, 3],[-0.5, 0, 15], [0, 0.5, 11], [0.5, 0, 3], [0, -0.5, 11], [0.5, 0, 11], [0, 0.5, 3], [0.5, 0, 1]]self.ghost_sprites.add(player)elif role_name == 'Pinky':player = Player(287, 259, each)player.is_move = Trueplayer.tracks = [[0, -1, 4], [0.5, 0, 9], [0, 0.5, 11], [-0.5, 0, 23], [0, 0.5, 7], [0.5, 0, 3],[0, -0.5, 3], [0.5, 0, 19], [0, 0.5, 3], [0.5, 0, 3], [0, 0.5, 3], [0.5, 0, 3],[0, -0.5, 15], [-0.5, 0, 7], [0, 0.5, 3], [-0.5, 0, 19], [0, -0.5, 11], [0.5, 0, 9]]self.ghost_sprites.add(player)return self.hero_sprites, self.ghost_spritesdef setupFood(self, food_color, bg_color):self.food_sprites = pygame.sprite.Group()for row in range(19):for col in range(19):if (row == 7 or row == 8) and (col == 8 or col == 9 or col == 10):continueelse:food = Food(30*col+32, 30*row+32, 4, 4, food_color, bg_color)is_collide = pygame.sprite.spritecollide(food, self.wall_sprites, False)if is_collide:continueis_collide = pygame.sprite.spritecollide(food, self.hero_sprites, False)if is_collide:continueself.food_sprites.add(food)return self.food_spritesdef startLevelGame(level, screen, font):clock = pygame.time.Clock()SCORE = 0wall_sprites = level.setupWalls(SKYBLUE)gate_sprites = level.setupGate(WHITE)hero_sprites, ghost_sprites = level.setupPlayers(HEROPATH, [BlinkyPATH, ClydePATH, InkyPATH, PinkyPATH])food_sprites = level.setupFood(YELLOW, WHITE)is_clearance = Falsewhile True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit(-1)if event.type == pygame.KEYDOWN:if event.key == pygame.K_LEFT:for hero in hero_sprites:hero.changeSpeed([-1, 0])hero.is_move = Trueelif event.key == pygame.K_RIGHT:for hero in hero_sprites:hero.changeSpeed([1, 0])hero.is_move = Trueelif event.key == pygame.K_UP:for hero in hero_sprites:hero.changeSpeed([0, -1])hero.is_move = Trueelif event.key == pygame.K_DOWN:for hero in hero_sprites:hero.changeSpeed([0, 1])hero.is_move = Trueif event.type == pygame.KEYUP:if (event.key == pygame.K_LEFT) or (event.key == pygame.K_RIGHT) or (event.key == pygame.K_UP) or (event.key == pygame.K_DOWN): hero.is_move = Falsescreen.fill(BLACK)for hero in hero_sprites:hero.update(wall_sprites, gate_sprites)hero_sprites.draw(screen)for hero in hero_sprites:food_eaten = pygame.sprite.spritecollide(hero, food_sprites, True)SCORE += len(food_eaten)wall_sprites.draw(screen)gate_sprites.draw(screen)food_sprites.draw(screen)for ghost in ghost_sprites:if ghost.tracks_loc[1] < ghost.tracks[ghost.tracks_loc[0]][2]:ghost.changeSpeed(ghost.tracks[ghost.tracks_loc[0]][0: 2])ghost.tracks_loc[1] += 1else:if ghost.tracks_loc[0] < len(ghost.tracks) - 1:ghost.tracks_loc[0] += 1elif ghost.role_name == 'Clyde':ghost.tracks_loc[0] = 2else:ghost.tracks_loc[0] = 0ghost.changeSpeed(ghost.tracks[ghost.tracks_loc[0]][0: 2])ghost.tracks_loc[1] = 0if ghost.tracks_loc[1] < ghost.tracks[ghost.tracks_loc[0]][2]:ghost.changeSpeed(ghost.tracks[ghost.tracks_loc[0]][0: 2])else:if ghost.tracks_loc[0] < len(ghost.tracks) - 1:loc0 = ghost.tracks_loc[0] + 1elif ghost.role_name == 'Clyde':loc0 = 2else:loc0 = 0ghost.changeSpeed(ghost.tracks[loc0][0: 2])ghost.update(wall_sprites, None)ghost_sprites.draw(screen)score_text = font.render("Score: %s" % SCORE, True, RED)screen.blit(score_text, [10, 10])if len(food_sprites) == 0:is_clearance = Truebreakif pygame.sprite.groupcollide(hero_sprites, ghost_sprites, False, False):is_clearance = Falsebreakpygame.display.flip()clock.tick(10)return is_clearancedef showText(screen, font, is_clearance, flag=False):clock = pygame.time.Clock()msg = 'Game Over!' if not is_clearance else 'Congratulations, you won!'positions = [[235, 233], [65, 303], [170, 333]] if not is_clearance else [[145, 233], [65, 303], [170, 333]]surface = pygame.Surface((400, 200))surface.set_alpha(10)surface.fill((128, 128, 128))screen.blit(surface, (100, 200))texts = [font.render(msg, True, WHITE),font.render('Press ENTER to continue or play again.', True, WHITE),font.render('Press ESCAPE to quit.', True, WHITE)]while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit(-1)if event.type == pygame.KEYDOWN:if event.key == pygame.K_RETURN:if is_clearance:if not flag:returnelse:main(initialize())else:main(initialize())elif event.key == pygame.K_ESCAPE:pygame.quit()sys.exit(-1)for idx, (text, position) in enumerate(zip(texts, positions)):screen.blit(text, position)pygame.display.flip()clock.tick(10)def initialize():pygame.init()icon_image = pygame.image.load(ICONPATH)pygame.display.set_icon(icon_image)screen = pygame.display.set_mode([606, 606])pygame.display.set_caption('吃⾖⼦')return screendef main(screen):try:pygame.mixer.init()pygame.mixer.music.load(BGMPATH)pygame.mixer.music.play(-1, 0.0)except:passpygame.font.init()font_small = pygame.font.Font(FONTPATH, 18)font_big = pygame.font.Font(FONTPATH, 24)for num_level in range(1, NUMLEVELS+1):if num_level == 1:level = Level1()is_clearance = startLevelGame(level, screen, font_small)if num_level == NUMLEVELS:showText(screen, font_big, is_clearance, True)else:showText(screen, font_big, is_clearance)if __name__ == "__main__":main(initialize())到此这篇关于Pygame做⼀期吃⾖⼦游戏的⽰例代码的⽂章就介绍到这了,更多相关Pygame 吃⾖⼦内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。

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

效果图:图片资源文件夹:小球资源:玩家资源:代码部分(按上面类从上到下排列):package com.abtc.game.prettyball.main;import com.abtc.game.prettyball.main.game.GameController; import ;import android.app.Activity;import android.content.pm.ActivityInfo;import android.content.res.AssetManager;import android.graphics.Rect;import android.os.Bundle;import android.view.Display;import android.view.KeyEvent;import android.view.MotionEvent;import android.view.Window;import android.view.WindowManager;public class MainActivity extends Activity {private GameController gameController;/** 游戏界面区域对象**/private static final Rect RECT_GAMESCREEN = new Rect();/** 资源文件夹管理对象**/private static AssetManager asset;@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);/** step1 1,去除标题栏2,去除任务栏3,获取实际设备的像素4,创建游戏的控制台5,控制台添加绘制功能* 6,控制台加入touch功能,按键功能*/// 去除标题栏requestWindowFeature(Window.FEATURE_NO_TITLE);// 去除任务栏getWindow().setFlags(youtParams.FLAG_FULLSCREEN, youtParams.FLAG_FULLSCREEN);// 强制横屏setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);// 获得显示器对象Display dis = getWindowManager().getDefaultDisplay();int niScreenWidth = dis.getWidth();int niScreenHeight = dis.getHeight();// 计算游戏界面位置和区域RECT_GAMESCREEN.left = (niScreenWidth - Info.NI_GAMESCREEN_WIDTH) / 2;RECT_GAMESCREEN.top = (niScreenHeight - Info.NI_GAMESCREEN_HEIGHT) / 2;RECT_GAMESCREEN.right = RECT_GAMESCREEN.left + Info.NI_GAMESCREEN_WIDTH;RECT_GAMESCREEN.bottom = RECT_GAMESCREEN.top+ Info.NI_GAMESCREEN_HEIGHT;// 初始化资源文件夹管理对象asset = this.getAssets();// 初始化游戏的控制台;gameController = new GameController(this);setContentView(gameController);}public static final AssetManager getAsset() {return asset;}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {// TODO Auto-generated method stubgameController.onKDown(keyCode, event);return super.onKeyDown(keyCode, event);}@Overridepublic boolean onTouchEvent(MotionEvent event) { // TODO Auto-generated method stubgameController.onTouch(event);return super.onTouchEvent(event);}/*** 获取游戏界面水平位置** @return*/public static final int getScreenX() {return RECT_GAMESCREEN.left;}/*** 获取游戏界面垂直位置** @return*/public static final int getScreenY() {return RECT_GAMESCREEN.top;}/*** 获取游戏界面宽** @return*/public static final int getScreenWidth() {return Info.NI_GAMESCREEN_WIDTH;}/*** 获取游戏界面高** @return*/public static final int getScreenHeight() {return Info.NI_GAMESCREEN_HEIGHT;}}package com.abtc.game.prettyball.main.game;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Paint;import com.abtc.game.prettyball.main.MainActivity;import com.abtc.game.prettyball.main.tools.Tools;/*** 游戏背景类** @author Administrator**/public class Background {/** 背景切换时间(分钟) **/private final int NI_BACKGROUND_CHANGE_TIME = (1000 * 60) * 5;/** 背景图片总数**/private final int NI_BACKGROUND_MAX = 3;/** 图片-当前背景**/private Bitmap bmpBackground;/** 图片-渐变背景**/private Bitmap bmpBackgroundAlpha;/** 笔刷-渐变**/private Paint paintBackground;/** 当前背景编号**/private int niBackgroundId;/** 线程开关**/private boolean isThread;/** 是否渐变中**/private boolean isShowing;public Background() {paintBackground = new Paint();paintBackground.setAlpha(0);// 设置笔刷的透明度(0:完全透明, 255:不透明)bmpBackground = Tools.readBitmapFromAssets("image/background/"+ niBackgroundId + ".png");}/*** 重置*/public void reset() {// 当前背景重置if (niBackgroundId != 0) {niBackgroundId = 0;bmpBackground = Tools.readBitmapFromAssets("image/background/"+ niBackgroundId + ".png");}// 重置渐变背景if (bmpBackgroundAlpha != null) {bmpBackgroundAlpha = null;paintBackground.setAlpha(0);isShowing = false;}}public void onDraw(Canvas canvas) {canvas.drawBitmap(bmpBackground, MainActivity.getScreenX(),MainActivity.getScreenY(), null);if (bmpBackgroundAlpha != null)canvas.drawBitmap(bmpBackgroundAlpha, MainActivity.getScreenX(), MainActivity.getScreenY(), paintBackground);}private void logic() {// 渐变状态if (isShowing) {// 渐变休眠时间try {Thread.sleep(80);} catch (InterruptedException e) {}// 透明值变化int niOldAlpha = paintBackground.getAlpha();niOldAlpha++;// 检测透明值变化结束if (niOldAlpha >= 255) {// 渐变背景图交给当前背景图bmpBackground = bmpBackgroundAlpha;// 等待渐变图交付完毕try {Thread.sleep(80);} catch (InterruptedException e) {}// 渐变背景图销毁bmpBackgroundAlpha = null;// 还原相关数值isShowing = false;paintBackground.setAlpha(0);} elsepaintBackground.setAlpha(niOldAlpha);}// 等待切换状态else {// 切换间隔休眠时间try {Thread.sleep(NI_BACKGROUND_CHANGE_TIME);} catch (InterruptedException e) {}// 渐变背景图得到图片niBackgroundId++;if (niBackgroundId == NI_BACKGROUND_MAX)niBackgroundId = 0;bmpBackgroundAlpha = Tools.readBitmapFromAssets("image/background/"+ niBackgroundId + ".png");// 改变状态isShowing = true;}}public void start() {if (!isThread) {isThread = true;new Thread(new LogicMonitor()).start();}}public void close() {isThread = false;}private class LogicMonitor implements Runnable {@Overridepublic void run() {while (isThread) {logic();}}}}package com.abtc.game.prettyball.main.game;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Rect;import com.abtc.game.prettyball.main.MainActivity;import com.abtc.game.prettyball.main.tools.Tools;/*** 小球对象** @author Administrator**/public class Ball {/** 球类型-草莓型(增加玩家角色生命值10点) **/public static final int NI_TYPE_0 = 0;/** 球类型-苹果型(增加玩家50分) **/public static final int NI_TYPE_1 = 1;/** 球类型-海洋型(5秒内停止减少生命,当已经进入此状态时,则增加50点生命值) **/public static final int NI_TYPE_2 = 2;/** 球类型-太阳型(升级,如果已经是满级状态,则当前的生命值直接加满) **/public static final int NI_TYPE_3 = 3;/** 球类型-黑洞型(减少玩家角色生命值30点) **/public static final int NI_TYPE_4 = 4;/** 球类型-金币型(减少分数值200分) **/public static final int NI_TYPE_5 = 5;/** 球类型-炸弹型(直接降一级,如果已经是1级状态,则进入gameover) **/ public static final int NI_TYPE_6 = 6;/** 类型总数**/private static final int NI_TYPE_MAX = 7;/** 重生时间累计标准值**/private static final int NI_RELIVE_TIME = 30;/** 动画帧总数**/private static final int NI_FRAME_MAX = 6;/** 尺寸**/private static final int NI_SIZE = 32;/** 图片组-动画**/private static final Bitmap[][] ARR_BMP;static {// 样式ARR_BMP = new Bitmap[NI_TYPE_MAX][];for (int i = 0; i < ARR_BMP.length; i++)ARR_BMP[i] = Tools.readBitmapFolderFromAssets("image/balls/" + i);}/** 监听回调对象**/private BallCallBack callback;/** 区域-位置**/private Rect rectPosition;/** 速度**/private int niSpeed;/** 帧**/private int niFrame;/** 类型**/private int niType;/** 重生时间累计(>0:代表正处于等待重生, -1代表此小球可用, 0代表此小球正在使用) **/private int niReliveTimeCount;public Ball() {this.niSpeed = 4;rectPosition = new Rect();reset();}public void reset() {// 动画niFrame = 0;// 位置rectPosition.left = Tools.getRandomInt(MainActivity.getScreenX(),MainActivity.getScreenX() + MainActivity.getScreenWidth()- NI_SIZE);rectPosition.top = MainActivity.getScreenY() - NI_SIZE;rectPosition.right = rectPosition.left + NI_SIZE;rectPosition.bottom = rectPosition.top + NI_SIZE;// 累计重生时间niReliveTimeCount = NI_RELIVE_TIME;// 类型boolean isGoodBall = Tools.getRandomInt(0, 2) == 0;// 先根据第一个随机值获得好、坏球之分int niRandom = 0;if (isGoodBall) {niRandom = Tools.getRandomInt(0, 10);// 根据第二个随机值获得具体的小球类型if (niRandom < 5)this.niType = Ball.NI_TYPE_0;else if (niRandom < 7)this.niType = Ball.NI_TYPE_1;else if (niRandom < 9)this.niType = Ball.NI_TYPE_2;elsethis.niType = Ball.NI_TYPE_3;} else {niRandom = Tools.getRandomInt(0, 4);// 根据第二个随机值获得具体的小球类型if (niRandom < 2)this.niType = Ball.NI_TYPE_4;else if (niRandom < 3)this.niType = Ball.NI_TYPE_5;elsethis.niType = Ball.NI_TYPE_6;}}public void onDraw(Canvas canvas) {if (niReliveTimeCount == 0)canvas.drawBitmap(ARR_BMP[niType][niFrame], rectPosition.left,rectPosition.top, null);}public void logic() {// 正在使用中if (niReliveTimeCount == 0) {niFrame = ++niFrame % NI_FRAME_MAX;rectPosition.top += niSpeed;rectPosition.bottom += niSpeed;// 检测小球是否超出屏幕底端if (rectPosition.top > MainActivity.getScreenY()+ MainActivity.getScreenHeight()) {reset();} else {callback.collideCheck(this);}}// 重生中else if (niReliveTimeCount != -1) {niReliveTimeCount--;if (niReliveTimeCount == 0)niReliveTimeCount = -1;}}/*** 使小球进入使用状态*/public void use() {niReliveTimeCount = 0;}/*** 是否可用** @return*/public boolean isEnable() {return niReliveTimeCount == -1;}/*** 是否与指定对象发生碰撞** @param p* : 玩家角色对象* @return*/public boolean isCollideWith(Player p) {return Rect.intersects(rectPosition, p.getRect()); }/*** 获取类型** @return*/public int getType() {return niType;}/*** 加入小球监听** @param callback*/public void addBallListener(BallCallBack callback) { this.callback = callback;}/*** 删除小球监听*/public void removeListener() {if (callback != null)callback = null;}}package com.abtc.game.prettyball.main.game; public interface BallCallBack {void collideCheck(Ball ball);}package com.abtc.game.prettyball.main.game; import java.util.Timer;import java.util.TimerTask;import android.annotation.SuppressLint;import android.graphics.Canvas;@SuppressLint("WrongCall")public class BallManager {/** 小球数量总数**/private final int NI_NUMBER_MAX = 10;/** 小球生产间隔(毫秒)**/private final int NI_ADD_BALL_TIME = 1500;/** 小球对象**/private Ball[] arrBall;/** 小球回调对象**/private BallCallBack callback;/** 计时器-生产球**/private Timer timerAddBall;/** 线程开关**/private boolean isThread;public BallManager(BallCallBack callback) { this.callback = callback;arrBall = new Ball[NI_NUMBER_MAX];}public void reset() {for (int i = 0; i < arrBall.length; i++)if (arrBall[i] != null)arrBall[i].reset();}public void onDraw(Canvas canvas) {for (int i = 0; i < arrBall.length; i++)if (arrBall[i] != null)arrBall[i].onDraw(canvas);}private void logic() {for (int i = 0; i < arrBall.length; i++)if (arrBall[i] != null)arrBall[i].logic();}public void start() {if (!isThread) {isThread = true;new Thread(new LogicMonitor()).start();}if (timerAddBall == null) {timerAddBall = new Timer();timerAddBall.schedule(new AddBall(), 10, NI_ADD_BALL_TIME);}}public void close() {isThread = false;if (timerAddBall != null) {timerAddBall.cancel();timerAddBall = null;}}private class LogicMonitor implements Runnable {@Overridepublic void run() {while (isThread) {try {Thread.sleep(80);} catch (InterruptedException e) {}logic();}}}private class AddBall extends TimerTask {@Overridepublic void run() {boolean isAddBall = false;// 让等待的小球投入工作for (int i = 0; i < arrBall.length; i++) {if (arrBall[i] != null && arrBall[i].isEnable()) {arrBall[i].use();isAddBall = true;break;}}// 加入新球if (!isAddBall) {for (int i = 0; i < arrBall.length; i++) {if (arrBall[i] == null) {// 初始化一个新球arrBall[i] = new Ball(); // 构造小球对象arrBall[i].addBallListener(callback); // 添加监听break;}}}}}}package com.abtc.game.prettyball.main.game;import android.annotation.SuppressLint;import android.content.Context;import android.graphics.Bitmap;import android.graphics.Canvas;import android.view.KeyEvent;import android.view.MotionEvent;import android.view.View;import com.abtc.game.prettyball.main.MainActivity;import com.abtc.game.prettyball.main.tools.Tools;public class GameController extends View implements Runnable { /** 背景对象**/private Background background;/** 玩家对象**/private Player player;/** 小球对象**/// private Ball ball;private BallManager ballManager;/** 游戏结束的标志**/private boolean isGameOver;/** 游戏结束时显示的图片**/private Bitmap bmpGameOver;public GameController(Context context) {super(context);background = new Background();player = new Player();player.addStateListener(new StateMonitor());// 添加回调// ball = new Ball();// ball.addBallListener(new BallMonitor());ballManager = new BallManager(new BallMonitor());new Thread(this).start();// 开启绘制线程background.start();// 开启背景动画player.start();// 开启玩家线程// ball.start();ballManager.start();}@SuppressLint("WrongCall")protected void onDraw(Canvas canvas) {if (isGameOver) {if (bmpGameOver != null) {canvas.drawBitmap(bmpGameOver, MainActivity.getScreenX(),MainActivity.getScreenY(), null);}} else {background.onDraw(canvas);// 绘制背景player.onDraw(canvas);// 绘制玩家角色// ball.onDraw(canvas);ballManager.onDraw(canvas);}}public void onTouch(MotionEvent event) {int niTouchX = (int) event.getX();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:if (!isGameOver)player.setState(true, niTouchX < MainActivity.getScreenX()+ MainActivity.getScreenWidth() / 2);break;case MotionEvent.ACTION_UP:if (!isGameOver)player.setState(false, niTouchX < MainActivity.getScreenX()+ MainActivity.getScreenWidth() / 2);else {restart();}break;}}/*** 重新开始游戏private void restart() {// TODO Auto-generated method stubbackground.reset();player.reset();// ball.reset();ballManager.reset();isGameOver = false;bmpGameOver = null;background.start();player.start();// ball.start();ballManager.start();}public void onKDown(int keyCode, KeyEvent event) {// player.lvUp();// player.updateScore(200);}@Overridepublic void run() {while (true) {try {Thread.sleep(20);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}this.postInvalidate();}}private class StateMonitor implements StateCallBack {@Overridepublic void notifyGameOver() {// 状态改变isGameOver = true;background.close();player.close();bmpGameOver = Tools.readBitmapFromAssets("image/system/gameover.png");}private class BallMonitor implements BallCallBack {@Overridepublic void collideCheck(Ball ball) {if (ball.isCollideWith(player)) {// 获取小球的类型,根据不同的类型做相应的处理switch (ball.getType()) {case Ball.NI_TYPE_0:player.addHP(20);break;case Ball.NI_TYPE_1:player.updateScore(50);break;case Ball.NI_TYPE_2:if (!player.stopAutoHurt(5))player.addHP(50);// 已启动自动减血功能,增加50点生命break;case Ball.NI_TYPE_3:if (!player.lvUp())player.addHP(Player.NI_HPBAR_WIDTH);break;case Ball.NI_TYPE_4:player.hurt(50);break;case Ball.NI_TYPE_5:player.updateScore(-50);break;case Ball.NI_TYPE_6:player.hurt(player.getHp());break;}ball.reset();}}}}package com.abtc.game.prettyball.main.game;public interface Info {/** 游戏界面的宽**/int NI_GAMESCREEN_WIDTH = 480;/** 游戏界面的高**/int NI_GAMESCREEN_HEIGHT = 320;/** Log的标签**/String STR_LOG_TAG = "sysout";}package com.abtc.game.prettyball.main.game;import java.util.Timer;import java.util.TimerTask;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Paint.Style;import android.graphics.Point;import android.graphics.Rect;import com.abtc.game.prettyball.main.MainActivity;import com.abtc.game.prettyball.main.tools.Tools;/**** 玩家角色1、将玩家角色显示在指定的位置2、让玩家角色实现简单的移动3、让玩家角色实现连续的移动4、让玩家角色实现动画移动* 5、玩家touch离开时,角色处于站立状态** @author Administrator**/public class Player {/** 玩家的基础移动速度**/private final int NI_SPEED_BASIC = 15;/** 玩家角色的帧宽**/private final int NI_WIDTH = 42;/** 玩家角色的帧高**/private final int NI_HEIGTH = 42;/** 玩家等级上限**/private final int NI_LV_MAX = 3;/** 玩家动画最大帧数**/private final int NI_FRAME_MAX = 6;/** 动画组-玩家角色动画**/private Bitmap[][] arrBmpAnimation;/** 玩家的当前速度**/// private int niSpeed;/** 玩家动画当前帧**/private int niFrame;/** 是否在移动中**/private boolean isMoving;/** 方向(true:左,false:右) **/private boolean isLeft;/** 区域-玩家角色位置**/private Rect rectPosition;/** 线程开关**/private boolean isThread;/** 生命体的最大宽度**/public static final int NI_HPBAR_WIDTH = 240;/** 生命体的最大高度**/private final int NI_HPBAR_HEIGHT = 8;/** 玩家生命条区域**/private Rect rectHpBar;/** 笔刷-玩家生命条**/private Paint paintHpBar;/** 笔刷-玩家生命条框**/private Paint paintHpBarBound;/** 生命条颜色组**/private int[] arrNIHpColor = { Color.RED, Color.BLUE, Color.MAGENTA }; /** 等级**/private int niLv;/** 角色生命值**/private int niHp;/** 生命条自动消减线程的频率(毫秒)**/private final int NI_HP_AUTO_HURT_ROTATE = 100;/** 线程-生命条自动消减的控制器**/private Timer timerHpAutoHurt;/** 文本-等级**/private final String STR_TEXT_LV = "lv:";/** 文本-分数**/private final String STR_TEXT_SCORE = "score:";/** 笔刷-玩家文本数据**/private Paint paintText;/** 位置-级别和分数**/private Point pLv;private Point pScore;/** **/private String strLv;private String strScore;private int niScore;/** 状态回调**/private StateCallBack callBack;/** 停止自动消减生命值(0代表非停止状态,非0只代表停止减血) **/ private int niStopAutoHurtValue;/*** 添加回调功能** @param callBack* 回调对象*/public void addStateListener(StateCallBack callBack) {this.callBack = callBack;}/*** 删除回调功能*/public void removeStateListener() {if (callBack != null) {callBack = null;}}public Player() {arrBmpAnimation = new Bitmap[NI_LV_MAX][NI_FRAME_MAX];for (int i = 0; i < arrBmpAnimation.length; i++) {for (int j = 0; j < arrBmpAnimation[i].length; j++) {arrBmpAnimation[i][j] = Tools.readBitmapFromAssets("image/player/p" + (i + 1) + "_"+ j + ".png");}}rectPosition = new Rect();rectPosition.left = MainActivity.getScreenX()+ (MainActivity.getScreenWidth() - NI_WIDTH) / 2;rectPosition.top = MainActivity.getScreenY()+ MainActivity.getScreenHeight() - (int) (NI_HEIGTH * 1.5);rectPosition.right = rectPosition.left + NI_WIDTH;rectPosition.bottom = rectPosition.top + NI_HEIGTH;// niSpeed = NI_SPEED_BASIC;niFrame = isLeft ? 1 : 4;rectHpBar = new Rect();rectHpBar.left = MainActivity.getScreenX()+ (MainActivity.getScreenWidth() - NI_HPBAR_WIDTH) / 2;rectHpBar.top = MainActivity.getScreenY()+ MainActivity.getScreenHeight() - NI_HPBAR_HEIGHT;rectHpBar.right = rectHpBar.left + NI_HPBAR_WIDTH;rectHpBar.bottom = rectHpBar.top + NI_HPBAR_HEIGHT;paintHpBar = new Paint();paintHpBarBound = new Paint();paintHpBarBound.setStyle(Style.STROKE);paintHpBarBound.setStrokeWidth(1);niHp = NI_HPBAR_WIDTH;paintText = new Paint();paintText.setTextSize(11);pLv = new Point(MainActivity.getScreenX() + 5,MainActivity.getScreenY() + MainActivity.getScreenHeight() - 5);pScore = new Point(MainActivity.getScreenX()+ MainActivity.getScreenWidth() - 5- (int) paintText.measureText(STR_TEXT_SCORE + niScore), pLv.y);strLv = STR_TEXT_LV + (niLv + 1);strScore = STR_TEXT_SCORE + niScore;}public void onDraw(Canvas canvas) {canvas.drawBitmap(arrBmpAnimation[niLv][niFrame], rectPosition.left, rectPosition.top, null);// 绘制上一级生命条if (niLv > 0 && niHp != NI_HPBAR_WIDTH) {paintHpBar.setColor(arrNIHpColor[niLv - 1]);canvas.drawRect(rectHpBar, paintHpBar);}paintHpBar.setColor(arrNIHpColor[niLv]);// 绘制生命条canvas.drawRect(rectHpBar.left, rectHpBar.top, rectHpBar.left + niHp, rectHpBar.bottom, paintHpBar);// 绘制生命条边框canvas.drawRect(rectHpBar, paintHpBarBound);// 绘制文本canvas.drawText(strLv, pLv.x, pLv.y, paintText);canvas.drawText(strScore, pScore.x, pScore.y, paintText);}/*** 设置状态** @param isMoving* :true 移动,false停止移动** @param isLeft* true 左移false 右移*/public void setState(boolean isMoving, boolean isLeft) {this.isLeft = isLeft;this.isMoving = isMoving;if (isMoving) {niFrame = isLeft ? 0 : 3;} else {niFrame = isLeft ? 1 : 4;}}/*** 玩家逻辑首先判断是否移动--》左或者右**/public void logic() {if (isMoving) {if (isLeft) {moveLeft();} else {moveRight();}}}/*** 设定玩家角色移动的区域*/private void moveRight() {niFrame++;if (niFrame == 6) {niFrame = 3;}int niSpeed = NI_SPEED_BASIC + niLv;rectPosition.left += niSpeed;rectPosition.right += niSpeed;if (rectPosition.right >= MainActivity.getScreenX()+ MainActivity.getScreenWidth()) {rectPosition.right = MainActivity.getScreenX()+ MainActivity.getScreenWidth();rectPosition.left = rectPosition.right - NI_WIDTH;}}/*** 设定玩家角色移动的区域*/private void moveLeft() {niFrame++;if (niFrame == 3) {niFrame = 0;}int niSpeed = NI_SPEED_BASIC + niLv;rectPosition.left -= niSpeed;rectPosition.right -= niSpeed;if (rectPosition.left <= MainActivity.getScreenX()) { rectPosition.left = MainActivity.getScreenX();rectPosition.right = rectPosition.left + NI_WIDTH;}}public void start() {if (!isThread) {isThread = true;new Thread(new LogicMonitor()).start();// 生命条自动消减线程timerHpAutoHurt = new Timer();timerHpAutoHurt.schedule(new HpAutoHurtMonitior(), 1000,NI_HP_AUTO_HURT_ROTATE);}}public void close() {isThread = false;if (timerHpAutoHurt != null) {timerHpAutoHurt.cancel();timerHpAutoHurt = null;}}/*** 增加生命值** @param niValue*/public void addHP(int niValue) {niHp += niValue;if (niHp > NI_HPBAR_WIDTH) {if (lvUp()) {niHp = niHp - NI_HPBAR_WIDTH;} else {niHp = NI_HPBAR_WIDTH;}}}/*** 更新分数** @param niValue*/public void updateScore(int niValue) {niScore += niValue;if (niScore <= 0) {niScore = 0;}strScore = STR_TEXT_SCORE + niScore;pScore.x = MainActivity.getScreenX() + MainActivity.getScreenWidth() - 5 - (int) paintText.measureText(STR_TEXT_SCORE + niScore); }/*** 玩家升级*/public boolean lvUp() {if (niLv < NI_LV_MAX - 1) {niLv++;strLv = STR_TEXT_LV + (niLv + 1);return true;}return false;}public int getHp() {return niHp;}/*** 受伤** @param niValue*/public void hurt(int niValue) {niHp -= niValue;if (niHp <= 0) {if (niLv > 0) {niLv--;strLv = STR_TEXT_LV + (niLv + 1);niHp = NI_HPBAR_WIDTH;} else {niHp = 0;gameOver();}}}/*** GameOver*/private void gameOver() {if (callBack != null) {callBack.notifyGameOver();}}public Rect getRect() {return this.rectPosition;}/*** 重置*/public void reset() {// 重置人物出现的位置rectPosition.left = MainActivity.getScreenX()+ (MainActivity.getScreenWidth() - NI_WIDTH) / 2;rectPosition.top = MainActivity.getScreenY()+ MainActivity.getScreenHeight() - (int) (NI_HEIGTH * 1.5);rectPosition.right = rectPosition.left + NI_WIDTH;rectPosition.bottom = rectPosition.top + NI_HEIGTH;// 重置等级和分数niLv = 0;strLv = STR_TEXT_LV + (niLv + 1);niScore = 0;strScore = STR_TEXT_SCORE + niScore;pScore.x = MainActivity.getScreenX() + MainActivity.getScreenWidth() - 5 - (int) paintText.measureText(STR_TEXT_SCORE + niScore);// 重置角色状态setState(false, true);// 重置生命条niHp = NI_HPBAR_WIDTH;}/*** 开始停止自动减血** @param niValue* 停止时长* @return true 代表成功启动停止减血,false代表已处于自动减血状态*/public boolean stopAutoHurt(int niValue) {if (niStopAutoHurtValue != 0) {return false;}niStopAutoHurtValue = 10 * niValue;return true;}private class LogicMonitor implements Runnable { @Overridepublic void run() {while (isThread) {try {Thread.sleep(800);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}// 执行玩家逻辑logic();}}}private class HpAutoHurtMonitior extends TimerTask { @Overridepublic void run() {if (niStopAutoHurtValue == 0) {hurt(1);} else {niStopAutoHurtValue--;}}}}package com.abtc.game.prettyball.main.game;public interface StateCallBack {void notifyGameOver();}package com.abtc.game.prettyball.main.tools;import java.io.IOException;import java.io.InputStream;import java.util.Random;import android.content.res.AssetManager;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.util.Log;import com.abtc.game.prettyball.main.MainActivity;import ;public final class Tools {private static final Random random = new Random();/*** 获取随机整数** @param min* @param max* @return*/public static final int getRandomInt(int min, int max) {// int niRan = random.nextInt();//-2的32~ 2的32-1return Math.abs(random.nextInt()) % (max - min) + min;}/*** 获取assets指定文件夹下的所有资源图片** @param strDir* @return*/public static final Bitmap[] readBitmapFolderFromAssets(String strDir) { // 获取指定文件夹中所有资源图片的名称String[] arrStrFileName = null;try {arrStrFileName = MainActivity.getAsset().list(strDir);} catch (IOException e) {e.printStackTrace();Tools.logError(strDir + " error!");}if (arrStrFileName.length == 0) {return null;}Bitmap[] arrBmp = new Bitmap[arrStrFileName.length];for (int i = 0; i < arrBmp.length; i++) {arrBmp[i] = readBitmapFromAssets(strDir + "/" + arrStrFileName[i]);}return arrBmp;}public static final Bitmap readBitmapFromAssets(String strFileName) { Bitmap bmp = null;InputStream is = null;try {is = MainActivity.getAsset().open(strFileName);bmp = BitmapFactory.decodeStream(is);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();Tools.logError("read bitmap error: " + strFileName);} finally {if (is != null) {try {is.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}return bmp;}/*** 获取assets文件夹下的资源图片** @param asset* :资源文件夹对象* @param strFileName* :文件的名称* @return :图片*/public static final Bitmap readBitmapFromAssets(AssetManager asset, String strFileName) {Bitmap bmp = null;InputStream is = null;try {is = asset.open(strFileName);bmp = BitmapFactory.decodeStream(is);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {if (is != null) {try {is.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}return bmp;}/*** 打印错误信息** @param strMsg* :信息*/public static final void logError(String strMsg) {Log.e(Info.STR_LOG_TAG, strMsg);}public static final void logInfo(String strMsg) {Log.i(Info.STR_LOG_TAG, strMsg);}}。

相关文档
最新文档