人工智能实验1 五子棋游戏 .doc_第1页
人工智能实验1 五子棋游戏 .doc_第2页
人工智能实验1 五子棋游戏 .doc_第3页
人工智能实验1 五子棋游戏 .doc_第4页
人工智能实验1 五子棋游戏 .doc_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

人工智能实验报告班级:计研-12班学号:2012312120105姓名:孔德星实验一 五子棋游戏1实验目的(1)了解机器博弈相关技术;(2)掌握机器博弈的分析方法。2实验内容(1)实现简单的五子棋游戏;(2)插入一个下载的棋盘图片作为自己的棋盘;(3)插入一段音乐实现背景音乐的播放;(4)当有输赢出现时弹出一个显示战况的对话框;(5)在菜单栏上添加一个战况的标题,当单击时弹出显示当时战况的对话框。3 实验报告要求(1)简述实验原理及方法,并请给出程序设计流程图。a、实验原理:假设电脑用白棋,人用黑棋。在前两步时由于不会有赢的趋势,所以白子在黑子的周围随机下棋。第三步以后,电脑要扫描整个棋局,构建博弈树,然后用深度优先算法分析并评估自己是否占优势。如果自己占优势,则进攻,否则,则防守。当然在整个下棋过程中,会检查是否已经五子连,即是否有人(电脑)获胜。b、流程图:(2)源程序清单:本程序用java语言编写,共有七个类。a、主界面类package fivechess;import java.awt.color;import java.awt.graphics;import java.awt.event.actionevent;import java.awt.event.actionlistener;import java.awt.event.inputevent;import java.awt.event.mouseevent;import java.awt.event.mouselistener;import java.awt.event.windowadapter;import java.awt.event.windowevent;import javax.swing.imageicon;import javax.swing.jbutton;import javax.swing.jframe;import javax.swing.jmenu;import javax.swing.jmenubar;import javax.swing.jmenuitem;import javax.swing.joptionpane;import javax.swing.jpanel;import javax.swing.jtextfield;public class main extends jpanel implements actionlistener,mouselistenerint allchess = new int1919;jbutton zhankuang;int x = 0;/步数计算int y = 0;int i = 0;int win1 = 0;/记录黑棋赢的局数int win2 = 0;/记录白棋赢的局数int 棋子颜色=1;scan scanp=new scan();/定义两个扫描棋盘的类,一个扫描白字,一个扫描黑子scan scanc=new scan(); autoplay autoplay=new autoplay();/定义一个音乐器播放对象evaluate evaluatep=new evaluate();/定义两个评估棋盘的类,一个评估白字,一个评估黑子evaluate evaluatec=new evaluate();sort sort=new sort();jtextfield jf = new jtextfield(10);static jmenubar bar0 = new jmenubar();public main()jmenu menu0 = new jmenu(游戏选项);jmenuitem item0 = new jmenuitem(重新开始游戏);item0.setactioncommand(restart);item0.addactionlistener(this);jmenuitem item1 = new jmenuitem(退出游戏);item1.setactioncommand(exit);item1.addactionlistener(this);menu0.add(item0);menu0.add(item1);jmenu menu1 = new jmenu(声音选项);jmenuitem item2 = new jmenuitem(音乐开);item2.setactioncommand(on);item2.addactionlistener(this);jmenuitem item3 = new jmenuitem(音乐关);item3.setactioncommand(off);item3.addactionlistener(this);menu1.add(item2);menu1.add(item3);zhankuang = new jbutton(游戏战况);/游戏战况标签zhankuang.setactioncommand(zhankuang);zhankuang.addactionlistener(this);bar0.add(menu0);bar0.add(menu1);bar0.add(zhankuang);bar0.add(jf);jf.seteditable(false);for(int i=0;i19;i+)for(int j=0;j19;j+)allchessij=0; /初始化所有的位置都是没有棋子的,1代表有黑棋子,-1代表有白棋子。 for(int i=0;i19;i+) for(int j=0;j19;j+) for(int h=0;h5;h+) scanp.shapeijh=0; scanc.shapeijh=0; this.addmouselistener(this);public void actionperformed(actionevent e) music back = new music();if(e.getactioncommand().equals(exit)system.exit(0);else if(e.getactioncommand().equals(restart)addmouselistener(this);this.repaint();i=0;jf.settext();zhankuang.settext(游戏战况); for(int i=0;i19;i+) for(int j=0;j19;j+) allchessij=0; for(int i=0;i19;i+) for(int j=0;j19;j+) for(int h=0;h5;h+) scanp.shapeijh=0; scanc.shapeijh=0; else if(e.getactioncommand().equals(on)back.pt.start();else if(e.getactioncommand().equals(off)back.pt.stop();else if(e.getactioncommand().equals(zhankuang)joptionpane.showmessagedialog(null, 黑棋:白棋 +win1+:+win2);public void mouseclicked(mouseevent arg0) public void mouseentered(mouseevent arg0) public void mouseexited(mouseevent arg0) public void mousepressed(mouseevent e) graphics g =this.getgraphics();int a=0,b=0; if(e.getmodifiers()=inputevent.button1_mask) x = e.getx(); y = e.gety(); jf.settext(这是第+i+步); a=(x+5)/20; b=(y+5)/20; /当鼠标点击的位置不在棋盘时 if(x+5)/202|(y+5)/2019|(y-5)/2019) return ; else if(allchessb-2a-2 = 0&棋子颜色=1) g.setcolor(color.black); g.filloval(a*20-5,b*20-5,10,10); i+; 棋子颜色=棋子颜色*(-1); allchessb-2a-2=1; if (judge.judge(allchess,1) jf.settext(黑棋赢!); win1+; zhankuang.settext(游戏战况); 棋子颜色=2; joptionpane.showmessagedialog(null, 恭喜您,您赢了!n当前战况是 黑棋:白棋 +win1+:+win2); removemouselistener(this); return; if(i2&棋子颜色=-1) scanp.scan(allchess,1); scanc.scan(allchess,-1); sort.sort(scanp.shape); sort.sort(scanc.shape); evaluatep.evaluate(scanp.shape); evaluatec.evaluate(scanc.shape); 棋子颜色=棋子颜色*(-1); if(evaluatep.maxevaluatec.max) g.setcolor(color.white);g.filloval(evaluatep.max_y+2)*20-5,(evaluatep.max_x+2)*20-5,10,10); allchessevaluatep.max_xevaluatep.max_y=-1; zhankuang.settext(请黑棋下子); for(int i=0;i19;i+) for(int j=0;j19;j+) for(int h=0;h5;h+) scanp.shapeijh=0; scanc.shapeijh=0; else g.setcolor(color.white);g.filloval(evaluatec.max_y+2)*20-5,(evaluatec.max_x+2)*20-5,10,10); allchessevaluatec.max_xevaluatec.max_y=-1; if (judge.judge(allchess,-1) jf.settext(白棋赢!);joptionpane.showmessagedialog(null, 很遗憾,电脑赢了!n当前战况是 黑棋:白棋 +win1+:+win2); 棋子颜色=2; win2+; zhankuang.settext(游戏战况); removemouselistener(this); return; else zhankuang.settext(请黑棋下子); for(int i=0;i19;i+) for(int j=0;j19;j+) for(int h=0;h5;h+) scanp.shapeijh=0; scanc.shapeijh=0; public void mousereleased(mouseevent arg0) private imageicon background=new imageicon(fivechess/五子棋.jpg);public void paintcomponent(graphics g)super.paintcomponent(g);g.drawimage(background.getimage(),0,0,background.geticonwidth(),background.geticonheight(),this);static jframe getmainframe ()jframe main = new jframe();main.setcontentpane(new main();main.setjmenubar(bar0);main.settitle(连珠五子棋);main.setlocation(100, 200);main.setsize(440, 440);main.setvisible(true); main.addwindowlistener(new windowadapter() public void windowclosing(windowevent e) system.exit(0); );return main;public static void main(string args)getmainframe();b、前两步自动播放的类package fivechess;public class autoplay int x,y; void autoplay(int chesspad,int a,int b) int randomnumber=(int)(math.random()*8)+1; switch(randomnumber) case(1): if(chesspada-1b-1=0) x=a-1;y=b-1; else if(chesspada-2b-2=0) x=a-2;y=b-2; else x=a-3;y=b-3; break; case(2): if(chesspada-1b=0) x=a-1;y=b; else if(chesspada-2b=0) x=a-2;y=b; else x=a-3;y=b; break; case(3): if(chesspada-1b+1=0) x=a-1;y=b+1; else if(chesspada-2b+2=0) x=a-2;y=b+2; else x=a-3;y=b+3; break; case(4): if(chesspadab+1=0) x=a;y=b+1; else if(chesspadab+2=0) x=a;y=b+2; else x=a;y=b+3; break; case(5): if(chesspada+1b+1=0) x=a+1;y=b+1; else if(chesspada+2b+2=0) x=a+2;y=b+2; else x=a+3;y=b+3; break; case(6): if(chesspada+1b=0) x=a+1;y=b; else if(chesspada+2b=0) x=a+2;y=b; else x=a+3;y=b; break; case(7): if(chesspada+1b-1=0) x=a+1;y=b-1; else if(chesspada+2b-2=0) x=a+2;y=b-2; else x=a+3;y=b-3; break; case(8): if(chesspadab-1=0) x=a;y=b-1; else if(chesspadab-2=0) x=a;y=b-2; elsex=a;y=b+3; break; c、扫描棋盘的类package fivechess;public class scanint shape=new int19195; void scan(int chesspad,int colour) int i,j; for(i=0;i=18;i+) for(j=0;j=0&chesspadm-n=colour) shapeij0+; n=j;while(n+1=0&chesspad-mn=colour) shapeij1+; m=i;while(m+1=0&n+1=18&chesspad-m+n=colour) shapeij2+; m=i;n=j; while(m+1=0&chesspad+m-n=colour) shapeij2+; m=i;n=j; while(m-1=0&n-1=0&chesspad-m-n=colour) shapeij3+; m=i;n=j; while(m+1=18&n+1=18&chesspad+m+n=colour)shapeij3+; d、评估棋盘的类package fivechess;public class evaluate int max_x,max_y,max; public void evaluate(int shape) int i=0,j=0; for(i=0;i19;i+) for(j=0;j19;j+) switch(shapeij0) case 5: shapeij4=200; break; case 4: switch(shapeij1) case 4: shapeij4=150+shapeij2+ shapeij3; break; case 3: shapeij4=100+ shapeij2+ shapeij3; break; default: shapeij4=50+ shapeij2+ shapeij3; break; case 3: switch(shapeij1) case 3: shapeij4=75+ shapeij2+ shapeij3; break; default: shapeij4=20+ shapeij2+ shapeij3; break; case 2: shapeij4=10+shapeij1 +shapeij2 +shapeij3; break; case 1: shapeij4=shapeij0+shapeij1 +shapeij2 +shapeij3; default : shapeij4=0; int x=0,y=0; max=0; for(x=0;x19;x+) for(y=0;y19;y+) if(maxshapexy4) max=shapexy4; max_x=x;max_y=y; e、排序package fivechess;public class sort public void sort(int shape) int temp; for(int i=0;i19;i+) for(int j=0;j19;j+) for(int h=1;h=h;w-) if(shapeijw-1shapeijw) temp=shapeijw-1; shapeijw-1=shapeijw; shapeijw=temp; f、判断胜负package fivechess;public class judge static boolean judge(int a,int color) int i,j,flag; for(i=0;i19;i+) flag=0; for(j=0;j19;j+) if(aij=color) flag+; if (flag=5) return true; else flag=0; for(j=0;j19;j+) flag=0; for(i=0;i19;i+) if(aij=color) flag+; if(flag=5) return true; else flag=0; for(j=4;j19;j+) flag=0; int m=j; for(i=0;i=0;j-) flag=0; int m=j; for(i=0;i=0;i-) flag=0; int n=i; for(j=0;j=0;j-) flag=0; int m=j; for(i=18;i=j;i-) if(aim+=color) flag+; if(flag=5) return true; else flag=0; return false; g、音乐播放器package fivechess;import java.io.file;import java.io.fileinputstream;import javazoom.jl.player.player;/jl1.jarpublic class musicstatic thread pt = null;/定义线程void play(final file af)if(pt!=null & pt.isalive()return;/内部类pt = new thread()pu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论