中国象棋博弈系统设计_第1页
中国象棋博弈系统设计_第2页
中国象棋博弈系统设计_第3页
中国象棋博弈系统设计_第4页
中国象棋博弈系统设计_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

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

文档简介

1、中国象棋对弈系统XXXX【摘要】象棋是我们国家特有的一项棋类益智游戏,中国象棋在中国有着三千多年的历史,属于二人对抗性游戏的一种。由于用具简单,趣味性强,成为流行极为广泛的棋艺活动。随着科技的不断进步,人们不再局限于现实中在棋盘上双人面对面对弈,象棋的 “下法”也在改变。网络上流传的关于象棋的小游戏自然而然也就多了起来。从开始的键盘控制走棋到之后的鼠标控制走棋。人们对这个系统的需求越来越高了,现在人们已经不满足于手动的控制进行游戏了,随着语音识别的出现人们更倾向与语音操作实现走棋了。语音是现下最先进的操控方式,他可以不通过手动控制就能够实现我们之前手动操作的任务,就如之前说的能简单就简单。这是

2、我们现下的最终状态了,能少动手就少动手,能不动手就更好的理念之下我们着手了这次的中国象棋游戏编程,我们采用了Microsoft Speech SDK来实现了我们的语音操作功能来实现了最新的走棋功能。【关键词】中国象棋;语音操控;打谱,悔棋;目录1 概述11.1项目背景11.2系统简介11.3开发环境11.4主要技术11.5小组分工12 需求分析22.1用户分析22.1.1系统定位22.1.2用户面临的问题22.1.3系统的运行环境22.1.4时间约束与资源约束22.2用户设计流程22.2.1用户的观察与分析22.2.2设计22.3任务分析43 概要设计63.1界面设计原则6

3、3.2设计模型63.3.系统描述93.4使用的交互技术104 详细设计与实现114.1界面设计:114.2棋盘的绘制:114.2.1竖线的绘制代码:114.2.2横线的绘制代码:124.2.3兵处折线的绘制:124.2.4炮处折线的绘制:154.2.5楚河汉界的绘制:164.3棋子的规则实现:174.3.1兵/卒的走棋规则:174.3.2车的走棋规则:194.3.3马的走棋规则实现:204.3.4炮的走棋规则实现:214.3.5士的规则:224.3.6相的规则:234.3.7帅的规则:254.4悔棋:264.5播放/关闭背景音乐:364.6残局:374.7帮助与关于:395 可用性评估415.

4、1评估指标体系415.1.1对整个系统的内容功能界面等方面进行评估415.1.2对整个系统运行效率方面进行评估415.1.3对整个系统给用户的体验感满意度方面进行评估415.2具体步骤425.3结果分析426 结论436.1总结:436.2不足之处:436.3心得体会:431 概述1.1项目背景总所周知,随着互联网技术迅猛的发展,在各行各业得到了很广泛的应用。同时,随着时代的进步,产业的发展,生活质量的提高,人们的业余时间在很大方面的空闲了出来,各种各样建立在互联网基础上的游戏也是不断的出现,在人们空余的时间填充他们的生活,网络游戏是一类,但是网络游戏要具备有网络的情况下进行操作,在这种条件受

5、限的情况下,单机游戏的推广更是休闲娱乐一族玩家们的主流,而且贴近生活所设计的单机游戏更是大众的喜爱。中国象棋这类的游戏第一,贴近生活,从小耳濡目染的游戏,更是深受大众的喜爱,成为许多人在平时闲暇时间娱乐消遣的一款游戏,为了满足广大玩家的需求,扩大中国象棋的应用范围是针对目前社会形式可以进行的一项,所以针对网上象棋这类游戏的开发对于我们作为计算机科学与技术专业的学生,更是我们应该是重点去面对的一项。1.2系统简介整个系统采用C#语言编写,之所以使用C#,因为C#在带来对应用程序的快速开发能力的同时,并没有牺牲C与C+程序员所关心的各种特性。它忠实地继承了C和C+的优点。里面包括简洁的语法。精心地

