虚拟分组课程设计报告讲解_第1页
虚拟分组课程设计报告讲解_第2页
虚拟分组课程设计报告讲解_第3页
免费预览已结束,剩余23页可下载查看

下载本文档

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

文档简介

1、学号2013-2014 学年 第二学期软件开发课程设计报告题 目: 虚拟分组坦克程序设计专 业: 计算机科学与技术班 级: 10( 2)姓 名:院 系: 计算机与信息工程系指导教师:成 绩:2014年 6 月 8 日目录1 开发技术概述 1.2 相关技术理论 1.3 系统分析 1.3.1 系统可行性分析 技术可行性 操作可行性 1.3.2 功能分析 TankClient 类基本功能分析 Tank 类基本功能分析 3.4 系统实现 . .44.1 游戏主窗体实现 4.4.2 分组游戏的实现 分组 获取

2、敌人 消灭敌人 显示敌人的距离 7.5 功能测试 8.6 总结 1.0.致 谢 1.0.参考文献 1.0.源代码 1.1.1 开发技术概述Java 语言是一种跨平台,适合于分布式计算环境的面向对象编程语言。JAVA 现在主要用在 WEB开发,手机游戏及一些平台游戏的开发,因为它具有很好的跨平台性,在手机等各 种电子产品上应用非常广泛。C 语言是一种面向过程编程,这就使得 Java 具有重用的特性 , 在开发速度上比 C 语言更 快, 但是在运行速度上却是 C 更快,因为 C 属于底层语言,它比 JAVA更加亲近机器,所以在 许多系统开发上一般是用 C语言,比如我

3、们常用的 XP系统、 LINUX系统,都是 C语言开发的。 跨平台的服务器端的嵌入式脚本语言。C+多用于游戏引擎、反病毒、硬件驱动以及一些对运行效率要求比较高的应用程序,比 如数据库管理系统。 C+语言在提供强大的功能的同时也提高了程序含BUG的可能性。 C+为了照顾大量的 C语言使用者 , 而兼容了 C,使得自身仅仅成为了带类的 C语言,多多少少影 响了其面向对象的彻底性。2 相关技术理论系统运行环境(1)网络服务器操作系统: Windows XP;( 2)开发工具: eclipse3.2 ;( 3)运行环境: J2SDK 1.5 ;( 4)编程语言: Java 语言;3 系统分析3.1 系

4、统可行性分析技术可行性Java语言自Sun公司于1995年5月正式发布以来, 经历了出生、 成长、成熟壮大的几个阶 段,逐渐发展成为 IT 领域里的主流计算模式, 使用 Java开发工具方便,容易实现。 Java对开 发网络产品有它自己独特的优势,网络游戏也是其开发产物之一。本系统开发过程是利用 Java 编程语言和 eclipse 集成开发环境配合使用来实现的,它是基于TCP/UDP协议和 Socket编程技术,建立以 C/S为结构模式的娱乐性游戏平台。操作可行性本设计是一个虚拟的游戏平台, 只是模拟了现在社会上的一些多机游戏的部分功能, 以操作简易,玩家不需要了解内部流程,只是和一般其他的

5、游戏一样的操作即可开始游戏。 相对于开发者而言,整个系统形成主要由 JDK5.0虚拟环境和 eclipse3.2 共同完成 , 无需更多 复杂的工具和服务器支持。3.2 功能分析3.2.1 TankClient 类基本功能分析TankClient 类是整个系统的核心部分, 它承担整个系统的所有可实现功能的调度工作。 是整个游戏运行的场所。 TankClient 类设计流程图如图 3.2 所示:对战双方玩家坦克由键盘控制移动发射炮弹同角色坦克碰撞检测(坦克和子弹) 不处理不同角 色坦克产生爆炸判断胜负结束TankClient 类是主类,通过调用其他类中封装的方法来使整个系统运行起来,下面显示 T

