中国象棋人工智能实现

news/2025/1/15 21:53:25/

中国象棋在我看来最难的人工对战中电脑怎能走这个问题,以下为本人浅见,希望各位多多包涵!

1.初步尝试

电脑的优势在于强大的计算能力,虽然其不知道怎么走合适,但是它能够模拟的将每一种走法都走一遍,选最优的走法来走。我们的思路就有了,首先需要解决两个问题:

(1)怎么判断局面最优?

(2)怎么模拟走?

第一个问题可以用每一个棋子的重要程度来打分,比如将最重要,所以给1000分,而车次之给100分,炮80等等

第二个问题因为每一个中国象棋实现方式不同,所以我分享一下本人代码

电脑模拟走一步的代码:

mov Board::getbestmove()
{/** 1.获取所有可能走的步数* 2.试着走一下* 3.看看局面怎么样* 4.选择最好的走法*/QVector<mov> canstep;canstep = getallstep();int maxscore = -100000;mov ret;for(auto it = canstep.begin();it!=canstep.end();it++){mov step = *it;fakemove(step);             //模拟走一步int score = ctscore();        //计算局面分unfakemove(step);            //返回if(score>maxscore)            //计算最大的局面分{maxscore = score;ret.equal(step);}}qDebug()<<"get best move!!!";return ret;                        //得到最好走法
}

以上代码可以实现电脑模拟走一步的场景,但是缺点也显而易见。就是目光短浅,只考虑到自己走一步,并没有考虑到对手走的一步,例如:我要吃电脑车,它会看着我吃,它只是遍历了自己走一步局面分最大的走法,但是没有考虑我走一步会造成的影响。

2.电脑模拟走两步的走法

我们可以这样设计--在电脑走一步后考虑我再走一步的结果,就是模拟两步,比如轮到电脑走有n种走法,电脑走了一步人又有n种走法,在这n*n种选择中再选最有利的---也就是局面分最大的

                                          

如上图所示,电脑如果走了1分支,人有三种选择,局面分分别为30,40,70分,正常人都会走对电脑最不利的一步棋即30分,所以我们需要找到电脑走每一个分支下的最小值。

3.电脑走n步的走法

很容易知道,电脑多考虑一步计算量就多一个循环。但是理论上让电脑考虑n步算法是可以实现的,先贴代码:

mov Board::getbestmove()
{/** 1.获取所有可能走的步数* 2.试着走一下* 3.看看局面怎么样* 4.选择最好的走法*///qDebug()<<"begin to get best move!!!";QVector<mov> canstep;canstep = getallstep(0); //电脑走法qDebug()<<"allstep ==="<<canstep.count();int maxscore = -100000;mov ret;for(auto it = canstep.begin();it!=canstep.end();it++){mov step = *it;//qDebug()<<"origin pao position is---"<<weizhi[9];//qDebug()<<"chess "<<step.name<<" from "<<step.from<<" to "<<step.to;fakemove(step);int score = getminscore(level-1,maxscore);unfakemove(step);qDebug()<<"THE SCORE IS--"<<score;if(score>maxscore){maxscore = score;ret.equal(step);}}return ret;
}
int Board::getmaxscore(int level,int curminscore)
{if(level==0)return ctscore();QVector<mov> step;step = getallstep(0);   //获取人可以走的步数int maxscore = -100000;for(auto it = step.begin();it!=step.end();it++){mov mystep = *it;//qDebug()<<"chess "<<step.name<<" from "<<step.from<<" to "<<step.to;fakemove(mystep);int score = getminscore(level-1,maxscore);unfakemove(mystep);if(score>=curminscore)return score;//qDebug()<<"THE SCORE IS--"<<score;if(score>maxscore){maxscore = score;}}return maxscore;
}
int Board::getminscore(int level,int curmaxscore)
{if(level==0)return ctscore();QVector<mov> step;step = getallstep(1);   //获取人可以走的步数int minscore = 100000;for(auto it = step.begin();it!=step.end();it++){mov mystep = *it;//qDebug()<<"chess "<<step.name<<" from "<<step.from<<" to "<<step.to;fakemove(mystep);int score = getmaxscore(level-1,minscore);unfakemove(mystep);if(curmaxscore>=score)return score;//qDebug()<<"THE SCORE IS--"<<score;if(score<minscore)minscore = score;}return minscore;
}

我们首先设置一个level参数,表示需要电脑考虑几步,然后再用getminscore和getmaxscore递归调用,直到最后一层返回。

4.剪枝算法

如上图所示,如果第一个分支得到了最小的局面分30,然后有算出了第二个分支中有一个10,那说明第二个分支情况最好局面分也只有10,小于第一个分支的局面分30,所以第二个分支没用了,第二个分支的n-1中情况都不用在计算了。

具体项目代码见:https://github.com/luoshiyong/AIChess(求各位老铁给个star)

 


http://www.ppmy.cn/news/694907.html

相关文章

软考A计划-系统集成项目管理工程师-项目立项-下

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

js实现中国象棋

闲的没事干写的js代码。使用table元素作表格&#xff0c;div元素作象棋。 效果如下&#xff1a; 代码如下&#xff1a; <html> <head> <title>中国象棋</title> <meta charset"UTF-8"> <style> table{margin:10px;border-coll…

365值得吗 office_对于一个大学生来说,Office365是否值得购买?

值得 入了office365 家庭版&#xff0c;拼的车&#xff0c;一年算下来也就50块左右 怎么评价Office365呢&#xff1f; 1.首先&#xff0c;Office将组件大家都清楚&#xff0c;办公学习考试啥的&#xff0c;啥都要用&#xff0c;金山的wps做出来的东西在导入或者导总会有或多或少…

## term没有查到数据分析

match 一般要结合 text 类型一起使用 而 term 要结合 keyword 类型一起使用&#xff0c;这样才是有意义的 这里的理解有些人可能有误区, "name" : {"type" : "text","fields" : {"keyword" : {"type" : "…

zoho邮箱收费和免费区别_集成MS Office和您的Zoho在线帐户

zoho邮箱收费和免费区别 Have you been looking to integrate MS Office install and your Zoho online account? Then join us as we look at the Zoho Plugin for Microsoft Office. 您是否一直在寻找将MS Office安装和您的Zoho在线帐户集成在一起的方法&#xff1f; 然后加…

计算机二级office如何考取高分?

【知识兔】学姐为了系统地汇总Excel函数公式&#xff0c;我们查阅了所有的计算机二级office真题&#xff0c;经过三天的整理、分类、筛选、修改&#xff0c;反复的校对&#xff0c;知识兔团队希望自己整理出的知识点能够帮助更多的人学习office技能考取计算机二级证书。知识兔本…

Office 2019怎么下载?附学习视频教程

只能网络下载&#xff0c;仅支持Win10系统&#xff01;领&#xff01; 根据微软的说法&#xff0c;Office 2019不再提供MSI本地安装包&#xff0c;仅通过Click-to-Run网络安装包的方式发放。如此一来&#xff0c;每一次用户安装Office 2019的时候就只能下载数量庞大的组件&…

多少并发量算高并发_如何理解:程序、进程、线程、并发、并行、高并发?

作者&#xff1a;大宽宽链接&#xff1a;http://tinyurl.com/wx5xxho 在这里你可以了解&#xff1a; 为啥大家说的进程的意思有出入&#xff1f;为啥并发那么难理解&#xff1f;为啥高并发不仅仅是“高”“并发”的意思&#xff1f;为啥这些概念到了现实当中就不一样了&#xf…