一种点格棋最佳招法的确定方法及系统与流程

文档序号:14991532发布日期:2018-07-20 22:19阅读:2994来源:国知局

本发明涉及点格棋领域,特别是涉及一种点格棋最佳招法的确定方法及系统。



背景技术:

点格棋由于其棋型种类繁杂多变,没有定式,以及在安全边存在的情况下,估值会由于其安全边占有顺序的不同而有误差,目前,点格棋博弈系统所采用的招法确定优化方法大多都是阿尔法-贝塔(alpha-beta)算法,alpha-beta算法是对极大极小算法的优化,同时,也是一种对博弈树的剪枝策略。但alpha-beta算法在搜索时,需要扩展完全的一层节点后返回的胜率才是有效的,如果步时耗尽而新的一层深度没有模拟完全,将会舍弃该层模拟,以已经搜索完全的上一层节点开始作为出招依据;博弈树的扩展呈指数级,每下一层的节点相比上一层都多的惊人,搜索消耗的时间也更多,从而导致采用传统的alpha-beta算法确定最佳招法时间长、效率低的问题。因此,alpha-beta算法不能很好地应对随时终止搜索的情况,不可避免地浪费了非常多的模拟量。alpha-beta算法除了搜索之外,估值函数也极为重要,估值函数执掌评判局面优劣、招法确定的大权,对点格棋的估值,往往依据棋形、位置,其他棋亦然,棋形的好坏对应得分多少,很大程度上取决于人类的历史经验,依据人类所认为的优势与劣势走棋,招法的确定始终脱离不开人类的思维,棋力也就有限,找到一个优秀的估值函数参数,更是需要进行数以万计的参照对局才能确定出,耗时耗力,还依赖高效率服务器的支持。

因此,传统的alpha-beta算法确定点格棋最佳招法耗时长、效率和精准度低。



技术实现要素:

本发明的目的是提供一种点格棋最佳招法的确定方法及系统,以解决在点格棋中确定最佳招法耗时长、效率和精准度低的问题。

为实现上述目的,本发明提供了如下方案:

一种点格棋最佳招法的确定方法,包括:

获取落点位置;

根据所述落点位置确定所述落点位置相邻的格子;

获取当前数据结构信息;所述当前数据结构信息为当前棋局的数据结构信息;

根据所述落点位置和所述格子,按照所述当前棋局的数据结构信息,确定剩余可走落点位置;

采用上限置信区间算法对所述剩余可走落点位置进行搜索,确定最佳招法的同时,同步对所述上限置信区间算法进行优化。

可选的,所述采用上限置信区间算法对所述剩余可走落点位置进行搜索,确定最佳招法的同时,同步对所述上限置信区间算法进行优化,具体包括:

根据所述剩余可走落点位置建立招法树;所述招法树为多叉树,根节点代表当前局面,模拟双方落子进而得到不同深度的不断展开的多层节点棋局;

采用所述上限置信区间算法对所述招法树中第一层节点进行评估,得到同层节点的胜率;

根据所述胜率确定胜率最高的第一节点;

判断所述第一节点是否有第一子节点,得到第一判断结果;

若所述第一判断结果表示为所述第一节点有第一子节点,采用所述上限置信区间算法对所述招法树中下一层节点进行评估,得到下一层节点的胜率;

若所述第一判断结果表示为所述第一节点没有第一子节点,对所述第一节点进行扩展,得到第二子节点,并在所述第二子节点中寻找胜率最高的节点;将所述胜率最高的节点设为所述第一节点。

可选的,所述采用所述上限置信区间算法对所述招法树中第一层节点进行评估,得到同层节点的胜率,具体包括:

获取所述第一节点的模拟量的阈值;所述模拟量的阈值包括最大模拟量阈值和最小模拟量阈值;所述模拟量为模拟一盘完整棋局的次数;

获取所述第一节点的实际模拟量;

判断所述实际模拟量是否大于最大模拟量阈值,得到第二判断结果;

若所述第二判断结果表示为所述实际模拟量大于最大模拟量阈值,访问所述第一节点的第一子节点;