6、ankClient 与各个类之间的关系如图 3.3 所示:键盘 控制 移动图 3.3 游戏系统类关联图Tank 类基本功能分析Tank(坦克)类中,封装了一些变量属性,包括坦克自己的大小(WIDTH,HRIGH)T,运动速度 (SPRRD_X:在 x 轴方向的速度; SPEED_:Y 在 Y 轴方向的速度 ) 、生命值控制( life )、 坦克编号( id )、坦克名 (name) 、方向控制 (dir) 、生死控制 (live) 、好坏控制 (good) 的变量 等。 Tank 类中没有 main 函数,不是主类 , 它当中只封装一些变量属性和静态方法,被 TankClient 类调用来实

7、现坦克的一系列动作。 Tank 类中的主要方法罗列如下:( 1) getRect() 方法public Rectangle getRect() return new Rectangle(x, y, this.WIDTH, this.HEIGHT);Rectangle 类是碰撞检测的辅助类,通过得到子弹的x ,y 坐标和宽高度,检测两个矩形是否碰撞(相交) ;( 2) draw ()方法:负责将所有的活动在屏幕上画出来;( 3) move()方法:主要负责控制坦克的移动,包括8 个方向(左,左上,上,右上,右,右下,下,左下)的控制以及给坦克一个移动的速度;( 4) keyPressed() 方

8、法:设定使用键盘的“” “”“”“”键控制坦克移动;( 5)keyReleased() 方法:处理按键抬起事件,抬起“ CTRL”键时,发射炮弹并加入新 炮弹,能够逐一发射每一发炮弹、抬起“A”键可以发射超级炮弹等功能;( 6) locationDirection()方法:定义了炮筒方向,可以向八个方向发射炮弹;( 7) fire() 方法:处理发送子弹的方法;(8)bumpWithWall ()方法:主要负责处理坦克撞墙事件;( 9) bumpWithTank() 方法:主要到负责处理坦克和坦克相撞事件;4 系统实现4.1 游戏主窗体实现TankClient 类负责画出游戏主窗体, 它是整个

9、游戏运行和所有活动的场所。 登陆主 窗口后,主界面上包括两个下拉菜单条, “游戏”和“帮助” 。 TankClient 类是整个系统 的“大管家” ,当要执行某动作时, “大管家”只需要调用各个类中封装好的方法,让被调 用的类自己去执行它自己的方法,这更体现了面向对象的思想。游戏主窗体界面如图 4.1 所示:图 4.1 游戏主窗口预览效果图实现虚拟屏幕消除闪烁的关键代码如下:public void update(Graphics g) / 利用双缓冲消除闪烁的效果if(offScreenImage = null) offScreenImage = this.createImage(GAME_W

10、IDTH, GAME_HEIGHT); Graphics gOffScreen = offScreenImage.getGraphics();Color c = gOffScreen.getColor();gOffScreen.setColor(Color.BLACK);gOffScreen.fillRect(0, 0, GAME_WIDTH, GAME_HEIGHT); gOffScreen.setColor(c);paint(gOffScreen); g.drawImage(offScreenImage,0,0,null);4.2 分组游戏的实现RoboCode 的混战模式中,如何更好的掌

11、握多个对手的情况,从而采取更好的策略,成 为每一个玩家迫切需要解决的问题。分组游戏运行主界面,通过键盘控制坦克运动,相互对战,其效果图如图 4.2 所示:图 4.2代码如下:package mytest;import robocode.*; public class Track public String Name;public double Heading;/敌人坦克的名称/敌人的绝对角度,通过计算得出public double Bearing;/敌人坦克相对于你车头方向的相对角度public double Distance;public double Energy;public doubl

12、e V elocity;public double FaceHeading;public double trackX,trackY;public double nextTrackX,nextTrackY;/敌人坦克的距离/能量/速率/敌人坦克面向的方向/敌人坦克的坐标/ 下一个 标准 时间中敌人坦克所在的位置public void update(ScannedRobotEvent e) Name=e.getName();/敌人坦克的名称Bearing=e.getBearing();/敌人坦克相对于你车头方向的相对角度Distance=e.getDistance(); / 敌人坦克的距离Ener

13、gy=e.getEnergy();/能量Velocity=e.getVelocity(); /速率FaceHeading=e.getHeading(); / 敌人坦克面向的方向vector 里去了,让我们回到我们的 下一步就是如何把已经现身在雷达中的敌人抓到一个机器人主体中去:派生自 AdvancedRobot 类的 MyVector 类中。首先,声明一个 vector 类型,并在 run 中进行初始化。public class MyVector extends AdvancedRobot final double version=0.1;private Vector trackVector;

