人工智能上机报告.docx
《人工智能上机报告.docx》由会员分享,可在线阅读,更多相关《人工智能上机报告.docx(41页珍藏版)》请在冰豆网上搜索。
人工智能上机报告
人工智能上机报告
项目:
简易五子棋游戏
班级:
学号:
姓名:
指导老师:
2013年6月
目录
一:
实验项目2
二:
程序结构及相关内容介绍2
三:
程序运行界面及使用说明2
四:
主要代码8
Chessboard.cs8
Computer.cs13
Rule.cs18
Stone.cs31
一:
实验项目
综合实验
1.实验目的
理解和掌握博弈树的启发式搜索过程和α-β剪枝技术,能够用某种程序语言开发一个五子棋博弈游戏。
2.实验环境
在微型计算机上,任选一种编程语言。
3.实验要求
(1)设计一个15行15列棋盘,要求自行给出估价函数,按极大极小搜索方法,并采用α-β剪枝技术。
(2)采用人机对弈方式,对弈双方设置不同颜色的棋子,一方走完一步后,等待对方走步,对弈过程的每个棋局都在屏幕上显示出来。
当某一方在横、竖或斜方向上先有5个棋子连成一线时,该方为赢。
(3)提交1篇实验报告,以及完整的软件系统和相关文档,包括源程序和可执行程序。
二:
程序结构及相关内容介绍
程序涉及两个窗体:
一个是游戏进行的主界面Form4,一个用于对游戏的说明:
Form4_1
均存在Forms文件夹中:
在文件夹Lab4中添加了用于功能实现的四个类,分别是Chessboard.csComputer.csRule.csStone.cs在窗体控件的响应函数中调用这些类和函数,实现程序运行。
三:
程序运行界面及使用说明
程序主窗体如下:
首先,在主窗体的Menustrip中点击“Lab4五子棋”则呈现出游戏界面,如下所示:
可以看出游戏共由:
棋盘,棋子坐标,选择棋子,棋子位置记录及游戏设置、说明五部分组成。
在窗口的左上角,是游戏说明与设置部分:
点击“游戏”可以设置:
决定是由玩家走第一步棋还是由电脑走第一步,在所选项前打钩即可,程序默认“玩家先”,如果选择了“电脑先”则电脑随即在棋盘上安排第一个棋子。
点击”关闭”会退出游戏,但是不结束整个程序的运行。
点击”帮助(H)“下拉菜单的第一项,会出现关于游戏的说明窗口:
指导玩家进行游戏。
程序有记录坐标位置的功能,随着玩家的鼠标在棋盘上移动,”棋子坐标“一栏内的X,Y坐标会随之变动,这只是后台记录数据的显示,在决定电脑下棋位置中有重要作用,玩家可以忽略此信息。
在选择棋子框中显示程序设定好的棋子。
玩家在决定放棋子的格点点击棋盘,会显示出玩家的棋子,计算机自动做出反应,游戏进行下去。
在此过程中,界面上历史记录一栏内会随时记录下黑白棋子的位置坐标:
游戏进行,直到白棋或黑棋首先达到五子连成一线,则系统显示获胜方:
整个游戏程序界面美观,设计人性化,操作方便。
四:
主要代码
Chessboard.cs
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingAI.Lab4;
usingSystem.Drawing;
usingSystem.Windows.Forms;
namespaceAI.Lab4
{
classChessboard
{
privateint[,]arrchessboard=newint[15,15];
//绘?
制?
的Ì?
对?
象¨®
privateGraphicsmg;
//棋?
子Á¨®对?
象¨®
privateStonestone;
//电Ì?
脑?
对?
象¨®
privateComputercomputer;
//判D断?
当Ì¡À前¡ã棋?
子Á¨®是º?
黑¨²(true)是º?
白ã¡Á(false)
privateboolstoneflag=true;
//判D断?
先¨¨手º?
玩ª?
家¨°(ꡧ是º?
电Ì?
脑?
(true)还1是º?
人¨?
(false),ê?
先¨¨手º?
下?
黑¨²棋?
)ê?
privateboolmplayfirstflag=false;
//历¤¨²史º¡¤记?
录?
堆?
栈?
privateStackmStarckHistory=newStack();
///
///历¤¨²史º¡¤记?
录?
属º?
性?
///
publicStackStarckHistory
{
get
{
returnmStarckHistory;
}
}
publicChessboard(Graphicsg)
{
mg=g;
Initialization();
}
publicvoidDraw()
{
System.Reflection.AssemblythisExe;
thisExe=System.Reflection.Assembly.GetExecutingAssembly();
System.IO.Streamfile=thisExe.GetManifestResourceStream("AI.chessboard.gif");
ImageimgChessboard=System.Drawing.Image.FromStream(file);//棋?
盘¨¬图ª?
片?
大䨮小?
600*600像?
素?
file.Close();
mg.DrawImage(imgChessboard,0,0,imgChessboard.Width,imgChessboard.Height);
//绘?
制?
棋?
子Á¨®
for(inti=0;i<15;i++)
{
for(intj=0;j<15;j++)
{
if(arrchessboard[i,j]==0)
{
stone.DrawStone(i,j,true);
}
if(arrchessboard[i,j]==1)
{
stone.DrawStone(i,j,false);
}
}
}
}
privatevoidDownStone(intm,intn)
{
stone.DrawStone(m,n,stoneflag);
//记?
录?
情¨¦况?
if(stoneflag)
{
arrchessboard[m,n]=0;
}
else
{
arrchessboard[m,n]=1;
}
//记?
录?
历¤¨²史º¡¤记?
录?
if(stoneflag)
{
mStarckHistory.Push("黑¨²:
êo"+m.ToString()+","+n.ToString());
}
else
{
mStarckHistory.Push("白ã¡Á:
êo"+m.ToString()+","+n.ToString());
}
//判D断?
结¨¢果?
if(Rule.Result(m,n,arrchessboard)<6)
{
switch(Rule.Result(m,n,arrchessboard))
{
case1:
MessageBox.Show("黑¨²棋?
双?
三¨y禁?
手º?
失º¡ì败㨹!
ê?
");
break;
case2:
MessageBox.Show("黑¨²棋?
双?
四?
禁?
手º?
失º¡ì败㨹!
ê?
");
break;
case3:
MessageBox.Show("黑¨²棋?
长¡è连¢?
禁?
手º?
失º¡ì败㨹!
ê?
");
break;
case4:
if(stoneflag)
{
MessageBox.Show("黑¨²棋?
胜º¡è利¤?
!
ê?
");
}
else
{
MessageBox.Show("白ã¡Á棋?
胜º¡è利¤?
!
ê?
");
}
break;
case5:
MessageBox.Show("平?
局?
!
ê?
");
break;
}
//重?
新?
开a始º?
!
ê?
Start();
return;
}
else
{
//交?
换?
当Ì¡À前¡ã棋?
子Á¨®颜?
色¦?
stoneflag=!
stoneflag;
}
//测a试º?
//MessageBox.Show(Rule.Result(m,n,arrchessboard).ToString());
}
publicvoidPersonDownStone(intx,inty)
{
if(x<600&&y<600)
{
//取¨?
下?
棋?
点Ì?
intm=(int)Math.Floor(Convert.ToDouble(x/40));
intn=(int)Math.Floor(Convert.ToDouble(y/40));
if(!
Rule.IsExist(m,n,arrchessboard))
{
DownStone(m,n);
ComputerDownStone();
}
}
}
privatevoidComputerDownStone()
{
intm,n,count=0;
do
{
computer.Down(arrchessboard);
m=computer.X;
n=computer.Y;
count++;
if(count>100)
{
MessageBox.Show("异°¨¬常¡ê!
ê?
");
Start();
return;
}
}
while(Rule.IsExist(m,n,arrchessboard));
DownStone(m,n);
}
publicvoidStart(boolplayfirstflag)
{
mplayfirstflag=playfirstflag;
Start();
}
///
///开a始º?
///
privatevoidStart()
{
Initialization();
//构1造¨¬电Ì?
脑?
对?
象¨®
computer=newComputer(mplayfirstflag);
//画-棋?
盘¨¬
Draw();
if(mplayfirstflag)
{
ComputerDownStone();
}
}
privatevoidInitialization()
{
//置?
当Ì¡À前¡ã要°a走Á?
的Ì?
棋?
为a黑¨²棋?
(ꡧ黑¨²棋?
先¨¨走Á?
)ê?
stoneflag=true;
//把ã?
棋?
盘¨¬所¨´有®D位?
置?
置?
为a空?
(ꡧ未¡ä下?
子Á¨®)ê?
for(inti=0;i<15;i++)
{
for(intj=0;j<15;j++)
{
arrchessboard[i,j]=2;
}
}
//清?
空?
历¤¨²史º¡¤记?
录?
堆?
栈?
mStarckHistory.Clear();
//构1造¨¬棋?
子Á¨®对?
象¨®
stone=newStone(mg);
}
}
}
Computer.cs
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingAI.Lab4;
namespaceAI.Lab4
{
classComputer
{
privateboolmflag;//区?
别Àe电Ì?
脑?
是º?
下?
黑¨²棋?
还1是º?
下?
白ã¡Á棋?
privateintx;//电Ì?
脑?
下?
子Á¨®的Ì?
位?
置?
privateinty;//电Ì?
脑?
下?
子Á¨®的Ì?
位?
置?
publicComputer(boolflag)
{
mflag=flag;
}
publicintX
{
get
{
returnx;
}
}
publicintY
{
get
{
returny;
}
}
publicvoidDown(int[,]arrchessboard)
{
//权¨¡§值¦Ì数ºy组Á¨¦
int[,]qz=newint[15,15];
for(inti=0;i<15;i++)
{
for(intj=0;j<15;j++)
{
if(arrchessboard[i,j]<2)
{
qz[i,j]=-1;//当Ì¡À已°?
有®D子Á¨®时º¡À标À¨º注Á¡é为a-1
}
else
{
qz[i,j]=Check(i,j,arrchessboard);
}
}
}
//找¨°出?
权¨¡§值¦Ì最Á?
大䨮的Ì?
点Ì?
MaxQZ(qz);
privatevoidMaxQZ(int[,]qz)
{
intmax=0;
for(inti=0;i<15;i++)
{
for(intj=0;j<15;j++)
{
if(qz[i,j]>max)
{
x=i;
y=j;
max=qz[i,j];
}
}
}
}
privateintCheck(intm,intn,int[,]arrchessboard)
{
intqz=0;
intw1=100000;
//找¨°对?
手º?
的Ì?
取¨?
胜º¡è点Ì?
(ꡧ80)ê?
intw2=50000;
//找¨°自Á?
己o的Ì?
三¨y个?
相¨¤连¢?
的Ì?
点Ì?
(ꡧ60)ê?
intw3=10000;
//找¨°对?
手º?
的Ì?
三¨y个?
相¨¤连¢?
的Ì?
点Ì?
(ꡧ40)ê?
intw4=5000;
//找¨°自Á?
己o的Ì?
两¢?
个?
相¨¤连¢?
的Ì?
点Ì?
(ꡧ20)ê?
intw5=1000;
//找¨°对?
手º?
的Ì?
两¢?
个?
相¨¤连¢?
的Ì?
点Ì?
(ꡧ10)ê?
intw6=500;
//找¨°自Á?
己o的Ì?
相¨¤连¢?
的Ì?
点Ì?
(ꡧ5)ê?
intw7=100;
//找¨°对?
方¤?
的Ì?
相¨¤连¢?
的Ì?
点Ì?
(ꡧ5)ê?
intw8=50;
//找¨°自Á?
己o的Ì?
失º¡ì败㨹点Ì?
intw9=-999999;
int[]arrf=newint[4];
//如¨?
果?
该?
位?
置?
下?
我¨°方¤?
的Ì?
子Á¨®
if(mflag)
{
//我¨°方¤?
黑¨²子Á¨®
arrchessboard[m,n]=0;
}
else
{
//我¨°方¤?
白ã¡Á子Á¨®
arrchessboard[m,n]=1;
}
arrf[0]=Rule.Xnum(m,n,arrchessboard);
arrf[1]=Rule.Ynum(m,n,arrchessboard);
arrf[2]=Rule.YXnum(m,n,arrchessboard);
arrf[3]=Rule.XYnum(m,n,arrchessboard);
//中D心?
点Ì?
权¨¡§值¦Ì加¨®1
if(m==7&&n==7){qz+=1;}
for(inti=0;i<4;i++)
{
if(Math.Abs(arrf[i])==5)
{
qz+=w1;
}
if(arrf[i]==4)
{
qz+=w3;
}
if(arrf[i]==3)
{
qz+=w5;
}
if(arrf[i]==2)
{
qz+=w7;
}
if(mflag)
{
if(Rule.IsFail(arrf,arrchessboard[m,n])>0)
{
qz+=w9;
}
}
}
//如¨?
果?
该?
位?
置?
下?
对?
方¤?
的Ì?
子Á¨®
if(mflag)
{
//对?
方¤?
白ã¡Á子Á¨®
arrchessboard[m,n]=1;
}
else
{
//对?
方¤?
黑¨²子Á¨®
arrchessboard[m,n]=0;
}
arrf[0]=Rule.Xnum(m,n,arrchessboard);
arrf[1]=Rule.Ynum(m,n,arrchessboard);
arrf[2]=Rule.YXnum(m,n,arrchessboard);
arrf[3]=Rule.XYnum(m,n,arrchessboard);
for(inti=0;i<4;i++)
{
if(Math.Abs(arrf[i])==5)
{
qz+=w2;
}
if(arrf[i]==4)
{
qz+=w4;
}
if(arrf[i]==3)
{
qz+=w6;
}
if(arrf[i]==2)
{
qz+=w8;
}
}
arrchessboard[m,n]=2;
returnqz;
}
}
}
Rule.cs
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
namespaceAI.Lab4
{
classRule
{
publicstaticboolIsExist(intm,intn,int[,]arrchessboard)
{
if(arrchessboard[m,n]<2)
{
returntrue;
}
else
{
returnfalse;
}
}
publicstaticintResult(intm,intn,int[,]arrchessboard)
{
int[]arrf=newint[4];
arrf[0]=Xnum(m,n,arrchessboard);
arrf[1]=Ynum(m,n,arrchessboard);
arrf[2]=YXnum(m,n,arrchessboard);
arrf[3]=XYnum(m,n,arrchessboard);
if(IsFail(arrf,arrchessboard[m,n])>0)
{
returnIsFail(arrf,arrchessboard[m,n]);
}
else
{
if(IsWin(arrf))
{
return4;
}
else
{
if(IsTie(arrchessboard))
{
return5;
}
else
{
return6;
}
}
}
}
#region检¨¬查¨¦是º?
否¤?
失º¡ì败㨹,ê?
是º?
否¤?
胜º¡è利¤?
,ê?
是º?
否¤?
平?
局?
publicstaticintIsFail(int[]arr,intstoneflag)
{
if(stoneflag==1)
{
//如¨?
果?
是º?
白ã¡Á棋?
不?
验¨¦证¡è因°¨°为a白ã¡Á棋?
无T禁?
手º?
return0;
}
else
{
intnum=0;//活?
的Ì?
3子Á¨®相¨¤连¢?
的Ì?
个?
数ºy
for(inti=0;i<4;i++)
{
if(arr[i]==3)
{
num++;
}
}
if(num>1)
{
return1;
}
num=0;//活?
的Ì?
4子Á¨®相¨¤连¢?
的Ì?
个?
数ºy
for(inti=0;i<4;i++)
{
if(arr[i]==4)
{
num++;
}
}
if(num>1)
{
return2;
}
//验¨¦证¡è长¡è连¢?
禁?
手º?
for(inti=0;i<4;i++)
{
if(Math.Abs(arr[i])>5)
{
return3;
}
}
return0;
}
}
privatestaticboolIsWin(int[]arr)
{
for(inti=0;i<4;i++)
{
if(Math.Abs(arr[i])==5)
{
returntrue;
}
}
returnfalse;
}
privatestaticboolIsTie(int[,]arrchessboard)
{
for(inti=0;i<15;i++)
{
for(intj=0;j<15;j++)
{
if(arrchessboard[i,j]==2)
returnfalse;
}
}
returntrue;
}
#endregion
#region从䨮四?
个?
方¤?
向¨°检¨¬测a,ê?
连¢?
子Á¨®个?
数ºy
publicstaticintXnum(intm,intn,int[,]arrchessboard)
{
intflag=0;
//连¢?
子Á¨®个?
数ºy
intnum=1;
inti=m+1;
//不?
超?
出?
棋?
格?
while(i