一字棋实验报告即程序代码
更新时间:2023-09-26 12:01:01 阅读量: 综合文库 文档下载
- 一字棋实验报告推荐度:
- 相关推荐
一字棋实验报告
题 目: 一字棋 学 号: 姓 名: 专 业: 教 师:
XXXX大学 计算机科学与技术学院
摘要:本实验的思想有别于其他实验,程序实现起来相对简单。在人机对垒中,分别编
写了计算机走步Mac函数,人走步User函数,评分value函数,判定输赢CheckWin函数,以及打印PrintQP函数和主函数。本实验的创新点主要集中在Mac函数和value函数。计算机在走步之前先将当前棋盘复制给临时棋盘,在此我定义了两个临时棋盘。在临时棋盘1中计算机试探性地走了一步,相应地在临时棋盘2中的相同位置计算机帮人走了一步,接下来分别对两个临时棋盘调用CheckWin函数,根据返回的结果分别选择性地记录该走步的坐标位置。最后计算机再将临时棋盘1送入value函数,并记录评分。重置临时棋盘1和2,依次对所有空缺位置进行试探。根据返回的结果选择合适的坐标位置。而value函数实现起来相对比较简单,简化了极大极小分析法。返回的值等于所有空格上都放上计算机的棋子后,计算机的三个棋子所组成的行、列及对角线的总数减去所有空格上都放上人的棋子后,人的三个棋子所组成的行、列及对角线的总数。而在机机对垒中的Mac1函数和Mac2函数比较相似,其他函数类似。
关键词: 极大极小分析法 临时棋盘 试探评价
一、一字棋游戏的文字描述
“一字棋”游戏(又叫“三字棋”或“井字棋”),是一款十分经典的益智小游戏。游戏双方在一个3*3的格子上依次下入自己的棋子,任何一方首先三子连成一线即获胜利,游戏结束。
二、一字棋对垒过程计算机描述和实现
首先我定义一个3*3的二维数组,作为一字棋的棋盘。
1、 主函数main
程序输出当前棋盘并提示判断是否玩家先走步。然后玩家电脑依次走步,当当前棋盘能够判断输赢时,游戏结束,否则直到棋盘下满,游戏结束。
2、 打印函数PrintQP
打印二维数组,即当前棋盘。
3、 玩家走步函数User
实现玩家的走步,并判断玩家的走步是否有误,返回结果。
4、 计算机走步函数Mac
该函数是整个程序实现智能的关键所在,函数中定义两个临时棋盘,一个是给计算机试探走步使用,另一个是计算机替玩家走步使用,并结合其他的判断语句和评价函数value,得出一个最佳的走步坐标,并实现。
5、 评价函数value
Value函数采用极大极小函数的思想,并做了适当的简化。该函数对当前棋盘直接计算val的值。Val的值等于所有空格上都放上计算机的棋子后,计算机的三个棋子所组成的行、列及对角线的总数减去所有空格上都放上人的棋子后,人的三个棋子所组成的行、列及对角线的总数。返回该值。
6、 判定输赢函数CheckWin
因为每次导致输赢的只会是当前放置的棋子,输赢算法中只需从当前点开始扫描判断是否已经形成三子。对于这个子的八个方向判断是否已经形成三子。如果有,则说明有一方胜利,如果没有则继续搜索,直到有一方胜利或者搜索完整个棋盘。
三、实例
本实验有人机对垒和机机对垒。
1、 人机对垒:
2、机机对垒:
四、尝试考虑五子棋的实现
五子棋和一字棋在性质上挺相似的,只是将棋盘扩大,棋子的连线增加到5个。但五子棋所考虑的情况将更加复杂,五子棋的棋盘不在局限在5*5中,对智能的要求也是非常之高。
五、体会
本次实验在对极大极小分析法理解的基础之上,结合自己的一些想法编写而成,在程序实现初期,出现了很多BUG,例如计算机不能准确地判断对自己构成危险的走步,还有就是计算机在可以获胜情况下,没有走对棋子等等。还好这些问题在接下来对程序的不断完善中得以解决。
六、参考文献
七、程序源代码见附件。
#include
void PrintQP() { for(int i=0;i<3;i++) { for(int j=0;j<3;j++) cout< int CheckWin(int b[3][3]) { for(int i=0;i<3;i++) { if((b[i][0]==1&&b[i][1]==1&&b[i][2]==1)||(b[0][i]==1&&b[1][i]==1&&b[2][i]==1)) { return 1; } if((b[i][0]==-1&&b[i][1]==-1&&b[i][2]==-1)||(b[0][i]==-1&&b[1][i]==-1&&b[2][i]==-1)) { return -1; } } if((b[0][0]==1&&b[1][1]==1&&b[2][2]==1)||(b[2][0]==1&&b[1][1]==1&&b[0][2]==1)) { return 1; } if((b[0][0]==-1&&b[1][1]==-1&&b[2][2]==-1)||(b[2][0]==-1&&b[1][1]==-1&&b[0][2]==-1)) { return -1; } return 0; } int value(int a[3][3]) { int tmpQP3[3][3],tmpQP4[3][3]; int r=0; for(int i=0;i<3;i++) { for(int j=0;j<3;j++) { if(a[i][j]==0) { tmpQP3[i][j]=1; tmpQP4[i][j]=-1; } else { tmpQP3[i][j]=a[i][j]; tmpQP4[i][j]=a[i][j]; } } } for(i=0;i<3;i++) { r+=(tmpQP3[i][0]+tmpQP3[i][1]+tmpQP3[i][2])/3; r+=(tmpQP3[0][i]+tmpQP3[1][i]+tmpQP3[2][i])/3; r+=(tmpQP4[i][0]+tmpQP4[i][1]+tmpQP4[i][2])/3; r+=(tmpQP4[0][i]+tmpQP4[1][i]+tmpQP4[2][i])/3; } r+=(tmpQP3[0][0]+tmpQP3[1][1]+tmpQP3[2][2])/3; r+=(tmpQP3[2][0]+tmpQP3[1][1]+tmpQP3[0][2])/3; r+=(tmpQP4[0][0]+tmpQP4[1][1]+tmpQP4[2][2])/3; r+=(tmpQP4[2][0]+tmpQP4[1][1]+tmpQP4[0][2])/3; return r; } void Mac1() { int pos1=0; int pos2=0; int pos3=0; int val=100; int x,y,pos; int tmpQP1[3][3],tmpQP2[3][3]; for(int i=0;i<3;i++) { for(int j=0;j<3;j++) { tmpQP1[i][j]=QP[i][j]; tmpQP2[i][j]=QP[i][j]; } } for(i=0;i<3;i++) { for(int j=0;j<3;j++) { if(QP[i][j]==0) { tmpQP1[i][j]=1; tmpQP2[i][j]=-1; if(CheckWin(tmpQP2)==-1) { pos3=10*(i+1)+j+1; } if(CheckWin(tmpQP1)==1) { pos1=10*(i+1)+j+1; } else if(value(tmpQP2) tmpQP1[i][j]=0; tmpQP2[i][j]=0; } } } if(pos3!=0) pos=pos3; else if(pos1!=0) pos=pos1; else pos=pos2; x=pos/10; y=pos; cout<<\计算机1走步为:\QP[x-1][y-1]=-1; } void Mac2() { int pos1=0; int pos2=0; int pos3=0; int val=-100; int x,y,pos; int tmpQP1[3][3],tmpQP2[3][3]; for(int i=0;i<3;i++) { for(int j=0;j<3;j++) { tmpQP1[i][j]=QP[i][j]; tmpQP2[i][j]=QP[i][j]; } } for(i=0;i<3;i++) { for(int j=0;j<3;j++) { if(QP[i][j]==0) { tmpQP1[i][j]=1; tmpQP2[i][j]=-1; if(CheckWin(tmpQP1)==1) { pos3=10*(i+1)+j+1; } if(CheckWin(tmpQP2)==-1) { pos1=10*(i+1)+j+1; } else if(value(tmpQP1)>val) { val=value(tmpQP1); pos2=10*(i+1)+j+1; } tmpQP1[i][j]=0; tmpQP2[i][j]=0; } } } if(pos3!=0) pos=pos3; else if(pos1!=0) pos=pos1; else pos=pos2; x=pos/10; y=pos; cout<<\计算机2走步为:\QP[x-1][y-1]=1; } void main() { int num=0; char IsFirst; cout<<\打印棋盘:\ PrintQP(); cout<<\计算机1先走步(y/n):\ cin>>IsFirst; while(IsFirst!='y'&&IsFirst!='n') { cout<<\输入有误!\计算机1先走步(y/n):\ cin>>IsFirst; } if(IsFirst=='y') { Mac1(); num++; PrintQP(); for(;num<9;) { Mac2(); PrintQP(); if(CheckWin(QP)==1) { cout<<\计算机2获胜\ break; } num++; Mac1(); PrintQP(); if(CheckWin(QP)==-1) { cout<<\计算机1获胜\ break; } num++; if(num==9) { if(CheckWin(QP)==0) cout<<\平局\ } } } else { for(;num<9;) { Mac2(); PrintQP(); if(CheckWin(QP)==1) { cout<<\计算机2获胜\ break; } num++; if(num==9) { if(CheckWin(QP)==0) cout<<\平局\ break; } Mac1(); PrintQP(); if(CheckWin(QP)==-1) { cout<<\计算机1获胜\ break; } num++; } } } #include void PrintQP() { for(int i=0;i<3;i++) { for(int j=0;j<3;j++) cout< int CheckWin(int b[3][3]) { for(int i=0;i<3;i++) { if((b[i][0]==1&&b[i][1]==1&&b[i][2]==1)||(b[0][i]==1&&b[1][i]==1&&b[2][i]==1)) { return 1; } if((b[i][0]==-1&&b[i][1]==-1&&b[i][2]==-1)||(b[0][i]==-1&&b[1][i]==-1&&b[2][i]==-1)) { return -1; } } if((b[0][0]==1&&b[1][1]==1&&b[2][2]==1)||(b[2][0]==1&&b[1][1]==1&&b[0][2]==1)) { return 1; } if((b[0][0]==-1&&b[1][1]==-1&&b[2][2]==-1)||(b[2][0]==-1&&b[1][1]==-1&&b[0][2]==-1)) { return -1; } return 0; } int value(int a[3][3]) { int tmpQP3[3][3],tmpQP4[3][3]; int r=0; for(int i=0;i<3;i++) { for(int j=0;j<3;j++) { if(a[i][j]==0) { tmpQP3[i][j]=1; tmpQP4[i][j]=-1; } else { tmpQP3[i][j]=a[i][j]; tmpQP4[i][j]=a[i][j]; } } } for(i=0;i<3;i++) { r+=(tmpQP3[i][0]+tmpQP3[i][1]+tmpQP3[i][2])/3; r+=(tmpQP3[0][i]+tmpQP3[1][i]+tmpQP3[2][i])/3; r+=(tmpQP4[i][0]+tmpQP4[i][1]+tmpQP4[i][2])/3; r+=(tmpQP4[0][i]+tmpQP4[1][i]+tmpQP4[2][i])/3; } r+=(tmpQP3[0][0]+tmpQP3[1][1]+tmpQP3[2][2])/3; r+=(tmpQP3[2][0]+tmpQP3[1][1]+tmpQP3[0][2])/3; r+=(tmpQP4[0][0]+tmpQP4[1][1]+tmpQP4[2][2])/3; r+=(tmpQP4[2][0]+tmpQP4[1][1]+tmpQP4[0][2])/3; return r; } void User() { int pos,x,y; L:cout<<\请输入行列号(xy)\ cin>>pos; x=pos/10; y=pos; if(x>0&&x<4&&y>0&&y<4&&QP[x-1][y-1]==0) { QP[x-1][y-1]=-1; } else { cout<<\输入有误!\ goto L; } } void Mac() { int pos1=0; int pos2=0; int pos3=0; int val=-100; int x,y,pos; int tmpQP1[3][3],tmpQP2[3][3]; for(int i=0;i<3;i++) { for(int j=0;j<3;j++) { tmpQP1[i][j]=QP[i][j]; tmpQP2[i][j]=QP[i][j]; } } for(i=0;i<3;i++) { for(int j=0;j<3;j++) { if(QP[i][j]==0) { tmpQP1[i][j]=1; tmpQP2[i][j]=-1; if(CheckWin(tmpQP1)==1) { pos3=10*(i+1)+j+1; } if(CheckWin(tmpQP2)==-1) { pos1=10*(i+1)+j+1; } else if(value(tmpQP1)>val) { val=value(tmpQP1); pos2=10*(i+1)+j+1; } tmpQP1[i][j]=0; tmpQP2[i][j]=0; } } } if(pos3!=0) pos=pos3; else if(pos1!=0) pos=pos1; else pos=pos2; x=pos/10; y=pos; cout<<\计算机走步为:\QP[x-1][y-1]=1; } void main() { int num=0; char IsFirst; cout<<\打印棋盘:\PrintQP(); cout<<\你想先走步(y/n):\cin>>IsFirst; while(IsFirst!='y'&&IsFirst!='n') { cout<<\输入有误!\你想先走步(y/n):\ cin>>IsFirst; } if(IsFirst=='y') { User(); num++; PrintQP(); for(;num<9;) { Mac(); PrintQP(); if(CheckWin(QP)==1) { cout<<\计算机获胜\ break; } num++; User(); PrintQP(); if(CheckWin(QP)==-1) { cout<<\你获胜\ break; } num++; if(num==9) { if(CheckWin(QP)==0) cout<<\平局\ } } } else { for(;num<9;) { Mac(); PrintQP(); if(CheckWin(QP)==1) { cout<<\计算机获胜\ break; } num++; if(num==9) } } } { if(CheckWin(QP)==0) cout<<\平局\ break; } User(); PrintQP(); if(CheckWin(QP)==-1) { cout<<\你获胜\ break; } num++;
正在阅读:
一字棋实验报告即程序代码09-26
学位论文-—基于企业生命周期的海澜之家人力资源管理研究03-01
研修心语01-01
关于长效干扰素佩乐能和派罗欣的治疗心得01-20
工商管理专业毕业论文任务书04-12
上市公司财务舞弊的动因及防范措施06-05
建筑工程班组承包协议书(木工组)05-18
浅谈档案现状及信息化建设的重要性12-14
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 一字
- 实验
- 代码
- 程序
- 报告