欢迎大家关注/订阅我的微信公众号Code Art Online,我会在我的公众号分享个人见闻,发现生活趣味;这里不仅有0和1,还有是诗和远方↓↓↓

前言:前面几篇博客详细介绍了棋盘类的封装、棋子类的封装以及各种类型的棋子的走棋算法的实现。有了前面的铺垫,就能迈出人工智能的第一步了。本系列博客还是重点介绍实现方法,很多的代码都不再过多解释了。

人机对战类:

#ifndef SINGLEGAME_H
#define SINGLEGAME_H#include "Board.h"class SingleGame : public Board
{
public:virtual void click(int id,int row,int col);//获取所有走棋路径存放到steps中void getAllPossibleMove(QVector<Step *>& steps);//评估局面分int calcScore();//假装走一步void fakeMove(Step* step);//将假装走的那一步挪回来void unfakeMove(Step* step);//获取最佳走棋路径Step* getBestMove();//电脑走棋void computerMove();
};#endif // SINGLEGAME_H

由以上代码可以看出,人机对战类继承自棋盘类,重载了棋盘类中的click函数。其中,Step是一个QVector容器,其内部情况是这样的:

#ifndef STEP_H
#define STEP_H#include <QObject>class Step : public QObject
{Q_OBJECT
public:explicit Step(QObject *parent = 0);~Step();//行走棋子的idint _moveid;//杀掉棋子的idint _killid;//起始行坐标int _rowFrom;//起始列坐标int _colFrom;//目标位置行坐标int _rowTo;//目标位置列坐标int _colTo;signals:public slots:
};#endif // STEP_H

由以上代码可以看出Step类是用来存放走棋信息的。

人机对战类中重载的click函数源代码:

void SingleGame::click(int id,int row,int col)
{if(!this->_bRedTurn)return;Board::click(id,row,col);if(!this->_bRedTurn){Step* step=getBestMove();moveStone(step->_moveid,step->_killid,step->_rowTo,step->_colTo);}
}

由以上代码可以看出,人类方走红棋,电脑方走黑棋。当轮到红方走棋的时候,与人人对战的时候没有区别,于是调用父类中的click函数;当轮到黑方走棋的时候,就获取对电脑最有利的走棋路径,让电脑走棋。

--------------------------------------------------------------------这里是华丽的分割线----------------------------------------------------------------------------

人工智能的实现分3步走

1.获取所有走得通的路径

上getAllPossibleMove函数的源代码:

void SingleGame::getAllPossibleMove(QVector<Step *>& steps)
{//遍历所有黑方棋子for(int i=16;i<32;i++){//如果棋子已死则直接跳过if(_s[i]._dead) continue;//遍历所有行坐标for(int row=0;row<=9;row++){//遍历所有列坐标for(int col=0;col<=8;col++){//获取想要杀死的棋子的idint killid=this->getStoneId(row,col);//若想要杀死的棋子与行走的棋子颜色相同则跳过if(sameColor(killid,i)) continue;//判断某一棋子能不能行走if(canMove(i,killid,row,col)){//将可以行走的“步”存放到steps中saveStep(i,killid,row,col,steps);}}}}
}

算法解析:遍历所有黑方的棋子,遍历到某一棋子时全方位无死角地遍历棋盘上的所有位置,把每个位置的信息都输入canMove函数,将canMove函数返回true的“步”存放到容器steps中。

2.从所有能走的路径中找到对电脑最有利的路径

上getBestMove函数的源代码:

Step* SingleGame::getBestMove()
{QVector<Step *> steps;//看看有哪些步骤可以走getAllPossibleMove(steps);int maxScore=-100000;Step* ret;for(QVector<Step*>::iterator it=steps.begin();it!=steps.end();++it){Step* step=*it;//试着走一下fakeMove(step);//评估局面分int score=calcScore();//再走回来unfakeMove(step);//取最高的分数if(score>maxScore){maxScore=score;ret=step;}}return ret;
}

