基于Android植物大战僵尸.docx

上传人:b****4 文档编号:5080832 上传时间:2022-12-13 格式:DOCX 页数:26 大小:371.69KB
下载 相关 举报
基于Android植物大战僵尸.docx_第1页
第1页 / 共26页
基于Android植物大战僵尸.docx_第2页
第2页 / 共26页
基于Android植物大战僵尸.docx_第3页
第3页 / 共26页
基于Android植物大战僵尸.docx_第4页
第4页 / 共26页
基于Android植物大战僵尸.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

基于Android植物大战僵尸.docx

《基于Android植物大战僵尸.docx》由会员分享,可在线阅读,更多相关《基于Android植物大战僵尸.docx(26页珍藏版)》请在冰豆网上搜索。

基于Android植物大战僵尸.docx

基于Android植物大战僵尸

 

梧州学院

课程设计

 

课程:

智能手机软件开发技术

题目:

基于安卓的植物大战僵尸

学院:

信息与电子工程学院

专业班级:

12软件工程1班

学生学号:

201200208114

学生姓名:

梁庆

一、安卓手游概述

手机游戏,就是指在手机上运行的游戏软件。

目前用来编写安卓手机程序使用最多的是Java语言。

随着科技的快速发展,目前手机的硬件更新速度越来越快,功能也越来越强大。

而现在的手机游戏也不是诺基亚时代风靡全球的那些依托于掌上游戏机的“俄罗斯方块”、“贪吃蛇”等画面简陋,规则简单的游戏,进而发展到了可以和掌上游戏机媲美,具有很强的娱乐性和交互性的复杂形态。

作为运行在手持移动终端设备上的应用程序,手机的硬件特征决定了手机游戏的特点:

首先是其庞大的潜在用户群,据最新调查统计,2015年底全球使用智能手机的人口即将达到25亿,超过全球人口的三分之一,而且这个数字每天都在不断增加,另外,Android市场份额占84.7%。

在除美国之外的各个发达国家,手机用户都比计算机用户多。

手机游戏潜在的市场比其他任何平台都要大。

其次是其便携性,在控制台游戏时代,掌上游戏机热销的一个原因就是便携性——人们可以随时随地沉浸在自己喜欢的游戏中。

和游戏控制台或者PC相比,手机虽然可能不是一个专业的游戏设备,但毕竟人们总是随时随身携带,这样手机游戏很可能成为人们消遣时间的首选。

更重要的是其支持网络,由于手机是网络设备,在一定限制因素下可以实现多人在线游戏。

为什么要开发Android版本的游戏。

一是源于其技术优势:

一方面是其稳定性,现在已有公认最稳定版本Android5.0操作系统Lollipop(棒棒糖)。

另一方面是程序员技术入门快,对有一定Java语言基础的人来说,学习和掌握Android开发技术非常快。

二是源于Android手机操作系统的市场优势:

自Google在2008年9月正式发布Android1.0系统以来,Android系统在短短的3年时间就占据全球智能机市场48%的份额,如今已经增长至84.7%,远远超过IOS,稳坐全球第一。

更需要特别说明的一点:

开发周期短,是一个很大的优势。

熟悉手机游戏市场的人都知道,手机游戏形式更新换代的周期很短,如果一旦错过了最佳发布时间,即使开发出来的产品再好,也只能成为废品。

二、开发工具的介绍

开发此款游戏主要使用到的工具有四种:

Eclipse,是一个开放源代码的、基于Java的可扩展开发平台;ADT,是Eclipse平台下用来开发Android应用程序的插件;AndroidSDK,是Android专属的软件开发工具包;Fireworks,是Adobe推出的一款图形编辑软件。

2.1Eclipse

Eclipse是著名的跨平台的自由集成开发环境(IDE)。

其本身只是一个框架平台,但是众多插件的支持使得Eclipse拥有其他功能相对固定的IDE软件很难具有的灵活性。

许多软件开发商以Eclipse为框架开发自己的IDE,因此得到了众多组织定力支持。

2.2ADT

这是Eclipse插件,作用是关联AndroidSDK,使Eclipse能够新建Android工程。

2.3AndroidSDK

AndroidSDK全称为AndroidSoftwareDevelopmentKit,它提供了在Windows/Linux/Mac平台上开发Android应用的开发组件。

