[论文]基于MFC的09年游戏毕业论文_第1页
[论文]基于MFC的09年游戏毕业论文_第2页
[论文]基于MFC的09年游戏毕业论文_第3页
[论文]基于MFC的09年游戏毕业论文_第4页
[论文]基于MFC的09年游戏毕业论文_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、毕业论文graduation paper following english word系 别: 班 级: 学生姓名: 学 号: 指导老师: 完成日期: 摘要毕业设计,要求作品更好的要到有创新性和实用性,能运用以前学过的知识来完成设计,经充分的调查与分析后,得出目前大部分的小学生对英语学习不怎感到兴趣,特别是对强记硬背的记住单词更感到枯燥无味,而对游戏游玩却非常感兴趣,最后决定选择目前还没有人做过的休闲娱乐游戏“英格洛斯接龙”游戏开发作为毕业设计项目,希望通过游戏能提高对小学生的学习英语兴趣。“英格洛斯接龙”游戏以英语词汇接龙游戏为原形,游戏规则简单明了,将课堂上的英语词汇练习游戏与现代的动画技

2、术、网络技术及算法相结合,做到界面动感美观,算法精确,在视觉、听觉享受同时巩固和学习英语词汇,提高英语能力和反应能力。游戏以卡通人物为主,主要体现出游戏的活力和游戏的娱乐性。游戏开始我们便仿佛进入一个广阔的大草原上,一辆载满小精灵的火车拌着美妙的音乐开进草原这里所创建的人物生动、有趣,景物生机勃勃,非常有新意,整体界面设计活泼、新鲜,有趣。游戏音乐,游戏图片和算法都是自创,卡通人物随机产生,音乐一直伴随着游戏。英语词汇量丰富,最高可达六级词汇量。 功能方面,单人网络版,多人网络对战和多组同时在网络对战功能,另外还实现了计分、计时和单步计时功能。网络功能的实现,使得游戏更富吸引力,也让游戏玩家更

3、具竞争性,计时计分功能的实现增加了游戏趣味性、刺激性和吸引力。在这游戏环境中学习英语,趣味无穷,完全可达到娱乐学习一体的目的。关键字:英 格 洛 斯 接 龙目 录一、引 言1(一)游戏开发目的1(二)游戏功能1(三)游戏特点1(四)开发工具与运行环境以及安装要求2二、需 求 分 析3(一)背景及需求分析3(二)界面设计分析3(三)游戏功能分析4(四)技术的分析4(五)词汇量分析6(六)游戏行业市场需求信息分析6三、游 戏 的 安 装7(一)安装directx(june2008)7(二)安装游戏的服务端与客户端8(三)成功安装游戏9四、界面设计和需求分析10(一) 游戏设计界面和功能分析10(二

4、)功能分析及设计15五、 算法设计与实现17(一)游戏规则说明17(二)游戏的算法17(三)uml设计与模块功能241 服务器端252. 客户端28六、 总结31七、 参考文献33一、 引 言(一)游戏开发目的随着我国动画游戏开发水平的不断提高,许多游戏软件不断涌现。随着电脑的普及,家庭和学校教育对游戏软件提出了新的要求,那就是游戏软件要同时兼备教育和娱乐两种功能,使学生在游戏中开发思维,学习知识。结合我们身边很多小学生对英语学习不感兴趣,而对游戏游玩却非常感兴趣,所以希望所开发的“英语接龙”游戏能提高他们的英语学习兴趣,将记英语单词这无趣的事情转到游戏中来,让学习者能在学习中体会游戏带来的快

5、乐,在游戏中学习英语,即可以学到知识又可以体会快乐,这是我开发这款这款游戏开发的主要目的。(二)游戏功能游戏同时结合游戏者的词汇量和反应速度来挑战游戏,不但极具娱乐性,还能提高记忆单词能力和思维反应能力。游戏的主要功能有: 游戏的登录 房间的创建 单人网络游戏 多人网络游戏 聊天室 计时。 计分。(三)游戏特点 目前还没有类似的游戏,因此该项目具有创新性。 多人游戏是非常刺激,并具有挑战性的。因为人类的手计算机的ai聪明多。(ai的意思就是人工智能artificial intelligence) 界面动感美观:考虑到让玩家在轻松愉快的游戏环境中游玩,游戏中的所有图片、场景都让人有轻快明朗的感觉