6、面向对象设计、与Web的紧密结合、完整的安全性与错误处理、版本处理技术、灵活性与兼容性等。在整个系统功能中有最基本的新建一个棋盘,新建棋盘相当于我们对弈时的重新开局,如果中间出现胜负,或者有人中途离场改变对弈对手等等,使用新建棋盘来解决。系统的走棋是最基本的对弈操作。系统的悔棋功能实现的是对上一个走棋步骤的访问,使棋盘回到上一个走棋时的状态。系统的语言识别包括对走棋中间落棋的语音播报等等。这几个是系统最基本功能的实现。整个系统运行过程较为流畅,可以实现基本的双方对弈操作。1.3开发环境计算机可使用WindowsXP/Windows7/Windows8系统运行,这些系统都是个人电脑上最忌泵具备的

7、系统,针对开发过程中使用的软件所支持的硬件条件,这些是开发系统的必须前提。编码使用Visual studio 2010软件进行编码,Visual studio 2010是一个很强大的软件,他是集合最基本的所有编程语言为一体的一个软件,使用Visual studio 2010的最大意义在于它的简易操作性,和对错误点的及时提示功能,Visual studio 2010让整个系统在开发的过程中少走了很多弯路,很多问题漏洞都能很快的发现和解决。使用Panel绘画软件进行棋盘的绘制,Panel绘画软件是一款针对性很强的软件,对于绘画这一块有着相当方便的操作界面,使得整个棋盘的绘制没有花费过多时间。1.4

8、主要技术主要使用了堆栈技术,堆栈是一种抽象数据结构,其操作机理是后进先出。当你把新条目推进堆栈时,已经在堆栈内的任何条目都会压到堆栈的深处。同样的,把一个条目从堆栈移出则会让堆栈内的其他条目都向堆栈的顶部移动。只有堆栈最顶端的条目能从堆栈中取出,条目离开堆栈的顺序和它们被推进堆栈的顺序一样。类的定义,类实际上就是抽象的概念,把某些具有类似或者相同属性的东西归整一起,类的定义包括对系统中各个类型的设置和命名,以及在类定义下对他们功能进行编写。Speech SDK的使用,这是一个微软开发的实现语音识别的语音引擎,利用它提供的接口,我们可以用任何语言编写一种语音识别软件或者文字转换声音文件的软件。1

9、.5小组分工我们小组主要分工如下:小组成员XX主要负责走棋,悔棋等功能代码生成这一部分,对于这一部分应该是整个开发系统最困难的一部分,针对每一个步骤的构思,紧密的连接性等等,都要从整体上面进行考虑。小组成员XX主要负责棋盘的绘制和基本界面的设计,这一块属于系统基本用户界面设计模块,对于整个界面的设计第一个要考虑用户的惯性视觉,怎么样的界面和棋盘会让人觉得贴近生活,而且对于一些细节的东西也要进行考虑设计。小组成员XX主要负责检验和修改系统和后期的文档整合,检验和修改系统漏洞需要通过在运行测试中发现的问题进行改进,文档的整合,要根据每个组员在整个系统编写过程中的一些想法和重要部分信息进行整22 需

10、求分析2.1用户分析2.1.1系统定位具有语音功能简单的单机象棋小游戏。2.1.2用户面临的问题需要一个简单的双人对弈棋局;需要我们实现悔棋功能和打谱的功能操作;需要我们实现简单的语音识别操作2.1.3系统的运行环境用户需求要在XP、WIN7、WIN8系统上运行。2.1.4时间约束与资源约束系统需要在2015年6月22日前完成,需要用来完成象棋的简单操作功能。2.2用户设计流程2.2.1用户的观察与分析这是一个中国象棋对弈系统,可以采取人人单机对弈。需要有棋盘棋子的局面、鼠标响应控制棋子移动、通过语音识别放置棋子。用户可以根据自己的需要悔棋,用户还可以选择打谱,把对弈双方之前的棋局一步一步还原