算法解析:这便是模拟人的思维的过程,从小跟爷爷下棋的时候爷爷就对我说,要走一步看三步,然而这里先实现走一步看一步。路边两个老爷爷在下棋,老爷爷虽然不会摆弄棋盘上的棋子,然而他的脑子里是在推演的,他也会权衡一下选择对自己最有利的路径走棋。fakeMove和unfakeMove便是推演的过程,假想自己走一步,评估完局面分再走回来。找到走完后局面分最高的路径作为返回值返回。

关于fakeMove函数和unfakeMove函数:

void SingleGame::fakeMove(Step* step)
{killStone(step->_killid);moveStone(step->_moveid,step->_killid,step->_rowTo,step->_colTo);
}
void SingleGame::unfakeMove(Step* step)
{reliveStone(step->_killid);moveStone(step->_moveid,step->_rowFrom,step->_colFrom);
}

其中killStone函数是用来杀死棋子的,relieveStone函数是用来复活棋子的。

获取最优走棋路径这一步中有个很重要的步骤就是评估局面分,上calcScore函数的源代码:

int SingleGame::calcScore()
{//枚举的 车=0 马=1 炮=2 兵=3 将=4 士=5 相=6static int chessScore[]={100,50,50,20,1500,10,10};int redTotalScore=0;int blackTotalScore=0;//计算红棋总分for(int i=0;i<16;i++){//如果棋子已死则跳过累加if(_s[i]._dead)continue;redTotalScore+=chessScore[_s[i]._type];}//计算黑棋总分for(int i=16;i<32;i++){//如果棋子已死则跳过累加if(_s[i]._dead)continue;blackTotalScore+=chessScore[_s[i]._type];}//返回黑棋总分-红棋总分return blackTotalScore-redTotalScore;
}

算法分析:先给所有棋子分配权重,根据棋子的重要程度来分配。将是最重要的棋子,因此将的权重最高,置为1500;车其次,置为100,马和炮再其次,置为50;兵再再其次,置为20;士和相最不重要,置为10。遍历红方所有的棋子,将红方活着的棋子的权重累加出一个总分;遍历黑方所有的棋子,将黑方活着的棋子的权重累加出一个总分。因为黑方是电脑,所以返回的局面分应该以黑方的角度计算,返回黑棋总分-红棋总分。

3.电脑走棋

这一部分在上面的click函数中有体现,请自行往上翻。

本片博客开始涉及到人工智能的一些基础算法,当然不是特别高级,还请勿喷。感兴趣的就可以自己动手实现一下啦!

