版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、人 工 智 能实验报告姓 名:学 号:院 系:类 别:科 目:人 工 智 能时 间:20170104目录一、实验及其界面显示11.一字琪玩法介绍12.一字棋程序所用软件13.实验调试24.运行程序25.可能出现的运行结果:4二、程序分析51.checkWin函数52Search函数53Checkwinning函数64Man函数65计算机落子位置76Display函数87main函数8三、针对玩家赢的情况对此程序进行分析:8四、实验心得10五、附源代码:10一、 实验及其界面显示1. 一字琪玩法介绍一字棋由电脑和人轮流来下,分别用“X”和“O”来代替自身的棋子(O表示电脑落子位置,X表示人落子位
2、置)。棋盘分9个格,双方可以在轮到自己下的时候,可以用棋子占领其中一个空的格子。如果双方中有一方的棋子可以连成一条直线,则这一方判胜,对方判负。当所有的格子都被占领,但双方都无法使棋子连成一条直线的话,则判和棋。此程序1-9分别表示棋盘上的不同位置,如下图所示:1234567892. 一字棋程序所用软件软件名称:Dev-C+。由于我使用的电脑是win10系统,无法兼容vc6。所以使用Dev-C+这个可以与win10兼容的软件。Dev-C+是一个C&C+开发工具。软件界面如下所示:3. 实验调试将程序进行调试,没有错误,然后运行。调试结果如下:4. 运行程序运行程序,有两种选择:人先走,和电脑先
3、走。显示界面如下:输入数字1:输入数字5(表示走在中间位置):输入数字3:输入数字4:输入数字2:输入数字9:5. 可能出现的运行结果:通过验证,发现此程序可能出现三种结果:这局是平局、孙伟输了、恭喜孙伟赢了。还可以终止此场游戏,但是玩家孙伟赢了,和预期有所出入,后面将具体分析。下图是各种情况出现的截图:二、 程序分析1. checkWin函数应用程序主要包含checkWin函数,用来判断胜负,列出了一字棋可以赢的8种可能;2Search函数Search函数主要作为估价函数,主要用于计算机落棋时来判断落子位置的。所有的估值都是根据一字棋可能赢的8种情况来的。对于计算机可以落子的每一种情况进行判
4、断,所得到的的最大值,即计算机应该落子的位置。例如:若果计算机先走,则返回的f值如下表所示:落子位置123456789返回的f值323242323从上表可以看出当落子位置为中间位置时,返回的f值最大为4,所以计算机会选择位置5落子。3Checkwinning函数用来确定是否已经有两点成线,返回成线的位置。4Man函数表示玩家落子位置5计算机落子位置通过Search函数的值以及Checkwinning函数来确定落子位置。Checkwinning函数的优先级高于Search函数。6Display函数用来显示棋盘的落子位置。7main函数主函数main函数,通过调用其它函数实现程序本身的功能。三、
5、针对玩家赢的情况对此程序进行分析:以下这种情况是玩家赢,并且所有类似的走法都是玩家赢。运行如下:例如下面这种情况,当玩家先走4时,计算机优先走5。当玩家再走的位置为3时,计算机可以走的位置只有1,2,6,7,8,9,四个位置。但是计算机选择的位置是9,为什么计算机没有选择走位置1?通过对程序的反复校核和思考。终于找到了答案。Checkwinning函数在返回f值之前并不能预测玩家下一步的位置,通过目前棋子的位置也不能满足Checkwinning函数的条件。因此执行Search函数。当玩家再走的位置为3时,计算机可以走的位置只有1,2,6,7,8,9,四个位置。此时各个位置返回的f值如下:落子位
6、置126789返回的f值777888通过比较可以发现:7,8,9三个位置的f值相同且均为最大值。将此三个位置通过Checkwinning函数,可以判断出落子位置是9时,计算机才有赢的可能性,所以选择了9。四、 实验心得通过这次实验发现人工智能是一个非常有意思的科学。并且通过自己的不断尝试与努力,终于将程序运行出来,并且对运行的结果进行了分析。感觉非常有意义,学到了很多,这次实验使我受益匪浅。在此感谢老师的辛苦教学及精心指导! 五、 附源代码:#include #include #include #include #define MAX 1000 /* 定义最大值为1000 */#define
7、MIN -1000 /* 最小值为-1000 */#define NONE 0 /* 如果搜索不到结果,结果NONE */#define DRAW 1 /* 定义平局DRAW为1 */#define C_WIN 2 /* 电脑赢为2 */#define M_WIN 3 /* 人赢为3 */#define QUIT 4 /* 放弃为4 */#define MAN -1 /* 人用-1表示 */#define COM 1 /* 电脑用1表示 */#define TRUE 1 /* 定义b10用来存储棋盘(board) , step表示可以下的步数 ,r表示结果,初始值为NONE;w表示可以赢的位置
8、 */int b10=0,step=9,r=NONE,w=0; /* checkWin函数用来判断胜负,如果有胜负,返回胜方,否则返回NONE */ int checkWin(int t, int p) if (t1=p & t1=t2 & t2=t3) return(p); if (t4=p & t4=t5 & t5=t6) return(p); if (t7=p & t7=t8 & t8=t9) return(p); if (t1=p & t1=t4 & t4=t7) return(p); if (t2=p & t2=t5 & t5=t8) return(p); if (t3=p & t3
9、=t6 & t6=t9) return(p); if (t1=p & t1=t5 & t5=t9) return(p); if (t3=p & t3=t5 & t5=t7) return(p); return(NONE);/* search函数,搜索计算机和人可以羸的机会,用来计算评价值,*/int search(int t) int f=0,k=0; k=checkWin(t,MAN); /* 先判断人是否可以羸 */ if(k=MAN) return MIN; /* 如果可以返回一个最小值 */ if (t1=0 & t2=0 & t3=0) f+; if (t4=0 & t5=0 & t
10、6=0) f+; if (t7=0 & t8=0 & t9=0) f+; if (t1=0 & t4=0 & t7=0) f+; if (t2=0 & t5=0 & t8=0) f+; if (t3=0 & t6=0 & t9=0) f+; if (t1=0 & t5=0 & t9=0) f+; if (t3=0 & t5=0 & t7=0) f+; if (t1=0 & t2=0 & t3=0) f-; if (t4=0 & t5=0 & t6=0) f-; if (t7=0 & t8=0 & t9=0) f-; if (t1=0 & t4=0 & t7=0) f-; if (t2=0 &
11、t5=0 & t8=0) f-; if (t3=0 & t6=0 & t9=0) f-; if (t1=0 & t5=0 & t9=0) f-; if (t3=0 & t5=0 & t7=0) f-; return f; /* 计算评价值,并返回评价值 */* checkWinning函数用来搜索是否已经有两子成线, 并返回成线的位置*/int checkWinning(int p,int t) int i,k=10; for(i=1;i10;i+) if(ti=0) ti=p; if(checkWin(t,p)=p) ti=0; k=i; w+; ti=0; return k;/*displ
12、ay函数用来显示棋盘,并显示结果*/void display(int type) printf(姓名: n); printf(学号: n); printf(学院: n); printf(班级: n); char dis10=; int i; for(i=1;i10;i+) if(bi0) disi=O; printf(n%c|%c|%cn,dis1,dis2,dis3); printf(-n); printf(%c|%c|%cn,dis4,dis5,dis6); printf(-n); printf(%c|%c|%cn,dis7,dis8,dis9); if(type=NONE) printf
13、(请继续); if(type=DRAW) printf(这局是平局!); if(type=C_WIN) printf(孙伟输了); if(type=M_WIN) printf(恭喜孙伟赢了!) ; if(type=QUIT) printf(孙伟停止了这场游戏!);/* 人下的时候执行man函数 */int man() int c; /* 提示信息 */ printf(n请输入您想下的位置,输入0结束(输入1-9分别代表9宫格所在的位置)n); for (c=getche(); ; printf(n), c=getche() ) if (isdigit(c) & bc-48=0) /* 如果用户
14、输入的是0就结束程序 */if(c=0)r=QUIT; return 0;/* 下在用户输入的位置 ,步数减1 */step-;bc-48=MAN;/* 如果步数为0,结果设为平局 */if(step=0) r=DRAW;/* 人赢了,结果为M_WIN */if(checkWin(b,MAN)=MAN)r=M_WIN;return 0; int com() int i,j,t10; int temp,max=MIN-1,f=0,best=1,k,flag; system(cls); /* 如果电脑可以赢下在该位置 */ flag=checkWinning(COM,b); if(flag10)
15、bflag=COM;r=C_WIN;step-;return 0; /* 如果人可以赢,也下在相应的位置 */ flag=checkWinning(MAN,b); if(flag10) bflag=COM;step-;return 0; /* 用t暂时存储棋盘 */ for(i=1;i10;i+) ti=bi; for(i=1;i10;i+) if(ti=0) ti=COM; f=MAX; k=checkWinning(COM,t); /*如果搜索到下了第i格后人可以赢*/ /*就对算法进行剪支,只返回k位置的评价值 */ for(j=1;j10;j+) if(k10) tk=MAN; f=s
16、earch(t); tk=0; break; /* 否则算出每个生成的结点的评价值 */ if(tj=0) tj=MAN; temp=search(t); if(tempmax) /* 在最大层中选择最大的评价值 */ best=i; max=f; bbest=COM; /* 并下在最大层中评价值最大的位置*/ step-; if(step=0) r=DRAW;main() char c; int i; system(cls); printf(姓名: n); printf(学号: n); printf(学院: n); printf(班级: n); for(i=0;i30;i+) printf(*); printf(n是否想先下?(自己先下请输入1,电脑先下请输入2)n); for (c=get
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025至2030高端空气净化产品消费升级趋势与品牌竞争策略研究报告
- 2025至2030保险科技市场发展分析及前景趋势与投融资发展机会研究报告
- 2025-2030中国民用无人机适航审定标准与国际接轨进展报告
- 2025-2030中国母婴电商用户复购率提升与供应链优化研究报告
- 2025-2030中国母婴用品零售渠道变革与消费者行为研究分析报告
- 2025-2030中国母婴用品消费升级与渠道下沉策略报告
- 2026年合肥建设投资控股集团有限公司校园招聘笔试参考题库及答案解析
- 2026年云南电信校园招聘笔试模拟试题及答案解析
- 2025年外科抗粘连产品行业现状分析报告及未来五至十年发展前景预测报告
- 新疆维吾尔自治区乌鲁木齐市达标名校2026年初三下学期第三次强化考试英语试题含解析
- 渣土运输车辆安全培训
- DL-T820.2-2019管道焊接接头超声波检测技术规程第2部分:A型脉冲反射法
- 起重吊装作业安全技术措施
- 春季保养与养生知识讲座
- 推土机配件供货合同
- 江西省修水县黄土坪金矿详查项目环评报告
- 慢性阻塞性肺疾病的早期筛查与管理
- 司法鉴定中的伦理道德问题与应对策略
- 汉唐美术空间表现研究:以敦煌壁画为中心
- 两段式煤气发生炉项目环境影响评估报告
- JJF 1059.1-2012测量不确定度评定与表示
评论
0/150
提交评论