6、,让人联想在广阔的大草原上奔跑游玩,在这游戏氛围中,开开心心学习到英语词汇。而且图片也是经过加工设计的。 音乐独创:本游戏中的所有背景音乐是原创(叫一位搞音乐朋友花了几天的时间搞出来的),能让人在轻松的背景音乐中进入游戏。 游戏算法创新:算法是一个游戏的灵魂,它觉得一个游戏本质上的好与坏,在算法也有独特的创新。 适合对象:所有人群,不过偏向幼儿园还有上小学的学生。 可以在游戏的过程中聊天,学会如果更好的沟通,所谓沟通从心开始,沟通更应该从小开始。 适合对象:所有人群,不过偏向幼儿园还有上小学的学生。(四)开发工具与运行环境以及安装要求 图像开发工具:采用flashmx、photoshop、ul

7、ead gif animator等为制作游戏界面和背景图的工具。 frustrated family:为制作音乐的软件。 软件开发工具:用microsoft visual studio 2008(profseeion edition)全新级的重量级的开发环境 ,managed directx sdk2008支持c#的开发包,采用c # 语言作为程序开发语言。 运行平台:windows xp / vista /window 2000 /window 2003 。 安装要求:该游戏需要 .net framework 框架和directx插件支持。.net framework 框架已包含在安装包中(

8、 如果原本机子上有已经比.net framework 2.0更新的版本可以选择不安装), directx 插件须自行安装(如果是电脑上装了vista系统的可以省略这一步)。二、 需 求 分 析(一)背景及需求分析考虑到作为毕业设计,要有创新性和实用性,也要有一定的技术难度。所以本人对网上的游戏产品作了广泛的调查,总结了开发休闲游戏一定要有下面的特点:l 要有吸引力,界面美观l 有一定的技术难度和科学性l 在游戏过程中能够锻炼出逻辑思维能力、勉捷的反应能力、超强的记忆力、耐力、意志力。l 具有一定的文化内涵,将一些基础知识融入其中,达到寓教于乐的效果。结合我们的学习情况,学生从小学到大学,英语都

9、是必考的课程,而很多同学面对英语束手无策,毫无兴趣,而小朋友也应该从小开始培养对学习英语的兴趣,从小学起,因此决定将休闲游戏跟英语学习结合起来,使游戏过程同时也是英语复习和学习的过程。以往的英语接龙游戏都只是几个同学间的口头比赛,很难进行计时计分,且必须要有几个同学一起玩才会玩得开心,现在我们把这种传统的口头游戏变成软件游戏,让游戏者随时都可以玩,可以一个人玩、跟电脑玩或上网跟网友玩,并且实现计时计分功能,让游戏更刺激、更好玩、更有魅力。基于上述原因,经充分的调查与分析后而选定英语学习的游戏作为毕业设计,基于时间问题,暂时先做英格洛斯接龙游戏的大部分功能,在后续时间,有时间将游戏继续的完善,希

10、望广大小朋友们能从游戏中开心学习和巩固英语词汇,增加自己的英语词汇量而且提高自己的记忆力。(二)界面设计分析游戏主要针对小学生而开发的,也可适用于各阶层人士游玩。因此界面设计时主要考虑适合少龄玩家的视观感觉,根据他们追求趣味性和动感性,发自于一颗怜悯而好奇的稚气之心,小动物更能吸引他们的注意和关心,具有趣味的动画更是他们的最爱,因此界面设计以草原为游戏界面的整体背景,以一些精灵和小动物和飞去的蜻蜓作为动态背景,色调方面采用让人轻松愉快的暖色调,对于一些时间、分数、结果等的显示通俗易懂,软件具有很强的美感。(三)游戏功能分析将几个同学间的口头词汇游戏比赛,转换成网络中的游戏,提高游戏的娱乐性和趣

