请对以下算法mysql添加注释释

中文词性标注与viterbi算法
示例代码下载:/bottlebox/HmmPos.zip
一、viterbi算法原理及适用情况
当事件之间具有关联性时,可以通过统计两个以上相关事件同时出现的概率,来确定事件的可能状态。
以中文的词性标注为例。
中文中,每个词会有多种词性(比如"希望"即是名字又是动词),给出一个句子后,我们需要给这个句子的每个词确定一个唯一的词性,实际上也就是在若干词性组合中选择一个合适的组合。
动词、名词等词类的搭配是具有规律性的,比如动词+名词的形式是大量存在的,当我们看到句子"存在希望",如果确定了"存在"是动词,那么由于动名词组合的概率较大,我们就会认定"希望"是名词。
viterbi算法的原理就是基于此。我们需要计算所有的名词+动词,名词+名词,动词+形容词。。。。。等各种种词性搭配的出现概率,然后从中选出最大概率的组合。
二、操作步骤
1、需要准备一个语料库,包含已经正确标注了词性的大量语句。
2、对语料库的内容进行统计。需要得到以下数据。
(1)所有可能的词性。
(2)所有出现的词语。
(3)每个词语以不同词性出现的次数。
(4)记录句首词为不同词性的次数。
(5)记录句子中任一两种词性相邻的次数(如遇到:"看电影"这个句子,则有[动词][名词]的值加一。
3、针对前面统计的结果,进行分析计算。需计算以下数据。
(1)计算每类词性作为句首出现的比例(比如:动词为句首,占所有不同词性为句首中的比例),
记录到fstart[TYPE_NUM]。
(2)计算后词固定为词性[n]时,前词为词性[x]占总情况的比例(如:后词固定为[动词]时,前词[名词]出现的次数占所有[x][动词]的比例),
记录到fshift[TYPE_NUM][TYPE_NUM];
(3)计算每一个词作为不同类词性出现的次数,占所有该类词出现总数的比例(如:"中国"作为名词出现的次数占所有名词的比例),
记录到ffashe[TYPE_NUM][60000]
4、输入句子进行词性标注
输入的句子中每个词有多个词性。我们需要选出合适的一个组合。
比如输入句子"希望"+"的"+"田野",
分别有词性个数p1,p2,p3,p4,则可能的词性组合数为:S=p1*p2*p3*p4,我们需要从S个不同组合中选出最优的一个组合。
1、当输入词数较多时,一般取概率的自然对数值log(P(B1|A)),否则很容易出现后面的值因为过小全变为0而无法比较的情况。
2、概率的计算。
对二3.(2)的概率计算如果改成固定前词,则最后的正确率要小3%左右,从图中也可看出算法的比较是固定的后词。如果改为以所有的连接数为总体,则正确率要小1%左右,但感觉这样更合理些,因为当某类词数量较小时(比如只有一两个),就会导致其实际存在的连接概率很大。实测中,"希望的田野"中的田野开始被标注为na类型,na在语料库中只出现一次(应该是不存在的词性,是误标),其前词是助词,这就导致m_fshift[助词][na]值偏大(达到0.7),所以导致标注错误。
对二3.(3)的概率计算,如果改成统计每个词以某一词性出现次数占该词出现总数的比例,则最后的正确率要小2%左右。
如果一个词A可为动词和名词,其为动词的次数大于为名词的次数,而另一方面A为(名词次数/所有名词出现次数)大于A为(动词次数/所有动词出现次数),从全局来考虑A作为名词估计全局正确率更大些。
摘自:/bottlebox/archive//2256644.html
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
opencvHOG算法注释.doc27页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
文档加载中...广告还剩秒
需要金币:100 &&
你可能关注的文档:
··········
··········
#include "_cvaux.h" /***************************************************************************************** struct CV_EXPORTS HOGDescriptor public: enum
L2Hys 0 HOGDescriptor
: winSize 64,128 , blockSize 16,16 , blockStride 8,8 , cellSize 8,8 , nbins 9 , derivAperture 1 , winSigma -1 , histogramNormType L2Hys , L2HysThreshold 0.2 , gammaCorrection true HOGDescriptor Size _winSize, Size _blockSize, Size _blockStride, Size _cellSize, int _nbins, int _derivAperture 1, double _winSigma -1, int _histogramNormType L2Hys, double _L2HysThreshold 0.2, bool _gammaCorrection false : winSize _winSize , blockSize _blockSize , blockStride _blockStride , cellSize _cellSize , nbins _nbins , derivAperture _derivAperture , winSigma _winSigma , histogramNormType _histogramNormType , L2HysThreshold _L2HysThreshold , gammaCorrection _gammaCorrection HOGDescriptor const String& filename virtual ~HOGDescriptor size_t getDescriptorS bool checkDetectorS double getWinS virtual void setSVMDetector const vector & _ virtual bool load const String& filename, const String& objname S virtual void save const String& filename, const String& objname S virtual void compute const Mat& img, vector & descriptors, Size winStride Size
, Size padding Size
, const vector & lo virtual void detect const Mat& img, vector & foundLocations, double hitThreshold 0, Size winStride Size
, Size padding Size
, const vector & searchLo virtual void detectMultiScale const Mat& img, vector & foundLocations, double hitThreshold 0, Size winStride Size
, Size padding Size
, double scale 1.05, int groupThreshold 2 //Mat& angleOfs,与后文Mat& qangle不一致,怀疑是笔误,由于qangle与angleOfs有不同含义,尽量改过来? virtual void computeGradient const Mat& img, Mat& grad, Mat& angleOfs, Size paddingTL Size
, Size paddingBR S st
正在加载中,请稍后...跪求高手解释人机对弈里五子棋的AI算法和FINDMAX算法的注释,高手进来啊。。。救命啊.....
40homencc]
跪求高手解释人机对弈里五子棋的AI算法和FINDMAX算法的注释,高手进来啊。。。救命啊.....
40homencc]
发布时间: 17:14:02
编辑:www.fx114.net
本篇文章主要介绍了"跪求高手解释人机对弈里五子棋的AI算法和FINDMAX算法的注释,高手进来啊。。。救命啊.....
40homencc]",主要涉及到跪求高手解释人机对弈里五子棋的AI算法和FINDMAX算法的注释,高手进来啊。。。救命啊.....
40homencc]方面的内容,对于跪求高手解释人机对弈里五子棋的AI算法和FINDMAX算法的注释,高手进来啊。。。救命啊.....
40homencc]感兴趣的同学可以参考一下。
int&quan[5][2]={0,0,1,2,7,9,35,40,125,180};&
int&state[15][15],goal[15][15][2],num[15][15][2][4];&//state指的时盘面的数组,goal指,num[][][][4]指四个方向
char&win=2,a,b;&//a左右指移动,左a--,右a++;下&b++,上b--(玩家在棋盘里左右上下移动);win=1时代表玩家输了,win=0代表玩家赢了
int&maxgoal,x,y,s=0;//x,y是电脑选择将棋子放哪的坐标void&ai(char&ax,char&ay,char&am,char&an)&
&&&&&char&r,t;
&&&&&int&beginx,beginy,endx,
&&&&&/*0方向判断*/
&&&&&if((ax+ay)&=4&&(ax+ay)&=24)
&&&&&&&&&&beginx=ax-4;beginy=ay+4;
&&&&&&&&&&if(beginx&0)
&&&&&&&&&&{
&&&&&&&&&&&&&&&beginx=0;
&&&&&&&&&&&&&&&beginy=ay+
&&&&&&&&&&}
&&&&&&&&&&if(beginy&14)
&&&&&&&&&&{
&&&&&&&&&&&&&&&beginx=ax+ay-14;
&&&&&&&&&&&&&&&beginy=14;
&&&&&&&&&&}
&&&&&&&&&&endx=ax+4;endy=ay-4;
&&&&&&&&&&if(endx&14)
&&&&&&&&&&{
&&&&&&&&&&&&&&&endx=14;
&&&&&&&&&&&&&&endy=ax+ay-14;
&&&&&&&&&&}
&&&&&&&&&&if(endy&0)
&&&&&&&&&&{
&&&&&&&&&&&&&&&endx=ax+
&&&&&&&&&&&&&&&endy=0;
&&&&&&&&&&}
&&&&&&&&&&endx=endx-4;endy=endy+4;
&&&&&&&&&&for(r=r&endx+1;r++)
&&&&&&&&&&{
&&&&&&&&&&&&&&&if(num[r][beginy+beginx-r][am][0]!=6)
&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&num[r][beginy+beginx-r][an][0]=6;
&&&&&&&&&&&&&&&&&&&&for(t=0;t&5;t++)
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&goal[r+t][beginy+beginx-r-t][am]=goal[r+t][beginy+beginx-r-t][am]-quan[num[r][beginy+beginx-r][am][0]][am];
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&num[r][beginy+beginx-r][am][0]++;
&&&&&&&&&&&&&&&&&&&&if(num[r][beginy+beginx-r][am][0]==5)&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&win=
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&for(t=0;t&5;t++)
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&goal[r+t][beginy+beginx-r-t][am]=goal[r+t][beginy+beginx-r-t][am]+quan[num[r][beginy+beginx-r][am][0]][am];
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&else&if(num[r][beginy+beginx-r][an][0]!=6)
&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&for(t=0;t&5;t++)
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&goal[r+t][beginy+beginx-r-t][an]=goal[r+t][beginy+beginx-r-t][an]-quan[num[r][beginy+beginx-r][an][0]][an];
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&num[r][beginy+beginx-r][am][0]=6;
&&&&&&&&&&&&&&&&&&&&num[r][beginy+beginx-r][an][0]=6;
&&&&&&&&&&&&&&&}
&&&&&&&&&&}
&&&&&/*1方向判断*/
&&&&&&&&&&beginx=ax-4;beginy=
&&&&&&&&&&if(beginx&0)
&&&&&&&&&&{
&&&&&&&&&&&&&&&beginx=0;
&&&&&&&&&&}
&&&&&&&&&&endx=ax+4;endy=
&&&&&&&&&&if(endx&14)
&&&&&&&&&&{
&&&&&&&&&&&&&&&endx=14;
&&&&&&&&&&}
&&&&&&&&&&endx=endx-4;
&&&&&&&&&&for(r=r&endx+1;r++)
&&&&&&&&&&{
&&&&&&&&&&&&&&&if(num[r][ay][am][1]!=6)
&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&num[r][ay][an][1]=6;
&&&&&&&&&&&&&&&&&&&&for(t=0;t&5;t++)
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&goal[r+t][ay][am]=goal[r+t][ay][am]-quan[num[r][ay][am][1]][am];
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&num[r][ay][am][1]++;
&&&&&&&&&&&&&&&&&&&&if(num[r][ay][am][1]==5)
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&win=
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&for(t=0;t&5;t++)
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&goal[r+t][ay][am]=goal[r+t][ay][am]+quan[num[r][ay][am][1]][am];
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&else&if(num[r][ay][an][1]!=6)
&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&for(t=0;t&5;t++)
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&goal[r+t][ay][an]=goal[r+t][ay][an]-quan[num[r][ay][an][1]][an];
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&num[r][ay][am][1]=6;
&&&&&&&&&&&&&&&&&&&&num[r][ay][an][1]=6;
&&&&&&&&&&&&&&}
&&&&&&&&&&}
&&&&&/*2方向判断*/
&&&&&beginx=ax-4;beginy=ay-4;
&&&&&if(beginx&0)
&&&&&&&&&&beginy=beginy-
&&&&&&&&&&beginx=0;
&&&&&if(beginy&0)
&&&&&&&&&&beginx=beginx-
&&&&&&&&&&beginy=0;
&&&&&endx=ax+4;endy=ay+4;
&&&&&if(endx&14)
&&&&&&&&&&endy=endy-endx+14;
&&&&&&&&&&endx=14;
&&&&&if(endy&14)
&&&&&&&&&&endx=endx-endy+14;
&&&&&&&&&&endy=14;
&&&&&endx=endx-4;endy=endy-4;
&&&&&if(beginx&=endx)
&&&&&&&&&&for(r=r&endx+1;r++)
&&&&&&&&&&{
&&&&&&&&&&&&&&&if(num[r][beginy-beginx+r][am][2]!=6)
&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&num[r][beginy-beginx+r][an][2]=6;
&&&&&&&&&&&&&&&&&&&&for(t=0;t&5;t++)
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&goal[r+t][beginy-beginx+r+t][am]=goal[r+t][beginy-beginx+r+t][am]-quan[num[r][beginy-beginx+r][am][2]][am];
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&num[r][beginy-beginx+r][am][2]++;
&&&&&&&&&&&&&&&&&&&&if(num[r][beginy-beginx+r][am][2]==5)
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&win=
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&for(t=0;t&5;t++)
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&goal[r+t][beginy-beginx+r+t][am]=goal[r+t][beginy-beginx+r+t][am]+quan[num[r][beginy-beginx+r][am][2]][am];
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&else&if(num[r][beginy-beginx+r][an][2]!=6)
&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&for(t=0;t&5;t++)
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&goal[r+t][beginy-beginx+r+t][an]=goal[r+t][beginy-beginx+r+t][an]-quan[num[r][beginy-beginx+r][an][2]][an];
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&num[r][beginy-beginx+r][am][2]=6;
&&&&&&&&&&&&&&&&&&&&num[r][beginy-beginx+r][an][2]=6;
&&&&&&&&&&&&&&&}
&&&&&&&&&&}
&&&&&/*3方向判断*/
&&&&&&&&&&beginy=ay-4;beginx=
&&&&&&&&&&if(beginy&0)
&&&&&&&&&&{
&&&&&&&&&&&&&&&beginy=0;
&&&&&&&&&&}
&&&&&&&&&&endy=ay+4;endx=
&&&&&&&&&&if(endy&14)
&&&&&&&&&&{
&&&&&&&&&&&&&&&endy=14;
&&&&&&&&&&}
&&&&&&&&&&endy=endy-4;
&&&&&&&&&&for(r=r&endy+1;r++)
&&&&&&&&&&{
&&&&&&&&&&&&&&&if(num[ax][r][am][3]!=6)
&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&num[ax][r][an][3]=6;
&&&&&&&&&&&&&&&&&&&&for(t=0;t&5;t++)
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&goal[ax][r+t][am]=goal[ax][r+t][am]-quan[num[ax][r][am][3]][am];
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&num[ax][r][am][3]++;
&&&&&&&&&&&&&&&&&&&&if(num[ax][r][am][3]==5)
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&win=
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&for(t=0;t&5;t++)
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&goal[ax][r+t][am]=goal[ax][r+t][am]+quan[num[ax][r][am][3]][am];
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&else&if(num[ax][r][an][3]!=6)
&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&for(t=0;t&5;t++)
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&goal[ax][r+t][an]=goal[ax][r+t][an]-quan[num[ax][r][an][3]][an];
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&num[ax][r][am][3]=6;
&&&&&&&&&&&&&&&&&&&&num[ax][r][an][3]=6;
&&&&&&&&&&&&&&&}
&&&&&&&&&&}
void&findmax(char&m,char&n)//1,0
&&&&&char&i,j;
&&&&&maxgoal=-1;
&&&&&for(i=0;i&15;i++)
&&&&&&&&&&for(j=0;j&15;j++)
&&&&&&&&&&{
&&&&&&&&&&&&&&&if(state[i][j]==2)
&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&if(goal[i][j][m]&maxgoal)
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&a=i;
&&&&&&&&&&&&&&&&&&&&&&&&&b=j;
&&&&&&&&&&&&&&&&&&&&&&&&&maxgoal=goal[i][j][m];
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&else&if(goal[i][j][m]==maxgoal)
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&if(goal[i][j][n]&goal[a][b][n])
&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&a=i;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&b=j;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&maxgoal=goal[i][j][m];&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&else&if(goal[i][j][n]==goal[a][b][n])
&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if(random(2))
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&a=i;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&b=j;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&maxgoal=goal[i][j][m];
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&}
&&&&&&&&&&}
}&大致就是
void&ai(char&ax,char&ay,char&am,char&an)
从4个方向对棋盘进行扫描,并对每个点进行评分,如果有5子直接win
&&/*0方向判断*/0方面(大概是斜向),
&&if((ax+ay)&=4&&(ax+ay)&=24)&//排除两个角落&并设置扫描范围
&void&findmax(char&m,char&n)&用来查找评分最高的,如果相等取随机&if(random(2))谢谢楼上的高手,但是还是有点不懂,ai里的算法,findmax里的也不懂,希望能详细些。谢谢了AI的评分怎么实现的啊,,真不懂...顶上去啊,,高手求解啊num[][][][]的四维数组是什么啊。。。求解..这是main函数
&&&&&int&gd=DETECT,gm,turn,oa,ob,
&&&&&char&ch,i1,i2,i3,i4;
&&&&&registerbgidriver(EGAVGA_driver);
&&&&&initgraph(&gd,&gm,"");
&&&&&begin://不懂什么意思
&&&&&for(i1=0;i1&15;i1++)
&&&&&for(i2=0;i2&15;i2++)
&&&&&&&&&&state[i1][i2]=2;
&&&&&&&&&&for(i3=0;i3&2;i3++)
&&&&&&&&&&{
&&&&&&&&&&&&&&&goal[i1][i2][i3]=0;
&&&&&&&&&&&&&&&for(i4=0;i4&4;i4++)
&&&&&&&&&&&&&&&num[i1][i2][i3][i4]=0;//连续五个子就胜利
&&&&&&&&&&}
&&&&&win=2;s=0;//win使用来判断胜负的,win=1时代表玩家输了,win=0代表玩家赢了;s是用来记录棋盘上的棋子数的,总共有225个
&&&&&turn=(show(150)-150)/30;//接收用户菜单界面的选择
&&&&&if(turn==2)//如果选中了EXIT则退出
&&&&&&&&&&exit(0);
&&&&&else//没有选中EXIT
&&&&&&&&&&pan();
&&&&&&&&&&if(turn==1)//选择了电脑优先,即show()=y=180;
&&&&&&&&&&{
&&&&&&&&&&&&&&&randomize();
&&&&&&&&&&&&&&&a=random(7)+4;
&&&&&&&&&&&&&&&randomize();
&&&&&&&&&&&&&&&b=random(7)+4;
&&&&&&&&&&&&&&&ai(a,b,1,0);//确定方向
&&&&&&&&&&&&&&&state[a][b]=//不懂!
&&&&&&&&&&&&&&&s++;
&&&&&&&&&&&&&&&step(s);//显示走了几步棋
&&&&&&&&&&&&&&&turn=0;//将turn置为0后,下步就该玩家走,若不置为0,则电脑走两步
&&&&&&&&&&&&&&&x=124+28*a;y=44+28*b;
&&&&&&&&&&&&&&&setcolor(GREEN);
&&&&&&&&&&&&&&&setfillstyle(1,GREEN);
&&&&&&&&&&&&&&&pieslice(x,y,0,360,11);//x,y是电脑选择将棋子放哪的坐标,pieslice画的是棋子
&&&&&&&&&&&&&&&curr(WHITE);//画出方向键选择的位置
&&&&&&&&&&}
&&&&&&&&&&else//选择了玩家优先
&&&&&&&&&&{
a=7;//初始化玩家初始的位置
&&&&&&&&&&&&&&&x=124+28*a;
&&&&&&&&&&&&&&&y=44+28*b;
&&&&&&&&&&&&&&&curr(WHITE);
&&&&&&&&&&&&&&&step(0);//步数置0
&&&&&&&&&&}
&//-------------------------------
&//开始游戏
&//-------------------------------
&&&&&while(win==2&&s&225)//win使用来判断胜负的,win=1时代表玩家输了,win=0代表玩家赢了;s是用来记录棋盘上的棋子数的,总共有225个
&&&&&&&&&&if(turn==1)//如果电脑走
&&&&&&&&&&{
&&&&&&&&&&&&&&&fun(1);//显示电脑走时的界面,只有一瞬间
&&&&&&&&&&&&&&&findmax(0,1);
&&&&&&&&&&&&&&&omax=
&&&&&&&&&&&&&&&findmax(1,0);
&&&&&&&&&&&&&&&if(omax&maxgoal)
&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&a=
&&&&&&&&&&&&&&&&&&&&b=
&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&else&if(omax==maxgoal)
&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&if(goal[oa][ob][1]&goal[a][b][0])
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&a=
&&&&&&&&&&&&&&&&&&&&&&&&&b=
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&else&if(goal[oa][ob][1]==goal[a][b][0])
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&if(random(2))
&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&a=
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&b=
&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&ai(a,b,1,0);
&&&&&&&&&&&&&&&state[a][b]=
&&&&&&&&&&&&&&&s++;
&&&&&&&&&&&&&&&step(s);
&&&&&&&&&&&&&&&turn=0;//将turn置为0后,下步就该玩家走,若不置为0,则电脑走两步
&&&&&&&&&&&&&&&x=124+28*a;
&&&&&&&&&&&&&&&y=44+28*b;
&&&&&&&&&&&&&&&setcolor(GREEN);
&&&&&&&&&&&&&&&setfillstyle(1,GREEN);
&&&&&&&&&&&&&&&pieslice(x,y,0,360,11);
&&&&&&&&&&&&&&&curr(WHITE);
&&&&&&&&&&}
&&&&&&&&&&else//turn==0时
&&&&&&&&&&{
&&&&&&&&&&&&&&&fun(0);//显示该玩家走,即界面显示your&turn..
&&&&&&&&&&&&&&&ch=getch();
&&&&&&&&&&&&&&&while(ch!=enter)//玩家开始行动时,用enter确定
&&&&&&&&&&&&&&&{//下面是玩家走的方式总共有esc,h键,up,down,left,right
&&&&&&&&&&&&&&&&&&&&if(ch==esc)//如果玩家在游戏中选择了ESC,则提示玩家esc&y/n
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&fun(2);
&&&&&&&&&&&&&&&&&&&&&&&&&if(getch()==y_key)//如果玩家点了Y&,则到了主界面,继续选择
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&goto&
&&&&&&&&&&&&&&&&&&&&&&&&&fun(0);//没有选就继续玩
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&else&if(ch==h_key)//玩家按了H键,则执行帮助系统,可以帮助玩家显示可以走的位置
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&curr(BLACK);
&&&&&&&&&&&&&&&&&&&&&&&&&findmax(1,0);
&&&&&&&&&&&&&&&&&&&&&&&&&omax=
&&&&&&&&&&&&&&&&&&&&&&&&&oa=a;
&&&&&&&&&&&&&&&&&&&&&&&&&ob=b;
&&&&&&&&&&&&&&&&&&&&&&&&&findmax(0,1);
&&&&&&&&&&&&&&&&&&&&&&&&&x=a;
&&&&&&&&&&&&&&&&&&&&&&&&&y=b;
&&&&&&&&&&&&&&&&&&&&&&&&&if(omax&maxgoal)
&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&a=
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&b=
&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&else&if(omax==maxgoal)
&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if(goal[oa][ob][0]&goal[a][b][1])
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&a=
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&b=
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&else&if(goal[oa][ob][0]==goal[a][b][1])
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if(random(2))
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&a=
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&b=
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&x=124+28*a;
&&&&&&&&&&&&&&&&&&&&&&&&&y=44+28*b;
&&&&&&&&&&&&&&&&&&&&&&&&&curr(WHITE);
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&else&if(ch==up)
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&curr(BLACK);//将原始位置还原
&&&&&&&&&&&&&&&&&&&&&&&&&b--;
&&&&&&&&&&&&&&&&&&&&&&&&&if(b&0)//如果走到了棋盘的最下边,则循环到棋盘上边
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&b=14;
&&&&&&&&&&&&&&&&&&&&&&&&&x=124+28*a;
&&&&&&&&&&&&&&&&&&&&&&&&&y=44+28*b;
&&&&&&&&&&&&&&&&&&&&&&&&&curr(WHITE);//将现在位置画出
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&else&if(ch==down)
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&curr(BLACK);
&&&&&&&&&&&&&&&&&&&&&&&&&b++;
&&&&&&&&&&&&&&&&&&&&&&&&&if(b&14)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&b=0;
&&&&&&&&&&&&&&&&&&&&&&&&&x=124+28*a;
&&&&&&&&&&&&&&&&&&&&&&&&&y=44+28*b;
&&&&&&&&&&&&&&&&&&&&&&&&&curr(WHITE);
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&else&if(ch==left)
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&curr(BLACK);
&&&&&&&&&&&&&&&&&&&&&&&&&a--;
&&&&&&&&&&&&&&&&&&&&&&&&&if(a&0)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&a=14;
&&&&&&&&&&&&&&&&&&&&&&&&&x=124+28*a;
&&&&&&&&&&&&&&&&&&&&&&&&&y=44+28*b;
&&&&&&&&&&&&&&&&&&&&&&&&&curr(WHITE);
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&else&if(ch==right)
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&curr(BLACK);
&&&&&&&&&&&&&&&&&&&&&&&&&a++;
&&&&&&&&&&&&&&&&&&&&&&&&&if(a&14)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&a=0;
&&&&&&&&&&&&&&&&&&&&&&&&&x=124+28*a;
&&&&&&&&&&&&&&&&&&&&&&&&&y=44+28*b;
&&&&&&&&&&&&&&&&&&&&&&&&&curr(WHITE);
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&ch=getch();//等待用户输入
&&&&&&&&&&&&&&&}//玩家已经确定怎么走了,点了enter键
&&&&&&&&&&}
&&&&&&&&&&if(state[a][b]==2)//画出玩家走的棋子
&&&&&&&&&&{
&&&&&&&&&&&&&&&curr(BLACK);
&&&&&&&&&&&&&&&ai(a,b,0,1);
&&&&&&&&&&&&&&&state[a][b]=//此位置已经走了,不能再走了
&&&&&&&&&&&&&&&x=124+28*a;
&&&&&&&&&&&&&&&y=44+28*b;
&&&&&&&&&&&&&&&turn=1;//将turn置为1,则下步该电脑走
&&&&&&&&&&&&&&&s++;
&&&&&&&&&&&&&&&step(s);
&&&&&&&&&&&&&&&setcolor(RED);
&&&&&&&&&&&&&&&setfillstyle(1,RED);
&&&&&&&&&&&&&&&pieslice(x,y,0,360,11);
&&&&&&&&&&}
&&&&&}//游戏结束
&&&&&curr(WHITE);
&&&&&fun(win+3);
&&&&&getch();
&&&&&goto&求高手指教啊。。AI算法怎么实现的,findmax怎么实现的????高手来啊这是整个五子棋的其他简单代码,求解释main函数里调用findmax&和ai&时是怎么一回事啊,五子棋高手来啊
void&menu()//显示功能菜单
&&&&&setcolor(RED);
&&&&&settextstyle(0,0,3);
&&&&&outtextxy(150,150,"Player&first");
&&&&&outtextxy(150,180,"Computer&first");
&&&&&outtextxy(150,210,"Exit");
int&show(int&y)&//返回用户的选择
&&&&&int&oy=0;
&&&&&char&ch=0;
&&&&&cleardevice();
&&&&&setbkcolor(BLACK);
&&&&&setcolor(BLUE);
&&&&&settextstyle(0,0,4);
&&&&&outtextxy(200,40,"GOBANG");
&&&&&settextstyle(0,0,2);
&&&&&outtextxy(350,90,"www.vcworld.net");
&&&&&setcolor(WHITE);
&&&&&settextstyle(0,0,2);
&&&&&outtextxy(40,280,"operate&handbook:");
&&&&&outtextxy(100,310,"Up,Down,Left,Right&key&to&move");
&&&&&outtextxy(100,340,"Enter&key&for&sure");
&&&&&outtextxy(100,370,"H&key&for&help");
&&&&&outtextxy(100,400,"Esc&key&to&exit");
&&&&&outtextxy(440,430,"version:1.0");
&&&&&while(ch!=enter)//玩家没有选择选项
&&&&&&&&&&if((ch==down||ch==right)&&y!=210)
&&&&&&&&&&&&&&&y+=30;
&&&&&&&&&&else&if((ch==up||ch==left)&&y!=150)
&&&&&&&&&&&&&&&y-=30;
&&&&&&&&&&if(oy!=y)//oy是用来记录移动前的位置,将移动前的位置背景给涂黑
&&&&&&&&&&{
&&&&&&&&&&&&&&&setfillstyle(0,BLACK);
&&&&&&&&&&&&&&&bar(140,oy-2,490,oy+24);
&&&&&&&&&&&&&&&setfillstyle(1,BLUE);
&&&&&&&&&&&&&&&bar(140,y-2,490,y+24);
&&&&&&&&&&&&&&&menu();//画完后跳回主菜单(红体那部分)
&&&&&&&&&&&&&&&oy=y;
&&&&&&&&&&}
&&&&&&&&&&ch=getch();//接收玩家在键盘上的输入的方向
&&&&&return&y;//返回用户的选择
void&step(int&step)&//将记录下的步数step传给STEP函数进行输出到屏幕上
&&&&&char&s[4];
&&&&&sprintf(s,"%d",step);//将计算好的步数传给s字符串进行储存
&&&&&setcolor(BLACK);
&&&&&setfillstyle(1,BLACK);
&&&&&bar(22,239,100,269);//进行显示
&&&&&setcolor(BLUE);
&&&&&settextstyle(0,0,3);
&&&&&outtextxy(10,210,"STEP");//
&&&&&outtextxy(23,240,s);
void&fun(int&t)&//提示玩家游戏的进行界面
&&&&&setcolor(BLACK);
&&&&&setfillstyle(1,BLACK);
&&&&&bar(539,100,639,300);
&&&&&setcolor(BLUE);
&&&&&settextstyle(0,0,3);
&&&&&if(t==1)
&&&&&&&&&&outtextxy(540,210,"&");
&&&&&&&&&&outtextxy(540,240,"&");
&&&&&else&if(t==0)
&&&&&&&&&&outtextxy(540,195,"Your");
&&&&&&&&&&outtextxy(540,225,"turn");
&&&&&&&&&&setcolor(RED);
&&&&&&&&&&setfillstyle(1,RED);
&&&&&&&&&&pieslice(590,270,0,360,11);
&&&&&else&if(t==2)
&&&&&&&&&&outtextxy(540,210,"Exit");
&&&&&&&&&&outtextxy(540,240,"y/n&");
&&&&&else&if(t==3)
&&&&&&&&&&setcolor(RED);
&&&&&&&&&&outtextxy(540,210,"You&");
&&&&&&&&&&outtextxy(540,240,"win&");
&&&&&else&if(t==4)
&&&&&&&&&&setcolor(RED);
&&&&&&&&&&outtextxy(540,210,"You&");
&&&&&&&&&&outtextxy(540,240,"lose");
&&&&&else&if(t==5)
&&&&&&&&&&setcolor(RED);
&&&&&&&&&&outtextxy(540,210,"GAME");
&&&&&&&&&&outtextxy(540,240,"OVER");
void&pan()//画出棋盘
&&&&&int&r;
&&&&&cleardevice();
&&&&&setcolor(WHITE);
&&&&&for(r=1;r&15;r++)//画出里边的表格
&&&&&&&&&&rectangle(124,44,124+r*28,44+r*28);
&&&&&&&&&&rectangle(516,436,516-r*28,436-r*28);
&&&&&rectangle(106,26,534,454);
&&&&&rectangle(105,25,535,455);
&&&&&rectangle(107,27,533,453);
void&curr(int&co)&//画出方向键选择的位置
&&&&&setcolor(co);
&&&&&line(x-15,y-10,x-10,y-10);
&&&&&line(x-10,y-10,x-10,y-15);
&&&&&line(x+10,y-15,x+10,y-10);
&&&&&line(x+10,y-10,x+15,y-10);
&&&&&line(x-15,y+10,x-10,y+10);
&&&&&line(x-10,y+10,x-10,y+15);
&&&&&line(x+10,y+10,x+10,y+15);
&&&&&line(x+10,y+10,x+15,y+10);
}&顶上去啊,高手来解啊.....高手来解啊。。。。高手来啊!!!这样的问题自己硬看就行了吧引用&11&楼&laocui172&的回复:这样的问题自己硬看就行了吧
就是看不懂呀,求教啊。。引用楼主&homencc&的回复:int&quan[5][2]={0,0,1,2,7,9,35,40,125,180};&
int&state[15][15],goal[15][15][2],num[15][15][2][4];&//state指的时盘面的数组,goal指,num[][][][4]指四个方向
char&win=2,a,b;&//a左右指移动,左a--,右a++;下&b++,上b--(玩家在棋盘里左右上下移动);……
高手帮帮看看呗。。求解释,详细。。引用&1&楼&bigfog&的回复:大致就是
void&ai(char&ax,char&ay,char&am,char&an)
从4个方向对棋盘进行扫描,并对每个点进行评分,如果有5子直接win
&&/*0方向判断*/0方面(大概是斜向),
&&if((ax+ay)&=4&&(ax+ay)&=24)&//排除两个角落&并设置扫描范围
&void&findmax(char&m,char&n)&用……
高手帮帮看看呗。。求解释,详细。。代码写的乱
如果你自己想搞明白,最好先去画个 15*15的棋盘,然后对着棋盘去思考
int&quan[5][2]={0,0,1,2,7,9,35,40,125,180};&&//表示得分
quan[n同色数][2旗子颜色] 旗子颜色就2种(用0和1表示)
比如 n=1,那么得分就是 
num[15][15][2][4];&//num[x坐标][y坐标][2旗子颜色][4指4个方向&分别(0:/;1:-;2:\;3:|)]
void&ai(char&ax,char&ay,char&am,char&an)
ax,ay:旗子放这个位子的得分 ,am=0,an=1指两中颜色
下面就"0"方向简单的解释一下,其他方向类推
先来确定"0"是哪个方向,
for(r=r&endx+1;r++)
if(num[r][beginy+beginx-r][am][0]!=6)
for(t=0;t&5;t++)
goal[r+t][beginy+beginx-r-t][am]=
可以看出 x方向是+,y方向是-,坐标原点在棋盘左上角,就可以确定是从左下往右上的方向
在这个方向上,左上或右下两个角落的部分区域是不能构成五子的,就排除掉
&&/*0方向判断*/
&&if((ax+ay)&=4&&(ax+ay)&=24)//确定可能的范围
在这个方向上,可以由(ax,ay)点组成五子的就只有向前4个点及后4个点(共9个点),
参考代码:beginx=ax-4;beginy=ay+4; endx=ax+4;endy=ay-4;
还要考虑到这些点是否超出了棋盘的范围(超出的给排除掉),
参考代码:
&&if(beginx&0)
&&beginx=0;
&&beginy=ay+
&&if(beginy&14)
&&beginx=ax+ay-14;
&&beginy=14;
&&if(endx&14)
&&endx=14;
&&endy=ax+ay-14;
&&if(endy&0)
&&endx=ax+
为了每次扫描都要包含点(ax,ay),需把结束点前移
endx=endx-4;endy=endy+4;
这样就可以确定这些点开始和结束坐标(beginx,beginy)(endx,endy)
接下来就去省下的点扫描
//下面假设am是黑子,an是白子
for(r=r&endx+1;r++)//循环扫描
&&if(num[r][beginy+beginx-r][am][0]!=6) //6标记非同色或空 =>非6表示同色
&&{//判断是黑子
&&num[r][beginy+beginx-r][an][0]=6;
 //去除连续5点的同色数得分 
&&for(t=0;t&5;t++)
&&goal[r+t][beginy+beginx-r-t][am]=goal[r+t][beginy+beginx-r-t][am]-quan[num[r][beginy+beginx-r][am][0]][am];
 //当前点的同色数增加
&&num[r][beginy+beginx-r][am][0]++;
 //数为5表示胜利
&&if(num[r][beginy+beginx-r][am][0]==5)&{
 //个人想法:程序这里应该有个跳出,既然赢了就该结束,没比较做其他操作
 //重新设定同色得分
&&for(t=0;t&5;t++)
&&goal[r+t][beginy+beginx-r-t][am]=goal[r+t][beginy+beginx-r-t][am]+quan[num[r][beginy+beginx-r][am][0]][am];
&&else&if(num[r][beginy+beginx-r][an][0]!=6)
&&{//判断是白子
  //由于是不同颜色旗子,就循环对当前五个旗子的得分进行设置
&&for(t=0;t&5;t++)
&&goal[r+t][beginy+beginx-r-t][an]=goal[r+t][beginy+beginx-r-t][an]-quan[num[r][beginy+beginx-r][an][0]][an];
//该子已经评价过,下次循环是不再评价
&&num[r][beginy+beginx-r][am][0]=6;
&&num[r][beginy+beginx-r][an][0]=6;
最后说一句,分是不是少了点!引用&15&楼&bigfog&的回复:代码写的乱
如果你自己想搞明白,最好先去画个 15*15的棋盘,然后对着棋盘去思考
int&quan[5][2]={0,0,1,2,7,9,35,40,125,180};&//表示得分
quan[n同色数][2旗子颜色] 旗子颜色就2种(用0和1表示)
比如 n=1,那么得分就是 
num[15][15][2][4];&//num[x坐标][y坐标][2旗子颜色][4指4个方向&分别……
加分了,,谢谢高手啦。。。多多指教啊,以后。。。引用&15&楼&bigfog&的回复:代码写的乱
如果你自己想搞明白,最好先去画个 15*15的棋盘,然后对着棋盘去思考
int&quan[5][2]={0,0,1,2,7,9,35,40,125,180};&//表示得分
quan[n同色数][2旗子颜色] 旗子颜色就2种(用0和1表示)
比如 n=1,那么得分就是 
num[15][15][2][4];&//num[x坐标][y坐标][2旗子颜色][4指4个方向&分别……
findmax()那个函数也不怎么懂呀,高手有空也帮忙解释一下吧,,再加分呀。。。谢谢啦还有为什么要用beginy&beginx&endx&endy,是干什么的呀?goal[][][]函数有什么用呀。。。小菜鸟求指教看在加分上简单解释一下&findmax,由于程序不是我设计,缺少相应文档,有些地方是猜的,不一定正确
void&findmax(char&m,char&n)//1,0
&&char&i,j;
&&maxgoal=-1;&//存放最高得分值&先设定一个最小值
&&//双循环遍历棋盘
&&for(i=0;i&15;i++)
&&for(j=0;j&15;j++)
&&if(state[i][j]==2)//猜测:2表示该位置没旗子
&&//如果M的旗子在该处的得分大于maxgoal时,保存该坐标(a,b)和得分
&&if(goal[i][j][m]&maxgoal)
&&maxgoal=goal[i][j][m];
&&else&if(goal[i][j][m]==maxgoal)
&&{//如果相等,则比较N方(另一方)在此处的得分,记录得分高的
&&if(goal[i][j][n]&goal[a][b][n])
&&maxgoal=goal[i][j][m];&}
&&//如果得分也相同,则取随机
&&else&if(goal[i][j][n]==goal[a][b][n])
&&if(random(2))//随机数函数,返回0,1
&&maxgoal=goal[i][j][m];
通过便历棋盘上的各个坐标点,取得对己方最高的评价位子,
如果出现两个评价分一样,就看这两个位子对手的评价分,占居对手的有利位子
如果这两个位子对方的评价都一样,那么就取随机
最后,该给分了引用&19&楼&bigfog&的回复:看在加分上简单解释一下&findmax,由于程序不是我设计,缺少相应文档,有些地方是猜的,不一定正确
void&findmax(char&m,char&n)//1,0
&&char&i,j;
&&maxgoal=-1;&//存放最高得分值&先设定一个最小值
&&//双循环遍历棋盘
&&for(i=0;i&15;i++)
&&for(j……谢谢啦,,给分啦。。。
一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!
二、互相尊重,对自己的言论和行为负责。
本文标题:
本页链接:

我要回帖

更多关于 latex 算法注释 的文章

 

随机推荐