人工智能报告.docx
《人工智能报告.docx》由会员分享,可在线阅读,更多相关《人工智能报告.docx(18页珍藏版)》请在冰点文库上搜索。
人工智能报告
《人工智能》
实验大作业
实验题目:
五子棋游戏
专业信息与计算科学
年级091001
姓名张娇
学号091001128
指导老师时华
日期2012-12-10
五子棋游戏
一.实验目的
(1)了解机器博弈相关技术;
(2)掌握机器博弈的分析方法。
二、实验方法:
1.先熟悉深度优先搜索算法;
2.JAVA语言编程实现实验内容。
3、实验背景知识:
深度优先搜索中,首先扩展最新产生的(最深的)节点,下图所示。
深度相等的节点可以任意排列。
“最晚产生的节点最先扩展”。
起始节点
图1深度优先搜索示意图
(1)起始节点(即根节点)的深度为0.
(2)任何其他节点的深度等于其父辈节点的深度加1。
深度优先搜索的具体编程可用递归过程或模拟递归来实现。
他们各有各的优缺点。
递归形式的程序符合思维习惯.编写起来较容易.但由于递归过程的调用借助较慢的系统栈空间传递参数和存放局部变量,故降低了执行效率。
模拟递归使用数组存放堆栈数据,在管理指针和每层选择决策上不如递归容易编程.但一旦熟悉了程序框架,调试起来要比递归程序方便,由于数组一般使用静态内存.访问速度较快,执行效率也较高。
四、实验内容:
(1)实现简单的五子棋游戏;
(2)插入一个下载的棋盘图片作为自己的棋盘;
(3)选择白棋黑棋下棋的优先;
(4)当有输赢出现时在边框显示赢家;
五、问题
(1)简述实验原理及方法,并请给出程序设计流程图。
A、实验原理:
假设电脑用白棋,人用黑棋。
在前两步时由于不会有赢的趋势,所以白子在黑子的周围随机下棋。
第三步以后,电脑要扫描整个棋局,构建博弈树,然后用深度优先算法分析并评估自己是否占优势。
如果自己占优势,则进攻,否则,则防守。
当然在整个下棋过程中,会检查是否已经五子连,即是否有人(电脑)获胜。
B、流程图:
(2)规则库描述
1.黑棋先行,白棋随后。
从天元开始相互顺序落子。
2.最先在棋盘的横向、竖向、斜向形成连续的相同色五个棋子的一方为胜利。
3.黑棋禁手判负、白棋无禁手。
黑棋禁手包括“三、三”;“四、四”;“长连”。
黑方只能用“四、三”去取胜。
4.如分不出胜负,则定位平局。
5.对局中拔子、中途退场均判为负
6.五连与禁手同时形成,先五为胜。
7.黑方禁手形成时,白方应立即指出。
若白方未发现或发现后不立即指正,反而继续落子,则不能判黑方负。
(3)控制机制
A、键盘上事先设定8个按键,分作两组,每组四个,分别代表两个人用来控制棋子的上下左右键。
B、绘制棋盘,15条横线,15条竖线,在直线交点处下棋子(实心圆形)。
C、黑子先行,黑白交替下子,在棋盘上设定一个与棋盘格大小边长相等的正方形,初始状态,正方形的中心位于期盼的中心点。
当一方欲走棋的时候,应用四个按键来控制所要下棋的位置,每按一次按键,正方形都要向相应方向移动一个格,并且让喇叭发出某种声音,将要移出边界时,发出另一种警告声音并不让其移出边界。
当按下回车键时,应在正方形所在位置放下一个棋子,然后此组按键不能操作,换另一个人下棋,用另一组按键,规则同前。
D、当任何一方有五个棋子沿着横,竖,斜连在一起时,系统自动判断赢棋,并显示黑方或白方胜利。
棋局结束后,任何一方均不能继续操作。
(4)程序清单
packagezh;
importjava.awt.*;
importjava.awt.event.*;
importjava.applet.Applet;
importjava.awt.Color;
publicclassFiveChessextendsAppletimplementsActionListener,MouseListener,
MouseMotionListener,ItemListener{
intcolor=0;//旗子的颜色标识0:
白子1:
黑子
booleanisStart=false;//游戏开始标志
intbodyArray[][]=newint[16][16];//设置棋盘棋子状态0无子1白子2黑子
Buttonb1=newButton("游戏开始");
Buttonb2=newButton("重置游戏");
LabellblWin=newLabel("");
CheckboxckbHB[]=newCheckbox[2];
CheckboxGroupckgHB=newCheckboxGroup();
publicvoidinit(){
setLayout(null);
addMouseListener(this);
add(b1);
b1.setBounds(330,50,80,30);
b1.addActionListener(this);
add(b2);
b2.setBounds(330,90,80,30);
b2.addActionListener(this);
ckbHB[0]=newCheckbox("白子先",ckgHB,false);
ckbHB[0].setBounds(320,20,60,30);
ckbHB[1]=newCheckbox("黑子先",ckgHB,false);
ckbHB[1].setBounds(380,20,60,30);
add(ckbHB[0]);
add(ckbHB[1]);
ckbHB[0].addItemListener(this);
ckbHB[1].addItemListener(this);
add(lblWin);
lblWin.setBounds(330,130,80,30);
gameInit();
this.resize(newDimension(450,350));
}
publicvoiditemStateChanged(ItemEvente){
if(ckbHB[0].getState())//选择黑子先还是白子先
{
color=0;
}else{
color=1;
}
}
publicvoidactionPerformed(ActionEvente){
if(e.getSource()==b1){
gameStart();
}else{
reStart();
}
}
publicvoidmousePressed(MouseEvente){
}
publicvoidmouseClicked(MouseEvente){
intx1,y1;
x1=e.getX();
y1=e.getY();
if(e.getX()<20||e.getX()>300||e.getY()<20||e.getY()>300){
return;
}
if(x1%20>10){
x1+=20;
}
if(y1%20>10){
y1+=20;
}
x1=x1/20*20;
y1=y1/20*20;
setDown(x1,y1);
}
publicvoidmouseEntered(MouseEvente){
}
publicvoidmouseExited(MouseEvente){
}
publicvoidmouseReleased(MouseEvente){
}
publicvoidmouseDragged(MouseEvente){
}
publicvoidmouseMoved(MouseEvente){
}
publicvoidpaint(Graphicsg){
g.setColor(Color.lightGray);
g.fill3DRect(10,10,300,300,true);
g.setColor(Color.black);
for(inti=1;i<16;i++){
g.drawLine(20,20*i,300,20*i);
g.drawLine(20*i,20,20*i,300);
}
}
publicvoidsetDown(intx,inty)//落子
{
if(!
isStart)//判断游戏未开始
{
return;
}
if(bodyArray[x/20][y/20]!
=0){
return;
}
Graphicsg=getGraphics();
if(color==1)//判断黑子还是白子
{
g.setColor(Color.black);
color=0;
}else{
g.setColor(Color.white);
color=1;
}
g.fillOval(x-10,y-10,20,20);
bodyArray[x/20][y/20]=color+1;
if(gameWin1(x/20,y/20))//判断输赢
{
lblWin.setText(startColor(color)+"赢了!
");
isStart=false;
}
if(gameWin2(x/20,y/20))//判断输赢
{
lblWin.setText(startColor(color)+"赢了!
");
isStart=false;
}
if(gameWin3(x/20,y/20))//判断输赢
{
lblWin.setText(startColor(color)+"赢了!
");
isStart=false;
}
if(gameWin4(x/20,y/20))//判断输赢
{
lblWin.setText(startColor(color)+"赢了!
");
isStart=false;
}
}
publicStringstartColor(intx){
if(x==0){
return"黑子";
}else{
return"白子";
}
}
publicvoidgameStart()//游戏开始
{
isStart=true;
enableGame(false);
b2.setEnabled(true);
}
publicvoidgameInit()//游戏开始初始化
{
isStart=false;
enableGame(true);
b2.setEnabled(false);
ckbHB[0].setState(true);
for(inti=0;i<16;i++){
for(intj=0;j<16;j++){
bodyArray[i][j]=0;
}
}
lblWin.setText("");
}
publicvoidreStart()//游戏重新开始
{
repaint();
gameInit();
}
publicvoidenableGame(booleane)//设置组件状态
{
b1.setEnabled(e);
b2.setEnabled(e);
ckbHB[0].setEnabled(e);
ckbHB[1].setEnabled(e);
}
publicbooleangameWin1(intx,inty)//判断输赢横
{
intx1,y1,t=1;
x1=x;
y1=y;
for(inti=1;i<5;i++){
if(x1>15){
break;
}
if(bodyArray[x1+i][y1]==bodyArray[x][y]){
t+=1;
}else{
break;
}
}
for(inti=1;i<5;i++){
if(x1<1){
break;
}
if(bodyArray[x1-i][y1]==bodyArray[x][y]){
t+=1;
}else{
break;
}
}
if(t>4){
returntrue;
}else{
returnfalse;
}
}
publicbooleangameWin2(intx,inty)//判断输赢竖
{
intx1,y1,t=1;
x1=x;
y1=y;
for(inti=1;i<5;i++){
if(x1>15){
break;
}
if(bodyArray[x1][y1+i]==bodyArray[x][y]){
t+=1;
}else{
break;
}
}
for(inti=1;i<5;i++){
if(x1<1){
break;
}
if(bodyArray[x1][y1-i]==bodyArray[x][y]){
t+=1;
}else{
break;
}
}
if(t>4){
returntrue;
}else{
returnfalse;
}
}
publicbooleangameWin3(intx,inty)//判断输赢左斜
{
intx1,y1,t=1;
x1=x;
y1=y;
for(inti=1;i<5;i++){
if(x1>15){
break;
}
if(bodyArray[x1+i][y1-i]==bodyArray[x][y]){
t+=1;
}else{
break;
}
}
for(inti=1;i<5;i++){
if(x1<1){
break;
}
if(bodyArray[x1-i][y1+i]==bodyArray[x][y]){
t+=1;
}else{
break;
}
}
if(t>4){
returntrue;
}else{
returnfalse;
}
}
publicbooleangameWin4(intx,inty)//判断输赢左斜
{
intx1,y1,t=1;
x1=x;
y1=y;
for(inti=1;i<5;i++){
if(x1>15){
break;
}
if(bodyArray[x1+i][y1+i]==bodyArray[x][y]){
t+=1;
}else{
break;
}
}
for(inti=1;i<5;i++){
if(x1<1){
break;
}
if(bodyArray[x1-i][y1-i]==bodyArray[x][y]){
t+=1;
}else{
break;
}
}
if(t>4){
returntrue;
}else{
returnfalse;
}
}
}
(5)实验结果
(6)整个过程中用人工智能思想,既提高对人工智能的理解,也锻炼了使用人工智能思想解决问题的能力,要使程序在此基础上更加智能,需要添加时间限制和分数累加,使这项娱乐博弈运动竞争更加激烈,更加完善。