包含了在Android平台上开发移动应用程序的各种工具集,主要是由以下5个部分组成:

Andriod模拟器(AVD Manager.exe):

运行在计算机上的虚拟移动模拟器,可以使用模拟器来在一个实际的Android运行环境下设计,调试和测试应用程序。

调试监视服务(ddms.bat):

它集成在Dalvik(Android平台虚拟机)中,用于管理运行在模拟器或设备上的进程,并协助进行调试。

可以用它来去除进程,选择一个特定程序来调试,生成跟踪数据,查看堆和线程数据,对模拟器或设备进行屏幕快照等。

Android调试(adb.exe):

它用于向模拟器或手机设备安装应用程序的apk文件和从命令行访问模拟器或手机设备.也可以用于将标准的调试器连接到运行在android模拟器或手设备上的应用代码。

SQLite3数据库(sqlit3(sqlite3.exe)):

Android应用程序可以创建和使用SQLite数据文件,开发者和使用者也可以方便的访问这些数据文件 

创建SD卡工具(mksdcard(mksdcard.exe)) 

2.4Fireworks

Fireworks是Macromedia公司发布的一款专为网络图形设计的图形编辑软件,它大大简化了网络图形设计的工作难度,无论是专业设计家还是业余爱好者,使用Fireworks都不仅可以轻松地制作出十分动感的GIF动画,还可以轻易地完成大图切割、

动态按钮、动态翻转图等。

三、技术介绍

该设计主要使用了SurfaceView游戏框架,采用双缓存技术避免屏幕出现闪烁。

3.1SurfaceView

SurfaceView可以直接从内存或者DMA等硬件接口取得图像数据,是个非常重要的绘图容器。

它的特性是:

可以在主线程之外的线程中向屏幕绘图上。

这样可以避免画图任务繁重的时候造成主线程阻塞,从而提高了程序的反应速度。

在游戏开发中多用到SurfaceView,游戏中的背景、人物、动画等等尽量在画布Canvas中画出。

3.2双缓存

窗体在刷新时,总要有一个擦除原来图象的过程,它利用背景色填充窗体绘图区,然后再调用新的绘图代码进行重绘,这样一擦一写造成了图象颜色的反差,造成闪烁。

闪烁是图形编程的一个常见问题。

需要多重复杂绘制操作的图形操作会导致呈现的图像闪烁或具有其他不可接受的外观。

当数据量很大时,绘图可能需要几秒钟甚至更长的时间,闪烁现象会更加严重,为了解决这些问题,可采用双缓冲技术来绘图。

3.3Cocos2d-android游戏引擎

cocos2d是一个基于MIT协议的开源框架,用于构建游戏、应用程序和其他图形界面交互应用。

可以让你在创建自己的多平台游戏时节省很多的时间。

Cocos2D也拥有几个主要版本,包括Cocos2D-iPhone、Cocos2D-X,以及被社区普遍看好的Cocos2D-HTML5和JavaScriptbindingsforCocos2D-X。

同时也拥有了非常优秀的编辑器(独立编辑器),例如SpriteSheetEditors、ParticleEditors、FontEditors、TilemapEditors。

另外,2012年发布的CocoStudio工具集是开源游戏引擎Cocos2d-x开发团队官方推出的游戏开发工具,目前已经进入稳定版。

CocoStudio吸取了他们自己在游戏制作中的经验,为移动游戏开发者和团队量身定做,旨在降低游戏开发的门槛,提高开发效率,同时也为Cocos2D-X的进一步发展打下基础。

四、系统功能

系统主要有以下几个功能

4.1项目概述

本项目分为五个主要部分:

常规、夜晚、无尽三个模式进行游戏,和游戏设置与查看帮助。

用例图如图2.1。

图2.1系统用例图

4.2项目概述

4.2.1常规模式

此部分主要实现玩家在游戏背景为白天的情况下玩游戏。

该部分具体情况如表2.1。

表2.1常规模式

用例名称

常规模式

功能简述

在常规模式下进行游戏

前置条件

玩家进入游戏

后置条件

进入常规模式开始游戏

基本流

1、点击主菜单页面“常规模式”按钮,进入常规模式开始游戏

2、点击“返回”按钮,用例终止

4.2.2夜晚模式

