欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > DOC文档下载  

    益智拼图游戏设计毕业论文.doc

    • 资源ID:2602635       资源大小:598.50KB        全文页数:38页
    • 资源格式: DOC        下载积分:8金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要8金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    益智拼图游戏设计毕业论文.doc

     毕 业 论 文 设计(论文)题目: 基于Android 益智拼图游戏设计 学生姓名: 陈 斌 指导教师: 李莉 讲师 二级学院: 信息技术学院 专业: 计算机科学与技术 班级:08计算机科学与技术(2) 学号: 0805110219 提交日期: 2012年 04月 27日 答辩日期: 2012年 05月 12日目 录摘 要IIAbstractIII1 绪 论11.1 课题开发的背景11.2 课题意义12 Android架构与开发平台搭建22.1 Android的系统架构22.2 Window下Android开发环境的搭建43 流程介绍与概要设计53.1 游戏流程介绍53.2 系统概要设计63.2.1 界面布局模块63.2.2 难度选择模块63.2.3 图片选择模块73.2.4 步数和时间模块73.2.5 游戏实现模块74 系统详细设计与实现84.1 界面布局实现84.1.1 选择界面布局84.1.2 游戏界面布局94.2 游戏功能实现114.2.1 难度选择114.2.2 图片选择124.2.3 步数和时间设置134.2.4 拼图的实现145 系统测试175.1 Android仿真器介绍175.2 功能模块测试175.3 出现的错误及解决方案206 总结与展望21参考文献22附 录23致 谢33基于Android益智拼图游戏设计摘 要随着移动设备的日益普及,使用Android技术开发手机软件受到越来越多人的青睐。在此背景下,本课题开发了一款Android平台下的手机游戏益智拼图。本文首先对Android的研究背景,系统架构以及开发环境进行介绍,然后就玩家对游戏的需求进行一定的分析,最后运用Android技术实现拼图游戏的开发,并合理布局游戏界面,使游戏界面更加美观和人性化,实现了游戏的基本功能,最终可以让玩家享受拼图游戏的乐趣。关键词:Android;拼图游戏;Activity;架构 The development and features of AndroidAbstractKey words: Android;Jigsaw puzzle game;Activity;sturcture1 绪 论1.1 课题开发的背景随着嵌入式技术的发展,手持终端设备也迅速发展起来,目前,全球手机用户数已超过了PC机用户数,其中智能手机的比例越来越高。智能手机是指像电脑一样可以通过下载、安装软件来拓展基本功能的手机,一般具有智能手机操作系统。相较于非智能手机,它功能更强,处理速度更快。基于Linux的Android手机操作系统,由于具有开源、免费的特性,迅速得到广大爱好者及厂商的支持。目前,移动应用软件中的手机游戏开发是一项非常热门的技术。Android系统对第三方软件是开放的,这促进了第三方软件的发展。Android系统以Linux 2.6为核心,其安全机制比较完善,增强了手机使用的安全性。Android平台已经形成由 Google牵头,OHA组织参与,系统支持商和服务供应商完善搭配的运作机制,为Android平台的快速发展提供了坚实的基础。由于Android构建在开源代码的框架之上,并且提供了强大的SDK库和开放的理念,所以它为广大的没有任何移动应用程序开发经验的新手开辟了一条开发完美移动应用程序的康庄大道。而富有经验的移动开发人员现在也可以方便地扩展到Android平台上来,利用它独特的功能来改进现有产品或者开发其他新颖产品。1.2 课题意义Android软件在一两年的时间内已经迅速发展,在各类型应用系统中都有令用户满意的成果,本课题研究的就是基于此背景下Android手机的一款益智拼图游戏。通过该游戏的设计,将自己学到的Java,Android方面的理论知识应用于实践,提高自己的动手能力。在设计的过程中,不断的修补知识方面的漏洞,加深自己对程序设计的理解,为将来从事软件开发事业打下基础。2 Android架构与开发平台搭建2.1 Android的系统架构Android的系统架构和其操作系统一样,采用了分层的架构。从图2.1中可以看出,Android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和Linux核心层。图2.1 Android系统架构图(1) 应用程序Android会同一系列核心应用程序包一起发布,该应用程序包包括Email客户端,SMS短消息程序,日历,地图,浏览器,联系人管理程序等。所有的应用程序都是使用JAVA语言编写的。(2) 应用程序框架开发人员也可以完全访问核心应用程序所使用的API框架。该应用程序的架构设计简化了组件的重用;任何一个应用程序都可以发布它的功能块并且任何其它的应用程序都可以使用其所发布的功能块(不过得遵循框架的安全性限制)。同样,该应用程序重用机制也使用户可以方便的替换程序组件。隐藏在每个应用后面的是一系列的服务和系统, 其中包括;丰富而又可扩展的视图(Views):可以用来构建应用程序,它包括列表(lists),网格(grids),文本框(text boxes),按钮(buttons),甚至可嵌入的web浏览器。内容提供器(Content Providers):使得应用程序可以访问另一个应用程序的数据(如联系人数据库),或者共享它们自己的数据。资源管理器(Resource Manager):提供非代码资源的访问,如本地字符串,图形,和布局文件(layout files)。通知管理器(Notification Manager):使得应用程序可以在状态栏中显示自定义的提示信息。活动管理器(Activity Manager):用来管理应用程序生命周期并提供常用的导航回退功能。(3) 系统运行库1) 程序库Android包含一些C/C+库,这些库能被Android系统中不同的组件使用。它们通过 Android应用程序框架为开发者提供服务。以下是一些核心库:系统C库:一个从BSD继承来的标准C系统函数库(libc), 它是专门为基于embedded linux的设备定制的。媒体库:基于PacketVideo OpenCORE,该库支持多种常用的音频、视频格式回放和录制,同时支持静态图像文件。编码格式包括MPEG4,H.264,MP3,AAC,AMR,JPG,PNG。Surface Manager:对显示子系统的管理,并且为多个应用程序提供了2D和3D图层的无缝融合。LibWebCore:一个最新web浏览器引擎用,支持Android浏览器和一个可嵌入的web视图。SGL:底层的2D图形引擎。3D libraries:基于OpenGL ES 1.0 APIs实现;该库可以使用硬件3D加速(如果可用)或者使用高度优化的3D软加速。FreeType:位图(bitmap)和矢量(vector)字体显示。SQLite:一个对于所有应用程序可用,功能强劲的轻型关系型数据库引擎。2) Android 运行库Android包括了一个核心库,该核心库提供了JAVA编程语言核心库的大多数功能。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟 机实例。Dalvik被设计成一个设备可以同时高效地运行多个虚拟系统。Dalvik虚拟机执行(.dex)的Dalvik可执行文件,该格式文件针对小内存使用做了优化。同时虚拟机是基于寄存器的,所有的类都经由JAVA编译器编译,然后通过SDK的"dx"工具转化成.dex格式由虚拟机执行。Dalvik虚拟机依赖于Linux内核的一些功能,比如线程机制和底层内存管理机制。(4) Linux内核Android的核心系统服务依赖于Linux 2.6内核,如安全性,内存管理,进程管理,网络协议栈和驱动模型。Linux内核也同时作为硬件和软件栈之间的抽象层。2.2 Window下Android开发环境的搭建为了在PC主机上得到Android的开发环境,我们选择在Windows操作系统中进行对Android开发环境的搭建,具体步骤如下:(1)JDK安装首先下载JDK,按照提示安装成功后,最重要的是进行环境变量的配置,步骤如下:我的电脑属性高级环境变量系统变量中添加以下环境变量:Java_HOME值为:C:Program FilesJavajdk1.6.020(安装JDK的目录)CLASSPATH值为:;%Java_HOME%libtoolsjar;%Java_HOME%libdt jar;%Java _HOME%bin;Path值:添加C:Program FilesJavajdk1.6.020bin;(2)Eclipse安装可下载一个绿色版的Eclipse,无需安装,和安装版一样都能为Android开发提供功能。(3)Android SDK安装在AndroidDevelopers下载Androidsdkr07windowszip,下载完成后解压到任意路径。运行SDK Manager.exe,出现如图以下界面,点击Available Package。选择希望安装的SDK及其文档或者其它包,点击Installation Selected、Accept All、Install Accepted,开始下载安装所选包。下载完成后出现如下图的所有Androidsdkr07windows文件夹内容;(4)ADT安装ADT实际上是一个工具,它可以连接sdk和Eclipse,帮助Eclipse找到sdk打开Eclipse界面,进入进入菜单中的“Help” “InstallNewSoftware”,点击Add按钮弹出对话框要求输入Name和Location,完成之后,选择Window Preferences;在左边的面板选择Android,然后在右侧点击Browse;并选中SDK路径,本机为;D:YJSHAndroidAndroidsdkr07windows;点击Apply、OK。配置完成。(5)创建AVD为使Android应用程序可以在模拟器上运行,必须创建AVD,步骤如下:在Eclipse中,选择Windows Android SDK and AVD Manager,点击左侧面板的Virtual Devices,再右侧点击New,填入Name,选择Target的API,SDCard大小任意,Skin随便选,Hardware目前保持默认值,点击CreateAVD即可完成创建AVD。3 流程介绍与概要设计3.1 游戏流程介绍根据拼图游戏的游戏规则,本设计拟出游戏的大致流程如图3.1所示: 图3.1 拼图游戏流程图3.2 系统概要设计本设计参考了拼图游戏流程图(图3.1)按照自顶向下的设计方式将拼图游戏分为以下模块进行设计,如图3.2所示:图3.2 拼图游戏模块3.2.1 界面布局模块由于本课题的题材是一款游戏,对于游戏的界面以及一些基本控件有必要介绍一下。本系统一共有两个界面:一个选择界面,一个游戏界面,基本的控件有文本框,下拉列表,网格视图,按钮,图片视图等。下面简单介绍下它们的作用:文本框主要是用来显示一些文本,这些文本基本是描述文本框所在位置的功能。下拉列表主要用在了难度选择部分,当玩家点击难度时,会出现下拉列表。网格视图主要用于图片选择部分,利用网格视图将图片一一列出,供玩家选择图片进行游戏。按钮是两个界面的链接枢纽,在第一个选择界面按下确定按钮,会跳转到游戏界面。在游戏界面也设置了一个按钮,主要是给玩家提供“重新游戏”的机会。图片视图只要用来显示图片,在游戏界面用图片视图显示图片,供玩家游戏。3.2.2 难度选择模块拼图游戏的难度在于图片被分割后的块数,数量越多,自然难度就越大。(1)难度最小的是将其设置为3*3 当难度设置为3*3时,系统将图片分割为3行3列,也就是将图片分成了9块。(2)难度最大的是将其设置为4*4当难度设置为4*4时,系统将图片分割成4行4列,也就是将图片分成了16块。(3)难度中等的设置有两种:3*4 和4*3 当难度设置为3*4时,系统将图片分割成3行4列,即分成了12块。当难度设置为4*4时,系统将图片分割成4行3列,同样分成了12块。3.2.3 图片选择模块图片选择步骤相当简单,只要在选择界面的图片选择区域,从9张图片中鼠标单击1张玩家感兴趣的图片即可。3.2.4 步数和时间模块拼图游戏过程中,为了增加趣味性,玩家每移动一次图块,步数加一,知道游戏全部位置正确,游戏结束,统计最后步数;从游戏开始,时间模块开始计时,直到游戏结束,时间停止,并显示玩家完成游戏所花的时间。3.2.5 游戏实现模块在完成上述的图片选择,难度选择后就可以开始正式的拼图游戏。玩家选择“play”后,图片会根据玩家选择的难度随机分解图片。在本设计中,原图分割后右下角设置为空白块,为图块的移动提供可能。玩家用鼠标点击与空白块相邻的图块,并将选中的图片往空白块拖动,这样就完成了空白块与选中图片的位置的互换。这样子循环往复,知道全部图块位置正确,游戏就结束了。4 系统详细设计与实现4.1 界面布局实现本设计有两个界面:选择界面和游戏界面。界面的设计主要运用Android的绘图技术,图形的绘制通常是在View类中完成的,同时也会用到各种控件,如:TextView,Button,Spinner,GridView,ImageView。当然说到控件,容器就不得不提了,两者是息息相关的。本设计中用到了最常用的LinearLayout容器,控件的布局也用到了相对布局,绝对布局等。4.1.1 选择界面布局选择界面在main.xml文件中布局,界面效果如图4.1.1 :图4.1.1 选择界面该界面采用LinearLayout布局,在LinearLayout标签中完成界面设置。布局设置:设置布局排列方式为竖直排列,宽和高的值为填满,背景颜色为黑色。代码如下:android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"下面给出构成该界面的一些基本控件的设置代码:设置文本框的高和宽根据内容调整,文本内容从values文件夹中的strings.xml文件中读取,内容为“等级”: android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="string/level" style="style/font_20_white_bold"/ 设置下拉列表的高和宽根据内容调整: android:layout_width="wrap_content" android:layout_height="wrap_content"设置文本框高根据内容调整,宽为填满,文本内容取自values文件夹下strings.xml文件,内容为选择图片区: android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="string/selectPictureArea" style="style/font_20_white_bold" android:background="color/slateGray" 设置网格视图宽和高为填满: android:layout_width="fill_parent" android:layout_height="fill_parent"设置按钮属性,宽和高为根据内容调整,按钮内容取自values文件夹的strings.xml文件,内容为“确定”:android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="string/confirm" style="style/btn_font_17_black" android:layout_gravity="center”4.1.2 游戏界面布局游戏界面在jigsaw.xml文件中布局,界面效果如图4.1.2:图4.1.2 游戏界面该界面同样采用LinearLayout布局,在LinearLayout标签中进行基本设置。布局设置:高和宽为填满,排列方式为竖直排列,背景颜色为黑色。代码如下: android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:background="color/black"下面给出游戏界面其他控件的设置内容和相关代码:设置文本框的高和宽根据内容调整,文本框的内容取自strings.xml,内容为“预览”,位置居中: android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="string/preview" style="style/font_20_white_bold" android:layout_gravity="center" 设置图片框高和宽根据内容调整,图片取自drawable文件下的pingtu_6 : android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="drawable/pingtu_6"设置文本框高和宽根据内容调整,文本框内容取自strings.xml中的level2,内容为“等级”: android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="string/level2" style="style/font_20_white_bold"设置文本框高和宽根据内容调整,文本框内容取自strings.xml中的stepNum,内容为“步数”: android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="string/stepNum" style="style/font_20_white_bold"设置文本框高和宽根据内容调整,文本框内容取自strings.xml中的time,内容为“时间”: android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="string/time" style="style/font_20_white_bold"设置按钮高和宽根据内容调整,文本框内容取自strings.xml中的play,内容为“play” android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="string/play" android:textSize="14dip"4.2 游戏功能实现游戏代码具体运行流程是这样的:游戏启动后,启动MainActivity,接着加载main.xml初始化选择界面,在完成难度选择和图片选择后,点击“确定”按钮,运行MainActivity类中的监听器btnOnClickListener跳转在JigsawActivity,并加载jigsaw.xml文件初始化游戏界面,然后根据界面上的内容进行游戏。整个设计过程中主要完成以下功能:难度选择,图片选择,步数和计时功能,拼图功能。4.2.1 难度选择在选择界面点击“等级”后的下拉列表,跳出下拉列表框,供玩家选择难度,在 MainActivity中导入MainImpl类和IMain类用于实现难度选择。MainImpl类中定义了 getLevelAdapter方法,使用List()将四种难度等级存入列表,以供选择。getLevelAdapter方法的代码如下:public ArrayAdapter<String> getLevelAdapter(Context context) List<String> list=new ArrayList<String>();String level=context.getResources().getStringArray(R.array.levelArray);for(String str:level)list.add(str);ArrayAdapter<String> cityArrayAdapter=new ArrayAdapter<String>(context,android.R.layout.simple_spinner_item,list);cityArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);return cityArrayAdapter;在MainActivity中给难度选择定义两个监听器ItemClickListener,玩家单击下拉列表,就会启动ItemClickListener,玩家点击四个难度中的一种后又会启动另一个监听器 ItemSelectedListener。玩家选择完,选择的难度将会传回Activity。监听器的简单代码如下: private class ItemSelectedListener implements OnItemSelectedListenerpublic void onItemSelected(AdapterView<?> adapterView, View view, int position,long rowid) pictureIndex=position;public void onNothingSelected(AdapterView<?> arg0) 4.2.2 图片选择选择界面会列举出9种图片供玩家选择。图片列举功能是由MainActivity中的 showGridView方法和getAllItemsForListView方法完成的。showGridView方法获取屏幕大小,根据screenWidt和screenHeight自动调整图片大小,保证界面的美观。而getAllItemsForListView方法生成动态数组imageItem,并且传入数据,将图片一一列举出来。玩家点击一张图片并按下“确定”按钮时,将选择的图片同时传递给JigsawActivity。代码如下:private void showGridView()DisplayMetrics dm = new DisplayMetrics(); dm = this.getApplicationContext().getResources().getDisplayMetrics(); pictureGridView.setColumnWidth(screenWidth-10*4)/3);SimpleAdapter saImageItems = new SimpleAdapter(this, getAllItemsForListView(),R.layout.grid_item,new String "ImageView",new int R.id.gridItem_imgView);pictureGridView.setAdapter(saImageItems);pictureGridView.setSelector(R.drawable.menuitemshape);列出9张图片,并选择一张图片进行游戏是在getAllItemsForListView()方法中实现的,在该方法中生成了动态数组imageItem,将各个图片的序号传入了数组中。public List<Map<String, Object>> getAllItemsForListView() List<Map<String, Object>> imageItem = new ArrayList<Map<String, Object>>();for (int i=0;i<pictureArray.length;i+) HashMap<String, Object> tempMap = new HashMap<String, Object>();tempMap.put("ImageView",pictureArrayi);/ imageItem.add(tempMap);return imageItem;4.2.3 步数和时间设置在JigsawActivity的initControls分别给stepNumTV和timeTV做出定义。玩家点击界面上的“play”按钮,启动onClick方法,该方法开始给步数和时间赋初值。关于时间设置,还给出了时间的分秒设置。这是在timeParser方法中实现的,每过60秒,分钟加1。游戏过程中图片移动一次,步数加1。具体实现如下:在游戏过程中,秒数一直在加一,这一实现体现在GameRunable 类中的run方法中。当然在秒数加1之前要先判断是否为游戏状态,代码为:public void run() while(isGaming) try second+; Message msg=new Message();msg.what=TIME_MESSAGE;mHandler.sendMessage(msg);Thread.sleep(1000); / catch (InterruptedException e) e.printStackTrace();步数和时间的运行都是handleMessage方法中实现,在该方法中通过switchcase语句实现判断。public void handleMessage(android.os.Message msg)switch(msg.what)case TIME_MESSAGE:break;case INIT_MESSAGE:break;super.handleMessage(msg);4.2.4 拼图的实现在JigsawActivity中进行游戏时首先要解决的问题就是图片的随机分割问题。该问题的解决方案在JigsawView类中,JigsawActivity只是导入了该类。在该类中定义了相当多的变量,具体如下:private Bitmap oBitamp;/初始化切割后的图片输数组private int row=2;/行private int col=2;/列private int cutBitmapWidht;/切割后每张位图的宽private int cutBitmapHeight;/切割后每张位图的高private float x,y;/当然触发的X,Y坐标private int offsetW,offsetH;/偏移量宽度高度private int maxRectW,maxRectH;/最大矩形宽,高private PointF downPoint=new PointF();/触发的坐标点private PointF currPoint=new PointF();/当前坐标点private int step=0;/步数private boolean isGameing=false;/是否游戏中该问题的解决涉及到随机和分割两个算法。关于随机的问题,算法中使用了randomGenerated 方法,该方法随机生成0-n范围内不重复的数字,不包含n。在Math类中有定义的random方法,因此只需要调用以下。代码如下:private void randomGenerated(int n)Vector<Integer> vector=new Vector<Integer>();int num=new intn;for(int i=0;i<n;i+)int radom = (int)(Math.random()*n); radom = (int)(Math.random()*n);while(vector.contains(radom)radom = (int)(Math.random()*n);vector.add(radom);numi=radom;for(int i=0;i<col;i+)for(int j=0;j<row;j+)Picture picture=new Picture();picture.value=numi*row+j; pictrueArrayji=picture;System.out.println(pictrueArrayji.value);cutBitmap(mBitmap);分割图片是通过cutBitmap方法实现的,定义了cutBitmaoWidth,cutBitmapHeight变量表示分割后图片的宽和高,并根据难度选择的行数和列数初始化分割后的图片数数组。具体代码如下:private void cutBitmap(Bitmap srcBitamp)cutBitmapWidht=srcBitamp.getWidth()/row; /分割后每张位图的宽。cutBitmapHeight=srcBitamp.getHeight()/col; /分割后每张位图的高。offsetW=cutBitmapWidht; /偏移量宽度。offsetH=cutBitmapHeight; /偏移量高度。oBitamp=new Bitmaprow*col; /初始化切割后的图片数数组。for(int i=0;i<col;i+)for(int j=0;j<row;j+)oBitampi*row+j=Bitmap.createBitmap(srcBitamp, cutBitmapWidht*j, cutBitmapHeight*i, cutBitmapWidht, cutBitmapHeight);for(int i=0;i<col;i+)for(int j=0;j<row;j+)if(i=(col-1)&&(j=(row-1)pictrueArrayji.bitamp=null; elsepictrueArrayji.bitamp=oBitamppictrueArrayji.value;用randomGenerated 方法解决了图片随机分割的问题之后,接着就是游戏的运行即交换图片功能的实现。首先确保鼠标点击并拖动图片有效,然后实现图片的交换。为确保鼠标点击和拖动有效,定义onTouchEvent方法进行活动的判断,该方法中定义了x,y两个变量表示坐标,来显示鼠标点击的位置。onTouchEvent方法中定义了如下两个变量:x=event.getX();y=event.getY();通过如下语句实现判断鼠标的活动:按下(MotionEvent.ACTION_DOWN),离开(MotionEvent.ACTION_UP),移动(MotionEvent.ACTION_MOVE)。if(!(x<=maxRectW)&&(y<=maxRectH)return false;switch(event.getAction()case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION

    注意事项

    本文(益智拼图游戏设计毕业论文.doc)为本站会员(仙人指路1688)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开