获取所述第一子节点的胜率;多个所述第一子节点的胜率为同层节点的胜率;

若所述第二判断结果表示为所述实际模拟量不大于最大模拟量阈值,判断所述实际模拟量是否小于最小模拟量阈值,得到第三判断结果;

若所述第三判断结果表示为所述实际模拟量小于最小模拟量阈值,确定所述第一节点的胜率为最大胜率阈值。

可选的,所述采用上限置信区间算法对所述剩余可走落点位置进行搜索,确定最佳招法的同时,同步对所述上限置信区间算法进行优化,具体包括:

采用全步优先算法和快速作用估值算法对所述上限置信区间算法进行优化,得到优化后的上限置信区间算法。

可选的,所述采用上限置信区间算法对所述剩余可走落点位置进行搜索,确定最佳招法的同时,同步对所述上限置信区间算法进行优化,具体包括:

采用上限置信区间算法对所述剩余可走落点位置进行搜索的同时获取当前搜索时间;

判断所述当前搜索时间是否超出搜索时间阈值,得到第四判断结果;

若所述第四判断结果表示为所述当前搜索时间超出搜索时间阈值,停止搜索。

一种点格棋最佳招法的确定系统,包括:

落点位置获取模块,用于获取落点位置;

格子确定模块,用于根据所述落点位置确定所述落点位置相邻的格子;

数据结构信息获取模块,用于获取当前数据结构信息;所述当前数据结构信息为当前棋局的数据结构信息;

剩余可走落点位置确定模块,用于根据所述落点位置和所述格子,按照所述当前棋局的数据结构信息,确定剩余可走落点位置;

最佳招法确定模块,用于采用上限置信区间算法对所述剩余可走落点位置进行搜索,确定最佳招法的同时,同步对所述上限置信区间算法进行优化。

可选的,所述最佳招法确定模块,具体包括:

招法树建立单元,用于根据所述剩余可走落点位置建立招法树;所述招法树为多叉树,根节点代表当前局面,模拟双方落子进而得到不同深度的不断展开的多层节点棋局;

胜率计算单元,用于采用所述上限置信区间算法对所述招法树中第一层节点进行评估,得到同层节点的胜率;

第一节点确定单元,用于根据所述胜率确定胜率最高的第一节点;

第一判断单元,用于判断所述第一节点是否有第一子节点,得到第一判断结果;

评估单元,用于若所述第一判断结果表示为所述第一节点有第一子节点,采用所述上限置信区间算法对所述招法树中下一层节点进行评估,得到下一层节点的胜率;

扩展单元,用于若所述第一判断结果表示为所述第一节点没有第一子节点,对所述第一节点进行扩展,得到第二子节点,并在所述第二子节点中寻找胜率最高的节点;将所述胜率最高的节点设为所述第一节点。

可选的,所述胜率计算单元,具体包括:

阈值获取子单元,用于获取所述第一节点的模拟量的阈值;所述模拟量的阈值包括最大模拟量阈值和最小模拟量阈值;所述模拟量为模拟一盘完整棋局的次数;

实际模拟量获取子单元,用于获取所述第一节点的实际模拟量;

第二判断子单元,用于判断所述实际模拟量是否大于最大模拟量阈值,得到第二判断结果;

第一子节点访问子单元,用于若所述第二判断结果表示为所述实际模拟量大于最大模拟量阈值,访问所述第一节点的第一子节点;

胜率获取子单元,用于获取所述第一子节点的胜率;多个所述第一子节点的胜率为同层节点的胜率;

第三判断子单元,用于若所述第二判断结果表示为所述实际模拟量不大于最大模拟量阈值,判断所述实际模拟量是否小于最小模拟量阈值,得到第三判断结果;

胜率确定子单元,用于若所述第三判断结果表示为所述实际模拟量小于最小模拟量阈值,确定所述第一节点的胜率为最大胜率阈值。

可选的,所述最佳招法确定模块,具体包括:

优化单元,用于采用全步优先算法和快速作用估值算法对所述上限置信区间算法进行优化,得到优化后的上限置信区间算法。