此部分主要实现玩家在游戏背景为夜晚的情况下玩游戏。

该部分具体情况如表2.2。

表2.2夜晚模式

用例名称

夜晚模式

功能简述

在夜晚模式下进行游戏

前置条件

玩家进入游戏

后置条件

进入夜晚模式开始游戏

基本流

1、点击主菜单页面“夜晚模式”按钮,进入夜晚模式开始游戏

2、点击“菜单”按钮游戏暂停并进入主菜单

3、点击“夜晚模式”回到游戏

4、点击“返回”按钮,用例终止

4.2.3无尽模式

此部分主要实现游戏玩家在常规或者夜晚模式通关的情况下玩游戏。

该部分具体情况如表2.3。

表2.3无尽模式

用例名称

无尽模式

功能简述

在无尽模式下进行游戏

前置条件

玩家在常规或者夜晚模式通关

后置条件

进入常规模式开始游戏

基本流

1、点击主菜单页面“无尽模式”按钮,进入无尽模式开始游戏

2、点击“菜单”按钮游戏暂停并进入主菜单

3、点击“无尽模式”回到游戏

4、点击“返回”按钮,用例终止

4.2.4游戏设置

此部分主要实现对游戏背景音乐、效果音的开启和关闭。

该部分具体情况如表2.4。

表2.4无尽模式

用例名称

游戏设置

功能简述

打开、关闭游戏背景音乐或者效果音

前置条件

想要对游戏进行设置

后置条件

游戏属性改变

基本流

1、点击主菜单页面“选项”按钮,进入“游戏设置”界面

2、在游戏设置界面中,根据需要进行设置

3、设置之后自动返回主菜单或者不设置点击“返回”按钮,用例终止

4.2.5关卡选择

此部分主要实现玩家根据自己喜好选择在哪个游戏关卡下玩游戏。

但是不能选择没有通过的关卡。

4.2.6查看帮助

此部分主要实现游戏玩家查看帮助。

五、概要设计

5.1游戏设计

5.1.1游戏背景

人类与僵尸之间的仇恨由来已久,为了争夺生存空间,僵尸一有机会就向人类发起攻击。

但是人类也不会束手就擒,他们培养出了可以对僵尸造成伤害的植物,当僵尸进攻时这些植物就是人类捍卫家园的武器。

5.1.2游戏逻辑

(1)僵尸是进攻方,人类通过种植培育出的各种进攻,防御型植物来抵抗僵尸的进攻。

想要植物成长来攻击,防御僵尸需要相应的阳光值。

(2)不同的关卡中,供选择的植物不同,僵尸进攻的单位也不同。

例如第一关只有普通僵尸进攻,第二关就会出现两种僵尸。

(3)在交战区,玩家要种植进攻,防御单位是需要植物的,所以还需要种植产生阳光的生产单位。

(4)每关都有相应的敌人数量,全部消灭之后过关。

如果有敌人穿过交战区域到达人类后方,则判定游戏失败。

5.1.3僵尸作战单位

(1)普通僵尸。

移动速度1px/帧,生命值3,吃掉植物需要3s。

(2)戴帽子僵尸。

移动速度1px/帧,生命值4,吃掉植物需要3s。

(3)戴铁桶僵尸。

移动速度1px/帧,生命值5,吃掉植物需要3s。

(4)运动员僵尸。

移动速度2px/帧,生命值3,吃掉植物需要3s。

(5)佩戴铁网僵尸。

移动速度1px/帧,生命值6,吃掉植物需要3s。

5.1.4植物作战单位

(1)向日葵。

消耗阳光值50,能够生产阳光,每10s生产的阳光值为50,没有攻击力。

(2)普通豌豆射手。

消耗阳光值100,每5s发射一颗子弹,攻击力为1。

(3)冰冻豌豆射手。

消耗阳光值175,每5s发射一颗子弹,攻击力为1。

(4)加强型豌豆射手。

消耗阳光值200,每5s发射两颗连续的子弹,每颗子弹攻击力为1。

(5)土豆卫士。

消耗阳光值50,可以抵挡僵尸3s,为其他攻击植物争取时间。

5.1.5每关进攻的僵尸及可以种植的植物说明

第一关,进攻的僵尸有普通僵尸,可以选择种植向日葵,普通豌豆射手。