11、味性,对游戏的功能分析后,主要设计如下功能: 自己一个人玩:在规定的时间内输入一个单词,单词的开头必须跟上一个单词最末字母相同,并且要在规定时间内接下一个单词,不能与前面的词汇重复,电脑自动统计所接单词的数量,通过最高记录板记录你的历史最高记录。可以达到锻炼自己的反应能力和输入能力,最重要的是扩充你的英语词汇量。 多人网络游戏:要求参加者的电脑能连接到互联网,游戏中玩家可以自己开一个游戏房间,跟朋友一起竞赛,也可能加入到其它的房间。游戏的规则是谁接的单词最多为赢家,在超过单步时间时,系统将自动帮你输入,如果这同个游戏中输入同样的单词,不扣分也不加分,所以从中可以看出,为了游戏能够获得胜利,玩家

12、必须对输入过得英语单词要再脑子里有个印象,不然就会输得很惨哦。 网络游戏还支持文字聊天,这样既可以达到朋友间彼此互相交流,在娱乐学习中相互成长。 计时:通过计时检验对词汇的熟练程度。 计分:通过计分达到竞赛的目的,也可以检验对词汇的掌握量。(四)技术的分析 游戏中用了directx的sdk,managed directx是对directx大部分功能的托管封装,可以用任何支持.net的语言开发。 mdx的性能是不用担心的,因为他还是像com directx一样提供对硬件层次的访问,大部分功能都是在你的显卡/网卡/声卡上起作用的,托管部分只是他的接口。所以如果不是大型游戏,效率可以忽略。 托管代码

13、的对象模型。 通常不用操心资源释放的问题。 委托是一种引用方法的类型。一旦委托了分配的了方法,委托将与该方法具有相同类型的行为。委托方法的使用可以其他方法一样,具有参数和返回值。(另一种说法:委托是函数的封装,它代表一“类“函数。他们有符合一定的签名:拥有相同的参数列表,返回值类型,同时,委托也可以看成是对函数的抽象,是函数的”类“。此时,委托的实例将代表一个具体的函数。) 异步回调。由于实例化委托是一个对象,所以可以将其作为一个参数进行传递,也可以将其赋值给属性。这样,方法便可以将一个委托作为参数来接受,并且以后可以调用该委托。这成为异步回调,是在较长的进程完成后用来通知调用方法的常用方法。

14、以这种方式使用委托时,使用委托的代码无需了解有关所用方法的实现方面的任何信息。回调的另外一个常用的用法是自定义的比较方法并将该委托传递给排序方法。 与现在技术结合得更好。 游戏设计过程中需要考虑到实时的并发时间交互。(1)能够在同时执行多行指令。 (2 ) 通常,只有一个cpu来处理所有的事件,所有的事件共享一个cpu,为每个事件分配一小段的cpu的时间,玩家就认为所有的事件都是同时发生并处理的。 延迟 计算机通过网络进行通讯可能会有延迟影响游戏的可玩性,如何保持多台pc的时钟同步时一个非常大的挑战。 数据丢失 在传输过程中,数据不可避免的会有所丢失。 可靠性 计算机间的通讯有可能是间断的。

15、技术的要点就是要让游戏尽可能的更加顺畅,玩家几乎感觉不到计算机在和其他计算机进行通信。 网络模型用了:client / server模型,这种模型也被称为星型模型,有一个服务器(server),所有玩家通过连接server来进行游戏。服务端接收所有客户端发送来的消息,在处理后再将信息发送到客户端。 技术的要点就是要让游戏尽可能的更加顺畅,玩家几乎感觉不到计算机在和其他计算机进行通信。(五)词汇量分析 词汇量是从小学英语到六级英语词汇,词汇来源于金山词霸,存储在文本文件中。因此词汇的更新和扩展均非常容易,也非常方便增加新的分类,如增加雅思英语、托福英语等等选项,算法方面做简单的修改便可。(六)游

