五子棋智能分析算法的设计与实现
目录
摘要3
关键词3
Abstract3
Key words3
引言4
1程序开发简述4
1.1程序开发环境 4
1.2程序开发条件 4
2 棋局的表示与绘制5
2.1 棋局的表示5
2.2 棋局的绘制5
3算法分析7
3.1博弈树7
3.2 Alphabeta剪枝算法7
4 估值函数与其他设计10
4.1 估值函数10
4.2 其他设计11
4.2.1 AI模式选择 11
4.2.2 对战模式选择12
4.2.3 悔棋算法设计12
5 程序优化与运行效果13
5.1 程序优化13
5.2 运行效果14
致谢15
参考文献15
五子棋智能分析算法的设计与实现
引言
人工智能最早起源于1956年夏季的一场由一批年轻科学家召开的聚会,在聚会上,这群年轻的科学家们互相交流,互相学习,并大胆预测了未来计算机解决实际问题的走势情况,而且提出了具有革命性意义的“人工智能”这一学术术语。此后,人工智能不断发展壮大,成为现在炙手可热的一个学科[1]。
经过六十年的不断发展,人工智能一直走在学术研究的前沿,被一线的科学家和研究人员所喜爱。总的说来,人工智能的研究目标就是让计算机能够具有人类一样学习能力和思考能力。到目前为止,科学家们已经造出了卫星,空调,电话等
*51今日免费论文网|www.jxszl.com +Q: ^3^5^1^9^1^6^0^7^2^*
已经改变了人类生活环境的种种设备。然而这些设备只是具备了一些功能,并不具备独立思考的能力。但是怎么样才能让一台机器具有智慧呢?这也是众多科学家们在思考和研究的一个重要的问题。我们人类的大脑结构极其复杂,里面有数以亿计的脑细胞在不断的工作,这样才成就了人类现在才具有的思考和解决问题的能力。这样看来,要让一台机器达到甚至超过人脑的智慧程度,似乎是一件不可能完成的任务,这仿佛是天方夜谭。但计算机的出现,使这个目标离我们越来越近,不再遥不可及[1]。
当计算机这样一个强大的技术工具出现之后,如何利用计算机来模拟人类大脑的思考能力成为众多科学家们奋斗的一个主要的目标。从计算机的诞生到现在,无数的科学家都为之付出了无尽的辛酸和努力,才使得人工智能达到现在这样的一个高度。人工智能这一学科如此热门,以至于现在几乎世界上所有的大学都设立了这一学科,无数的教授和学生都在学习和研究这一科学。在这种情况下,也许在不远的将来,人工智能可能会改变我们现在的世界[3]。
而五子棋作为棋类益智游戏的一种,深受许多人喜爱。人工智能的发展也使得计算机的“棋力”超过人类成为可能。而如何通过人工智能来提高计算机下棋的“智力”是本文研究的一个重要的问题。本文旨在设计与实现一个智能五子棋的程序,并尽最大能力使其达到更高的“智能”。
1 程序开发简介
程序开发环境
本程序采用C++作为编程语言。C++是以C语言为基础而设计出来的一种支持面向对象的语言,其编程领域宽广,经常运用于系统层的开发和应用端的编程,是至今为止最受广大程序员喜爱的编程语言之一。本程序以Visual Studio 2015为开发环境。Visual Studio 2015是微软公司为广大开发者提供的一套强大的开发工具,其包括多种开发语言并且集成了Windows系统平台开发所需要用到的大部分功能。Visual Studio 2015是目前Windows平台应用程序和基于系统层研发最为流行的开发环境。
程序开发条件
事先了解五子棋的常规开局和下法,并对包括寒星局,溪月局,残月局在内的多种棋局进行学习。这样在程序设计时就可以针对不同的下法,让计算机做出更加合理的选择。同时,对编程语言进行深度学习,以保证能完成程序的设计与开发。
2 棋局的表示与绘制
2.1 棋局的表示
五子棋的棋盘采用15*15的大小,当在人机模式时,默认人为黑方,机器为白方。五子棋。五子棋规则规定黑方先下子,因此人执黑先行。定义以下变量:
Const int MAXCREASE = 4; // 此项目为五子棋,所以最大数目为51
const UINT COLUMNS = 15; // 棋盘的列数
const UINT ROWS = 15; // 棋盘的行数
enum enumChessColor {NONE,WHITE,BLACK}; // NONE 无棋子,WHITE白方棋子, //BLACK 黑方棋子
2.2 棋局的绘制
创建一个绘制棋局的类如下:
class CChessDraw
{
public: //公有变量与函数
CChessDraw(void);
~CChessDraw(void);
void InitBoard(CRect rect,UINT uiRows, UINT uiCols,UINT uiBoardWidth, UINT uiPieceRadius);
void SetDC(CDC* pDC);
void DrawBackground(); // 画背景
void DrawBoard(); // 画棋盘
BOOL DrawPiece(CPoint pt, BOOL bBlack); // 画棋子
BOOL DrawPiece(UINT uiX,UINT uiY,BOOL bBlack); // 画棋子
void DrawPieceCur(CPoint pt); // 给当前的棋子加上标记
void DrawPieceCur(UINT uiX, UINT uiY); // 给当前的棋子加上标记
CRect GetRectBoard(); // 获取棋盘区域
BOOL GetCoordinateWithPoint(CPoint& pt, UINT* puiX = NULL, UINT* puiY = NULL); // 已知pt,获取棋盘坐标点(puiX, puiY)
原文链接:http://www.jxszl.com/jsj/xxaq/45415.html