11、,还原时可以在将棋局动态显示并使用语音合成将每一步的操作度出来。2.2.2设计图.1 初步系统结构图图.2 中国象棋游戏活动图2.3任务分析(1)首先我们要绘制出整体的框架布局(2)开始着手在Panel框体中间把棋盘的绘制写出来,将棋盘绘制出来(3)在绘制好的棋盘中写入棋子的放置语句,将棋子摆放到绘制好了的棋盘上(4)实现棋局开始行走后棋局能够按照活动图的流程进行(5)继而在可以实现基本的走棋功能之后我们能够在原本的基础上实现悔棋功能(6)利用悔棋功能的功能栈来实现打谱的功能,利用下棋的文字信息来实现语音合成的读谱功能。 图.3 中国象棋用例图 图.4 中国象棋状态图 图.5 中国象棋序列图

12、图.6 中国象棋活动图453 概要设计3.1界面设计原则用户界面可以分为命令行界面、图形界面和多通道用户界面三种基本界面。 命令界面:这是第一人机界面,在我们的中国象棋对弈程序中有选择棋子、复选棋子替换原先选中棋子、重新放置选中棋子、悔棋让棋子回到上一个状态位置。 图形界面:可以看作是第二人机界面,是基于图形方式的人机界面。由于引入了图片的话可以大量的减少中国象棋系统中绘制中国象棋棋盘的庞大的代码量,减少程序的代码复杂度。 多通道用户界面:进一步综合采用了语音、视觉、设备和交互技术,使用户利用多个通道的实现人机交互。更好的的捕捉到用户的行为方式和动作与想法。3.2设计模型 图.7 中国象棋设置

13、LOTOS图实现的中国象棋基本功能简化图应当如上述LOTOS图所示,形成一个简单的功能结构模块,在这个简述设计中我们可以看出我们实现的基础功能都有下棋 悔棋和打谱三项功能模块。图.8 象棋棋盘设计模型图.9 象棋棋子放置模型图.10 象棋残局模型3.3.系统描述我们的中国象棋系统中实现了棋盘和棋子的布局,我们的布局实现操作采用的是命令行界面设计的方式来实现的,通过代码来绘制棋盘,之后在采用循环语句将棋子一一摆放在棋盘上实现棋盘和棋子的布局。实现了棋盘和棋子的布局之后我们开始着手棋局中棋子的规则的描述,通过定义类定义出七种类型的棋子,每种棋子有着自己的走棋规则,完善了规则之后我们就要考虑棋局的走

14、势了。中国象棋是双方对弈的一种游戏,一人一步。所以我们在主界面中加入了规则,这就实现了基本的下棋功能了。能实现下棋之后就是简单的悔棋,和回放式的打谱功能。3.4使用的交互技术在中国象棋系统中我们使用了语音交互技术实现了语音合成功能。在下棋落子的时候会读出象棋的行走路径。 还使用到了笔交互技术来实现了棋盘和棋子的绘制。使用循环语句达成利用笔交互技术的使用来绘制基础棋盘。使用基本交互技术来实现了背景音乐的播放棋子的定位选择以及帮助信息等框架。4 详细设计与实现4.1界面设计:使用panel控件(绘制棋盘)、menuStrip控件(菜单栏)、axWindowsMediaPlayer(用于播放mp3背

15、景音乐)、time控件(用于记录红黑各方的用时)等。图.11 初始界面设计4.2棋盘的绘制:4.2.1竖线的绘制代码:(利用DrawLine函数绘制棋盘的竖向线以及红黑双方的交叉线,需注意竖线在楚河汉界处有中断)#region 创建绘画对象 #region 竖向线 /两边的竖向线 g.DrawLine(p, point.X, point.Y, point.X, point.Y + wei * 9); g.DrawLine(p, point.X + wei * 8, point.Y, point.X + wei * 8, point.Y + wei * 9); /上半边的竖向线 for (int

16、 i = 1; i <= 7; i+) g.DrawLine(p, point.X + wei * i, point.Y, point.X + wei * i, point.Y + wei * 4); /下半边的竖向线 for (int i = 1; i <= 7; i+) g.DrawLine(p, point.X + wei * i, point.Y + wei * 5, point.X + wei * i, point.Y + wei * 9); #endregion /两边的交叉线 g.DrawLine(p, point.X + wei * 3, point.Y, poin