可选的,所述最佳招法确定模块,具体包括:

当前搜索时间获取模块,用于采用上限置信区间算法对所述剩余可走落点位置进行搜索的同时获取当前搜索时间;

第四判断模块,用于判断所述当前搜索时间是否超出搜索时间阈值,得到第四判断结果;

搜索停止模块,用于若所述第四判断结果表示为所述当前搜索时间超出搜索时间阈值,停止搜索。

根据本发明提供的具体实施例,本发明公开了以下技术效果:本发明提供了一种点格棋最佳招法的确定方法及系统,本发明采用上限置信区间算法(upperconfidenceboundapplytotree,uct)无需估值函数,不会产生由于安全边占有顺序的不同而有误差,本发明通过综合全盘考虑,基于数百万、千万模拟得到最佳招法,从而提高了确定点格棋最佳招法的精确性和效率。

且本发明所提供的点格棋最佳招法的确定方法及系统是对多线程技术共用时提升模拟量的考虑,尽管模拟量对于alpha-beta方法和uct方法都是接近成倍的增加的,但alpha-beta的节点指数级增长,线性地增加模拟量对它作用非常小;而uct可以裁剪树的部分分支,将近成倍增加的模拟量会被用于其认为的更值得搜索的方向,大大增强了uct算法的准确性。

整体来看,uct算法表现出更多的亮点,尤其是以模拟代替估值,去除了人类固有思维的影响,将uct算法应用到点格棋中来,经过了大量的实验对抗证明了采用uct算法的点格棋人工智能博弈水平高于采用alpha-beta方法的点格棋的博弈水平。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。

图1为本发明所提供的确定方法流程图;

图2为本发明所提供的棋盘棋局的数据结构的伪代码界面图;

图3为本发明所提供的蒙特卡洛树的数据结构的伪代码界面图;

图4为本发明所提供的sim-min=2,sim-max=6的蒙特卡洛树第一种情况的树形示意图;

图5为本发明所提供的sim-min=2,sim-max=6的蒙特卡洛树第二种情况的树形示意图;

图6为本发明所提供的sim-min=2,sim-max=6的蒙特卡洛树第三种情况树的形示意图;

图7为本发明所提供的返乡更新影响上层节点的伪代码界面图;

图8为本发明所提供的棋盘界面图;

图9为本发明所提供的确定系统结构图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

本发明的目的是提供一种点格棋最佳招法的确定方法及系统,能够提高确定点格棋最佳招法的精确性和效率。

为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本发明作进一步详细的说明。

蒙特卡洛方法,也称统计模拟方法,产生于二十世纪四十年代,主要基于概率统计和数值计算,是指使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。以最简单的蒙特卡洛方法应用举例,计算圆周率,给定一个正方形范围,在该范围内随机生成十万个点,计算其坐标与该正方形内切圆圆心的距离,从而判断该点是否在圆内,把在圆内的点数量乘4,将会近似得到π的值,并且取的点越多,往往越逼近真实的π值。这也就是所谓的大数定律。推广这个方法,运用到棋类博弈来说,就是两个完全不懂得比赛规则的棋手,他们都不追求比赛的胜负,对于一个已有的局面,每次行棋都随机下一条边(或落子),直到游戏终局。这样的下棋持续上百万次,千万次,最后得到的一方胜率近似成这个局面真实的胜率。

蒙特卡洛方法主要分为3个步骤。

(1)构造或描述概率过程

对于本来不是随机性质的确定性问题,要将不具有随机性质的问题转化为随机性质的问题。在点格棋中,即是假使双方所下的每一步棋在满足规则的情况下都是随机的。

(2)实现从已知概率分布抽样

构造了概率模型以后,由于各种概率模型都可以看作是由各种各样的概率分布构成的,因此产生已知概率分布的随机变量(或随机向量),就成为实现蒙特卡罗方法模拟实验的基本手段,这也是蒙特卡罗方法被称为随机抽样的原因。在点格棋中,即是在规则限定下,所有可行的招法中,产生随机的招法。

