第十届编程大赛队式选手手册_电子版.doc_第1页
第十届编程大赛队式选手手册_电子版.doc_第2页
第十届编程大赛队式选手手册_电子版.doc_第3页
第十届编程大赛队式选手手册_电子版.doc_第4页
第十届编程大赛队式选手手册_电子版.doc_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

29附录1:AI头文件的内容赛事介绍一、关于“队式程序设计大赛”队式程序设计大赛以“增加同学科技热情,培养团队协作精神,提高选手设计创新能力,丰富校园文化生活”为宗旨,基于某款经典电子游戏,让选手组队设计出能够顺利高效地完成游戏的AI。比赛往往以双方AI对战的形式进行,因而对抗性、观赏性较强。今年的题目是“坦克争霸”,定位为一个类似于星际争霸的即时战略游戏。为推广此项赛事,本届比赛在以前的基础上进一步扩大此项赛事的影响力,把参赛选手的范围扩展到整个清华大学,比赛规模也居历届之首。二、历届主题精彩回顾第九届(2008年)淘金者选手编写AI程序,控制淘金者在竖直的二维地图内上下左右移动,以最快的速度来找寻地图上散布的金块,并设法躲避警察的追捕。 第八届(2007年)我炸我炸我炸炸炸选手编写AI程序,投掷炸弹炸毁墙砖等障碍物,并设法炸毁对手,保全自己。第七届(2006年)是男人就下100层游戏方式与双人版的“是男人下一百层”类似,选手编写AI程序,通过互相阻挡、推挤对手,使自己的队员坚持到最后。第六届(2005年)超级占座选手通过自己编写的AI程序控制游戏中的玩家,占据二维地图中的空白(座位),抢占座位多者胜出。本届比赛主题本届队式程序设计大赛的主题是“坦克争霸”,画面取材于经典的“坦克大战”,游戏形式则为类似“星际争霸”这样的即时战略游戏。选手为自己的坦克编写AI,与其他选手的AI展开激烈的角逐,争夺地图上的矿点,使己方获得尽可能多的资源。下面就是游戏的实际画面,让我们先睹为快!游戏平台主界面 3D游戏画面2D回放调试画面详细规则一、主体规则本游戏中,红方与蓝方各有五架坦克,在一张中心对称地图上角逐,进行抢夺矿点的战斗。当一个矿点被占领后,它将每回合向占领它的那一方提供1点资源。本游戏判定胜负的依据为双方取得的资源数。当某一方先获得游戏指定的资源数(设为1200),则判定此方胜利。参赛选手的任务是为己方坦克编写AI,与其他参赛选手的AI在此规则下进行对抗。二、坦克种类本游戏中坦克分为三类。选手可自行决定己方五架坦克的类型与搭配。但五架坦克的类型与搭配在第一回合后将无法再进行改动。1. Striker 攻击:2 生命:3 射程:3在残酷的战争中,Striker以其强大的进攻火力而让对手闻风丧胆。它配备着超强火力的火炮,每发炮弹都能对对手的坦克造成重大的打击,并且可以轻易撕裂较为薄弱的障碍物,是攻城拔寨的强力单位。防守时也使对方不得不忌惮于它的强大火力。2. Pioneer 攻击:1 生命:8 射程:1战争中,最让对手无奈的可算是Pioneer了。它有着超强的装甲,任何炮火都难以迅速摧毁它。防守中,它就如一道无法攻克的万里长城;进攻中,它的每一次出现都给对手带来无限的死亡恐惧。它能轻易地碾过薄弱的障碍物,进行意想不到的奇袭或强攻。3. Sniper 攻击:1 生命:2 射程:5明枪易躲,暗箭难防。Sniper总习惯于躲在对方看不见的阴暗角落,向对手射去那致命的一炮。它的火炮经过特殊设计,使其射程远远超过对手。只可惜它侦察手段的改进未能跟上其火炮的要求。但如果有一个队友帮它开路,它对对方而言将是最致命的存在。同时它还能为冲锋的队友扫清前方的薄弱障碍,使其无阻碍地向前冲锋。三、细则详解1矿点信息:地图上将有至多十三个矿点,在游戏开始时,其中红、蓝方各占有若干矿点,剩下的矿点为中立状态。2矿点的所有权改变规则:一个本来为A方所占有的(或者中立的)矿点,一旦有B方的坦克到达了,则将变为B方所占有的矿点,并从此以后为B方提供资源点数,直到又有A方的坦克到达使其转变为A方占有的矿点或者游戏结束。3坦克行动规则:每回合每个活着的坦克有一次行动机会。游戏平台将调用选手编写的AI,由选手编写的AI程序计算出该回合指令。其指令可以是(注意是全大写!):STOP(停)、GOUP(上)、GODOWN(下)、 GOLEFT(左)、GORIGHT(右)、FIRE(开火)。若是FIRE,则同时还要给出开火的目标格。若该格有坦克,则该格坦克的生命值将减去开火坦克的攻击力(不分敌我皆会受伤);若该格为砖墙,则该砖墙生命值将减去开火坦克的攻击力;若该格为石墙或空格,则什么事也不会发生。4坦克死亡判定:当一辆坦克生命值减为0或者负时,则判定为死亡,两回合后于出生点复活,并拥有两回合的无敌时间。5坦克相撞判定:当两辆不同方的坦克在同一回合走到同一格,则生命值都减去相撞那辆坦克的生命值。若还有存活者则走到此格。(通俗地说,就是血多的留下,血少的死亡,若是血一样多,就同归于尽)。6坦克撞墙判定:当坦克撞向砖墙时,则与两坦克相撞类似进行判定(即若某坦克血比某砖墙多,则可以耗费与砖墙相等血量将砖墙撞掉;若血量不够,则死亡)。当坦克撞向石墙时,将死亡。两坦克同时撞向一砖墙的情形,则两坦克各减去一点生命值再进行两坦克相撞的判定。7视野:每个坦克视野都为4,每个矿点附近双方同有范围为2的视野。无论视野内外,选手的AI程序都能获得整张地图的地形信息,但是无法获得视野外敌方坦克的信息。己方五辆坦克视野互相共享。8障碍物:坦克不可摧毁石墙,但可摧毁砖墙。每个砖墙有两点“生命值”,当“生命值”减为0时则变为空地,永不再复生。摧毁砖墙的手段有:通过炮火击打或者直接硬撞掉。9平台逻辑判定流程:主程序在一回合中的流程是:获得每个坦克的指令处理开火的命令(如果有的话),进行开火后的伤害判定处理移动命令判断是否有坦克复活判断是否有相撞现象判定是否有矿点改变了所有方更新资源数。四、疑难解答Q:若双方同时达到指定资源数怎么办?A:若双方资源数不等,则多者获胜;否则再看当时占有矿点数,多者获胜;再次看击杀数,击杀多者获胜;若击杀数也相同则视为平局。Q:比赛的回合数有上限吗?A:比赛的回合数上限设为400回合。第400回合过后,若双方资源数不等,则多者获胜;否则再看击杀数,击杀多者获胜;再次看当时占有矿点数,多者获胜;若矿点数也相同则视为平局。Q:上面提到了坦克复活会有无敌状态,请详细解释下?A:无敌状态是为了防止恶意“守尸”而设置的。当一辆坦克复活时它将拥有2回合的无敌状态。“无敌”包括:敌方坦克朝该坦克开火该坦克不掉血;与任何敌方坦克相撞都将无损伤地撞毁对方。但自己撞砖墙、撞石墙的判定与非无敌状态一样。Q:向己方坦克开火,也会造成伤害吗?A:会。Q:几架同方坦克在同一回合要走到同一格,将发生什么?A:序号小者优先走,序号大者留在原地。Q:若不同方两架坦克交错相撞,比如一个从(1, 1)走向(1, 2),另一个从(1, 2)走向(1, 1),将会怎样?A:平台将进行相撞判定,规则同走到同一格的相撞。相撞后若有存活一方则走到它的目标位置。Q:若同方两架坦克交错相撞,比如一个从(1, 1)走向(1, 2),另一个从(1, 2)走向(1, 1),将会怎样?A:两架坦克将都不移动。Q:若两辆坦克同时向对方开炮会怎样?A:两架坦克将同时受伤。如果两架坦克血都不够经受这一次打击,则会同归于尽。Q:Sniper是否可以向视野外的格开炮?A:可以初赛说明测试赛结束后,将公布初赛所用的地图若干,初赛的每场对战的地图都将从中随机抽取。初赛采用网上随机分组对战的形式。选手需要在12月13日之前将AI源文件上传至服务器,12月13日当天服务器自动对新生组和老生组的所有参赛队伍各分为4小组进行单循环对抗,每小组选出4支优胜队,共16支队伍再次进行单循环,分别选出新生组和老生组的前8名队伍晋级决赛。比赛结束后公布比赛结果,并提供所有比赛的回放文件下载。报名截止后到初赛前(11月30日12月13日),网上对战平台将开放,供选手热身。各队伍可以将自己的AI源文件上传到服务器上,并指定要与哪支队伍对战。如果对方上线后也传上自己的AI源文件,则进行对战。对战结束后,双方可以下载本场对战的回放。决赛说明经过初赛,新生组和老生组中各有8支队伍进入决赛。决赛所用的地图不事先公布。决赛将采用现场对战的形式,决赛所有对战使用的地图和双方的坦克颜色均由抽签决定。8支队伍分两个小组进行单循环,各小组前两名进入淘汰赛。淘汰赛采取三局两胜制。最终,新生组和老生组各决出一等奖1队,二等奖1队,三等奖2队,其余进入决赛的队伍为鼓励奖。现场将为获奖队伍颁奖。颁奖前,将进行新生组和老生组冠军之间的表演赛。AI编写快速入门一、游戏流程每回合,选手程序会收到平台发送的一个结构体,其中包含了当前赛场上的全部信息,选手根据这些信息进行运算(暂定每辆坦克每回合限时50ms),并返回一个行动的指令,待平台收集到所有选手的行动指令后,会更新选手位置及赛场元素,进入下一回合。如此往复,直至游戏结束。二、选手AI工程的结构主要包括两个文件:Tank.h和myAI.cpp。1Tank.hTank.h是由平台组提供给选手的AI头文件,主要包括以下内容: 常量宏定义,例如:#define MAP_WIDTH21/赛场的宽度#define MAP_HEIGHT21/赛场的高度/ 自定义枚举类型,例如:typedef enum PERVIOUS, BRICK, BREAKBRICK, STONE CellType; /地面的类型typedef enum STOP, GOUP, GODOWN, GOLEFT, GORIGHT, FIRE OrderType;/指令的类型typedef enum Striker, Pioneer, Sniper TankType;/坦克的类型/ 定义结构体,存放游戏信息,例如:struct DataForAI/传递给坦克AI的所有信息MapCell mapMAP_HEIGHT+2MAP_WIDTH +2;/当前的赛场地图,从上到下,从左到右,行优先/比赛场有效区域头尾各多一行,左右各多一列,便于编写算法TankData tankMAX_TANK_NUM;/所有参赛坦克的信息Point sourceMAX_SOURCE_NUM;/矿点位置信息FlagType myFlag;/自己属于哪一方short myID;/自己的ID short round;/当前回合数short redGoldNum, blueGoldNum; /当前双方的金子数short redScore, blueScore; /当前双方击杀数short redSource, blueSource, totalSource;/当前双方占有矿点数、总矿点数int redTime, blueTime; /当前双方AI总用时;/游戏定义的各种类型、结构体的具体含义在Tank.h中都有详尽的注释。宏定义、自定义枚举类型和结构体的概念和语法请参考C语言教材。2myAI.cppmyAI.cpp包括两个函数:chooseType(FlagType myFlag) 和makeOrder (DataForAI data)。平台0回合时调用chooseType函数获取AI名称及坦克类型信息,0回合之后该函数不再被调用;从第一回合开始,每回合对每辆坦克各调用一次makeOrder函数,获得选手返回的指令。makeOrder函数的形参data是由平台提供给选手的当前回合游戏信息。选手的任务是: 改写chooseType函数,在第一回合选择每辆坦克的类型(Striker/Pioneer/Sniper),并为自己的AI命名。 编写makeOrder函数,由当前回合游戏信息得出下一步指令(左走、开火等等),返回至平台。下面是平台组为选手提供的myAI.cpp文件:#include Tank.h/引用游戏头文件Tank.h#include InitiateInfo chooseType(FlagType myFlag)/平台回合时调用此函数获取AI名称及坦克类型信息/0回合之后该函数不再被调用InitiateInfo Info; /定义一个InitiateInfo类型变量Info,存放函数返回的信息Info.tank0=Striker;/0号坦克选择StrikerInfo.tank1=Striker;/1号坦克选择StrikerInfo.tank2=Striker; /2号坦克选择StrikerInfo.tank3=Striker; /3号坦克选择StrikerInfo.tank4=Striker; /4号坦克选择Strikerstrcpy(Info.aiName,myAI);/设置AI名为“myAI”return Info;Order makeOrder(DataForAI data)/平台从第1回合开始调用此函数获得每回合指令Order order;/定义一个Order类型的变量orderorder.type=STOP;/对order的成员type赋值(参考头文件中struct Order和OrderType的定义return order;/返回order三、如何让平台调用我的程序1生成*.dll文件Visual C+ 6.0:在myAI.cpp中写好程序之后,点击菜单栏中的“Build Build myAI.dll”(图1),成功以后会在工程文件夹的Debug子文件夹中生成一个myAI.dll文件(“myAI”即工程名)。图1Visual Studio 2005/2008:在myAI.cpp中写好程序之后,点击菜单栏中的“Build Build solution”(“生成(B) 生成解决方案(B)”),成功以后会在工程文件夹的Debug子文件夹中生成一个myAI.dll文件(“myAI”即工程名)。2调用AI 打开游戏平台。 点击“单机游戏”,出现“选择游戏模式”窗口。 点击“单人闯关”,点击AI路径栏右方的“浏览”并选择上一步中生成的myAI.dll文件,然后选择相应关卡即可(图2)。(六个任务的详细要求参见“测试赛说明”)图2选择关卡后,平台将调用AI,调用完毕后告知选手是否闯关成功(图3)。如果是第4关第6关,还可以查看回放。图3注:“双人对战”模式是初赛和决赛时将使用的双方PK模式,这里暂不做说明。四、如何利用Tank.h获得信息希望能够通过以下几个实例,让选手熟悉如何使用Tank.h头文件。实例1 判断整型变量x是否超过地图宽度if ( x MAP_WIDTH)/分析:头文件中有这么一个宏定义:#define MAP_WIDTH21实例2 判断当前回合地图坐标(5, 8)的点的地图属性是否为砖墙if (data.map58.type = BRICK)/分析:在myAI.cpp中,makeOrder函数的参数中定义了一个结构体DataForAI类型的变量data。头文件中已定义DataForAI结构体如下。struct DataForAIMapCell mapMAP_HEIGHT+2MAP_WIDTH +2; /其中嵌套了另一个结构体MapCell,其定义如下:struct MapCellCellType type; /当前格的地面属性 /;其中的CellType是自定义的枚举类型,其定义如下:typedef enum PERVIOUS, BRICK, BREAKBRICK, STONE CellType;实例3 判断当前回合地图坐标(8, 4)的点上是否有坦克;若有,判断是否是敌方坦克。 if (data.map84.whoIsHere != -1) int n = data.map84.whoIsHere; if (data.tankn.flag != data.myFlag) / 请选手查阅Tank.h,自行分析这段代码。通过以上三个实例,相信你已经对编写AI的形式有了一定的了解,现在就动手编写自己的AI吧!回放文件播放器一、功能简介回放文件播放器可将对战的详细过程重现,帮助选手更高效地调试并改进自己的AI。可以用回放文件播放器打开每一场对战的回放文件,查看对战的详情(包括对战时间、AI名、地图名、对战结果、AI用时等),并可自由跳到任何一回合查看当前回合的地图、对战双方数据(包括矿点数、资源数、击杀数等)、坦克的数据(包括ID、位置、生命值、是否隐身、是否无敌、下回合指令等)。还可以随时为回放文件添加备注,写下关于这场对战的说明或观看回放时的意外发现,与他人分享。二、打开回放文件要获得回放文件,需要先进行游戏(双人对战或单人闯关的46关)。游戏结束后,平台会在“replay”子文件夹下生成一个名为“红方AI名_vs_蓝方AI名.tankrep”或“AI名_campaign关数”的回放文件,并询问是否马上打开它。要打开一个回放文件,除了对战后由平台自动打开,也可以直接运行“replay”子文件夹下的“TankRepPlayer.exe”,再打开回放文件。此程序也支持用文件关联和拖放等方式打开文件。三、观看回放文件打开一个回放文件后,会看到如下的界面:1查看回放文件信息窗口右侧的“回放文件信息”栏中显示了对战的基本信息。如果此次对战因为某AI死循环等原因被人为中止,最终资源数、最终矿点数和最终击杀数都将不显示,但在“对战结果”中会显示对战异常终止时正在思考的坦克ID,由此可以判断是哪方AI发生了死循环。“回放文件信息”栏的下方是“备注”栏。备注修改后会被保存在回放文件中。需要注意的是:如果观看完平台自动生成的回放后不另存,下次对战时,平台会自动覆盖掉同名的回放文件。2回放比赛过程占据窗口大部分位置的是当前回合的地图和坦克位置。将鼠标指在地图上时会提示当前所指格的坐标。三种坦克分别用三种不同的外形区分: Striker Pioneer Sniper坦克的外形记不住也没关系,窗口的右下方有坦克图例,将鼠标指上去时还会显示该种坦克的攻击力、生命值和射程。如果某格上出现了深绿色的瞄准标记(),说明下回合有坦克向此格开火,并且处于其有效射程之内。如果想查看坦克的详细信息,请将鼠标移到坦克上,此时将可能显示如下的信息: 隐身树叶。如果有此标记,表示该坦克在对方视野之外。 生命值。当前值/最大值。 坦克ID。红方为04,蓝方为59。 下回合指令(移动)。 下回合指令(开火)。瞄准标记表示开火目标,如果开火目标处于射程之外或者地图之外,瞄准标记为灰色。 无敌光环。如果有此标记,表示该坦克处于无敌状态。地图的上方显示的是当前双方的矿点数、资源数和击杀数。地图的下方有进度控制条,可以通过拖放来跳到任何一个回合;也可以点击跳到第一回合、点击后退或前进一回合、或者点击自动播放。自动播放的速度可以用右下角的拖动条来控制,从“龟速”(每回合2秒)到“光速”(每秒40回合)一共有11档速度可供选择,默认值为每秒4回合。3提取地图点击窗口右上方的“提取地图”按钮,可以将当前回放的对战所用的地图提取出来,保存为TankCraft地图文件(*.tankmap)。地图编辑器一、功能简介地图编辑器可以用来创建和修改属于自己的TankCraft地图。它将为选手提供一个自由发挥创造力、彰显个性的舞台,同时帮助选手更有针对性地测试自己的AI。借助它的对称绘制功能,可以轻松地创建出绝对公平公正的中心对称地图。二、地图设计要求TankCraft地图需要满足这些基本要求:(1) 最少要有5个矿点,最多有13个矿点;(2) 要指定10架坦克(红、蓝各5架)的初始位置;(3) 地图名不能超过16字节(8个汉字)。不满足以上三条要求中的任何一条的地图,将不能在地图编辑器中保存。如果要将地图用于正式对战,为公平起见,地图必须为严格中心对称(严格中心对称的定义见使用说明3对称绘制模式)。为了使地图更加具有对称美,还可以地图同时为轴对称。下面的这张样例地图不仅为中心对称,还关于两条对角线轴对称,充分体现了地图设计者洋溢的才华。三、使用说明如果想查看或修改一幅现成的地图,请直接运行map文件夹下的“TankMapEditor.exe”,再打开地图文件(扩展名为.tankmap)。此程序也支持用文件关联和拖放等方式打开地图。如果想创建一幅全新的地图,请在启动画面点击“创建新地图”。1修改地图信息地图信息包括地图名称和地图说明,可以在窗口的右上方修改。建议为地图起一个生动形象且充满诗情画意的名字,并在地图说明中简要描述一下地图,也可以加入作者信息。2绘制地图要绘制地图,请先在窗口右边栏中间的地图元素选择区(如下图)中选择要绘制的地图元素。鼠标左键和右键可以分别选择不同的地图元素,选中的地图元素会在地图选择区上方显示。默认将右键设为空地,用来擦除其他地图元素。选定地图元素后,就可以在地图区绘制了。如果选择的是空地、砖墙或石头,可以按住鼠标键拖动来连续绘制。如果选择的是矿点,则不能通过拖动来连续绘制,也就是说,每次点击鼠标只能放置一个矿点(对称绘制模式下放置两个)。如果在地图元素选择区选择了一架已经放置的坦克,它将立即从地图上撤除。将坦克放到地图上后,当前地图元素将自动换回选择坦克前选择的地图元素。如果还想继续放置坦克,需要在地图元素选择区重新选择。3对称绘制模式选择对称绘制模式分为上下对称、左右对称、左上-右下对称、右上-左下对称和中心对称,默认为中心对称。在所有对称模式下,放置空地、砖墙、石头、矿点时,都将在对称的格子里自动放置相应的元素(其中红方矿点对应蓝方矿点)。在中心对称模式下,放置坦克时,也会在对称的格子里自动放置对应的坦克(红方0号对应蓝方5号,红方1号对应蓝方6号,依此类推)。点击“对称性检查.”按钮,将按照当前选择的对称模式检查对称性。中心对称模式下将进行严格检查,只有当所有地图元素(包括坦克的ID)都对应时,才判定为对称。其他对称模式下对坦克只进行颜色的检查,不要求ID对应。如果所有的对应矿点和坦克的颜色都相同或都相异,就判定为对称。附录1:AI头文件的内容为方便选手查阅,在这里附上给选手的AI头文件(Tank.h)的完整内容,供参考。#define MAP_WIDTH21/赛场的宽度#define MAP_HEIGHT21/赛场的高度#define MAX_TANK_NUM 10/选手数量,一方五架坦克,比赛地图保证#define MAX_SOURCE_NUM13/最大矿数,具体矿数视地图而定#define GOLD_ONE_ROUND1/矿每回合提供金子数#define MAX_GOLD_NUM1200/判定胜利的金子数#define REVIVE_ROUND2/死亡后复活所需要的回合数#define MAX_NOHARM_ROUND2/无敌回合数#define MAX_ROUND400/比赛最大回合数/*#define STRIKER_ATTACK2/Striker攻击力#define PIONEER_ATTACK1/Pioneer攻击力#define SNIPER_ATTACK1/Sniper攻击力#define STRIKER_LIFE3/Striker生命值#define PIONEER_LIFE8/Pioneer生命值#define SNIPER_LIFE2/Sniper生命值#define STRIKER_RANGE3/Strike射程#define PIONEER_RANGE1/Pioneer射程#define SNIPER_RANGE5/Sniper射程#define SIGHT4/坦克视野#define SOURCE_SIGHT2/矿点视野/*typedef enum RED, BLUE FlagType;/坦克的归属,0=红方,1=蓝方typedef enum PERVIOUS, BRICK, BREAKBRICK, STONE CellType;/地面的类型/0 可以通过的,1=砖块(可摧毁),2=半毁的砖块(可摧毁),3=石头(不可摧毁)typedef enum STOP, GOUP, GODOWN, GOLEFT, GORIGHT, FIRE OrderType;/返回指令的类型/0=不动,1-4=分别向上下左右四个方向移动,5=开火struct Order/返回的指令OrderType type;/返回指令的类型short row, col;/开火目标位置,仅当type为fire时有效,row从上至下,col从左至右;typedef enum NotSource, RedSource, BlueSource, NeutralSource SourceType;/金矿的归属 /0=不是金矿,1=红方,2=蓝方,3=中立typedef enum Striker, Pioneer, Sniper TankType;/坦克的类型/Striker: 攻击:2生命:3射程:3视野:4/Pioneer:攻击:1生命:8射程:1视野:4/Sniper:攻击:1生命:2射程:5视野:4struct InitiateInfo/用于返回初始化所需信息Tank

温馨提示

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

评论

0/150

提交评论