飞机大战实训报告讲解_第1页
飞机大战实训报告讲解_第2页
飞机大战实训报告讲解_第3页
飞机大战实训报告讲解_第4页
飞机大战实训报告讲解_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

1、程序设计综合实践实习报告学院名称信息科学与工程学院专业班级软件工程20123学生姓名程大川学号201201051002指导教师孙红梅山东科技大学信息科学与工程学院软件实践实训报告_、实习题目:飞机大战游戏的设计与实现二、实习时间:7周8周实习地点:J13-128三、实习任务:1. 基本功能要求:飞机大战游戏必须运用透明贴图、按键处理、定时控制、双缓冲技术 等技术实现战机(玩家)和敌机(计算机)对战功能2. 扩展功能:在完成基本功能基础上町以增加双人对战、游戏积分制、声音效果、多种 子弹类型、客机类型、游戏关卡设计、多种类型敌机、游戏中间结果存贮等功能四、小组分工说明:此次实习项目,所有内容均由

2、一人完成五、实习成绩六、指导教师对实习的评语:指导教师(签章):2014年 月 日信息科学与工程学院软件实践实训报告1. 概述51.1实训概述51.2功能概述52. 相关技术52.1滚动背景技术52.2透明贝占图技术52.3走时器技术52.4双缓冲技术25连续按键处理技术2.6童处理技术2.7链表存储技术62.8动态效果技术73.需求分析731功能需求分析73.2数据需求分析73.3行为需求分析83.4其他需求84.总体设计与详细设计84.1系纟站聆划分4.2主要功能槪4.2.1玩家控制模块设计图信息科学与工程学院软件实践实训报告4.2.2游戏逻辑模块窈十图(包含关卡控制)104.2.3图形显

3、示模块设计(包含敌方生成模块)124.3主要类图134.4软件结构耐体会135.编码实现135.1编码规范135.2代码纟臣只策略145.3关键技术代码实现146 .测试情况说明。226.1主要模块测试情况22模块1、碰撞模块测试22模块2、滚动背景模块测试23模块3、关卡模块测试236.2主要功能测试情况23功自总1、飞机控制功育试23功自总2、育E量块吃取功能试23功自总3、BOSS功能测试23功自总3、显示功自纟测试237. 实训中遇到的主要问题及解决方法238. 实训收获与体会24信息科学与工程学院软件实践实训报告1.概述1.1实训概述这次实训,目的以Wmdow7+VS 2013为坏境

4、,编写一个简单的飞机大战游戏,熟悉软 件工程的思想,学习MFC编程的方法,加深对面向对彖思想的理解12功能概述用户可以左右移动控制战机和发射子弹,子弹命中敌机会造成伤害,敌机被击毁可以获 得积分,枳分达到一定程度会出现BOSS, BOSS被击杀后即可进行下一关。游戏中会不定期出现道具包,吃取不同的道具包会有不同的增益效果。2.相关技术本项目涉及的儿个主要技术介绍和简要实现方式如下:2.1滚动背景技术为了让游戏场景更加逼真,游戏节奏更加合理,可以通过让背景滚动来提高游戏的场景 效应,实现这一技术时,可以将一张背景图片复制为三张,从上到下连续的拼接在一起,并 将中间的图片进行垂直翻转,在输出图像时

5、,每次只输出合成后图片的1/3部分,每次输出 后,将位图中的纵坐标输出位置增加一个位移量,当输出位置到达图片的2/3部分时,将图 片的纵坐标输出位置置为0,由于图片的起始位置和图片的2/3位置是一致,所以在背景图 片的显示中,不会出现图片的卡顿和瞬移现彖。2.2透明贴图技术在飞机人战项目中,需要将很多的EMP图像贴到画布上,结合逻辑处理完成对整个游 戏的设计,为了实现更好的显示效果,使移动元素所用的图像更加贴合背景,则需要利用透 明贴图技术,将BMP图像中的无关颜色做透明处理,实现方式为调用CDC中的 TransparentBlt函数,并且利用函数的最后一个参数填写RGB信息,实现对对应颜色的

