一字棋实验报告即程序代码

更新时间: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 int QP[3][3];

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 int QP[3][3];

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++;

本文来源:https://www.bwwdw.com/article/qiqd.html

Top