第二关,进攻的僵尸有普通僵尸,戴帽子僵尸,可以选择种植向日葵,普通豌豆射手,冰冻豌豆射手。

第三关,进攻的僵尸有普通僵尸,戴帽子僵尸,戴铁桶僵尸,可以选择种植向日葵,普通豌豆射手,冰冻豌豆射手,加强型豌豆射手。

第四关,进攻的僵尸有普通僵尸,戴帽子僵尸,戴铁桶僵尸,运动员僵尸,可以选择种植向日葵,普通豌豆射手,冰冻豌豆射手,加强型豌豆射手,土豆卫士。

第五关,进攻的僵尸有普通僵尸,戴帽子僵尸,戴铁桶僵尸,运动员僵尸,佩戴铁网僵尸,可以选择种植向日葵,普通豌豆射手,冰冻豌豆射手,加强型豌豆射手,土豆卫士。

5.1.6关卡说明

总共有五条防御路线。

每条防御路线最多可以放九个单位。

僵尸在屏幕之外生成,随机出现在五条路线中的一条,之后缓缓向人类后方前进。

每关都有相应的僵尸数量,全部消灭之后就过关。

如果敌人穿过交战区域到达人类后方,则判定游戏失败。

5.1.7碰撞逻辑说明

僵尸从屏幕右方向左移动,当僵尸生成之后,如果该条路线种植了攻击性植物,将开始发射子弹。

子弹,植物与僵尸碰撞大小区域即为图片大小区域,当两者发生接触后即发生碰撞。

子弹与僵尸碰撞之后随即消失,僵尸生命值随即相应减少。

子弹超过屏幕右边界后消失。

5.1.8状态播放规则

所有植物素材均为8帧,僵尸素材为7帧。

每100ms播放一帧,播放完毕之后自动从第一针开始重新播放,如此循环。

5.2软件架构

根据前面的需求分及用户的基本要求,软件的总体结构设计包括有软件加载、主界面、主要功能选择、模式选择、开始游戏、游戏设置等。

软件的总体架构如图3.1

图3.1软件总体架构图

软件加载:

用户打开游戏后进行游戏加载欢迎用户使用该软件;

主界面:

主要展现游戏整体的功能界面;

模式选择:

玩家根据自身喜好决定并选择在何种模式下进行游戏;

开始游戏:

实现植物大战僵尸的功能;

游戏设置:

实现对游戏各种属性进行设置的功能。

5.3软件功能结构图

根据总体设计例图,分析出程序功能主要包括:

游戏加载、游戏模式选择、关卡选择、游戏设置、游戏帮助。

主要根据软件基本设计模块来设计这些功能,软件总体功能结构如图3.2。

图3.2软件功能结构图

5.4软件具体功能模块基本介绍

根据游戏的具体功能模块:

主要功能选择、游戏音效开关、模式选择、关卡选择、查看帮助帮助等功能模块。

植物大战僵尸游戏功能模块有以下功能:

5.4.1主要模块选择功能

该模块其实就相当于植物大战僵尸游戏的主菜单,在该模式下,玩家可以对游戏属性进行设置,根据自己的喜好选择如何开始游戏,以及查看游戏帮助等所有该游戏提供给玩家的功能。

游戏状态为MENU时激活该模块,之后根据玩家在不同位置的触屏事件调用相关的功能模块,在玩家点击设备返回按钮时退出游戏。

功能选择模块流程如图3.3。

5.4.2游戏声音开关功能

游戏默认关闭背景音效和效果音,玩家可以根据自己爱好选择是否开启背景音乐或者游戏效果音。

在主菜单中点击“选项”按钮,玩家则进入声音设置功能,因为默认关闭背景音,这时会显示开启音乐,如果音乐开启后再次进入声音设置功能将显示关闭音乐。

游戏效果音显示与背景音效相同。

图3.3功能选择模块流程图

5.4.3模式选择功能

该游戏分三种模式,常规、夜晚和无尽模式。

打开游戏后因为还没有通关(总共五个关卡),所以不能选择无尽模式游戏。

这时玩家可以在常规模式和夜晚模式中进行选择,在通过所有关卡之后,将封锁常规和夜晚模式,玩家只能选择无尽模式。

不管哪种模式,选择之后自动开始游戏。