6、透明 化。23定时器技术为了实现屏幕的定时刷新功能和暂停功能,需要设置定时器,当设置好时间间隔时,每 次经过一个设置的时间间隔,Windows都会向程序发送一个WM_TIME&并且调用相关函 数,程序执行OnTimer函数,并根据定时器编号执行相应的操作。实现方式为使用SetTmier信息科学与工程学院软件实践实训报告函数设置定时器标识和时间间隔。另外也可以利用定时器实现对连续按键的处理,使子弹发 射和移动效果更加平滑合理。2.4双缓冲技术利用普通的绘制函数对项目中元素进行绘图时,由于绘图时机不一定连续,绘图效率不 一定统一,会造成重影和闪屏的不良效果,为了解决这一问题,可以利用双缓冲技术,先

7、将 要绘制的每部分内容存储到内存中的一个虚拟的绘图设备中,当所有部分的内容都绘制完毕 后,再一次性的将内存中的内容绘制到真实屏幕上,实现这一方式,可以在程序定义一个 CDC指针变量和CBiUnap指针向量实现,在构造函数中为两个指针分配内存空间,将所有 的图像绘制完毕后,再利用GetDC函数取得真实窗I I CDC指针和BitBlt函数将内存中的内 容完整的拷贝至真实屏幕上。2.5连续按键处理技术在飞机大战项目中,需要根据键盘输入决定游戏中各种位置的改变和一些变量的内容, 在利用战机发射子弹或者进行移动时,需要按下键盘的空格键或者方向键,在该项目中,如 果利用MFC中提供的默认消息处理函数进行

8、按键消息的处理,则会导致子弹发射频率过快, 战机移动过快,甚至程序卡死等严重问题,所以应将按键消息处理放在OnTmier函数里, 以达到平滑的移动和发射子弹效果2.6碰撞处理技术在该项目中,需要处理对象之间的各种碰撞,比如,战机子弹与敌机的碰撞、敌机子弹 与战机的碰撞、敌机与战机的碰撞、子弹与客机的碰撞等等。在处理碰撞时,可以为每个对 象设置一个与位图大小相同的矩形,矩形的位置与对应位图所在位置一直,当判断两个元素 是否发生了碰撞时,只需要利用IntersectRect函数判断两个矩形是否相交即可。2.7链表存储技术一局游戏中会有很多的敌机,敌机子弹以及战机子弹,并且需要其进行添加、删除、遍

9、历等操作,为了提高程序执行效率,选用链表存储这些类型,当需要生产一个敌机或者敌机 子弹时,只需要在链表尾部添加一个对应的对象即可,时间复杂度为0(1),当敌机被击毁 或者子弹失效时,只需要在链表中将对应位置的对彖删除即可,时间复杂度为0(1),当绘 图时,需要对所有的对彖进行遍历,此时只需要从头至尾遍历一个链表即可,时间复杂度为 O(n),所有的复杂度已经是最低,所以利用CList链表存储项目各种对象,是一个非常合理信息科学与工程学院软件实践实训报告的选择。2.8动态效果技术在敌机被击毁时,需要显示敌机爆炸的画面,这个动态的画面是由一组静态图像连续绘 制形成的,为了实现这一效果,可以利用MFC

10、中的CIinageList类,将一组由静态图像组成 的连续位图按照一定格式转化为CLnageList对象,并为每个对彖设置一个index,在敌机生 命值为0时,根据index逐帧播放图像,实现敌机爆炸的动态效呆。3 需求分析3.1功能需求分析飞机大战项目需要实现的主要功能如卞:战机在用户的控制下可以自由移动,但不可以移动到窗体外。战机可以连续发射子弹,子弹的起始位置和战机位置有关。敌机在窗II顶部随机产生,产生后垂直向卞移动。敌机可以发射子弹,每个敌机在一个发射时刻可以发射两枚子弹。客机在窗II顶部随机产生,产生后由极慢的速度向下移动。客机的犬小十分庞人,远大于敌机和战机战机子弹由战机产生,垂

