-剪枝实现的一字棋实验报告.doc

上传人:wj 文档编号:525896 上传时间:2023-04-29 格式:DOC 页数:10 大小:305.50KB
下载 相关 举报
-剪枝实现的一字棋实验报告.doc_第1页
第1页 / 共10页
-剪枝实现的一字棋实验报告.doc_第2页
第2页 / 共10页
-剪枝实现的一字棋实验报告.doc_第3页
第3页 / 共10页
-剪枝实现的一字棋实验报告.doc_第4页
第4页 / 共10页
-剪枝实现的一字棋实验报告.doc_第5页
第5页 / 共10页
-剪枝实现的一字棋实验报告.doc_第6页
第6页 / 共10页
-剪枝实现的一字棋实验报告.doc_第7页
第7页 / 共10页
-剪枝实现的一字棋实验报告.doc_第8页
第8页 / 共10页
-剪枝实现的一字棋实验报告.doc_第9页
第9页 / 共10页
-剪枝实现的一字棋实验报告.doc_第10页
第10页 / 共10页
亲,该文档总共10页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

-剪枝实现的一字棋实验报告.doc

《-剪枝实现的一字棋实验报告.doc》由会员分享,可在线阅读,更多相关《-剪枝实现的一字棋实验报告.doc(10页珍藏版)》请在冰点文库上搜索。

-剪枝实现的一字棋实验报告.doc

人工智能大作业

——极大极小算法和a-b剪枝实现一字棋

学院:

班级:

姓名:

学号:

辅导老师:

日期:

目录

一、实验目的 3

二、实验环境 3

三、实验原理 3

3.1游戏规则 3

3.2极小极大分析法 3

3.3a-b剪枝算法 4

3.4输赢判断算法设计 5

四、数据结构 5

4.1程序流程 5

4.2主要成员函数 5

4.2.1估值函数 5

4.2.2Alpha-Beta剪枝算法 6

4.2.3判断胜负 6

4.2.4鼠标左键响应 6

4.2.5Draw系列函数 6

4.2.6COMPUTERorPLAYER先走 7

五、实验内容 7

5.1基本功能简介 7

5.2流程图. 8

5.2.1估价函数 8

5.2.2Alpha-Beta剪枝 9

六、实验小结 10

七、实验源代码 10

一、实验目的

(1)学习极大极小搜索及a-b剪枝。

(2)利用学到的算法实现一字棋。

二、实验环境

(1)硬件环境:

网络环境中的微型计算机。

(2)软件环境:

Windows操作系统,MicrosoftVisualC++语言。

三、实验原理

3.1游戏规则

"一字棋"游戏(又叫"三子棋"或"井字棋"),是一款十分经典的益智小游戏。

"井字棋"

的棋盘很简单,是一个3×3的格子,很像中国文字中的"井"字,所以得名"井字棋"。

"井字棋"游戏的规则与"五子棋"十分类似,"五子棋"的规则是一方首先五子连成一线就胜利;"井字棋"是一方首先三子连成一线就胜利。

井字棋(英文名Tic-Tac-Toe)

井字棋的出现年代估计已不可考,西方人认为这是由古罗马人发明的;但我们中国人认为,既然咱们都发明了围棋、五子棋,那发明个把井字棋自然是不在话下。

这些纯粹是口舌之争了,暂且不提。

3.2极小极大分析法

设有九个空格,由MAX,MIN二人对弈,轮到谁走棋谁就往空格上放一只自己的棋子,谁先使自己的棋子构成"三子成一线"(同一行或列或对角线全是某人的棋子),谁就取得了胜利。

用圆圈表示MAX,用叉号代表MIN。

比如左图中就是MAX取胜的棋局。

估价函数定义如下:

设棋局为P,估价函数为e(P)。

(1)若P对任何一方来说都不是获胜的位置,则e(P)=e(那些仍为MAX空着的完全的行、列或对角线的总数)-e(那些仍为MIN空着的完全的行、列或对角线的总数)

(2)若P是MAX必胜的棋局,则e(P)=+¥(实际上赋了60)。

(3)若P是B必胜的棋局,则e(P)=-¥(实际上赋了-20)。

比如P如下图示,则e(P)=5-4=1

需要说明的是,+¥赋60,-¥赋-20的原因是机器若赢了,则不论玩家下一步是否会赢,都会走这步必赢棋。

3.3a-b剪枝算法

上述的极小极大分析法,实际是先生成一棵博弈树,然后再计算其倒推值,至使极小极大分析法效率较低。

于是在极小极大分析法的基础上提出了a-b剪枝技术。

a-b剪枝技术的基本思想或算法是,边生成博弈树边计算评估各节点的倒推值,并且根据评估出的倒推值范围,及时停止扩展那些已无必要再扩展的子节点,即相当于剪去了博弈树上的一些分枝,从而节约了机器开销,提高了搜索效率。

具体的剪枝方法如下:

(1)对于一个与节点MIN,若能估计出其倒推值的上确界b,并且这个b值不大于MIN的父节点(一定是或节点)的估计倒推值的下确界a,即a³b,则就不必再扩展该MIN节点的其余子节点了(因为这些节点的估值对MIN父节点的倒推值已无任何影响了)。