(3)建立各种估计量

实现模拟实验后,确定一个随机变量,作为所要求的问题的解,即无偏估计。建立各种估计量,相当于对模拟实验的结果进行考察和登记,从中得到问题的解。在点格中,将局面模拟至终局后,判断谁占领的格子多,即在该次模拟中为谁赢。

本发明所采用的uct算法是蒙塔卡罗算法的一种延伸算法,根据大数定理以多次模拟的方式实现博弈树中节点的价值评估。

本发明主体是基于自创数据结构和蒙特卡洛方法的点格棋棋类系统,可划分为:棋盘棋局数据结构,对局过程中对弈双方的棋形、棋局表示与存储,是人类思维下的棋盘到计算机可识别的结构化数据的转换;用户输入及控制模块,用于将对弈双方所选招法输入进点格棋软件系统,以及选择对弈模式(人人、人机、机机),与外部界面通信交互;招法生成模块,属于对弈双方不可见的开发者管理,本发明包含了对基础随机招法的优化,即合理裁剪招法数量,这种优化基于之前独特的记录棋盘信息的数据结构;招法搜索模块,基础算法是蒙特卡洛树搜索(montecarlotreesearch,mcts)。本发明做了三步优化,其一为的上限置信区间算法(upperconfidenceboundapplytotree,uct),其二为全步优先算法(allmovesasfirst,amaf),其三为快速作用估值算法(rapidactionvalueestimation,rave)。此三种优化层层深入,逐步地改善了所选招法的合理性,同时可以剪裁招法;时间控制模块,用于控制在规定时间内进行招法搜索,亦可通过改变搜索模拟量、深度或直接控制搜索的时间参数来修改步时,可应对各种时长要求的棋局,具有普适性;多线程技术可以同时利用现代计算机的多个中央处理器实现高效的计算量和性能,可以提升棋力。

图1为本发明所提供的确定方法流程图,如图1所示,一种点格棋最佳招法的确定方法,包括:

步骤101:获取落点位置。

步骤102:根据所述落点位置确定所述落点位置相邻的格子。

步骤103:获取当前数据结构信息;所述当前数据结构信息为当前棋局的数据结构信息。

如图2所示,棋盘棋局的数据结构:boxes结构即为格子,棋盘的全部格子存在一个boxes[boxes_size]数组中,结构内的edge_near[4]数组用于存放一个格子周围的四条边,建立起格子对应的边的联系,其他有必备信息,如记录格子占有方、下棋的边数、在棋盘上的位置及全部格子顺序编号。edges结构即代表边。棋盘上的全部边存在一个一维数组中,通过box_near[2]数组存放该条边所属的两个(或一个)格子,建立起了边对应的格子的联系。除此之外,还需要边在棋盘中的位置、编号、以及留待后续使用的信息。

步骤104:根据所述落点位置和所述格子,按照所述当前棋局的数据结构信息,确定剩余可走落点位置。

步骤105:采用上限置信区间算法对所述剩余可走落点位置进行搜索,确定最佳招法的同时,同步对所述上限置信区间算法进行优化。

步骤105中,采用全步优先算法和快速作用估值算法对所述上限置信区间算法进行优化,得到优化后的上限置信区间算法。

步骤105具体包括:根据所述剩余可走落点位置建立招法树;所述招法树为多叉树,根节点代表当前局面,模拟双方落子进而得到不同深度的不断展开的多层节点棋局;将所述第一层节点作为评估层,采用所述上限置信区间算法对所述招法树中第一层节点进行评估,得到同层节点的胜率;根据所述胜率确定胜率最高的第一节点;判断所述第一节点是否有第一子节点,若是,将所述下一层节点作为评估层,采用所述上限置信区间算法对所述招法树中下一层节点进行评估,得到下一层节点的胜率;若否,对所述第一节点进行扩展,得到第二子节点,并在所述第二子节点中寻找胜率最高的节点;将所述胜率最高的节点设为所述第一节点。

在实际应用中,采用上限置信区间算法对所述剩余可走落点位置进行搜索的同时获取当前搜索时间;

