安卓小游戏--附加标准源代码(吃豆豆)
吃豆豆手机游戏毕业设计说明书
毕业设计说明书吃豆豆手机游戏的设计与开发学专 指导教师: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吃豆子游戏课程设计一、课程目标知识目标: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
游戏《超级吃豆豆》开发文档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语言编写简单的程序,培养学生逻辑思维能力和问题解决能力。
具体目标如下: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:吃豆子游戏教案
少儿编程教学资料,仅供参考,需要可下载并修改后使用!教案式少儿编程教程【初级:第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是⼀个利⽤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 吃⾖⼦内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
2024年儿童编程scratch初级24吃豆子游戏精彩教案
2024年儿童编程scratch初级24吃豆子游戏精彩教案一、教学内容本节课选自《儿童编程Scratch初级教程》第七章,主题为“吃豆子游戏”。
教学内容包括:1. 游戏规则设计;2. 角色设计及编程;3. 游戏场景搭建;4. 事件监听及响应;5. 循环结构及条件判断。
二、教学目标1. 掌握吃豆子游戏的规则设计及编程实现;2. 学会使用Scratch绘制角色及搭建游戏场景;3. 理解事件监听、循环结构及条件判断在游戏编程中的应用。
三、教学难点与重点重点:1. 角色编程及场景搭建;2. 事件监听及响应;3. 循环结构及条件判断。
难点:1. 角色移动的平滑性;2. 游戏逻辑的设计与实现。
四、教具与学具准备教具:计算机、投影仪、Scratch软件。
学具:计算机、Scratch软件、教材。
五、教学过程1. 实践情景引入(5分钟)利用投影仪展示经典游戏“吃豆子”,引导学生回顾游戏规则,激发学习兴趣。
2. 知识讲解与示范(15分钟)a) 讲解游戏规则设计,引导学生思考如何将现实生活中的游戏规则转化为编程语言;b) 示范绘制角色、搭建场景,并编写相应代码;c) 讲解事件监听、循环结构及条件判断在游戏编程中的应用。
3. 随堂练习(10分钟)学生根据教师示范,独立完成角色绘制、场景搭建及编程。
4. 例题讲解(10分钟)针对学生编程过程中遇到的问题,进行逐一讲解。
5. 小组讨论与合作(15分钟)学生分组讨论,相互学习,共同解决问题。
六、板书设计1. 游戏规则设计;2. 角色绘制、场景搭建及编程;3. 事件监听、循环结构及条件判断。
七、作业设计1. 作业题目:制作一个吃豆子游戏的简易版本。
答案:根据课堂所学,完成角色绘制、场景搭建及编程。
2. 作业题目:思考如何增加游戏的趣味性,如添加敌人、道具等。
答案:学生可根据个人兴趣,发挥创意,为游戏添加新元素。
八、课后反思及拓展延伸1. 反思:本节课学生掌握情况较好,但部分学生对游戏规则设计及编程实现仍存在困难,需要在课后加强指导。
Python实现的欢乐斗地主
以下是Python实现的欢乐斗地主代码,实现了游戏场景、游戏逻辑、计分等功能:``` pythonimport randomclass Card(object):"""一张牌"""def __init__(self, suite, face):self._suite = suiteself._face = face@propertydef face(self):return self._face@propertydef suite(self):return self._suitedef __str__(self):if self._face == 1:face_str = 'A'elif self._face == 11:face_str = 'J'elif self._face == 12:face_str = 'Q'elif self._face == 13:face_str = 'K'else:face_str = str(self._face)return '%s%s' % (self._suite, face_str)def __repr__(self):return self.__str__()class Poker(object):"""一副牌"""def __init__(self):self._cards = [Card(suite, face)for suite in '♠♥♣♦'for face in range(1, 14)]self._current = 0@propertydef cards(self):return self._cardsdef shuffle(self):"""洗牌"""self._current = 0random.shuffle(self._cards)@propertydef next(self):"""发牌"""card = self._cards[self._current]self._current += 1return card@propertydef has_next(self):"""还有没有牌"""return self._current < len(self._cards)class Player(object):"""玩家"""def __init__(self, name):self._name = nameself._cards_on_hand = []@propertydef name(self):return self._name@propertydef cards_on_hand(self):return self._cards_on_handdef get(self, card):"""摸牌"""self._cards_on_hand.append(card)def arrange(self, card_key):"""玩家整理手上的牌"""self._cards_on_hand.sort(key=card_key) # 用于排序的函数def get_key(card):return (card.suite, card.face)class DouDiZhu(object):"""斗地主游戏"""def __init__(self, player_names):self._players = [Player(name) for name in player_names]self._poker = Poker()self._last_discards = []self._landlord = Nonedef prepare_game(self):"""洗牌和发牌"""self._poker.shuffle()for player in self._players:for _ in range(17):player.get(self._poker.next)@staticmethoddef _is_valid(cards):"""判断牌是否合法"""if len(cards) == 1:return Trueif len(cards) == 2 and cards[0].face == cards[1].face:return Trueif len(cards) == 3 and cards[0].face == cards[1].face == cards[2].face:return Trueif len(cards) == 4 and cards[0].face == cards[1].face == cards[2].face == cards[3].face: return Trueif len(cards) == 5:faces = [card.face for card in cards]faces.sort()if faces[0] == faces[1] == faces[2] - 1 == faces[3] - 1 == faces[4] - 2:return Truereturn Falsedef _find_first_discards(self):"""找到第一个出牌的人"""lowest = Nonefor player in self._players:for card in player.cards_on_hand:if lowest is None:lowest = cardelif card.suite < lowest.suite or (card.suite == lowest.suite and card.face <lowest.face):lowest = cardif lowest:player.cards_on_hand.remove(lowest)self._last_discards.append(lowest)print('%s%s ' % (, lowest), end='', flush=True)breakelse:raise Exception('No card in the poker.')def _find_next_player(self, player):"""找到下一个出牌的人"""idx = self._players.index(player)next_idx = (idx + 1) % len(self._players)return self._players[next_idx]def _play_game(self):"""玩游戏"""card_num = len(self._players[0].cards_on_hand)while self._last_discards:print()current_player = self._find_next_player(self._landlord)if self._landlord.cards_on_hand == [] or current_player.cards_on_hand == []: breakprint('%s cards on hand: ' % current_, end='')for card in current_player.cards_on_hand:print(card, end=' ')print()if current_player is self._landlord:print('Last discards: ', end='')for card in self._last_discards:print(card, end=' ')print()discards = current_player.cards_on_handelse:discards = current_player.discards(self._last_discards)if not discards:current_player.get_cards(self._last_discards)self._last_discards.clear()elif DouDiZhu._is_valid(discards):for card in discards:current_player.cards_on_hand.remove(card)self._last_discards = discardselse:print('Invalid discard.')continueif current_player.cards_on_hand == []:breakdef start_game(self):"""开始游戏"""self.prepare_game()print('Cards in poker: ', end='')print(self._poker.cards)self._find_first_discards()self._landlord = self._find_next_player(self._players[-1])self._play_game()if self._landlord.cards_on_hand == []:print('\n%s wins.' % self._)else:print('\n%s wins.' % self._find_next_player(self._landlord).name)if __name__ == '__main__':game = DouDiZhu(['East', 'West', 'South'])game.start_game()```这段代码实现了一个简单的欢乐斗地主游戏,包括牌的洗牌、发牌、玩家整理牌、判断牌是否合法、出牌、判断胜利等游戏逻辑。
小游戏代码
if(winbox==3) win();
}
else mapData[spriteY][spriteX+2]="2";
mapData[spriteY][spriteX+1]="0";
eval("box"+spriteY+"_"+(spriteX+1)).style.backgroundColor='#333333';
"10000001000000111001",
"10000000000000000001",
"10000000011110000001",
"10020200000000000001",
"10000000000000000001",
"11111111111111111111"
)//原始地图信息,便于编辑地图。
var mapData =new Array(15);
var spriteX=0;
spriteY=0;
var winbox=0;
function readMap(){ //重建地图信息便于程序使用。
for(var i=0;i<15;i++){
mapData[i]=new Array(20);
for(var j=0;j<20;j++){
var oe=document.createElement("div");
oe.id="box"+i+"_"+j; //设定id规则以便后面程序访问。
基于java的吃豆子小游戏开发
学号:常州大学毕业设计(论文)(2012届)题目学生学院专业班级校内指导教师专业技术职务校外指导老师专业技术职务二○一二年六月基于java的吃豆子小游戏开发摘要:在现今电子信息高速发展的时代,电子游戏已经深入人们的日常生活,成为老少皆宜的娱乐方式。
吃豆子游戏是一款具有活动元素的经典游戏,它曾经造成的轰动与造成的经济价值可以说是游戏史上的一件大事。
自1980年Namco(南梦宫)发布吃豆子这款游戏后,20余年一直被众玩家传玩着,经久不衰。
它看似简单但却变化无穷,令人上瘾。
现在联众又将重新掀起这股让人沉迷的吃豆子游戏的风潮。
对一般用户来说,它的规则简单,容易上手,且游戏过程变化无穷。
本论文主要介绍如何利用图片工具Photoshop7.0,Java语言编程环境JDK,游戏开发平台Eclipse和音乐转换工具Winamp以及如何使用这些工具实现吃豆子游戏的游戏总体及构成模块。
吃豆子游戏总体是有界面、控制和音乐三个主要部分组成。
吃豆子游戏的界面分为图片制作和位图载入两方面。
图片采用了整体界面图片制作和区块图片制作两种方法。
位图的载入是使用游戏库中的画图精灵实现的。
画图精灵除了可以载入位图,还可以让界面产生图层效果;吃豆子游戏中的控制方法分为键盘控制和定时器控制两种。
键盘控制是由玩家从键盘输入控制命令对游戏进行控制,而定时器控制是使用定时器对游戏进行时间控制。
键盘控制包括游戏的开始与退出控制、游戏菜单的选择与确定控制和吃豆者的行动方向控制。
定时器控制包括吃豆者的持续移动控制、道具的出现时间控制和道具有效时间的控制。
在游戏音乐方面,分为背景音乐和特殊音效两种。
背景音乐使用了循环播发模式,特殊音效使用了触发播放模式。
关键词:Java 游戏开发画图精灵Based on the Java Pac-Man developmentAbstract:In the current of rapid development of electronic information, electronic games have become an important part of people's daily life. It has been a popular form of entertainment for all ages. Pac-man game is a classic game with elements of activity. It has caused the economic value, which can be said to be a great thing in the history of games. Since 1980, Namco had released Pac-man game, more than 20 years the game has been always playing by all players. It seems easy but changeable and addictive. Now many people turn too re-set off this addictive Pac-man game wave. For the average user, its rules are simple, easy to use, and the game process is changing.Main of this thesis is introduction how to install the picture manufacture tool Photoshop7.0, Java language be written program environment JDK, game development environment Eclipse and music conversion tool WINAMP. And how use theses tools to realize PAC-MAN game’s total and it’s constitute parts. The game is divided into three parts: interface part, control part and music part.Interface part is divided into picture manufacture and picture loaded in. Picture manufacture adopted the whole interface picture manufacture method and square piece picture manufacture method. Picture loaded in is using allegro’s DRAW_SPRITE complete. Control part is divided into keyboard control and timer control. Keyboard control is player use keyboard control the game. Timer control is the game was controlled by timer. Keyboard control included include the game’s start .The game’s withdraw, the menu’s control of the game and the direction’s control of Pac-man. Timer controls include Pac-man’s Keep on move. At the music pare, It is divided into the background music and special sound effect. The background music used to circularly sowed the hair mode, special sound effect to use to trigger to broadcast the mode.Key words: Java the game development DRAW_SPRITE目录摘要 (I)目录............................................................................................................................................ I II 1引言 (1)1.1课题研究的背景 (1)1.2国内外研究现状与发展趋势 (2)1.3课题的意义及目的 (3)2可行性研究 (4)2.1设计的目的 (4)2.2本设计的问题定义 (4)2.3可行性分析 (4)2.3.1技术可行性 (4)2.3.2操作可行性 (5)3.设计所用软件及环境 (5)3.1J A V A语言简介 (5)3.2E CLIPSE基础 (7)3.3JDK环境 (9)3.4A PPLET基础 (10)4需求分析 (15)4.1游戏需求 (15)4.2编程环境需求 (15)4.3接口控制 (16)5.概要设计 (17)5.1游戏模块划分 (17)5.2游戏流程图 (18)5.3游戏地图算法流程图 (19)5.4游戏音乐算法流程图 (20)6详细设计 (21)6.1主界面设计 (21)6.2本游戏的模块设计 (24)6.2.1墙体绘制模块设计 (24)6.2.2豆子绘制模块设计 (25)6.2.3吃豆者的绘制模块设计 (26)6.2.4敌人绘制模块设计 (27)6.2.5 移动控制模块设计 (30)6.2.6水果模块设计 (31)6.2.7 HTML文件引用模块设计 (33)6.3音乐播放和墙体图片设计 (33)6.3.1音乐播放设计 (33)6.3.2游戏地图设计 (34)6.4游戏界面截图 (34)7软件测试 (36)7.1吃豆子游戏的测试内容 (36)7.2吃豆子游戏的测试步骤 (36)7.3吃豆子游戏的测试项目 (38)7.3.1游戏界面菜单选项的功能测试 (39)7.3.2按键事件的功能测试 (39)7.3.3无敌状态测试 (40)7.4测试结果分析 (41)8总结 (41)致谢 (41)参考文献 (42)1 引言1.1 课题研究的背景电脑已经深入到日常工作和生活的方方面面,比如文字处理、信息管理、辅助设计、图形图像处理、教育培训以及游戏娱乐等。
Python吃豆人游戏代码
Python吃豆人游戏代码编写一个完整的吃豆人游戏同样需要使用图形界面库来实现游戏画面和交互。
以下是一个简化的吃豆人游戏示例代码的框架,其中使用了`pygame`库实现游戏界面:import pygame# 游戏窗口大小WINDOW_WIDTH = 600WINDOW_HEIGHT = 600# 方格大小和数量GRID_SIZE = 30GRID_COUNT = WINDOW_WIDTH // GRID_SIZE# 颜色定义WHITE = (255, 255, 255)BLACK = (0, 0, 0)BLUE = (0, 0, 255)YELLOW = (255, 255, 0)# 初始化Pygamepygame.init()# 创建游戏窗口window = pygame.display.set_mode([WINDOW_WIDTH, WINDOW_HEIGHT])pygame.display.set_caption("吃豆人游戏")# 设置游戏时钟clock = pygame.time.Clock()# 游戏元素类class Pacman:def __init__(self):self.row = 1self.column = 1self.direction = Nonedef draw(self):x = self.column * GRID_SIZE + GRID_SIZE//2y = self.row * GRID_SIZE + GRID_SIZE//2pygame.draw.circle(window, YELLOW, (x, y), GRID_SIZE // 2)def update(self):if self.direction == "up":self.row -= 1elif self.direction == "down":self.row += 1elif self.direction == "left":self.column -= 1elif self.direction == "right":self.column += 1def set_direction(self, direction):self.direction = direction# 创建吃豆人角色pacman = Pacman()# 游戏地图game_map = ["##############################","#............##............#","#.####.#####.##.#####.####.#","#o####.#####.##.#####.####o#","#.####.#####.##.#####.####.#","#..........................#","#.####.##.########.##.####.#","#.####.##.########.##.####.#","#......##....##....##......#","######.#####.##.#####.######","######.#####.##.#####.######","######.## ##.######","######.## ######## ##.######"," . ######## . ","######.## ######## ##.######","######.## ##.######","#######.##########.#######","#######.##########.#######","#.........................#","#.####.#####.##.#####.####.#","#.####.#####.##.#####.####.#","#o..##................##..o#","###.##.##.########.##.##.###","###.##.##.########.##.##.###","#......##....##....##......#","#.##########.##.##########.#","#.##########.##.##########.#","#..........................#","##############################"]# 绘制游戏地图def draw_map():for row in range(len(game_map)):for column in range(len(game_map[row])):x = column * GRID_SIZEy = row * GRID_SIZEif game_map[row][column] == "#":pygame.draw.rect(window, BLUE, (x, y, GRID_SIZE, GRID_SIZE))elif game_map[row][column] == "o":pygame.draw.circle(window, WHITE, (x + GRID_SIZE//2, y + GRID_SIZE//2), GRID_SIZE // 8)# 判断是否超出游戏地图边界或遇到障碍物def check_collision(row, column):if row < 0 or row >= len(game_map) or column < 0 or column >= len(game_map[0]): return Trueelif game_map[row][column] == "#":return Truereturn False# 游戏主循环running = Truewhile running:# 处理事件for event in pygame.event.get():if event.type == pygame.QUIT:running = Falseelif event.type == pygame.KEYDOWN:if event.key == pygame.K_UP:pacman.set_direction("up")elif event.key == pygame.K_DOWN:pacman.set_direction("down")elif event.key == pygame.K_LEFT:pacman.set_direction("left")```pythonelif event.key == pygame.K_RIGHT:pacman.set_direction("right")# 更新游戏元素pacman.update()# 检查碰撞和吃豆子if check_collision(pacman.row, pacman.column):pacman.set_direction(None)elif game_map[pacman.row][pacman.column] == "o":game_map[pacman.row] = game_map[pacman.row][:pacman.column] + " " + game_map[pacman.row][pacman.column+1:]# 绘制游戏画面window.fill(BLACK)draw_map()pacman.draw()pygame.display.update()# 控制游戏帧率clock.tick(10)# 退出游戏pygame.quit()这个示例代码实现了一个简化的吃豆人游戏框架。
英语课堂游戏 吃豆豆闯关游戏
英语课堂游戏吃豆豆闯关游戏英语课堂游戏吃豆豆闯关游戏1、游戏简介吃豆豆闯关游戏是一款经典的英语课堂游戏,旨在提高学生的语言表达能力和听力理解能力。
游戏规则简单,玩家通过控制一个小豆豆,吃掉屏幕上出现的英语单词,躲避障碍物,以完成关卡任务。
2、游戏准备2.1 游戏道具- 投影仪或大屏幕电视- 控制器(可以用键盘代替)- 游戏软件(例如吃豆豆闯关游戏App或游戏网站)- 小奖品(可选)2.2 游戏策划- 确定游戏关卡数量- 准备每个关卡的题目及答案- 设计障碍物和道具的位置- 设置计分规则和游戏时间限制(可选)3、游戏流程3.1 游戏设置- 将游戏软件投影到大屏幕上- 进入游戏设置界面,选择游戏关卡数量和难度等级3.2 游戏开始- 玩家通过控制器控制小豆豆的移动- 游戏开始后,屏幕上会随机出现英语单词和障碍物- 玩家需要用小豆豆吃掉正确的英语单词,躲避障碍物 - 每吃掉一个正确的单词,得分加1,吃掉错误的单词或被障碍物撞击,扣分或被扣除生命值- 完成所有关卡的任务后,游戏结束,显示最终得分和评价3.3 游戏评价- 根据玩家的游戏得分和表现,给予相应的评价(例如糟糕、普通、优秀、卓越等)- 可根据评价结果给予奖励或惩罚(例如发放小奖品或暂停几分钟课堂时间)4、游戏效果4.1 提高听力理解能力- 在游戏中,玩家需要通过听到的英语单词来决定是否吃掉- 这可以帮助学生更好地理解和识别英语单词的发音和意义4.2 提高语言表达能力- 游戏过程中,玩家可以尝试用英语或汉语表达答案并与其他玩家交流- 这可以促进学生的口语表达能力和跨文化交流能力5、难点及解决方法5.1 难点:难度设置- 不同年级和语言水平的学生对游戏的难度需求不同5.2 解决方法- 设计多个难度级别供玩家选择- 在游戏设置中提供自定义难度选项,根据学生的水平进行调整6、附件本文档附带如下文件:- 游戏关卡设置表(附件1)- 英语单词库(附件2)- 游戏评价表(附件3)7、法律名词及注释- 附件:指与本文档相关的文件或资料,通常作为补充信息提供给读者- 计分规则:游戏中用来计算玩家得分的规则- 版权:指创作作品的独占权,包括复制、发行、展示、表演等权利- 商标:指商品、服务的商标标识,用于区分同类商品、服务的来源注释:以上法律名词及注释可根据具体情况进行添加或修改。
Python吃豆豆课程设计报告
Python吃豆豆课程设计报告前言:前段时间我参加了学校组织的“第一届信息技术微课比赛”,本来觉得很简单。
可当真正动手制作微课时才发现有这么多的知识点要去梳理,有那么多难懂的概念要去讲解。
于是便开始搜集资料,想尽快完成课题设计任务,希望能通过此次机会锻炼自己的编程和表达能力,以便日后工作之用。
通过对前人相关文献的研读,并与指导老师的沟通交流后,确定了本节课的主题—— Python 吃豆豆。
课程主要采取了微视频+文档的形式,首先从趣味性入手,介绍了游戏的基本玩法和操作步骤,让同学们认识到游戏的乐趣所在,为接下来的课堂内容做铺垫。
然后引出了游戏中遇到的问题,分析问题、寻找解决办法。
在解决问题的过程中将问题具体化,不断地提高解决问题的效率,使整个课程更贴近实际生活。
最后小结课程内容,布置课外练习,再进行课堂总结。
课程的名称 Python 吃豆豆,来源于人们玩的一种小游戏,小朋友经常利用自己的大脑在纸牌或其他卡片上放置各类图案或数字等,通过“吃掉”上面的图案来获胜。
为什么我选择这样一个课题呢?首先 Python 语言应用范围广泛,无论是在生产领域还是科学研究都有着重要的影响。
另外它支持多种语言编写,非常适合学生掌握。
而且 Python 是由 C 语言衍变而来的,所以掌握 C 语言的基础知识也显得尤为必要。
课程中的 Python 部分是整门课程中的重点,在这里着重讲述了 Python 语言的一些基本语句、语法规则及基本操作。
所以说 Python 吃豆豆这个课题适合全班同学,即使初学者,如果跟随老师循序渐进的学习 Python,也能很好地掌握。
最后就是个人兴趣爱好了, Python 既然叫吃豆豆,肯定是在不停的吃豆豆,在这样一个环境下,学起 Python 来心情愉悦,印象深刻。
所以课程确定下来后我立马投身到课题的准备工作中去了,刚好赶上学校的实践周,根据实践周的安排,这几天把需要讲授的课程 PPT 做出来,并查阅资料收集相关素材。
Java小游戏吃豆豆源代码
1.4源程序1.4.1 BigMouthFish.javapackage cn.ycit.xinxi.eatbean.fish;import java.awt.Color;import java.awt.Graphics;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.Timer;public class BigMouseFish implements ActionListener {public static int up = 0;public static int right = 1;public static int down = 2;public static int left = 3;public int size = 50;public int direction = right;public Color color = Color.CYAN;public int posx = 80;public int posy = 80;public int speed = 4;public int eyesize = size / 5;public int eyeposx = posx + size / 2;public int eyeposy = posy + size / 5;private Color eyecolor = Color.BLACK;private int maxMouse = 30;private int mousesize = 30;private boolean isOpen = true;private Timer time = null;/*** 创建一个位置为(200,200)大小为50,方向右,颜色蓝色,速度为10* */public BigMouseFish() {this(200,200,50,right,Color.CYAN,10);}public BigMouseFish(int posx, int posy, int size, int direction,Color color, int speed) { this.posx = posx;this.posy = posy;this.size = size;this.speed = speed;if (direction == 0 || direction == 1 || direction == 2 || direction == 3) {this.direction = direction;}eyesize = size / 7;initEye();time = new Timer(Fishpool.reTime, this);time.start();}public void move() {switch (direction) {case 0:posy--;break;case 1:posx++;break;case 2:posy++;break;case 3:posx--;break;default:break;}}public void changeColor(Color color) {this.color=color;}public void changeDir(int direction) {this.direction = direction;}public void paint(Graphics g){//保存画笔的颜色Color c = g.getColor();//绘制鱼脸g.setColor(color);//从(posx,posy)点开始,绘制宽为size,高为size,开始角度为(direction%2==0?(direction+1):(direction-1))*90+monthsize,弧度为360-2*maxMonth的弧形g.fillArc(posx, posy, size, size, (direction%2==0?(direction+1):(direction-1))*90+mousesize, 360-2*mousesize);//绘制鱼眼initEye();g.setColor(eyecolor);g.fillOval(eyeposx, eyeposy, eyesize, eyesize);//恢复画笔颜色g.setColor(c);}private void initEye() {switch (direction) {case 0:eyeposx = posx + size / 7;eyeposy = posy + size / 2;break;case 1:eyeposx = posx + size / 2;eyeposy = posy + size / 7;break;case 2:eyeposx = posx + size * 5 / 7;eyeposy = posy + size / 2;break;case 3:eyeposx = posx + size / 2 - eyesize;eyeposy = posy + size / 7;break;default:break;}}public void actionPerformed(ActionEvent e) {if(isOpen){mousesize -= 2;if(mousesize<=0)isOpen = false;}else{mousesize += 2;if(mousesize>=maxMouse)isOpen = true;}}}1.4.2 FishBean.javaackage cn.ycit.xinxi.eatbean.fish;import java.awt.Color;import java.awt.Graphics;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.Timer;public class FishBean implements ActionListener {public int posx = 190;public int posy = 190;public int size = 10;private Color color = Color.MAGENTA;private Color newcolor = Color.MAGENTA;private Color oldcolor = Color.GRAY;public static int flickerTime = 350;public static int flickerNum = 8;private int hasFileckedNum = 0;private Timer timer = null;public FishBean() {this(40, 15, 10, Color.MAGENTA, Color.gray);}public FishBean(int posx, int posy, int size, Color newcolor, Color oldcolor) { this.posx = posx;this.posy = posy;this.size = size;this.newcolor = newcolor;this.oldcolor = newcolor;timer = new Timer(flickerTime, this);}public void paint(Graphics g) {Color c = g.getColor();g.setColor(color);g.fillOval(posx, posy, size, size);g.setColor(c);}public void newPos(int posx, int posy) {this.posx = posx;this.posy = posy;}public void stopTimer() {color = newcolor;timer.stop();hasFileckedNum = 0;}public void runTimer() {timer.start();}public void actionPerformed(ActionEvent e) {hasFileckedNum++;if (color.equals(newcolor) || color == newcolor) {color = oldcolor;} else {color = newcolor;}if (hasFileckedNum == flickerNum && timer.isRunning()) { stopTimer();}}public boolean timerIsRunning(){return timer.isRunning();}}1.4.3 Fishpool.javapackage cn.ycit.xinxi.eatbean.fish;import cn.ycit.xinxi.eatbean.main.BigMouseFishFrame;import cn.ycit.xinxi.eatbean.tools.FishUtilities;import cn.ycit.xinxi.eatbean.tools.RandomUtil;import java.awt.Color;import java.awt.Graphics;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.KeyEvent;import java.awt.image.ImageObserver;import javax.swing.AbstractAction;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.KeyStroke;import javax.swing.Timer;public class Fishpool extends JLabel{private static final long serialVersionUID = 1L;private BigMouseFish fish = null;private FishBean bean = null;private int timeLength = 15 * 1000;public static int reTime = 100;private Timer timer = null;private Timer time = null;private int sizeAdd = 1;private int speedAdd =2;private int scoreAdd = 1;private int score = 0;private int upgradeNum = 10;private int eatNum = 0;private int min_x = 0;private int max_x = 0;private int min_y = 0;private int max_y = 0;public Fishpool() {setSize(BigMouseFishFrame.width, BigMouseFishFrame.height);setLocation(10, 10);fish = new BigMouseFish();initFishBean();max_x = BigMouseFishFrame.width - fish.size - 3;min_y = 3;max_y = BigMouseFishFrame.height - fish.size - 3;getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "UPPRESS");getActionMap().put("UPPRESS", new UpListenerImpl());getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "RIGHTPRESS");getActionMap().put("RIGHTPRESS", new RightListenerImpl());getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), "DOWNPRESS");getActionMap().put("DOWNPRESS", new DownListenerImpl());getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), "LEFTPRESS");getActionMap().put("LEFTPRESS", new LeftListenerImpl());timer = new Timer(reTime, new TimerListenerImpl());timer.start();time = new Timer(timeLength - FishBean.flickerTime * FishBean.flickerNum, new TimerListenerImpl());ActionListener actionListener = new ActionListener() {public void actionPerformed(ActionEvent e) {time.stop();bean.runTimer();new Thread() {public void run() {while(true){if ( !bean.timerIsRunning() ) {beanNewPos();time.restart();break;}}}}.start() ;}};timer.start();}private void initFishBean() {int posx = 0;int posy = 0;do {posx = RandomUtil.randomInt(BigMouseFishFrame.width - size-50);posy = RandomUtil.randomInt(BigMouseFishFrame.height - size-100);bean = new FishBean(posx, posy, size, getBackground(), Color.BLUE);} while (posx >= fish.posx && posx <= fish.posx + fish.size&& posy >= fish.posy && posy <= fish.posy + fish.size&&posx+size>=fish.posx &&posx+size<=fish.posx+fish.size&&posy+size>=fish.posy &&posy+size<=fish.posy+fish.size);bean = new FishBean(posx, posy, size, Color.MAGENTA, getBackground());}private void beanNewPos() {int size = 15;int posx =0;int posy= 0;do {posx = RandomUtil.randomInt(2 * size, BigMouseFishFrame.width - 2 * size);posy = RandomUtil.randomInt(2 * size, BigMouseFishFrame.height - 2 * size);} while (posx >= fish.posx && posx <= fish.posx + fish.size && posx >= fish.posy&& posy <= fish.posy + fish.size && posx + size >= fish.posx && posy + size < +fish.posy&& posx + size <= fish.posx + fish.size&& posy + size <= fish.posy + fish.size);bean.newPos(posx, posy);}public void paint(Graphics g) {super.paint(g);fish.paint(g);bean.paint(g);}private void bigFishmove(int direction) {MOVE:for (int i = 0; i < fish.speed; i++) {fish.changeDir(direction);switch (direction) {case 0:if (fish.posy >= min_y + 1) {if (isTouched()) {break MOVE;}}case 1:if (fish.posx >= max_x - 1) {if (isTouched()) {break MOVE;}}case 2:if (fish.posy >= max_y - 1) {if (isTouched()) {break MOVE;}}case 3:if (fish.posx >= min_x + 1) {if (isTouched()) {break MOVE;}break;}}}}private boolean isTouched() {fish.move();boolean b = FishUtilities.isInteraction(fish, bean);if (b) {initFishBean();eatNum++;score += scoreAdd;BigMouseFishFrame.IblScore.setText(score + "");fish.speed =4;if (eatNum == upgradeNum) {eatNum = 0;fish.size += sizeAdd;fish.speed += speedAdd;BigMouseFishFrame.IblSize.setText(fish.size + "");BigMouseFishFrame.IblSpeed.setText(fish.speed + "");}}return b;}class UpListenerImpl extends AbstractAction {private static final long serialVersionUID = 1L;public void actionPerformed(ActionEvent e) {bigFishmove(0); //To change body of generated methods, choose Tools | Templates.}}class RightListenerImpl extends AbstractAction {private static final long serialVersionUID = 1L;public void actionPerformed(ActionEvent e) {bigFishmove(1); //To change body of generated methods, choose Tools | Templates.}}class DownListenerImpl extends AbstractAction {private static final long serialVersionUID = 1L;public void actionPerformed(ActionEvent e) {bigFishmove(2); //To change body of generated methods, choose Tools | Templates.}}class LeftListenerImpl extends AbstractAction {private static final long serialVersionUID = 1L;public void actionPerformed(ActionEvent e) {bigFishmove(3); //To change body of generated methods, choose Tools | Templates.}}class TimerListenerImpl implements ActionListener {public void actionPerformed(ActionEvent e) {repaint(); //To change body of generated methods, choose Tools | Templates.}}}1.4.4 FishUtilities.javapackage cn.ycit.xinxi.eatbean.tools;import cn.ycit.xinxi.eatbean.fish.BigMouseFish;import cn.ycit.xinxi.eatbean.fish.FishBean;public class FishUtilities {public static boolean isInteraction(BigMouseFish fish,FishBean bean){return Math.pow(fish.posx+fish.size /2-bean.posx-bean.size /2,2)+Math.pow(fish.posy+fish.size/2-bean.posy -bean.size/2,2)<=Math.pow(fish.size/2,2);}1.4.5 RandomUtil.javapackage cn.ycit.xinxi.eatbean.tools;import java.util.Random;public class RandomUtil {public static int randomInt(int a,int b){int t,n=0;if(a>b){t=a;a=b;b=t;}t=(int)(Math.ceil(Math.log10(b)));while(true){n=(int)(Math.random()*Math.pow(10, t));if(n>=a&&n<=b){break;}}return n;}public static int randomInt(int a){return new Random().nextInt(a);}}1.4.6 BigMouthFishFrame.javapackage cn.ycit.xinxi.eatbean.main;import cn.ycit.xinxi.eatbean.fish.BigMouseFish; import cn.ycit.xinxi.eatbean.fish.Fishpool;import java.awt.Color;import java.awt.FlowLayout;import java.awt.Toolkit;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JTextArea;import javax.swing.border.EtchedBorder;import javax.swing.border.LineBorder;import javax.swing.border.TitledBorder;public class BigMouseFishFrame extends JFrame { private static final long serialVersion = 1L;public static int width = 800;public static int height = 800;private JLabel IblInfo = new JLabel("欢迎进入大嘴鱼游戏");private JLabel IblFishSize = new JLabel(" 鱼的大小:");private JLabel IblFishSpeed = new JLabel(" 鱼的速度:");private JLabel IblFishScore = new JLabel(" 现在得分:");public static JLabel IblSize = new JLabel("50");public static JLabel IblSpeed = new JLabel("4");public static JLabel IblScore = new JLabel("0");private JTextArea txtInfo = new JTextArea();public BigMouseFishFrame() {Fishpool pool = new Fishpool();pool.setBorder(new EtchedBorder());setTitle("大嘴鱼游戏");setSize(width + 180, height + 50);setResizable(true);Toolkit tk = Toolkit.getDefaultToolkit();setLocation((tk.getScreenSize().width - getSize().width) / 2, (tk.getScreenSize().height - getSize().height));IblInfo.setSize(150, 20);IblInfo.setLocation(width + 25, 240);String str = "大嘴鱼游戏的简单使用说明;使用键盘上的" + "上下左右键控制大嘴鱼的移动方向,得分加1" + "每吃10条鱼,大嘴鱼将升级,大小加1,速度加2\n\n";txtInfo.append(str);txtInfo.setBackground(getBackground());txtInfo.setEditable(false);txtInfo.setLineWrap(true);txtInfo.setSize(150, 240);txtInfo.setLocation(width + 15, 370);txtInfo.setBorder(new TitledBorder(new LineBorder(Color.GRAY), "游戏说明"));JPanel pan = new JPanel();pan.setSize(150, 100);pan.setLocation(width + 15, 265);pan.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));pan.setBorder(new TitledBorder(new LineBorder(Color.GRAY), "游戏积分"));pan.add(IblFishSize);pan.add(IblSize);pan.add (IblFishSpeed);pan.add(IblSpeed);pan.add(IblFishScore);pan.add(IblScore);setLayout(null);add(pool);add(IblInfo);add(pan);add(txtInfo);setDefaultCloseOperation(EXIT_ON_CLOSE);setVisible(true);}public static void main(String[] args) {new BigMouseFishFrame();}}。
打豆豆游戏的C#代码
第一部分是概述,第二部分为代码,第三部分为联络。
一、概述VS打开后如下图所示,由于不能直接上传C#文件,就做成这个Word文档。
运行后效果图:(1).得分显示区域,消除1个豆豆后可得10分,但若点击豆豆却不可消除,扣除30分。
分数图片资源文件:\ForFun\Pictures(2).测试用。
CheckBox勾上时,会将Log输出到exe所在文件夹下。
(3).勾上时,即使豆豆上升到最大时,游戏也不会结束。
(4).勾上时,每次得分都将自动保存到本地exe所在文件夹下。
(5).勾上时,豆豆才会自动往上增长。
(6).可点击六个Button设置增长豆豆的颜色。
若不勾上则不会使用设置的颜色,而使用游戏预设的颜色。
(7).点击“开始游戏”时,游戏界面出现的豆豆行数。
(8).“自增长模式”勾上时才有效。
豆豆增长间隔时间,ms单位。
(9).开始游戏(10).游戏界面。
鼠标点击豆豆,即打豆豆。
二、代码1. \ForFun\Class\FBlock.cs (FBlock代表的是一个个颜色的豆豆。
)using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Drawing;using System.Drawing.Drawing2D;namespace ForFun.Class{public class FBlock{///<summary>/// Block的长宽值///</summary>public const int BlockSize = 25;///<summary>///长宽值半数///</summary>public const int HalfSize = 12;///<summary>///随机数生成器///</summary>private static Random rand = new Random();private Color showColor;///<summary>///显示的主颜色///</summary>public Color ShowColor{get { return showColor; }set { showColor = value; }}///<summary>///初始化FBlock///</summary>///<param name="colors"></param>public FBlock(Color[] colors){int index = rand.Next(0, colors.Length);this.showColor = colors[index];}///<summary>///初始化FBlock///</summary>///<param name="color"></param>public FBlock(Color color){this.showColor = color;}///<summary>///填充颜色///</summary>///<param name="graphics"></param>///<param name="pointMatrix"></param>public void Draw(Graphics graphics, Point pointMatrix){// 渐变色Brush生成LinearGradientBrush brush = CreateTheBrush(pointMatrix);// 绘制DrawTheBlock(graphics, brush, pointMatrix);}///<summary>///填充Block颜色///</summary>///<param name="graphics"></param>///<param name="brush"></param>///<param name="pointMatrix"></param>private void DrawTheBlock(Graphics graphics, Brush brush, Point pointMatrix) {// 获得左上坐标(PictureBox中的坐标)Point location = FPointTranslator.GetLeftTopPoint(pointMatrix);// 绘制区域大小Size size = new Size(FBlock.BlockSize, FBlock.BlockSize);Rectangle rect = new Rectangle(location, size);graphics.FillEllipse(brush, rect);}///<summary>///获得渐变色的Brush///</summary>///<param name="pointMatrix"></param>///<returns></returns>private LinearGradientBrush CreateTheBrush(Point pointMatrix){// 渐变色起点:左下Point pointLB = FPointTranslator.GetLeftButtomPoint(pointMatrix);// 渐变色终点:右上Point pointRT = FPointTranslator.GetRightTopPoint(pointMatrix);return new LinearGradientBrush(pointLB, pointRT, this.ShowColor, Color.White); }}}2. \ForFun\Class\FGrid.cs (FGrid代表的是整个游戏主区域,包含了m*n个Block)using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Drawing;using System.IO;namespace ForFun.Class{public class FGrid{///<summary>///测试Log输出///</summary>public bool LogOutputFlg = false;///<summary>/// Block项目矩阵///</summary>private FBlock[,] matrix = new FBlock[14, 18];///<summary>///获取行数///</summary>public int AllRowCount{get { return matrix.GetLength(0); }}///<summary>///获取列数///</summary>public int AllColCount{get { return matrix.GetLength(1); }}private Color[] colors = new Color[] { Color.Red, Color.Green, Color.Yellow, Color.Blue };///<summary>///可能颜色集///</summary>public Color[] Colors{get { return colors; }set { colors = value; }}///<summary>///根据行数生成Matrix的随机颜色值。
吃豆人游戏C语言源代码
吃豆人游戏C语言源代码北京科技大学计算机与通信工程学院信息1008 庄辉#include "graphics.h"#include "stdlib.h"#include "dos.h"#include "bios.h"#include "stdio.h"#include "time.h"#include "graphics.h"#include "conio.h"#define LEFT 0x4b00#define RIGHT 0x4d00#define DOWN 0x5000#define UP 0x4800#define ESC 0x011b#define ENTER 0x1c0d#define SPACE 0x3920/*游戏中人物的结构体*/struct play{int x;int y;};struct Snow{int x;int y;1 / 23北京科技大学计算机与通信工程学院信息1008 庄辉int speed;}snow[100];int snownum=0;struct play you,them[5];void *save;int sum=0;/*统计吃的豆子个数,吃满50颗就算胜利*/int change=10;/*0豆子,1空地2,墙壁,3自己,4敌人*/int a[15][20]={2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,1,1,0,0,0,0,0,1,0,0,0,1,1,1,1,1,1,0,2,2,1,2,2,2,1,1,2,1,1,0,0,0,1,1,4,1,1,0,2,2,1,1,0,2,1,1,2,0,1,1,2,2,2,2,2,0,0,0,2,2,4,1,0,2,1,1,2,1,1,1,0,1,1,1,1,0,1,1,2,2,1,2,1,2,1,1,2,1,3,2,2,1,1,1,1,2,2,1,2,2,1,2,1,2,1,1,1,1,1,1,1,1,0,0,0,1,1,1,2,2,1,2,1,0,1,1,1,1,2,1,0,1,2,2,2,1,1,1,2,2,1,0,1,0,1,2,1,1,2,1,0,1,2,1,1,4,1,1,2,2,1,0,2,0,1,2,1,1,2,1,0,1,2,1,1,1,1,1,2,2,1,0,2,1,1,2,1,1,2,1,0,2,2,1,0,0,0,1,2,2,1,1,2,1,1,2,1,1,2,1,0,2,1,1,2,2,1,1,2,2,1,2,2,1,2,2,1,1,1,1,0,1,4,1,2,0,0,1,2,2,1,0,0,0,0,0,4,0,1,1,0,1,1,1,1,0,0,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2};/*数组就是地图( level 1)*/ ;int b[15][20]={2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,1,1,0,0,0,0,0,1,0,0,0,1,1,1,1,1,1,0,2,2,1,2,2,2,2,1,2,1,1,0,0,0,1,1,4,1,1,0,2,2,1,1,0,2,2,1,2,0,1,2,2,2,2,2,2,0,0,0,2,2,4,1,0,2,1,1,2,1,1,1,0,1,1,2,1,0,1,1,2,2,1,2,1,2,1,1,2,2,3,2,2,1,1,2,1,2,2,1,2,2,1,2,1,2,2,1,1,1,1,1,1,1,0,0,0,1,1,1,2,2,2,2,1,0,2,1,1,1,2,1,0,1,2,2,2,1,1,1,2,2,2,0,1,0,2,2,1,1,2,1,0,1,2,2,1,4,1,1,2,2 / 23北京科技大学计算机与通信工程学院信息1008 庄辉2,1,0,2,0,1,2,1,2,2,1,0,1,2,1,1,1,1,1,2,2,1,0,2,1,1,2,1,1,2,1,0,2,2,1,0,0,0,1,2,2,1,1,2,1,1,2,1,1,2,1,0,2,1,2,2,2,1,1,2,2,1,2,2,1,2,2,2,1,1,1,0,1,4,1,2,0,0,1,2,2,1,0,0,0,0,0,4,0,1,1,0,1,1,1,1,0,0,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2};/*数组就是地图( level 2)*/int c[15][20]={2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,0,0,0,0,0,1,0,0,0,1,1,2,1,1,1,0,2,2,1,2,2,2,1,1,2,2,1,0,0,0,1,2,4,1,1,0,2,2,1,1,0,2,2,1,2,0,1,2,2,2,2,2,2,0,0,0,2,2,4,1,0,2,1,1,2,1,1,1,0,1,1,1,1,0,1,1,2,2,1,2,1,2,1,2,2,1,3,2,2,1,1,1,1,2,2,1,2,2,1,2,1,2,1,1,1,1,1,1,1,1,0,0,0,1,1,1,2,2,1,2,1,0,2,1,1,1,2,2,0,1,2,2,2,1,1,1,2,2,2,0,1,0,1,2,1,2,2,1,0,1,2,1,1,4,1,1,2,2,2,0,2,0,1,2,1,1,2,1,0,1,2,2,1,1,1,1,2,2,2,0,2,1,1,2,2,1,2,1,0,2,2,1,0,0,0,1,2,2,1,1,2,1,1,2,1,1,2,2,0,2,1,1,2,2,2,1,2,2,1,2,2,1,2,2,1,2,1,1,0,1,4,1,2,0,0,1,2,2,1,0,0,0,0,0,4,0,1,1,0,1,1,1,1,0,0,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2};/*数组就是地图( level 3)*/int xx[5][2];/*判断敌人方向用的结构体*/int false=0; /*判断输赢的参数*//*************************选择关卡******************************************************************** /void levelchoose(int x){int j,k;switch(x)3 / 23北京科技大学计算机与通信工程学院信息1008 庄辉{case 1:break;case 2:for(j=0;j<15;j++)for(k=0;k<20;k++)a[j][k]=b[j][k];break;case 3:for(j=0;j<15;j++)for(k=0;k<20;k++)a[j][k]=c[j][k];break;default:break;}}/*********************欢迎界面******************************************************************** *****/void hello(){/*输出界面*/4 / 23北京科技大学计算机与通信工程学院信息1008 庄辉printf("XXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXXXX XXXXXXXXXXXX\n");printf("X XXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXX\n");printf("X XXX XX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXX\n");printf("X XXX X XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXX\n");printf("X XXX X XXXXXXXXXXXXXXXXX XXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXX\n");printf("X XXX XXX XXXXXXXXX XXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX\n");printf("X XXX XXXXXXX XXXXXXXXXX XXXXXXXXXX XXXXXXXXXXXXXXX XXXXXXXXXXX\n");printf("X XXX XXXXXX XXXXXXXXXXXX XXXXXXXXXXXXXX XX XXXXXXXXXX\n");printf("X XXXX XXXXXXXXXXXXXXX XXXXXXX XXXXXXXXXXXXXXXX XXXX XXXXXXXXX\n");printf("X XXX XXX XXXXXXXXXXXXXXXXX XXXXXX XXXXXXXXXXXXXX XXXXXX XXXXXXXX\n");printf("X XXX XXX XXXXXX XXXXXXXXXX XXXX XXXXXXXXXXXXX XXXXXXX XXXXXXX\n");printf("XXXXXXXXXX XXXXXXX XXXXXXXXXX XXXXX XXXXXXXXXXXXX XXXXXXXX XXXXX\n");printf("XXXXXXXXXXX XXXXX XXXXXXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXX XXXX\n");printf("XXXXXXXXXXX XXXXX XXXX XXXXXXXXXXXX XXX\n");printf("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXX\n");printf("X XXXXXX XXXXXXXX XXX XXXX XXXXX XXXXXX XXXXX X\n");printf("X XXXXX XXXXXX XXXXXXX XXX XXX XXXX XXXXX XXXXXX XXXXX X\n");printf("X XXXXXX XXXXX XXXXXXX XXXXX XX XX XXXXX XXXXXX XXXX X\n");printf("X XXXXXX XXXX X XXXXX XXXXXX XX XX XXXX X XXXXX XXXX X\n");printf("X XXXXXX XXXX X XXXXX XXXXXX XX XX XXXX X XXXXX X XXX X\n");printf("X XXXXXX XXXX X XXXXX XXXXXXXXXX X XX X XXXX X XXXXX X XXXX\n");5 / 23北京科技大学计算机与通信工程学院信息1008 庄辉printf("X XXXXX XXXX XXX XXXX XXXXXXXXXX X X XXX XXX XXXX XX XXX\n");printf("X XXXX XXX XXXX XXXXXXXXXX X X XXX XXX XXXX XX XX X\n");printf("X XXXXXXXXXXX XXXX XXXXXX XX X X XXX XXXX XXX X X\n");printf("X XXXXXXXXXX XXXXX XXX XXXXXX XX X X XX XXXXX XXX XXXX X\n");printf("X XXXXXXXXXX XXXXX XXXX XXXX XX XX XX XX XXXXX XXX XXXXX\n");printf("X XXXXXXXXXX XXXXX XXXX XXX XXX XX XX XX XXXXX XXX XXXXXX\n");printf("X XXXXXXXXX XXXXXXX XXXX XXXX XX XX X XXXXXXX XX XXXXX X\n");}/*********************游戏说明******************************************************************** *****/void instruction(){printf(" *****************************************\n");printf(" * GAME INSTRUCTIONS *\n");printf(" *****************************************\n");printf(" WELCOME TO PACMAN WORLD!\n\n");printf("Press up,down,left,right to play.\n");printf("Press Esc to quit it.\n");6 / 23北京科技大学计算机与通信工程学院信息1008 庄辉printf("Press space to reset the game when you are playing.\n");printf("How to win the game:\n");printf("\tIf you have aten all of the yellow peans without being in the same location with thegreen enemy , you win ! \n");printf("\tIf you are in the same location with the green enemy ,you lose !\n");printf("Please choose game level number from 1 to 3 and press Enter key to start game :\n");}/**************************延时函数传入微秒数******************************************************************** *******/void TimeDelay(unsigned long microsec){union REGS r;r.h.ah=0x86;r.x.cx=microsec>>16;r.x.dx=microsec;int86(0x15,&r,&r);}/***************************吃豆子的函数******************************************************************** *************/7 / 23北京科技大学计算机与通信工程学院信息1008 庄辉drawblackdou(int x,int y){setcolor(0);circle(100+y*20,100+x*20,3);/*吃到豆子后就加一*/sum++;/*吃到后这里就成为普通平地*/a[x][y]=1;}/*******************播放音乐的函数*********************************************************************/void Pr(){int s[15]={0,100,150,200,50,150,250,300,250,300,250,150,100,250,350};/*改变欢迎词的颜色*/setcolor(change/10);/*改变欢迎词的字体*/settextstyle(0,0,4);/*输出欢迎词*/outtextxy(20,200,"WELCOME TO OUR GAME!!");outtextxy(20,250,"Press Space key to");outtextxy(20,300,"continue...");8 / 23北京科技大学计算机与通信工程学院信息1008 庄辉/*使扬声器以s[change/10]的频率发声*/ sound(s[change/10]);}/******************播放动画音乐**************************************************************************************/void DrawSnow(){int i;int sx[62];setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*一次3行画出白色雪花的3条线*/line(1,1,9,9);line(0,5,10,5);line(9,1,1,9);/*在堆中申请200字节空间*/save=malloc(200);/*将雪花位图保存到save中*/getimage(0,0,10,10,save);/*清屏*/cleardevice();9 / 23北京科技大学计算机与通信工程学院信息1008 庄辉/*设置随机数的种子数*/randomize();/*计算雪花位置的横坐标数组*/for(i=0;i<62;i++)sx[i]=(i+2)*10;/*******************以下的键控while循环控制播放音乐和下雪动画********************************************//*如果未按键,执行循环体*/while(!kbhit()){Pr();if(snownum!=100){snow[snownum].speed=2+random(5);i=random(62);/*取横坐标*/snow[snownum].x=sx[i];/*计算纵坐标*/snow[snownum].y=10-random(100);}10 / 23北京科技大学计算机与通信工程学院信息1008 庄辉/*循环放置snownum个雪花*/for(i=0;i<snownum;i++)putimage(snow[i].x,snow[i].y,save,COPY_PUT); /*延迟100ms以便看到雪花*/delay(100);/*清屏*/cleardevice();/*调用 Pr函数输出欢迎词并播放声音*/Pr();/*循环画出snownum个雪花*/if(snownum!=100) snownum++;setfillstyle(SOLID_FILL,15);for(i=0;i<snownum;i++){snow[i].y+=snow[i].speed;putimage(snow[i].x,snow[i].y,save,COPY_PUT);if(snow[i].y>500) snow[i].y=10-random(200);}change++;if(change==140)change=10;}nosound();cleardevice();11 / 23北京科技大学计算机与通信工程学院信息1008 庄辉}/*****************图形系统初始化函数******************************************************************** ****/void Init(void){int gd=DETECT,gm;initgraph(&gd,&gm,"c:\\tc");cleardevice();}/***************************开始函数****************************************************************/ begain(){int i,j;sleep(1);for(i=0;i<15;i++)for(j=0;j<20;j++)/*代表墙壁*/if(a[i][j]==2){setfillstyle(SOLID_FILL,BLUE);bar(100+j*20-10,100+i*20+10,100+j*20+10,100+i*20-10);}12 / 23北京科技大学计算机与通信工程学院信息1008 庄辉/*代表自己*/else if(a[i][j]==3){setcolor(RED);circle(100+j*20,100+i*20,9);}/*代表敌人*/else if(a[i][j]==4){setcolor(GREEN);circle(100+j*20,100+i*20,9);}/*代表豆子*/else if(a[i][j]==0){setcolor(YELLOW);circle(100+j*20,100+i*20,3);}/*敌人也自己的开始坐标*/you.x=5;you.y=9;them[0].x=2;them[0].y=15;them[1].x=4;them[1].y=1;them[2].x=8;them[2].y=16;them[3].x=12;them[3].y=13;them[4].x=13;them[4].y=7;}13 / 23北京科技大学计算机与通信工程学院信息1008 庄辉/************************敌人移动的过程******************************************************************** /void movethem(struct play *them) {int i,loop;randomize();for(i=0;i<5;i++){if(you.x==them[i].x&&(them[i].y+1)==you.y)them[i].y++;else if(you.x==them[i].x&&(them[i].y-1)==you.y)them[i].y--;else if(you.y==them[i].y&&(them[i].x+1)==you.x)them[i].x++;else if(you.y==them[i].y&&(them[i].x-1)==you.x)/*只要控制者在身边就立即靠上去*/them[i].x--;else{loop:/*这里的方向采取随机赋值,原则是新的方向不可以和原来的方向相反*/ xx[i][0]=rand()%4+1;14 / 23北京科技大学计算机与通信工程学院信息1008 庄辉if(xx[i][0]==1&&xx[i][1]==2||xx[i][0]==2&&xx[i][1]==1)goto loop;if(xx[i][0]==3&&xx[i][1]==4||xx[i][0]==4&&xx[i][1]==3)goto loop;xx[i][1]=xx[i][0];if(xx[i][0]==1)/*四个方向*/{them[i].x--;if(a[them[i].x][them[i].y]==2)/*如果碰墙壁的话就回到原来的地方等待随机的方向*/{them[i].x++;goto loop;}}else if(xx[i][0]==2){them[i].x++;if(a[them[i].x][them[i].y]==2){them[i].x--;goto loop;}}else if(xx[i][0]==3){them[i].y++;if(a[them[i].x][them[i].y]==2){them[i].y--;goto loop;}15 / 23北京科技大学计算机与通信工程学院信息1008 庄辉}else if(xx[i][0]==4){them[i].y--;if(a[them[i].x][them[i].y]==2){them[i].y++;goto loop;}}}}}/**********************敌人移动中的判断******************************************************************** ****/fun(struct play *them){int i;/*把敌人原来的位置删除*/setcolor(0);16 / 23北京科技大学计算机与通信工程学院信息1008 庄辉for(i=0;i<5;i++)circle(them[i].y*20+100,them[i].x*20+100,9);/*根据控制者的位置来决定敌人的移动方向*/movethem(them);}/*********************胜利的话******************************************************************** ***************/win(){cleardevice();settextstyle(0,0,4);while(!kbhit()){setcolor(rand()%13+1);outtextxy(200,200,"YOU WIN!");delay(1000);}}17 / 23北京科技大学计算机与通信工程学院信息1008 庄辉/*********************失败的话******************************************************************** ***************/false1(){cleardevice();settextstyle(0,0,4);while(!kbhit()){setcolor(rand()%13+1);outtextxy(180,200,"GAME OVER!");delay(1000);}}loseyes()/*判断是否失败*/{int i;for(i=0;i<5;i++)if(them[i].x==you.x&&them[i].y==you.y)/*如果失败的话*/false=1;}18 / 23北京科技大学计算机与通信工程学院信息1008 庄辉/*********************主控函数*******************************************************************/ main(){int gd=DETECT,gm;int key,i,loop,jump;int choice;initgraph(&gd,&gm,"c:\\tc");cleardevice();DrawSnow();hello();getchar();instruction();scanf("%d",&choice);levelchoose(choice);getchar();loop:19 / 23北京科技大学计算机与通信工程学院信息1008 庄辉Init();/*开始画面*/begain();while(!kbhit()){/*重画敌人*/for(i=0;i<5;i++)setfillstyle(SOLID_FILL,GREEN);circle(them[i].y*20+100,them[i].x*20+100,9); TimeDelay(280000);for(i=0;i<5;i++)if(them[i].x==you.x&&them[i].y==you.y)false=1;/*如果失败的话*/loseyes();/*判断是否失败*/if(false)break;key=bioskey(0);setcolor(0);/*把自己原来位置的人给删除掉*/ circle(100+you.y*20,100+you.x*20,9);fun(them);/*处理敌人*//*ESC键退出游戏*/if(key==ESC)break;20 / 23北京科技大学计算机与通信工程学院信息1008 庄辉/*SPACE键重新开始本关游戏*/if (key==SPACE)goto loop;/*这里开始的判断主要是是否吃到豆子和碰到墙壁*/ else if(key==UP){you.x--;if(a[you.x][you.y]==2)you.x++;else if(a[you.x][you.y]==0)drawblackdou(you.x,you.y);}else if(key==DOWN){you.x++;if(a[you.x][you.y]==2)you.x--;else if(a[you.x][you.y]==0)drawblackdou(you.x,you.y);}else if(key==RIGHT){you.y++;if(a[you.x][you.y]==2)you.y--;21 / 23北京科技大学计算机与通信工程学院信息1008 庄辉else if(a[you.x][you.y]==0)drawblackdou(you.x,you.y);}else if(key==LEFT){you.y--;if(a[you.x][you.y]==2)you.y++;else if(a[you.x][you.y]==0)drawblackdou(you.x,you.y);}if(sum==50)break;/*执行了一次键盘后再画出自己的位置*/setcolor(RED);circle(100+you.y*20,100+you.x*20,9);for(i=0;i<5;i++){setcolor(GREEN);circle(them[i].y*20+100,them[i].x*20+100,9); }setcolor(RED);/*判断自己是否碰到敌人*/loseyes();if(false)22 / 23北京科技大学计算机与通信工程学院信息1008 庄辉break;}/*吃满豆子了即获胜条件*/if(sum==50){win();getch();}if(false){false1();getch();}closegraph();}23 / 23。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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);}}。