17、t.X + wei * 5, point.Y + wei * 2); g.DrawLine(p, point.X + wei * 5, point.Y, point.X + wei * 3, point.Y + wei * 2); g.DrawLine(p, point.X + wei * 3, point.Y + wei * 9, point.X + wei * 5, point.Y + wei * 7); g.DrawLine(p, point.X + wei * 5, point.Y + wei * 9, point.X + wei * 3, point.X + wei * 7);4.2

18、.2横线的绘制代码:(利用DrawLine函数绘制棋盘的横向线)#region 创建绘画对象 int wei = 50; Point point = new Point(25, 25); Graphics g = this.panel1.CreateGraphics(); Pen p = new Pen(Color.Black, 2); /横向线 for (int i = 0; i <= 9; i+) g.DrawLine(p, point.X, point.Y + wei * i, point.X + wei * 8, point.Y + wei * i); 4.2.3兵处折线的绘制:

19、(利用DrawLine函数绘制兵处的折线)#region "兵"的折线 for (int i = Convert.ToInt16(wei * 0.1); i < wei * 8; i += wei * 2) /右上角、纵线 g.DrawLine(p, point.X + i, point.Y + Convert.ToInt16(wei * 2.7), point.X + i, point.Y + Convert.ToInt16(wei * 2.9); /右下角、纵线 g.DrawLine(p, point.X + i, point.Y + Convert.ToInt1