判断所述当前搜索时间是否超出搜索时间阈值,若是,停止搜索。

所述采用所述上限置信区间算法对所述招法树中第一层节点进行评估,得到同层节点的胜率,具体包括:获取所述第一节点的模拟量的阈值;所述模拟量的阈值包括最大模拟量阈值和最小模拟量阈值;所述模拟量为模拟一盘完整棋局的次数;获取所述第一节点的实际模拟量;判断所述实际模拟量是否大于最大模拟量阈值,若是,访问所述第一节点的第一子节点;获取所述第一子节点的胜率;若否,判断所述实际模拟量是否小于最小模拟量阈值,若是,确定所述第一节点的胜率为最大胜率阈值。

如图3-图6所示,蒙特卡洛树搜索(mcts)搜索树的数据结构:在这棵搜索树上,每个节点存储的信息是当前棋局的数据结构信息上一步的玩家、招法以及胜负信息。除此之外,事先规定sim_max与sim-min作为单个节点的最大、最小模拟量。player用于记录玩家;visit用于记录实际模拟量;win记录胜场;结构指针node*用于建立树结构;depth是记录节点所在树的深度;最后更多的是为后续并查集使用、多线程、以及算法优化使用而储存的一些信息。

对于一次模拟,首先要把当前局面这个节点设为根节点,如果当前节点模拟量(visit)大于等于sim_max,就访问它的第一子节点,没有则扩展第一子节点。在第一子节点中寻找胜率最高的节点,继续设为当前节点,实质是递归的过程。对于模拟量小于sim-min的节点,默认初始给出一个极大值作为其胜率(rate),否则rate=win/total。这保证了模拟量小的节点优先访问,也就是所有节点都有一定的基础模拟量。对当前节点代表的棋局进行单纯的蒙特卡洛(montecarlo),也即双方不考虑任何外在因素只是单纯随机落子,获得最后的胜负情况,完成了一次模拟。这次模拟的结果会通过反向更新影响其上层节点,如图7所示:

for从当前节点到根路径上的全部节点,包含现节点以及根节点;节点visit自增1;if该节点player与模拟的胜利玩家相同;该节点win自增1;重复这样的模拟-更新过程,直到步时到达或访问量足够。

理论上来说,点格棋所有没有下过的边都可以下,但是由于点格棋有连下的机制,当你下在一个度为2的格子中时,对面就可以进行连下,而连下又只有两种情况,全吃和双交,所以我们可以在uct过程中将可以连下的边,放入并查集,合并边构成的集合中那些必须连下的多步招法为一步招法,每次mcts时,遇到连下只默认出现这两种情况,裁剪掉重复的招法,使程序效率以及强度得到大幅度的提高,如图8所示,用户输入界面(转化为黑白符合要求,原界面非此颜色)。左边为棋盘,右边为双方用时,中间处为双方得分,得分高者胜。

本发明完整的工作流程为:由用户选择对弈模式(人人、人机、机机),如果有需要载入点格棋系统引擎则载入,以人机为例,先由用户输入一步招法(所下的边的二维落子位置),输入的形式支持约定好传输格式的界面,或无界面的控制台输入,随后进入内部处理范围。首先更新棋盘棋局棋形表示的数据结构存储,包含边结构体和格子结构体,更新的内容包括将获得的落点位置这条边标记为已下,以及这条边下完后产生的对所属格子和邻边的影响;调用招法生成模块,按照已有的数据结构信息模拟出的棋盘进行遍历,先执行必须的连下招法(强调必须是因为如己方不走,则下一轮对方执行该连下,平白失分),再依据遍历棋盘的结果,生成当前剩余可走的招法,存入招法栈。招法搜索模块,基于已生成的招法栈中的招法进行模拟,uct算法是主体,在搜索模拟的过程中对招法树(一棵多叉树,根节点代表当前局面,模拟双方落子进而得到不同深度的不断展开的多层节点棋局)的每层节点进行评估,依据同层节点的胜率选择胜率最高,且具备一定模拟量(减小偶然性误差)的节点进行下次模拟,如此筛选出己方优势的招法,同时也裁剪掉了其余胜率低的招法。在uct基础上执行amaf算法,在二者基础上执行rave优化,优化的方法在于上文说到的同层节点选择,不完全依赖当前层节点的胜率,而是要综合考虑当前层节点所在招法树的整条分支,把这样的修正作为优化手段,在实战对局中效果佳。时间控制模块控制招法搜索的时间或节点数,时间到达则停止搜索返回当前统计出的胜率最高招法,执行。随后进入终局判断,如未终局则进入下一轮。