11、直向上飞行,并且可以击中敌机和客机敌机子弹由敌机产生,垂直向下飞行,并且可以击中战机和客机游戏中会不定期出现道具包,飞机经过道具包会出现不同的效果击毁敌机可以获得一定的得分,得分到达一定数量会出现BOSS BOSS产生于顶部,不会向下移动,会被子弹击中,击毁后可通过关卡。通过关卡后会使游戏难度增加,通过所有关卡会通关,完成游戏。3.2数据需求分析飞机人战项目中所需要的数据有类型数据战机战机位置,战机生命值,战机伤害值敌机敌机位置,敌机生命值,敌机伤害值,敌机的生成速 度,敌机的移动速度战机子弹子弹位置,子弹发射相应速度,子弹移动速度,子弹 伤害值敌机子弹子弹位置,子弹发射生成速度,子弹移动速度

12、,子弹7信息科学与工程学院软件实践实训报告伤害值道具包道具包类型,道具包位置,道具包移动速度BOSSEOSS位置,EOSS伤害,EOSS生命值关卡关卡编号,关卡难度,得分33行为需求分析飞机人战项目中的行为可以用下面的用例图表示34其他需求背景可以滚动4 总体设计与详细设计(介绍游戏的功能模块划分,主要类图、状态图、活动图或顺序图)信息科学与工程学院软件实践实训报告4.1系统模块划分图形显示模块关卡控制模块敌方生成模块游戏逻辑模块玩家控制模块飞机大战游戏系统4.2主要功能模块421玩家控制模块设计图信息科学与工程学院软件实践实训报告422游戏逻辑模块设计图(包含关卡控制)信息科学与工程学院软件

13、实践实训报告11信息科学与工程学院软件实践实训报告4.2.3图形显示模块设计(包含敌方生成模块)信息科学与工程学院软件实践实训报告4.3主要类图4.4软件结构设计体会软件结构设计部分是软件工程开发过程的重要部分,设计内容的好坏关系到整个软件的 优劣,在这次飞机人战项目开发中,对结构设计中出现的种种问题以及解决方法,加深了对 软件结构设计方法的理解,熟悉了对其的应用,从系统功能模块设计到主要功能设计,从类 图到状态图,都是着软件开发的每一个步骤,从宏观和细节处展示了整个软件的体系结构, 使整个软件更有层次感。5.编码实现5.1编码规范 在这次飞机大战设计开发项目中,涉及到的编码规范主要包括 类、

14、对彖、变量、常量、函数的名称含义准确不臃肿 类的命名必须以C开头。 类的名称中的单词首字母大写。 变量名称中的单词首字母大写。 函数名称中的单词首字母大写 对彖、变量、常量的定义尽量定义在CPapeiPlaiieDoc里。 函数定义在CPaperPlaneView里。 对不易理解的部分进行注释13信息科学与工程学院软件实践实训报告5.2代码组织策略以MFC代码标准组织方式为主。5.3关键技术代码实现5.3.1双缓冲的实现CDC* pMeniDC;CBitmap* pBitniap;CPapeiPlaiieView:CPaperPlaneView()/ TODO:在此处添加构造代码pMeniDC

15、 = new CDC();pBitmap = new CBitmapQ;DiawBG(pMeniDC);pDC-BitBlt(O, 0, 600. 600, pMeniDC, 0, 0, SRCCOPY);CPaperPlaiieView:CPaperPlaneViewQdelete pMeniDC;delete pBitniap;5.3.2透明贴图的实现void CCloud:draw(CDC* pDC)CDC meniDC;meniDC.CreateCompatibleDC(pDC);CBitmap bmpDraw;bmpDraw.LoadBitmap(C loudB itmapNum);