20、6(wei * 3.1), point.X + i, point.Y + Convert.ToInt16(wei * 3.3); /右上角、横线 g.DrawLine(p, point.X + i, point.Y + Convert.ToInt16(wei * 2.9), point.X + i + Convert.ToInt16(wei * 0.2), point.Y + Convert.ToInt16(wei * 2.9); /右下角、横线 g.DrawLine(p, point.X + i, point.Y + Convert.ToInt16(wei * 3.1), point.X +

21、 i + Convert.ToInt16(wei * 0.2), point.Y + Convert.ToInt16(wei * 3.1); /右上角、纵线 g.DrawLine(p, point.X + i, point.Y + Convert.ToInt16(wei * 5.7), point.X + i, point.Y + Convert.ToInt16(wei * 5.9); /右下角、纵线 g.DrawLine(p, point.X + i, point.Y + Convert.ToInt16(wei * 6.1), point.X + i, point.Y + Convert.T

22、oInt16(wei * 6.3); /右上角、横线 g.DrawLine(p, point.X + i, point.Y + Convert.ToInt16(wei * 5.9), point.X + i + Convert.ToInt16(wei * 0.2), point.Y + Convert.ToInt16(wei * 5.9); /右下角、横线 g.DrawLine(p, point.X + i, point.Y + Convert.ToInt16(wei * 6.1), point.X + i + Convert.ToInt16(wei * 0.2), point.Y + Con

23、vert.ToInt16(wei * 6.1); for (int i = Convert.ToInt16(wei * 1.9); i < wei * 8; i += wei * 2) /左上角、纵线 g.DrawLine(p, point.X + i, point.Y + Convert.ToInt16(wei * 2.7), point.X + i, point.Y + Convert.ToInt16(wei * 2.9); /左下角、纵线 g.DrawLine(p, point.X + i, point.Y + Convert.ToInt16(wei * 3.1), point.X

24、 + i, point.Y + Convert.ToInt16(wei * 3.3); /左上角、横线 g.DrawLine(p, point.X + i, point.Y + Convert.ToInt16(wei * 2.9), point.X + i - Convert.ToInt16(wei * 0.2), point.Y + Convert.ToInt16(wei * 2.9); /左下角、横线 g.DrawLine(p, point.X + i, point.Y + Convert.ToInt16(wei * 3.1), point.X + i - Convert.ToInt16(

25、wei * 0.2), point.Y + Convert.ToInt16(wei * 3.1); /左上角、纵线 g.DrawLine(p, point.X + i, point.Y + Convert.ToInt16(wei * 5.7), point.X + i, point.Y + Convert.ToInt16(wei * 5.9); /左下角、纵线 g.DrawLine(p, point.X + i, point.Y + Convert.ToInt16(wei * 6.1), point.X + i, point.Y + Convert.ToInt16(wei * 6.3); /左

26、上角、横线 g.DrawLine(p, point.X + i, point.Y + Convert.ToInt16(wei * 5.9), point.X + i - Convert.ToInt16(wei * 0.2), point.Y + Convert.ToInt16(wei * 5.9); /左下角、横线 g.DrawLine(p, point.X + i, point.Y + Convert.ToInt16(wei * 6.1), point.X + i - Convert.ToInt16(wei * 0.2), point.Y + Convert.ToInt16(wei * 6.

27、1); #endregion4.2.4炮处折线的绘制:(利用DrawLine函数绘制炮处的折线)#region 炮的绘制线 for (int i = Convert.ToInt16(wei * 1.1); i < wei * 8; i += wei * 6) /上方右上角、纵线 g.DrawLine(p, point.X + i, point.Y + Convert.ToInt16(wei * 1.7), point.X + i, point.Y + Convert.ToInt16(wei * 1.9); /上方右上角、横线 g.DrawLine(p, point.X + i, poin

28、t.Y + Convert.ToInt16(wei * 1.9), point.X + i + Convert.ToInt16(wei * 0.2), point.Y + Convert.ToInt16(wei * 1.9); /上方右下角、纵线 g.DrawLine(p, point.X + i, point.Y + Convert.ToInt16(wei * 2.1), point.X + i, point.Y + Convert.ToInt16(wei * 2.3); /上方右下角、横线 g.DrawLine(p, point.X + i, point.Y + Convert.ToInt

29、16(wei * 2.1), point.X + i + Convert.ToInt16(wei * 0.2), point.Y + Convert.ToInt16(wei * 2.1); /下方右上角、纵线 g.DrawLine(p, point.X + i, point.Y + Convert.ToInt16(wei * 6.7), point.X + i, point.Y + Convert.ToInt16(wei * 6.9); /下方右上角、横线 g.DrawLine(p, point.X + i, point.Y + Convert.ToInt16(wei * 6.9), poin

30、t.X + i + Convert.ToInt16(wei * 0.2), point.Y + Convert.ToInt16(wei * 6.9); /下方右下角、纵线 g.DrawLine(p, point.X + i, point.Y + Convert.ToInt16(wei * 7.1), point.X + i, point.Y + Convert.ToInt16(wei * 7.3); /下方右下角、横线 g.DrawLine(p, point.X + i, point.Y + Convert.ToInt16(wei * 7.1), point.X + i + Convert.T

31、oInt16(wei * 0.2), point.Y + Convert.ToInt16(wei * 7.1); for (int i = Convert.ToInt16(wei * 0.9); i < wei * 8; i += wei * 6) /上方左上角、纵线 g.DrawLine(p, point.X + i, point.Y + Convert.ToInt16(wei * 1.7), point.X + i, point.Y + Convert.ToInt16(wei * 1.9); /上方左上角、横线 g.DrawLine(p, point.X + i, point.Y +

32、 Convert.ToInt16(wei * 1.9), point.X + i - Convert.ToInt16(wei * 0.2), point.Y + Convert.ToInt16(wei * 1.9); /上方左下角、纵线 g.DrawLine(p, point.X + i, point.Y + Convert.ToInt16(wei * 2.1), point.X + i, point.Y + Convert.ToInt16(wei * 2.3); /上方左下角、横线 g.DrawLine(p, point.X + i, point.Y + Convert.ToInt16(we

33、i * 2.1), point.X + i - Convert.ToInt16(wei * 0.2), point.Y + Convert.ToInt16(wei * 2.1); /下方左下角、纵线 g.DrawLine(p, point.X + i, point.Y + Convert.ToInt16(wei * 7.1), point.X + i, point.Y + Convert.ToInt16(wei * 7.3); /下方左下角、横线 g.DrawLine(p, point.X + i, point.Y + Convert.ToInt16(wei * 7.1), point.X +

34、 i - Convert.ToInt16(wei * 0.2), point.Y + Convert.ToInt16(wei * 7.1); /下方左上角、纵线 g.DrawLine(p, point.X + i, point.Y + Convert.ToInt16(wei * 6.7), point.X + i, point.Y + Convert.ToInt16(wei * 6.9); /下方左上角、横线 g.DrawLine(p, point.X + i, point.Y + Convert.ToInt16(wei * 6.9), point.X + i - Convert.ToInt1

35、6(wei * 0.2), point.Y + Convert.ToInt16(wei * 6.9); #endregion4.2.5楚河汉界的绘制:在棋盘的中间添加楚河汉界,以及设置其基本属性/"楚河","汉界"字 FontFamily fm = new FontFamily("宋体"); Font f = new Font(fm, 35); StringFormat sf = new StringFormat(); sf.Alignment = StringAlignment.Near; g.DrawString("楚河

36、", f, Brushes.Black, point.X + wei - 20, point.Y + wei * 4, sf); g.DrawString("汉界", f, Brushes.Black, point.X + wei * 5, point.Y + wei * 4, sf); /f.Dispose(); g.Dispose(); #endregion Point Grid = new Point(25, 25); IChessItem.IChess selectChess; IChessItem.Enums.ChessType _type = IChe

37、ssItem.Enums.ChessType.Black;图.12 棋盘绘制效果图4.3棋子的规则实现:4.3.1兵/卒的走棋规则:移动范围:任何位置。移动规则:每步只能向前移动一点。过河以后,它便增加了向左右移动的能力,兵不允许向后移动。private Shuai shuai1; protected override bool LimitPoint(int x, int y) if (base.LimitPoint(x, y) /个性条件 /判断哪一方 /判断必须是向前行 /判断是否过河 /过河以后,可以横行 /未过河,只能直行 /直线行驶 if (x = GridX | y = GridY

38、) if (type = IChessItem.Enums.ChessType.Black) if (x = GridX) && (GridY - y) = -1)/没过河之前不能横走和倒走 return true; else if (y > 4) && (Math.Abs(GridX - x) = 1)/过河之后 return true; else return false; else if (type = IChessItem.Enums.ChessType.Red) if (x = GridX) && (y - GridY = -1)

39、/没过河之前不能横走和倒走 return true; else if (y < 5) && (Math.Abs(GridX - x) = 1)/过河之后 return true; else return false; /return base.LimitPoint(x, y); return false; /return true; /返回真假 else return false; private void InitializeComponent() System.ComponentModel.ComponentResourceManager resources = ne

40、w System.ComponentModel.ComponentResourceManager(typeof(Bing); this.shuai1 = new ChessItem.Shuai(); this.SuspendLayout(); / / shuai1 / this.shuai1.AutoSize = true; this.shuai1.BackColor = System.Drawing.SystemColors.Menu; this.shuai1.Font = new System.Drawing.Font("宋体", 30F, System.Drawing

41、.FontStyle.Bold); this.shuai1.ForeColor = System.Drawing.Color.Black; this.shuai1.GridX = 0; this.shuai1.GridY = 0; this.shuai1.Image = (System.Drawing.Image)(resources.GetObject("shuai1"); this.shuai1.ImageAlign = System.Drawing.ContentAlignment.TopLeft; this.shuai1.IsChecked = false; thi

42、s.shuai1.Location = new System.Drawing.Point(0, 0); this.shuai1.Name = "shuai1" this.shuai1.Size = new System.Drawing.Size(51, 51); this.shuai1.TabIndex = 0; this.shuai1.Text = "shuai1" this.shuai1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; this.shuai1.type = IChes

43、sItem.Enums.ChessType.Black; this.shuai1.Click += new System.EventHandler(this.shuai1_Click); this.ResumeLayout(false); 4.3.2车的走棋规则:移动范围:任何位置。移动规则:可以水平或垂直方向移动任意个无阻碍的点。public class Ju : ChessBase protected override bool LimitPoint(int x, int y) if (base.LimitPoint(x, y) /个性条件 int count = 0; Panel panel = (Panel)this.Parent; try count = Get

温馨提示

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

评论

0/150

提交评论