14、/声明我们的向量数组/* run: MyVector's default behavior*/public void run() out.println("myVector Version is "+version);trackVector=new Vector();/初始化我们的向量数组while(true) / Replace the next 4 lines with any behavior you would like showTrack();setTurnRadarRight(360); /让雷达不停转execute();获取敌人只要雷达工作正常, 我们

15、就能获取每一个敌人的信息了。 当敌人的信息源源不断地涌入 我们的 onScannedRobot 中,我们的机器人要像一个优秀的指挥官一样去鉴别情报,哪些是 已经有的,哪些是没有的。让我们去 onScannedRobot 事件里看一下吧。* onScannedRobot: What to do when you see another robot*/public void onScannedRobot(ScannedRobotEvent e) if(!isInVector(e) Track myTrack=new Track();myTrack.update(e); trackVector.ad

16、d(myTrack);我的 myVector 机器人是靠自定义方法 isInVector 来判断该机器人是否存在于向量数组中 的,如果 isInVector 返回值为 false,则初始化一个 Track 对象, 调用它的 update 方法来初始 化敌人的信息,然后调用 Vector 类型的 add 方法,将该对象加入到向量数组中。好了,让我们去 isInVector 里边看看吧。/*isInVector: 自定义方法,判断该机器人是否已存在于队列中*/public boolean isInVector(ScannedRobotEvent e) int i=0;while(i) Track

17、myTrack=(Track)trackVector.get(i);if(myTrack.Name=e.getName() myTrack.update(e);return true;i+; return false;isInVector 方法的基本思路是, 通过传进来的 ScannedRobotEvent 中的 getName 来和 vector 中已经存在的对象的 Name 来进行比较的。消灭敌人要消灭敌人,很简单,我们只需要在 onRobotDeath 事件中调用 Vector 类型的 remove 方法。 Remove 方法是用来删除指定位置上的对象的。下面代码的基本思路和 isInV

18、ector 是 一样的。显示如下:public void onRobotDeath(RobotDeathEvent event) int i=0;while(i) Track myTrack=(Track)trackVector.get(i);if(myTrack.Name=event.getName()i+;4.2.4显示敌人的距离我在 run 的 while 中调用了下面的函数,用来显示当前的时间、敌人的数量及每个敌人与我们的距离。对数量的计算用到了Vector 的 size 方法。public void showTrack() int i=0;out.println("This

19、 Time is "+getTime(); out.println("Track's count is "+trackVector.size(); while(i) Track myTrack=(Track)trackVector.get(i); if(myTrack.Name=event.getName() i+; 各个玩家游戏界面上都能显示实时动态,效果如图图 4.4 游戏对战实时显示图4.4 所示:图 4.5 玩家死亡时游戏界面当玩家被炮弹击中达到 4 次,而又没有及时吃到增长生命的血块时, 提示游戏结束, 可 以选择重新开始或退出该模式,效果如图

20、4.4 所示:5 功能测试经过测试发现,游戏各个功能正常,坦克可以玩家控制的坦克能够四处 移动,玩家控制的坦克能够打击敌人, 敌人坦克能够任意移动, 坦克被摧毁能够 模拟爆炸,地图上存在障碍,玩家坦克能够增长生命。游戏画面如图所示:游戏主画面简单的数据统计玩家控制的坦克敌方坦克及障碍物96 总结 本次设计是对大学所学专业知识的一次检验, ,同时也是我所做的工作量最大的一次作 业,因此从一开始我对本次毕业设计就给予了高度重视。 从选题、 收集资料、 学习相关技术 到实际编程, 我都一丝不苟的对待了。 当然其间我也走了不少弯路, 有时甚至需要推倒重来, 但同时我也多次体会过克服困难后的成就感。通过

21、这次毕业设计, 我学会了一些编程技巧, 而且对调试的错误有进一步的认识, 有时 候就一个小小的语法错误就会导致程序调试不通过。 所以每个字符, 每句程序都要认真对待。 使用不同的编程环境,其效率完全不一样,所以我选择了Eclipse,它自动找错 / 纠错功能、Debug 调试和代码自动生成等一些重要的功能大大提高了我的设计效率。 对于设计论文, 一 定要注意格式,认识事情都有它的规则、规范,不能按个人喜好随意改变。致谢经过一段时间的忙碌, 本次课程设计业已完成了, 作为一个还未毕业的本科生的课程设 计,由于经验的匮乏和业务逻辑的不熟悉, 难免有许多考虑不周全和不完善的地方, 但是在 指导老师和

22、宿舍同学的帮助下很多困难都得以解决, 所以在此本人要特别感谢他们对我的帮 助。参考文献1 姜志强编著 . Java 语言程序设计 M. 北京:电子工业出版社, 20072 侯俊杰编著 . Java 语言应用开发基础 M.3 孙更新 , 吕婕编著 . Java 毕业设计指南与项目实践 M. 北京:科技出版社, 2007.4 杜江, 管佩森编著 . Java 使用编程 100例 M. 北京:中国贴到出版社, 2004.5 殷兆麟编著 . Java 语言程序设计 M. 北京:高等教育出版社 , 2002.6 侯俊杰编著 . Java 程序设计教程与实训 M. 北京:科学出版社 , 2005.7 赵强

23、, 陈洪译著 . Java 程序设计高级主题 M. 北京:北京大学出版社, 2004.8 丁来佳,周静 . 基于 JAVA 平台事件驱动模型的研究与设计 J. 黄冈师范学院学报 , 2008,(S1) .10源代码11BattleCanvas.java 文件内容:package tank;public class BattleCanvas extends GameCanvas implements Runnable/* Constructor */ private UserSprite userSprite; private LayerManager layerManager; private

24、 EnemySprite enemySprite; private TiledLayer board; private Sprite gameOver; private ScoreScreen scoreScreen=new ScoreScreen(); private int enemyPosition=1; public static int enemyNum=9; /total enemy number in current level; public static int enemyOnScreen=0; /because one tank is served in the initi

25、alization. private String level1="/tank/level1.png" private String level2="/tank/level2.png" public static int currentLevel=1; /define what level the game is in now. private boolean isLoading=true; / whether game is in the state loading process; public static long beginTime; publ

26、ic static boolean dead=false; public static boolean completed=false; public static long endTime;/*3 positions are defined at top of the screen each time the enemy comes out.they are 1,2,3 respectively.enemy will takeint gameOverLine=100; /place gameover font at center of the screen;int continueCount

27、=20; / keep "gameOver "continue to display for 2 seconds after it has risen to the screen enemyOutDelay=100;/keep at least 2 turns to come out from these three ports.Default postion is 1. */public BattleCanvas() throws IOException super(true);layerManager=new LayerManager(); boa

28、rd=createTiledLayer();createBoard(level1);layerManager.append(board); userSprite=createUser();userSprite.setLayerManager(layerManager); userSprite.setTiledLayer(board); userSprite.resetPosition(); layerManager.append(userSprite); enemySprite=new EnemySprite6;userSprite.setShootCheck(enemySprite);thi

29、s.start();public void start()Thread t=new Thread(this); t.setPriority(Thread.MAX_PRIORITY); t.start();UserSprite createUser() throws IOExceptionImage image =Image.createImage("/tank/tanks.png");return new UserSprite(image);public void run()beginTime=System.currentTimeMillis();/ set the beg

30、in time.seconds intervals between two enemy comes out sequentiallyboolean isShining=false;try gameOver =createGameOver(); catch (IOException ex3) Graphics g=getGraphics();while(true)if(enemyNum<=0) endTime=System.currentTimeMillis();scoreScreen.repaint();try Thread.sleep(1500); / stop for a while

31、 to let the user take a look at the final status.catch (Exception ex6) Display.getDisplay(TankMain.instance).setCu rrent(scoreScreen);try Thread.sleep(4000);catch (InterruptedException ex5) if(currentLevel<2) / if now it is not the end level. this number should be changed according to the actual

32、end level number.createBoard(nextLevel(); currentLevel+; / step into the next level;enemyPosition=1;/ reset outport position.enemyNum=1; /reset enemy number.userSprite.resetPosition();beginTime=System.currentTimeMillis(); /reset start time for the next level;isLoading=true; Display.getDisplay(TankMa

33、in.instance).setCu rrent(this); elsecompleted=true;break; if(enemyOnScreen<6)&&(enemyOnScreen< enemyNum) if(getNullEnemyIndex()!=-1)if(!isShining)/ this if block isserving for shining before enemy tank comes out as an indicator;int x=0,y=0;switch(enemyPosition)case 1:x=0;y=0;break ;/se

34、t them at three different position respectivelycase 2:x=75;y=0;break ; case 3:x=148;y=0;break ;try Image image =Image.createImage("/tank/down.png");Shine shine = new Shine(image, layerManager);shine.setPosition(x,y);new Thread(shine).start(); isShining=true;catch (IOException ex) if(enemyO

35、utDelay!=0) enemyOutDelay-;/if twoseconds are not over,do not check whether can serve an enemy.elsetry serveAnEnemy(); isShining=false; enemyOnScreen+;catch (IOException ex2) enemyOutDelay = 100;/reset the delay time.if(!dead ) / if not gameover,check how many life ,user has.if(userSprite.getLife()&

36、lt;1)12/if user die over,handle these;dead=true;if(dead)layerManager.insert(gameOver,0);gameOver.setPosition(40,gameOverLine+70);/40 is the horizontal position in screen;if(gameOverLine!=0)gameOverLine=gameOverLine-2;else continueCount-; if (continueCount=0) scoreScreen.repaint();endTime=System.curr

37、entTimeMillis();Display.getDisplay(TankMain.instance).setCurrent(scoreScreen);break ; input(); render(g); System.gc(); try Thread.sleep(20);catch (InterruptedException ex4) void input()int keyStates = getKeyStates();if (keyStates & UP_PRESSED) != 0)userSprite.go(UserSprite.UP);else if (keyStates

38、 & RIGHT_PRESSED) !=0) userSprite.go(UserSprite.RIGHT);else if (keyStates & LEFT_PRESSED) != 0) userSprite.go(UserSprite.LEFT);else if (keyStates & DOWN_PRESSED) !=0) userSprite.go(UserSprite.DOWN);if (keyStates & FIRE_PRESSED) !=0) userSprite.fire();/ remove the "else" cla