16、meniDC.SelectObject(&b mpDraw);pDC-TranspaientBlt(pos.x, pos.y, 80,50, &meniDC, 0, 0. 80,50、RGB(255, 255, 255); 5.3.3滚动背景的实现DiawBG(pMeniDC);void CPaperPlaneView:DrawBG(CDC* pDC)CPaperPlaneDoc* pDoc = GetDocumentQ;ASSERT_VALID(pDoc);if (!pDoc)return;/*/CBitniap bitmap;14信息科学与工程学院软件实践实训报告bitinap.LoadB

17、itmap(pDoc-BackGroundNum);BITMAP BitMap;bitmap. GetBitmap (&E itMap);CDC deMem; dcMem.CieateCompatibleDC(pDC); deMem. SelectO bject(&bitmap); pDC-StretchBlt(O, 0, 600, 600, &dcMem, 0, pDoc-BGposY, 600. 600, SRCCOPY); pDoc-BGposY -= 10;if (pDoc-BGposYBGposY = 1200;53.4主要游戏逻辑void CPaperPlaneView:OnTim

18、ei(UINT_PTR nlDEvent)/ TODO:在此添加消息处理程序代码和/或调用默认值CPapei PlaiieDoc * pDoc = GetDocumentQ;ASSERT_VALID(pDoc);if (!pDoc)return;CDC* pDC = GetDCQ;switch (nlDEvent)case 1:Di a wBG(pMeniDC);CloudIiiPlane(pDoc-myPlaiie.pDoc-enemy);FireIiiCloud(pDoc-FireList,pDoc-enemy);WateiIiiPlaiie(pDoc-WateiList, pDoc-my

19、Plane);PackageIiiPlane(pDoc-package, pDoc-myPlane);FireIiiBusiness(pDoc-FireList, pDoc-business);DrawFire(pDoc-FireList);DrawCloud(pDoc-enemv);DrawWatei(pDoc-WateiList); pDoc-mvPlane.Draw(pMeniDC); pDoc-package.Draw(pMeniDC); pDoc-business.Drav(pMeniDC);DrawTitleQ;if (pDoc-PlaiieScore = pDoc-PassBas

20、e* 100*(3*pDoc-NowLevel-2)+300) KillTmier(l);15信息科学与工程学院软件实践实训报告if (pDoc-NowLevelNowLevel);if (pDoc-NowLevelPlaiieScore = pDoc-PassBase *100* (3 * pDoc-NowLevel - 2) - 300& pDoc-PlaneScorePassBase * 100*(3 * pDoc-NowLevel - 2)if (pDoc-boss.pos.y = -200)killAllEnemyO;FiieIiiBoss(pDoc-FueList. pDoc-bo

21、ss); pDoc-boss.Draw(pMeniDC);else if (pDoc-PlaneScoie = pDoc-PassBase * 100*(3 * pDoc-NowLevel - 2)if (pDoc-boss.pos.y PlaneScore = pDoc-PassBase * 100 * (3 * pDoc-NowLevel - 2) + 1000;pDoc-boss.DrawUp(pMeniDC);if (pDoc-mvPlane.life PlaneScore = 0;SetLevel(pDoc-NowLevel= 1);SetTimer(l,25.0);elseexit

22、(l);/GetKeyConmiand();if (GetAsyiicKeyState(,P,)KillTmier(l);SetTunei(2,300, 0);if (GetAsyiicKeyState(VK_UP) pDoc-myPlane.up();if (GetAsyiicKeyState(VK_DOWN) pDoc -myPlane. d o wnQ;if (GetAsyiicKeyState(VK_LEFT) pDoc-myPlaiie.left();if (GetAsyiicKeyState(VK_RIGHT) pDoc-myPlane.nghtQ; pDoc-TiinerCnt+

23、;if (pDoc-TmierCnt % (40 / CFiie:FireMakeSpeed) FueList.AddTail(CFiie(pDoc-myPlane.pos + CPoint(25, -20);16信息科学与工程学院软件实践实训报告if (pDoc-TiinerCnt % (40 / CCloud:CloudMakeSpeed) boss.pos.v enemy.AddTail(CCloud(); ram(pDoc-enemy, pDoc-WateiList);if (pDoc-TmierCnt400&pDoc-TimeiCnt % (800 / CPackage:Packag

24、eMakeSpeed) Vl)pDoc-package.pos.v = 0; pDoc-package.PackType = randQ % 3 + 1;if (pDoc-havePower 0 & pDoc-TuneiCnt - pDoc-havePower 300) CFire: :FiieMakeSpeed = 6;if (pDoc-boss.pos.v -200 & pDoc-TunerCnt % (40 / 1) 1)iiit base = randQ % 200;for (int i = 0; iWaterList.AddTail(CWatei(CPoint(base+i * 20

25、, 200);for (int i = 0; iWaterList.AddTail(CWater(CPoint(base + 300 + i * 20, 200);if (pDoc-TiinerCnt % 4000 busiiiess.pos.x =% 450;pDoc-busiiiess.pos.y = 0;break;case 2:CBitniap bitmap;bitinap.LoadBitmap(IDB_PAUSE);BITMAP BitMap;bitmap. GetBitmap (&BitMap);CDC dcMem;dcMem.CreateCompatibleDC(pMeniDC)

26、;deMem. SelectO bject(&bitmap);pMeniDC-StietcliBlt(0, 0, 600, 600. &deMem, 0, 0, 600. 600, SRCCOPY);if (GetAsyiicKeyState(,P,)KillTmier(2); SetTiinei(l,25,0);if (GetAsyiicKeyState(,Q,) KillTmier(2);信息科学与工程学院软件实践实训报告SetLevel(pDoc-NowLevel = 1);SetTiinei(l, 25, 0);if (GetAsyiicKeyState(,E,) KillTmier(

27、2);if (AfkMessageEox(L“确定退出游戏? ME_YESNO) = 6) exit(l);elseSetTimer(2,300. 0);pDC-BitBlt(0, 0, 600. 600, pMeniDC, 0, 0, SRCCOPY);ReleaseDC(pDC);C View: OnTunei(nlDEvent);5.3.5碰撞判断mt CPaperPlaneView:FneIiiCloud(CList& list, CList& enemy) CPapei PlaiieDoc * pDoc = GetDocumentQ;AS SERT_VALID(pDoc);if (!

28、pDoc)retuni 0;POSITION pos = enemy. GetHeadPositionQ;while (pos != NULL) pDoc-PlaiieScore+=enemy.GetNext(pos).beFued(list);return 0;void CPaperPlaneView:FireIiiBoss(CList& list, CBoss& boss)CPapei PlaiieDoc * pDoc = GetDocumentQ;ASSERT_VALID(pDoc);if (!pDoc)retuni;boss.beFiied(list);if (boss.life Pl

29、aiieScore = pDoc-PassBase * 100 * (3 * pDoc-NowLevel - 2); return;mt CPaperPlaneView:WaterInPlane(CList& listCPlane& plane)POSITION ps2,pos = list.GetHeadPosition();while (pos != NULL)信息科学与工程学院软件实践实训报告ps2 = pos;if (plane.beWateied(list.GetNext(pos)list.RemoveAt(ps2);return 0;mt CPaperPlaneView:Cloud

30、IiiPlane(CPlaiie& plane, CList& enemy)POSITION pos = enemy. GetHeadPositionQ;while (pos != NULL)CCloud& tmp = enemy.GetNext(pos);CRect planeRectl. planeRect2, cloudRect, teniRect;plaiieRect 1 .SetRect(plane.pos + CPoint(10,10), plane.pos + CPoint(60, 30); plaiieRect2.SetRect(plane.pos + CPomt(0, 30)

31、, plane.pos + CPoint(70. 80); cloudRect.SetRect(tmp.pos, tmp.pos + CPomt(80, 50);if (plane.life0 &tmp.life0& (teniRect.IiitersectRect(cloudRect, planeRectl) | teniRec 匚 Ineis 亡 ctRect(cloudRect,plaiieRect2)plane.life -= tmp.damage;tmp.life = plane.damage;return 1;return 0;5.3.6链表遍历mt CPaperPlaneView

32、:FiieIiiCloud(CList& list, CList& enemy)CPapei PlaiieDoc * pDoc = GetDocumentQ;ASSERT_VALID(pDoc);if (!pDoc)return 0;POSITION pos = enemy. GetHeadPositionQ;while (pos != NULL)pDoc-PlaiieScore+=enemy.GetNext(pos).beFued(list);return 0;53.7关卡设置void CPaperPlaneView: SetLevel(mt iiLevel)CPapei PlaiieDoc

33、 * pDoc = GetDocumentQ;ASSERT_VALID(pDoc);if (!pDoc) return;switch (nLevel)19信息科学与工程学院软件实践实训报告case 1:CPlane:PlaneLife = 6;CPlane: TlaneDainage = 1;CPlane: TlaneBitmapNum = IDB_PLANE1;CCloud: :CloudBitmapNum = IDBCLOUDl;CCloud: :CloudBoonuiiapNum = IDB_CLOUDBOOM1;CCloud:CloudLife = 1;CCloud:CloudDama

34、ge = 1;CCloud:CloudMakeSpeed = 1;CCloud: :CloudMoveSpeed = 2;CFire:FireMakeSpeed = 6; /I - 9 CFire:FireMove Speed = 15;CFire: :FireDaniage = 1;CFire: :FireBitniapNum = IDB_FIRE1;C Water: WaterMakePossible = 40;CWater: WaterMoveSpeed =4;C Water: AVaterDamage = 1;C Water: WaterBitmapNum = LDE_VATER1;C

35、Package:PackageMakeSpeed = 3;/every 20s CPackage:PackageMoveSpeed = 2;CBoss:BossBitmapNum = IDB_BOSS1;pDoc-PassBase = 10;pDoc-PlaiieScore = 0;pDoc-boss.pos.v = - 200;pDoc-TiinerCnt = 0;pDoc-BGposY = 0; pDoc-WaterList.RemoveAll(); pDoc-enemy.RemoveAll(); pDoc-FiieList.RemoveAll();pDoc-mvPlane. iiiitQ

36、;pDoc-NowLevel = 1;pDoc-liavePower = 0; pDoc-package.PackType = iand() % 3 + 1; pDoc-BackGroundNum = IDB_B ACKGROUND 1;20信息科学与工程学院软件实践实训报告pDoc-boss.life = 10; break;case 2:CPlane:PlaneLife = 6;CPlane: TlaneDainage = 1;CPlane: TlaneBitmapNum = IDB_PLANE2;CCloud: :CloudBitmapNum = EDE_CLOUD2;CCloud: :

37、CloudBoonuiiapNum = IDB_CLOUDBOOM1;CCloud:CloudLife = 2;CCloud:CloudDamage = 1;CCloud: :CloudMakeSpeed = 1;CCloud: :CloudMoveSpeed = 2;CFire:FireMakeSpeed = 6; /I - 40CFire:FireMoveSpeed = 15;CFire: :FireDaniage = 1;CFire: :FireBitniapNum = IDB_FIRE2;C Water: WaterMakePossible = 60;CWater: WaterMove

38、Speed = 3;C Water: WaterDamage = 1;C Water: WaterBitmapNum = LDE_WATER2;CPackage:PackageMakeSpeed = 3;/every 20sCPackage:PackageMoveSpeed = 2;CBoss:BossBitmapNum = IDB_BOSS1;pDoc-TiinerCnt = 0; pDoc-PassBase = 10;pDoc-BGposY = 0; pDoc-WaterList.RemoveAll(); pDoc-enemy.RemoveAll(); pDoc-FiieList.Remo

39、veAll();pDoc-mvPlane. iiiitQ;pDoc-liavePower = 0;pDoc-package.PackType = iand() % 3 + 1; pDoc-BackGroundNum = IDB_B ACKGROUND2; pDoc-NowLevel = 2;21信息科学与工程学院软件实践实训报告pDoc-boss.pos.v = -200;pDoc-boss.life = 3; break;default:KillTmier(l);AfxMessageBox(LM恭喜你,通关了 !ME_OK);SetTimer(2,300, 0); break;5.3.8子弹

40、生成void CPaperPlaneView:raiii(CList& enemy, CList& list) POSITION pos = enemy. GetHeadPositionQ;POSITION ps2;while (pos != NULL)ps2 = pos;CCloud& tinp = enemy.GetNext(pos);if (tmp.pos.y 600)enemy.RemoveAt(ps2);elseif (rand() % 100 CWater:WateiMakePossible) tmp.ram(list);void CCloud:iaiii(CList& list)list.AddTail(CWater(CPoint(pos.x +13

温馨提示

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

评论

0/150

提交评论