16、戏行业市场需求信息分析2008年娱乐软件协会(entertainment software association)公布的数据表明:1. 视频游戏带动的硬件以及软件的总销售额超过90亿美元。 在线游戏(网络游戏)的销售额也突破了50亿美元。 便携游戏突破10亿美元。2. 对游戏的平均年龄在18岁左右。 大约60%以上的游戏超过16岁。 39%的玩家是女性。 网络游戏的比例 - 其他(40%),青少年(44%),成年人(12%)。 受欢迎的3类游戏 - 动作类(30%),体育类(18%),竞赛类(10%)。 嘴受欢迎的3类计算机游戏 - 战略(27%),家庭/儿童娱乐类(20%),射击类(16%

17、)。 三、 游 戏 的 安 装(一) 安装directx(june2008) 安装directx(june2008)如下图1-1: 图1-1安装成功如下图1-2:图1-2(二) 安装游戏的服务端与客户端1 游戏服务端安装如下图1-3:图1-32游戏客户端安装如下图1-4:图1-4 (三) 成功安装游戏成功安装完游戏后在电脑桌面会出现下图 1-5 :(gameserver为游戏服务端,gameclient为游戏客户端)图1-5四、 界面设计和需求分析(一) 游戏设计界面和功能分析1. 打开服务端并启动服务器 如下图2-1图2-12. 服务器的功能包括处理客户端发送过来的所有信息然后再分发回客户端

18、。在工作中的服务器如下图2-2图2-23. 打开游戏客户端,登陆网络服务器,界面如图2-3所示,在界面中输入服务器ip地址和用户名密码,登录服务器后,转入下一步骤。图 2-34. 进入游戏客户端的平台,点击英语接龙进入房间管理界面, 在房间管理界面双击房间可以进入房间,如果想自己创建房间游戏可以在房间管理的空白位置右击鼠标选中新建来创建自己想要创建的房间(玩家可新建并自行命名房间,并选择二人玩、三人玩、四人玩等房间类型)。 如下图 2-4 ,2-5 与 2-6:图2-4图2-5 图2-6 5. 进入房间,等待其他玩家加入游戏,当进入的人数达到房间规定的人数时,开始的按钮会变成可点击的,点击“开

19、始”按钮便可以进入游戏。游戏过程中玩家可以在聊天窗口发送信息互相交流。界面如图2-7所示和图2-8图2-9所示。 图2-7 图2-8 图2-9 6.如果游戏中出现重复的输入则出现如下图的提示, 界面如图2-10:图2 -107.游戏结束时,会显示胜负与玩家的分数。界面如图2-11: 图 2-11每个窗体都栩栩如生,游戏中的细节更是咄咄逼人,只有在游戏中体会了。(二)功能分析及设计根据的需求调查与分析和大多数开发者的实际工作,将“英格洛斯接龙”游戏功能设计为网络多人游戏,并附加计时计分功能。多人游戏是联机竞赛功能(局域网或外网都可以设置)。多人网络游戏功能设计如下:l 用户登陆服务器:游戏采用用

20、户名、密码和服务器ip地址方式登陆。l 创建或进入房间:可以根据自己的选择,创建自己的房间和加入已有的房间,房间分为:单人练习,2人房间,3人房间,4人房间。l 词汇默认为全部词汇量。l 游戏设置的单词个数由游戏设计者设定。l 单词回答的限时时间由游戏设计者设置。五、 算法设计与实现(一)游戏规则说明l 多人网络游戏规则:该网络游戏有玩家登录服务器、游戏管理、房间管理等功能,玩家在登录进入游戏平台后,可以选择进入英语接龙游戏,获取系统支持的游戏房间列表,游戏房间定义了允许同时进行同一游戏的玩家数量,在满足游戏开始条件时,同一房间的玩家可以开始游戏。游戏采用多回合抢答模式,先答对者得分,每回合设

21、置答题时间限制,超过限制时间时,系统将自行产生一个答案,所有玩家均不得分,游戏继续。在游戏结束时得分多者获胜。l 游戏设置的单词的总个数到达时是你本轮游戏的总时间,在这规定的时间里你能输入多少单词直接决定你的胜负;游戏单步时间是你在输入一个单词到接下来输入下一个单词的间隔时间。单单词到达设置的个数时,游戏结束。(二)游戏的算法1加载单词把单词从文本文件中加载进一个变量数组中,根据单词的开头字母进行排序并存储在相应的数组中,算法如下:public static void readword() for (int i = 0; i 26; i+) arrtexti = new arraylist()