象棋人工智能算法的C++实现(四)——人工智能的开端相关推荐

  1. 《人工智能算法工程师(高级)》

    工业和信息化部<人工智能算法工程师(高级)>职业能力培训项目 ​ 工信部课程链接: 工业和信息化部<人工智能算法工程师>职业能力培训项目https://www.tech-ski ...

  2. 数字图像处理:图像分割 人工智能算法在图像处理中的应用

    人工智能算法在图像处理中的应用 人工智能算法包括遗传算法.蚁群算法.模拟退火算法和粒子群算法等,在图像边缘检测.图像分割.图像识别.图像匹配.图像分类等领域有广泛应用.本文首先介绍常用人工智能算法的的 ...

  3. 人工智能生态环境预测_2020年全球人工智能芯片发展趋势及市场规模预测

    中商情报网讯:智能芯片是面向人工智能领域而专门设计的芯片,其架构和指令集针对人工智能领域中的各类算法和应用作了专门优化,可高效支持视觉.语音.自然语言处理和传统机器学习等智能处理任务.采用专门为人工智 ...

  4. 象棋人工智能算法的C++实现(一)

    前言:自AlphaGo战胜世界著名九段围棋手李世石之后,我就对棋类人工智能产生了极大的兴趣,并想要自己实现象棋的人工智能.然而那个时候我还在读高二,没有这么深厚的代码基础,所以那个时候也就只能想想了. ...

  5. 《深度学习,统计学习,数学基础》人工智能算法工程师手册:程序员写的AI书,50 章一网打尽...

    来源:专知 本文约3400字,建议阅读10+分钟. 免费开源人工智能手册,带你快速上手写代码! [ 导读 ]市面上很多人工智能相关的书籍.大部分的书,面向小白,内容深度不够:小部分教材书或者科研书,内 ...

  6. 深思:外卖背后的人工智能算法揭秘

    知识积累带来规模递增,规模递增引发市场集中. 当一个行业可以以"流水线"的形式固定下来后,这个行业中,人的价值就被越来越弱化与微不足道,从身体.动作.时间.精力等,都被重复的机器与 ...

  7. 人工智能算法的可解释性方法研究

    来源:数学与人工智能 摘要 以深度学习为代表的人工智能技术在信息领域的应用,极大地提高了信息的利用效率和挖掘价值,深刻的影响了各领域的业务形态,同时也引发了监管部门和用户对这一新技术运用中出现的 &q ...

  8. 人工智能算法通俗讲解系列(二):逻辑回归

    2019独角兽企业重金招聘Python工程师标准>>> 今天,我们介绍的机器学习算法叫逻辑回归.它英语名称是Logistic Regression,简称LR. 跟之前一样,介绍这个算 ...

  9. 智能算法和人工智能算法,人工智能算法概念股票

    人工智能股票有哪些? 1.苏州科达:苏州科达科技股份有限公司是领先的视讯与安防产品及解决方案提供商,致力于以视频会议.视频监控以及丰富的视频应用解决方案帮助各类政府及企业客户解决可视化沟通与管理难题. ...

  10. 【研究计划书】基于人工智能算法的肿瘤代谢问题研究

    基于人工智能算法的肿瘤代谢问题研究 基于人工智能算法的肿瘤代谢问题研究 一.研究概述 1.1 研究背景 1.2 研究现状 1.3 研究方法 二.研究内容 2.1 肿瘤代谢过程和生物标志物识别 2.2 ...

最新文章

  1. 17个Python骚操作,你都Ok吗?
  2. mysql建立数据浏览器_一个简单的MySQL数据浏览器
  3. 深度学习(训练/开发/测试集)的划分技巧
  4. axure7.0元件库 安卓_AxureRP 7.0 元件库下载
  5. Ai写的文章会死掉至少90%的创作者,作为图文自媒体,如何破局?
  6. python装饰器详细剖析
  7. 安装windows 10操作系统
  8. 列表是不是python数据类型的是_在Python中,一个列表中的数据类型是否可以不相同?(回答可以or不可以)...
  9. matlab 输入方程组,弱弱地问,如何输入以下方程组?
  10. hive 操作(五)——常用内置函数
  11. 无根树的同构:Hash最小表示法(bzoj 4337: BJOI2015 树的同构)
  12. 二维数组作为函数的实参,定义函数形参的方法
  13. System.Trunc、System.Round、System.Int - 返回整数部分
  14. linux 切换内核版本,切换 Linux 内核版本
  15. 时空图卷积网络:一种用于交通预测的深度学习框架
  16. VS Code Material Icon Theme插件设置自定义文件夹图标关联
  17. SSM框架搭建及项目实战
  18. [C++][linux]C++实现类似C#AutoResetEvent或者win C++的SetEvent
  19. 嵌入式开发之NorFlash 和NandFlash
  20. 声网首发RTE行业专著《实时万象》,拉开RTE2022序幕

热门文章

  1. A系统跨域访问其他系统页面
  2. 操作vuex中的数据报错 Do not mutate vuex store state outside mutation handlers
  3. 2-6实变函数之微分与不定积分
  4. 数据挖掘期末知识点总结
  5. Unity最全渲染优化(LOD、遮挡剔除、光照贴图、Mash合并)
  6. 英安特1600说明书_英安特报警主机修改时间 英安特1600简易编程
  7. 非标准武术擂台机器人的设计思想——灰度传感器的使用
  8. 【SDOI2010】古代猪文
  9. 分析优酷2016.04最新视频加密算法
  10. 本文为大家解释,Dapr是比SpringCloud和Istio更优雅的微服务框架的原因是什么