5.4.4关卡选择功能

游戏分为5个关卡,每关有不同数量的僵尸且依次递增,玩家通过种植植物道具来消灭僵尸,待本关所有僵尸均消灭之后游戏自动进入下一关,并且玩家得到的奖励将显示在屏幕中的种子栏中,显示之后玩家就可以选择它进行种植,当然前提是阳光值大于等于该植物所需要消耗的值,阳光可以通过种植向日葵来得到,种的越多获得阳光值的速度越快。

为了避免作弊,关卡选择只对玩家通过的关卡有效。

5.4.5查看帮助功能

每款软件都具有帮助功能,该游戏也不能例外。

在查看完帮助之后点击屏幕或者设备返回键将会自动转到主菜单界面。

六、界面设计

软件用户界面是指软件用于和用户交流的外观、部件和程序等等。

为了使该游戏在界面上达到吸引眼球的目的,结合了图形和版面设计的相关原理对其界面进行了美化、规范化的设计。

6.1结构设计

根据对软件架构的分析,知道游戏应该有以下界面:

欢迎界面(游戏加载)、游戏主菜单、关卡选择界面、游戏设置界面、查看帮助界面、胜利界面、失败界面、游戏界面。

打开软件之后显示到欢迎界面、点击“开始游戏”之后界面转到主菜单界面,之后用户根据需要选择各种功能后转到相应界面,不同界面之间的跳转关系如图4.1。

图4.1界面跳转关系图

6.2交互设计

该游戏为Android中文版,因此界面语言选择使用中文。

每个页面都添加有onTouch()函数和onKeyDown()函数以响应用户触屏和点击按键事件,其功能都是退出本页面,在欢迎、主菜单界面点击退出按钮则是退出游戏,这么设置主要是为了程序方便退出。

主菜单实现了程序功能选择功能,其实它就相当于实现了程序导航功能。

主菜单界面设计如图4.2。

游戏界面有一个种子收集栏,点击该区域相应种子之后将其拖动到种植区域就能将植物种植,种植区分为五个横着的跑到,每行都有僵尸进攻。

游戏界面设计如图4.3。

6.3视觉设计

游戏采用绿色为主色调,这是大部分植物的颜色,色彩与内容符合。

角色造型使用卡通设计表现形式显得滑稽、可爱。

图4.2主菜单界面设计图

图4.3游戏界面设计图

七、详细设计与实现

植物大战僵尸游戏采用面向对象的方法进行设计,在对象设计过程中将程序中各种事物都看成是对象,复杂的对象可以由比较简单的对象以某种方式组合而成。

把对象划分为对象类,为他们定义数据与方法。

建立子类与父类的结构关系。

将需要使用的图片准备好,需要修改的用Fireworks修改,最后使用Java代码将该游戏各个部分描述出来。

5.1搭建游戏基本骨架

5.1.1SurfaceView框架

在Android系统中创建植物大战僵尸游戏的实现方法,需要使用到SurfaceView游戏框架,它主要是用来开发复杂的游戏,在要求程序执行效率很高时,例如对速度要求很高的游戏,可以使用双缓冲来显示。

游戏中的背景、人物都绘制在一个画布上,而Surfaceview可以直接访问一个画布。

因为系统默认建立竖屏项目,所以首先在AndroidManifest.xml配置文件的里添加代码android:

screenOrientation="landscape"将屏幕设置为横屏显示。

定义一个类“MainSurfaceView”,此类继承SurfaceView,除此之外还要实现android.view.SurfaceHolder.Callback和Runnable接口。

在其中定义了一个SurfaceHolder类的实例,该类可以为提供SurfaceView的大小,格式等,并且主要用于监听SurfaceView的状态。

我们是通过SurfaceHolder来控制SurfaceView的,使用lockCanvas()函数来获取到SurfaceView的Canvas对象,再通过在Canvas上绘制内容来修改SurfaceView中的数据。

为了防止SurfaceView在绘制过程中被修改、摧毁等发生的状态改变,要用lockCanvas()函数对Canvas画布进行加锁,在绘制完成后还要使用unlockCanvasAndPostt()函数来解锁画布和提交。

因此绘画函数总是在这两个函数之间进行调用。

根据界面设计,在该类中定义表示游戏各种状态的整型常量:

GAME_MUNU、GAME_WELCOME、GAME_INGDAY、GAEM_WIN、GAME_LOST、GAME_SELECT等将他们初始化。

定义画图函数myDraw(),里面使用switch()语句实现在不同游戏状态下的游戏绘图。

onTouchEvent()函数同样这么处理。

在游戏中,基本不会等用户每次触发了按键事件、触屏事件才去重绘画布,而是会固定一个时间去刷新画布,比如僵尸单位前进时向前迈步、植物单位的动态显示、子弹前进等并不会跟玩家交互,但是这些元素都是动态的。

所以游戏开发中,要设置一个线程不停的去重绘画布,实时的更新游戏元素的状态。

因此在实现run()方法时,要使用while循环在循环标志为真的情况下每隔一段时间调用绘画函数,这一段时间到底要多长呢?

无疑这必须要根据人眼视觉暂留的特性来确定。

比如一个视频,如果帧数达到24帧,那么这个视频播放起来人眼是感觉不到卡顿的。

24帧意思就是每秒播放24张图片。

为了让程序达到每秒绘制将近24次,让程序每次开始绘制到下一次开始绘制的时间保持在50ms之内,一秒绘制20次,这已经能够满足该游戏的需求了。

接下来修改MainActivity类,onCreate(BundlesavedInstanceState)函数,用setContentView(newMainSurfaceView(this))让其显示自定义的SurfaceView视图,使用requestWindowFeature(Window.FEATURE_NO_TITLE)隐去标题栏,再使用getWindow().setFlags()函数隐去状态栏。

定义init()函数将Config类中定义的各种位图初始化。

5.1.2Welcome类

这是定义的欢迎界面的类,定义了开始游戏按钮的横纵坐标等,它的draw()函数绘制了欢迎界面背景和图片按钮。

onTouchEvent()函数的功能是玩家在图片按钮区域触发ACTION_DOWN事件后,控制显示表示按钮被按下的图片。

当玩家在按钮区域触发ACTION_UP事件后,按钮图片显示为未按下状态并使用MainSurfaceView.gameState=MainSurfaceView.GAME_MENU代码将游戏转到主菜单界面。

5.1.3Menu类

游戏主菜单,其中用boolean类型定义了所有按钮是否按下的状态,并将它们全部初始化为false。

将“常规模式”、“夜晚模式”、“无尽模式”、“退出”等按钮按照主菜单界面设计中的布局绘制好。

在ACTION_DOWN或者ACTION_MOVE事件中检测每个按钮的状态(是否被按下),如果是,则在draw()函数中绘制被按下状态的相应图片按钮。

在ACTION_UP事件中将被释放按钮的状态修正并转到相应的游戏状态,比如点击“帮助”后调用MainSurfaceView.gameState=MainSurfaceView.GAME_HELP改变游戏状态。

如果点击“退出”,调用System.exit(0)直接退出游戏。

5.1.4Option类

实现游戏声音设置功能。

绘制完背景之后再绘制未按下状态的声音开关按钮。

玩家在按钮区域点击一次该按钮,onTouchEvent()函数将变量Config.isPlayMusic取反,如果该值为真则播放背景音乐,如果为假则停止播放背景音乐,并调用MainSurfaceView.backgroundMusic.prepare()函数为下一次开启背景音乐做准备。

完成这些动作之后将游戏转到主菜单。

5.1.5Help类

Help类是给玩家提供帮助信息,把帮助内容写在一张图片上,玩家需要帮助时打开该功能,该类把帮助图片绘制在屏幕上,玩家可查看帮助。

看完之后点击屏幕触发ACTION_UP事件,游戏转到主菜单界面。

5.1.6Select类

该类为玩家提供选择关卡功能。

玩家点击屏幕并在相应关卡位置触发ACTION_UP事件后,程序判断现在已通过最高关卡Config.tempLevel是否大于或者等于用户选择的关卡,如果成立,则将游戏设置为玩家选择关卡,否则弹出消息提示用户“该关卡还没解锁”。

接着在MainSurfaceView类中将游戏状态gameState初始化为GAME_WELCOME,定义上述类的对象并初始化,在myDraw(),onTouchEvent()函数相应的游戏状态下分别调用这些对象的draw()和onTouchEve

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1