图9为本发明所提供的确定系统结构图,如图9所示,一种点格棋最佳招法的确定系统,包括:

落点位置获取模块901,用于获取落点位置;

格子确定模块902,用于根据所述落点位置确定所述落点位置相邻的格子;

数据结构信息获取模块903,用于获取当前数据结构信息;所述当前数据结构信息为当前棋局的数据结构信息;

剩余可走落点位置确定模块904,用于根据所述落点位置和所述格子,按照所述当前棋局的数据结构信息,确定剩余可走落点位置;

最佳招法确定模块905,用于采用上限置信区间算法对所述剩余可走落点位置进行搜索,确定最佳招法的同时,同步对所述上限置信区间算法进行优化。

所述最佳招法确定模块905具体包括:招法树建立单元,用于根据所述剩余可走落点位置建立招法树;所述招法树为多叉树,根节点代表当前局面,模拟双方落子进而得到不同深度的不断展开的多层节点棋局;胜率计算单元,用于采用所述上限置信区间算法对所述招法树中第一层节点进行评估,得到同层节点的胜率;第一节点确定单元,用于根据所述胜率确定胜率最高的第一节点;第一判断单元,用于判断所述第一节点是否有第一子节点,得到第一判断结果;评估单元,用于若所述第一判断结果表示为所述第一节点有第一子节点,采用所述上限置信区间算法对所述招法树中下一层节点进行评估,得到下一层节点的胜率;扩展单元,用于若所述第一判断结果表示为所述第一节点没有第一子节点,对所述第一节点进行扩展,得到第二子节点,并在所述第二子节点中寻找胜率最高的节点;将所述胜率最高的节点设为所述第一节点以及优化单元,用于采用全步优先算法和快速作用估值算法对所述上限置信区间算法进行优化,得到优化后的上限置信区间算法。

其中,所述胜率计算单元,具体包括:阈值获取子单元,用于获取所述第一节点的模拟量的阈值;所述模拟量的阈值包括最大模拟量阈值和最小模拟量阈值;所述模拟量为模拟一盘完整棋局的次数;实际模拟量获取子单元,用于获取所述第一节点的实际模拟量;第二判断子单元,用于判断所述实际模拟量是否大于最大模拟量阈值,得到第二判断结果;第一子节点访问子单元,用于若所述第二判断结果表示为所述实际模拟量大于最大模拟量阈值,访问所述第一节点的第一子节点;胜率获取子单元,用于获取所述第一子节点的胜率;第三判断子单元,用于若所述第二判断结果表示为所述实际模拟量不大于最大模拟量阈值,判断所述实际模拟量是否小于最小模拟量阈值,得到第三判断结果;胜率确定子单元,用于若所述第三判断结果表示为所述实际模拟量小于最小模拟量阈值,确定所述第一节点的胜率为最大胜率阈值。

在上限置信区间算法执行过程中,所述最佳招法确定模块905具体包括:当前搜索时间获取模块,用于采用上限置信区间算法对所述剩余可走落点位置进行搜索的同时获取当前搜索时间;第四判断模块,用于判断所述当前搜索时间是否超出搜索时间阈值,得到第四判断结果;搜索停止模块,用于若所述第四判断结果表示为所述当前搜索时间超出搜索时间阈值,停止搜索。

采用本发明所提供的点格棋最佳招法的确定方法及系统,能够提高确定点格棋最佳招法的精确性和效率。

本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的系统而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。

本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处。综上所述,本说明书内容不应理解为对本发明的限制。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1