人工智能上机报告.docx

上传人:b****3 文档编号:12682376 上传时间:2023-04-21 格式:DOCX 页数:41 大小:722.46KB
下载 相关 举报
人工智能上机报告.docx_第1页
第1页 / 共41页
人工智能上机报告.docx_第2页
第2页 / 共41页
人工智能上机报告.docx_第3页
第3页 / 共41页
人工智能上机报告.docx_第4页
第4页 / 共41页
人工智能上机报告.docx_第5页
第5页 / 共41页
点击查看更多>>
下载资源
资源描述

人工智能上机报告.docx

《人工智能上机报告.docx》由会员分享,可在线阅读,更多相关《人工智能上机报告.docx(41页珍藏版)》请在冰豆网上搜索。

人工智能上机报告.docx

人工智能上机报告

 

人工智能上机报告

 

项目:

简易五子棋游戏

班级:

学号:

姓名:

指导老师:

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

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

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1