22、; streamreader sr = new streamreader(type(); string sline = ; while (sline != null) sline = sr.readline(); if (sline != null) int n = -1; if (sline0 = 0 & n arrtext.length) arrtextn.add(sline); sr.close(); for (int integer = 0; integer 26; integer+) arrtextinteger.sort(); 2随机产生开始的单词产生单词分成两部分,首先随机产生2

23、6个字母中的一个,然后以所产生的字母为首字母,再从该字母开头的单词列表中随机产生一个单词。算法如下:public static string word() system.random r1 = new random(); int num1 = r1.next(0, 25); int length = arrtextnum1.count; system.random r2 = new random(); int num2 = r2.next(0, length); return arrtextnum1num2.tostring();1. 判断输入的单词是否在所选的词汇列表中采用折半查找算法,该算

24、法大大提高了游戏的速率,主要算法如下:public static bool binarysearch(string search_content,byte tage) arraylist arrlist = new arraylist(); if(tage=1) arrlist=arrtextsearch_content0 - a; else if (tage = 2) inword.sort(); arrlist = inword; int small = 0; int big = arrlist.count - 1; int mid; while (small 0) small = mid

25、 + 1; else big = mid - 1; if (small = big & string.compare(search_content, arrlistsmall.tostring() = 0) return true; return false; 2. 自动产生和填充单词如果在规定的时间没有输入正确的单词,服务器根据玩家输入的最后一个单词随机产生出来一个合乎游戏规则的单词,算法如下public static string computertxt(string front) int index = frontfront.length - 1 - a; int length = ar

26、rtextindex.count; string tempword; while (true) system.random r3 = new random(); int num3 = r3.next(0, length); tempword = arrtextindexnum3.tostring(); boolean repetitionword =binarysearch(tempword, 2); if (!repetitionword) inword.add(tempword); return tempword; 3. 游戏引擎采用引擎来统领整个游戏,使游戏在扩充和更新的时候更加容易和方

27、便。下面是游戏引擎的精灵类算法: public class sprite: icloneable public sprite() m_id = m_counter+; protected sprite(sprite sprite):this() foreach (animation animation in sprite.m_animations) /设置精灵循环出现 m_animations.add(animation)animation.clone(); m_currentanimationindex = sprite.m_currentanimationindex; m_name = s

28、prite.m_name; m_collisionrectangle = sprite.m_collisionrectangle; m_velocity = sprite.m_velocity; m_position = sprite.m_position; m_scale = sprite.m_scale; m_rotation = sprite.m_rotation; m_visible = sprite.m_visible; m_active = sprite.m_active; m_showallpixels = sprite.m_showallpixels; m_opacity =

29、sprite.m_opacity; m_zorder = sprite.m_zorder; m_localmatrix = sprite.m_localmatrix; public void add(animation animation) /添加精灵 m_animations.add(animation); public int count get return m_animations.count; public int animationindex /设置并获取精灵索引值 set if (value = m_animations.count) value = m_animations.c

30、ount - 1; else if (animationindex 0) value = 0; m_currentanimationindex = value; get return m_currentanimationindex; public animation animation /当前精灵 get return m_animationsm_currentanimationindex; public bool visible get return m_visible; set m_visible = value; public bool active set m_active = val

31、ue; get return m_active; public pointf position set m_position = value; / updatecollisionrectangle(); get return m_position; public vector2 velocity set m_velocity = value; get return m_velocity; public float scalex /坐标设置 set m_scale.x = value; get return m_scale.x; public float scaley /坐标设置 set m_s

32、cale.y = value; get return m_scale.y; public float rotation /旋转 set m_rotation = value; get return m_rotation; public void internalupdate() /界面的重定位 if(!m_active) return; if (m_animations.count != 0) m_animationsm_currentanimationindex.update(); m_position.x += m_velocity.x; m_position.y += m_velocit

33、y.y; matrix trans = matrix.translation(m_position.x, m_position.y, 0); /平移 matrix rot = matrix.rotationz(m_rotation); /旋转 matrix scaling = matrix.scaling(m_scale.x, m_scale.y, 0); /缩放 int picturewidth = m_animationsm_currentanimationindex.currentpicture.width; int pictureheight = m_animationsm_curre

34、ntanimationindex.currentpicture.height; float newpicwidth = math.abs(scaling.m11 * picturewidth); float newpicheight = math.abs(scaling.m22 * pictureheight); float ltx = scaling.m11 0 ? newpicwidth : 0; float lty = scaling.m22 0 ? newpicheight : 0; ltx -= newpicwidth / 2; lty -= newpicheight / 2; ma

35、trix loctrans = matrix.translation(ltx, lty, 0); m_localmatrix = scaling * loctrans * rot * trans; updatecollisionrectangle(); private void updatecollisionrectangle() /图片定位 int picturewidth = m_animationsm_currentanimationindex.currentpicture.width; int pictureheight = m_animationsm_currentanimation

36、index.currentpicture.height; m_collisionrectangle.x = 0; m_collisionrectangle.y = 0; m_collisionrectangle.width = picturewidth; m_collisionrectangle.height = pictureheight; m_collisionrectangle.offset(int)(-picturewidth / 2 + m_position.x), (int)(-pictureheight / 2 + m_position.y); public virtual vo

37、id update() public void render() if (!m_visible | !m_active | m_opacity = 100) game.d3dsprite.begin(spriteflags.none); else game.d3dsprite.begin(spriteflags.alphablend); int alpha = (m_opacity * 255) / 100;game.d3dsprite.draw2d(m_animationsm_currentanimationindex.currentpicture.texture, new point(0,

38、 0), 0, new point(0, 0), color.fromargb(alpha, 255, 255, 255); game.device.transform.world = m_localmatrix; game.d3dsprite.end(); public int zorder set m_zorder = value; get return m_zorder; public int opacity set m_opacity = value; get return m_opacity; public bool showallpixels set m_showallpixels

39、 = value; get return m_showallpixels; public bool collideswith(sprite sprite) return m_collisionrectangle.intersectswith(sprite.m_collisionrectangle); public static int comparisonzorder(sprite sprite1, sprite sprite2) int r = sprite2.m_zorder - sprite1.m_zorder; if (r = 0) return sprite2.m_id - spri

40、te1.m_id; else return r; public virtual object clone() return new sprite(this); #region privatedata list m_animations = new list(); int m_currentanimationindex; string m_name = ; rectangle m_collisionrectangle; vector2 m_velocity; pointf m_position; vector2 m_scale = new vector2(1, 1); float m_rotat

41、ion = 0; bool m_visible = true; bool m_active = true; bool m_showallpixels = false; int m_opacity = 99; /author:winner int m_zorder = 0; matrix m_localmatrix = matrix.identity; int m_id; static int m_counter; #endregion privatedata (三) uml设计与模块功能系统采用dotnet framework2.0以上版本为开发平台,客户端游戏界面采用directx技术实现。

42、服务器与客户端之间的通信采用tcp/ip协议实现。系统框架图如图4-2所示。图4-2系统框架图本节分别描述服务端和客户端的实现算法,最后描述游戏平台间的协议定义。1 服务器端服务器由以下子系统组成l 通信子系统l 游戏管理子系统l 英语接龙游戏组件(1). 通信子系统系统采用异步的tcp socket技术实现,信息流图如图4-3所示。图4-3信息流图 1)gameserver类gameserver是服务器的入口类,该类负责创建一个tcp socket来侦听客户端的接入请求,并将已接入的客户端分配给messagedispatcher管理。2) messagedispatcher类messagedispatcher类用来管理消息的接收和发送,messagedispatcher为每个客户端创建一个gamecontext对象来保持系统相关的信息。接收到客户端的消息后,messagedispatcher解析消息结构并创建一个message对象来保存消息,对于游戏平台的控制消息,messagedispatcher将创建一个command实例并交由controlcommandhandler类处理。3) controlcommandhandler类controlcommandhandler类负责处理游戏平台的控制消息,包括以下功能:l 玩家登录玩家由用户名和和密码登

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论