39、use to enable tank fire when it is moving.void render(Graphics g)if (isLoading)loadingLevel(g);else int w = getWidth();int h = getHeight(); g.setColor(0x000000); g.fillRect(0, 0, w, h); layerManager.paint(g, 0, 0); g.setColor(0xB5B5AD); / set color to grayg.fillRect(160, 0, 20, 176); /draw the right

40、 side bar and make 3D effect.g.setColor(0xffffff); g.drawLine(160, 0, 180, 0); g.drawLine(161, 1, 180, 1); g.drawLine(160, 0, 160, 176); g.drawLine(161, 0, 161, 175); g.setColor(0x000000); g.drawLine(179, 0, 179, 176); g.drawLine(178, 1, 178, 176);Font indicator = Font.getFont(Font.FACE_SYSTEM, Font

41、.STYLE_BOLD,Font.SIZE_MEDIUM);try Image enemy =Image.createImage("/tank/enemy.png");g.drawImage(enemy, 165, 35, Graphics.TOP | Graphics.LEFT);Image user = Image.createImage("/tank/tanks.png");g.drawImage(user, 165, 70, Graphics.TOP | Graphics.LEFT);catch (IOException ex) g.setFon

42、t(indicator);g.drawString(String.valueOf(enemyNum), 172,57,Graphics.BASELINE | Graphics.HCENTER);g.drawString(String.valueOf(userSprite.getLife(), 172, 92,Graphics.BASELINE |Graphics.HCENTER);flushGraphics();public void createEnemy(int i) throwsIOExceptionImage image =Image.createImage("/tank/e

43、nemy.png"); enemySpritei=newEnemySprite(image);enemySpritei.setLayerManager(layerManag13er);enemySpritei.setNumber(i); enemySpritei.setTiledLayer(board);enemySpritei.setEnemyGroup(enemySprite); layerManager.append(enemySpritei);enemySpritei.setEnemyShootCheck(userSpri te);TiledLayer createTiled

44、Layer() throws IOExceptionImage image=Image.createImage("/tank/tiles.png");return new TiledLayer(20,22,image,8,8);public void createBoard(String level)InputStream map=getClass().getResourceAsStream(level);int z=0;if(map!=null)try for (int row = 0; row < 22; row+)for (int col=0; col <

45、 20; col+)z=map.read();board.setCell(col,row,z);catch (IOException ex) public Sprite createGameOver() throws IOExceptionreturn newSprite(Image.createImage("/tank/gameover.pn g");private int getNullEnemyIndex()int number=-1;for(int i=0;i<6;i+) if(enemySpritei=null)number=i;/ if find atan

46、k is null,return its index,else return -1 means all tank index are allocated.break ;return number;private void serveAnEnemy() throwsIOExceptionint index=getNullEnemyIndex();/if not all enemy are allocatedif (index!=-1)createEnemy(index);int x=0,y=0;switch(enemyPosition)case1:x=5;y=5;enemyPosition=2;

47、break ; /setthem at three different position respectivelycase2:x=80;y=5;enemyPosition=3;break ;case3:x=154;y=5;enemyPosition=1;break ;enemySpriteindex.setXY(x,y);enemySpriteindex.setRefPixelPosition(x,y);enemySpriteindex.start();else return ;public void loadingLevel(Graphics g)g.setColor(0x000000);g

48、.fillRect(0, 0, 180, 177);g.setColor(0xffffff);g.setFont(Font.getFont(Font.FACE_SYSTEM,Font.STYLE_PLAIN,Font.SIZE_MEDIUM);g.drawString("Loading state "+String.valueOf(currentLevel)+" . ",90,88,Graphics.BASELINE|Graphics.HCEN TER);flushGraphics();try Thread.sleep(1500); catch (Int

49、erruptedException ex) isLoading=false;public String nextLevel()return"/tank/level"+String.valueOf(currentLevel+1)+".png" /provide next level's source string.BulletSprite.java 文件内容:package tank;14public class BulletSprite extends Sprite implements Runnableprivate LayerManager

50、layerManager;public final static intUP=1,RIGHT=2,DOWN=3,LEFT=4;private int x,y;private UserSprite userSprite;private EnemySprite enemySprite;private Sprite explode;private EnemySprite enemySingle;private int speed=20;/ when thisnumber is less, the speed of the bullet will be faster moving.private Ti

51、ledLayer tiledLayer; / save handle to the tiledlayerprivate boolean isFromEnemy; / check where this bullet is shot from.private boolean isEnd=false; / used to check whether bullet's life has ended.Thread t;private static int transformDirection=TRANS_NONE,TRANS_ROT90,TRANS_R OT180,TRANS_ROT270;pr

52、ivate int currentDirection=0; /if no direction defined,it will/stay where it is.public BulletSprite(Image image) throws IOExceptionsuper(image);defineReferencePixel(1, 3); /center and bottom of the bulletpublic void run() else if (checkHit(x-2,y-1)hit=true;else if (checkHit(x-2,y+1)hit=true;break ;c

53、ase RIGHT:if(checkHit(x+3,y)hit=true;else if (checkHit(x+2,y-1)hit=true;else if (checkHit(x+2,y+1)hit=true;break ;if (hit) break ;isEnd=false;while ( (x < 155) && (x >=5) && (y >=5) && (y < 171)/if the bullet is in the screenareaif (currentDirection != 0) this.go(

54、currentDirection);if (collidesWith(tiledLayer,true) /check what to do when obstacle on the map existboolean hit=false;/used to check whether bullet has hit something.switch (currentDirection)case UP:if(checkHit(x,y-3) hit=true;else if (checkHit(x-1,y-2) hit=true;else if (checkHit(x+1,y-2) hit=true; break ;case DOWN:if(checkHit(x,y+3) hit=true;else if (checkHit(x-1,y+2) hit=true;else if (checkHit(x+1,y+2) hit=true; break ;case LEFT:if (checkHit(x-3,y) hit=true;if(!isFromEnemy)for(int i=0;i<6;i+) /check every enemyif (enemySpritei != null)/if such enemy exist

温馨提示

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

评论

0/150

提交评论