这一过程称为a剪枝。

(2)对于一个或节点MAX,若能估计出其倒推值的下确界a,并且这个a值不小于MAX的父节点(一定是与节点)的估计倒推值的上确界b,即a³b,则就不必再扩展该MAX节点的其余子节点了(因为这些节点的估值对MAX父节点的倒推值已无任何影响了)。

这一过程称为b剪枝。

从算法中看到:

(1)MAX节点(包括起始节点)的a值永不减少;

(2)MIN节点(包括起始节点)的b值永不增加。

在搜索期间,a和b值的计算如下:

(1)一个MAX节点的a值等于其后继节点当前最大的最终倒推值。

(2)一个MIN节点的b值等于其后继节点当前最小的最终倒推值。

3.4输赢判断算法设计

因为每次导致输赢的只会是当前放置的棋子,输赢算法中只需从当前点开始扫描判断是否已经形成三子。

对于这个子的八个方向判断是否已经形成三子。

如果有,则说明有一方胜利,如果没有则继续搜索,直到有一方胜利或者搜索完整个棋盘。

四、数据结构

4.1程序流程

4.2主要成员函数

4.2.1估值函数

估价函数:

intCTic_MFCDlg:

:

evaluate(intboard[])

完成功能:

根据输入棋盘,判断当前棋盘的估值,估价函数为前面所讲:

若是MAX的必胜局,则e=+INFINITY,这里为+60

若是MIN的必胜局,则e=-INFINITY,这里为-20,这样赋值的原因是机器若赢了,则不考虑其它因素。

其它情况,棋盘上能使CUMPUTER成三子一线的数目为e1

棋盘上能使PLAYER成三子一线的数目为e2,

e1-e2作为最终权值

参数:

board:

待评估棋盘

返回:

评估结果

4.2.2Alpha-Beta剪枝算法

AlphaBeta剪枝主函数:

intCTic_MFCDlg:

:

AlphaBeta(intBoard[],intDepth,intturn,intAlpha,intBeta,int*result)

完成功能:

根据输入棋盘,搜索深度,及其他参数,给出一个相应的最优解,存入result中。

参数:

board:

待评估棋盘

Depth:

搜索深度

turn:

当前是机器走(MAX结点)还是玩家走(MIN结点)

Alpha:

alpha值,第一次调用默认-100

Beta:

beta值,第一次调用默认+100

result:

输出结果

返回:

若当前点为MAX节点,则返回alpha值;

若当前点为MIN节点,则返回beta值

4.2.3判断胜负

intCTic_MFCDlg:

:

isWin(intcurPos)

完成功能:

根据输入棋盘,判断当前棋盘的结果,COMPUTER胜?

PLAYER胜?

平局?

参数:

board:

待评估棋盘

返回:

-1表示:

尚未结束

0表示:

平局

1表示:

PLAYER胜

2表示:

COMPUTER胜

4.2.4鼠标左键响应

voidCTic_MFCDlg:

:

OnLButtonDown(UINTnFlags,CPointpoint)

完成功能:

鼠标左键相应,在点击的那格放置玩家棋子,之后再相应计算机走下一步

4.2.5Draw系列函数

voidCTic_MFCDlg:

:

DrawBoard(CDC*pDC)

完成功能:

根据Chess棋盘数组画出棋盘

voidCTic_MFCDlg:

:

DrawO(CDC*pDC,intPos)

完成功能:

在棋盘上画一个O,电脑

voidCTic_MFCDlg:

:

DrawX(CDC*pDC,intPos)

完成功能:

在棋盘上画一个X,玩家

4.2.6COMPUTERorPLAYER先走

voidCTic_MFCDlg:

:

OnStartCom()

完成功能:

计算机先走

voidCTic_MFCDlg:

:

OnStartPly()

完成功能:

玩家先走

五、实验内容

5.1基本功能简介

本实验的界面采用C++的MFC完成,总的界面如下,有以下功能:

1.搜索树深度的设置;

2.机器先走或者玩家先走;

3.游戏胜负或者平局判断。

4.鼠标在游戏开始之前或者结束之后点击棋盘不会有相应,并会提示用户先开始游戏;

5.鼠标点击棋盘区域之外,不会有相应

6.搜索深度已经设置区域

7.同一棋盘格子点击只响应一次

这里需要说明的是,搜索深度并非越深越好,局限于估值函数是根据能够成三子一线的数目决定的,所以搜索到最后一层,如果有人胜,则出现¥¥,如果没人胜,则三子一线数目为0,所以毫无意义。

如果搜索深度取到4或者以上,会发现电脑会走出一些很"笨"的棋,就是这个原因。

经测试发现,搜索深度为2时效果最好,这也是我为什么默认值取2的原因。

5.2流程图.

5.2.1估价函数

5.2.2Alpha-Beta剪枝

六、实验小结

通过本次实验进一步对老师课堂上所讲的AlphaBeta剪枝有了更加深刻的了解,对它的一般实现有了初步的认识。

复习了大二时所学习的C++语言,并且对MFC程序设计有了更深的了解。

七、实验源代码

源代码见附件‘一字棋程序’。

10

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2