ImageVerifierCode 换一换
格式:DOCX , 页数:20 ,大小:64.12KB ,
资源ID:8783739      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8783739.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(五子棋人机博弈实验报告.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

五子棋人机博弈实验报告.docx

1、五子棋人机博弈实验报告五子棋人机博弈实验报告一(课程设计目的 2 二(课程设计要求 2 三(课程设计内容 2 四(课程设计思想 2 五(系统实现 2 设计平台 2 数据结构设计 3 程序流程图设计 3 主要算法设计 4 程序调试及运行结果 4 六(课程设计总结 5 七(参考资料 6 八(附录:五子棋博弈算法源代码 7 1 一( 课程设计目的 通过上学期学习的人工智能学科,运用推理技术、搜索方法和决策规划和博弈树设计五子棋人机博弈系统,以此进一步深化对理论知识技术的了解,培养学生编程能力以及实践水平。 二(课程设计要求 通过本次课程设计要求学生掌握以下内容: 1.深入了解博弈树和alpha-be

2、ta剪枝算法。 2.设计出适合五子棋算法的启发式函数。 3.熟练掌握启发式的搜索方法。 三(课程设计内容 本系统实现的是五子棋博弈算法,运用java语言实现了图形用户界面,方便用户使用。算法采用了博弈算法和启发式函数进行搜索,人机对弈可自动判断输赢,结束后可重新开局。 四(课程设计思想 本系统实现的是五子棋博弈算法,为了方便用户的使用,采用的是java图形用户界面技术。为了记录棋盘的每一个下棋点,定义数组array1919。并用shape16165记录所有获胜的组合。首先由玩家落子,前两步电脑根据玩家的落子情况在附近随机落子,第三步电脑开始搜索,并根据玩家落子情况对棋盘进行全局搜索(Scan)

3、并排序(Sort),并对每一个落子点进行打分并选择分值最大的点(Evaluate)落子,判断玩家或电脑是否获胜(Judge),一方获胜则结束。 五(系统实现 1.实验平台: myeclipse 8.5 2 2.数据结构设计: (1)int array1919:记录棋盘的每一个下棋点 (2)int max_x:记录最大评估值的横坐标 int max_y:记录最大评估值的纵坐标 int max :记录最大评估值 (3)int shape16165:记录所有获胜组合 3.程序流程图设计: 开始 玩家落子 是 玩家是否获胜 电脑对棋盘进行搜索,对每个点打分,记录最大值及其位置 电脑选择分值最大的点落子

4、 否 电脑是否获胜 是 是否重新开局 是 否 结束 3 4.主要算法设计: (1)class ChessPad:绘制棋盘棋子,初始化棋盘,添加鼠标点击事件。 (2)class ChessPoint_black:黑棋下棋的走法和显示 (3)class ChessPoint_white:白棋下棋的走法和显示 (4)class Chess:棋盘属性的设置 (5)class Evaluate:对每一步可选择的方法进行打分,选择最大值,记录坐标。 (6)class Scan:查看八个方向上相邻相同颜色棋子的个数。 (7)class Judge:判断是否有一方获得胜利。 (8)class AutoPlay

5、:电脑的下棋走法,依据玩家当前的落子位置来判断自己的走子位置。 5.运行结果: (1)人机对弈,黑棋为人操作,白棋为计算机操作,人赢得胜利的页面截图如 下: 4 (2)人机对弈,黑棋为人操作,白棋为计算机操作,计算机赢得胜利的页面截图如下: 六(课程设计总结: 通过小组合作完成五子棋人机博弈系统,自己更透彻的了解了上学期学习的人工智能教授的知识,可谓一大收获;同时更强化了Visual C+的一些基本技术,捡回了选修课讲过的很多相关知识,可谓是另一大收获。在对五子棋人机博弈的估值搜索算法的设计上,采用博弈搜索的方法,采用静态估值函数对各节点的代价进行估计,使算法达到最优。小组合作区别与自己独立实

6、验,此一形式,让我们扬长避短,体味到了团队合作的快乐 5 七(参考资料: 1 蔡自兴(人工智能及其应用M(北京:清华大学出版社,1999 2 王小春(游戏编程(人机博弈)M(重庆:重庆大学出版社,2002 3 潘金贵,顾铁成,曾俭等编译(现代计算机常用数据结构和算法M(南京:南京大学出版社,1994 4 王永庆(人工智能原理与方法M(西安:西安交通大学出版社,1998 5 林尧瑞,马少平(人工智能导论M(北京:清华出版社,1989 6 田盛丰,黄厚宽(人工智能与知识工程M(北京:中国铁道出版社,1999 7 王镌(博弈树搜索的算法改进J(福建电脑(2004,(2) 8 Visual C+游戏设

7、计入门. 机械工业出版社 普悠玛数科技 著 9 标准C+实用教程. 电子工业出版社 康晓明 汪涛 等编著 10C+面向对象程序设计陈维兴 林小茶编著 中国铁道出版社 11五子棋必读 作者:彭建国编 6 附录:五子棋博弈算法源代码: import java.awt.*; import java.awt.event.*; class ChessPad extends Panel implements MouseListener,ActionListener int array=new int1919; Scan scanp=new Scan(); Scan scanc=new Scan(); Au

8、toPlay autoPlay=new AutoPlay(); Evaluate evaluatep=new Evaluate(); Evaluate evaluatec=new Evaluate(); Sort sort=new Sort(); int i=0; int x=-1,y=-1,棋子颜色=1; Button button=new Button(重新开局); TextField text_1=new TextField(请黑棋下子), text_2=new TextField(), text_3=new TextField(); ChessPad() /棋盘初始化 setSize(

9、440,440); setLayout(null);setBackground(Color.LIGHT_GRAY); addMouseListener(this);add(button);button.setBounds(10,5,60,26); button.addActionListener(this); add(text_1); text_1.setBounds(90,5,90,24); add(text_2); text_2.setBounds(290,5,90,24); add(text_3); text_3.setBounds(200,5,80,24); for(int i=0;i

10、19;i+) for(int j=0;j19;j+) arrayij=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; text_1.setEditable(false); text_2.setEditable(false); text_3.setEditable(false); public void paint(Graphics g) /棋盘布局 for (int i=40;i=400;i=i+20) g.drawLine(40,i,400,i)

11、; 7 for(int j=40;j=400;j=j+20) g.drawLine(j,40,j,400); g.fillOval(97,97,6,6); /棋盘上的五个什么点 g.fillOval(337,97,6,6); g.fillOval(97,337,6,6); g.fillOval(337,337,6,6); g.fillOval(217,217,6,6); public void mousePressed(MouseEvent e) int a=0,b=0; if(e.getModifiers()=InputEvent.BUTTON1_MASK) /鼠标点击,判断是否可以落子 x

12、=(int)e.getX();y=(int)e.getY(); ChessPoint_black chesspoint_black=new ChessPoint_black(this); ChessPoint_white chesspoint_white=new ChessPoint_white(this); i+; text_3.setText(这是第+i+步); if(x+5)/202|(y+5)/2019|(y-5)/2019)/局外 else a=(x+10)/20;b=(y+10)/20; if(arrayb-2a-2=0&棋子颜色=1) /用变量 棋子颜色 来判断是黑还是白下子 t

13、his.add(chesspoint_black); chesspoint_black.setBounds(a*20-9,b*20-9,18,18); 棋子颜色=棋子颜色*(-1); arrayb-2a-2=1; if (Judge.judge(array,1) text_1.setText(黑棋赢!);棋子颜色=2;removeMouseListener(this); else text_1.setText(); 8 if(i2&棋子颜色=-1) /电脑下子 scanp.scan(array,1); scanc.scan(array,-1); sort.sort(scanp.shape);

14、sort.sort(scanc.shape); evaluatep.evaluate(scanp.shape); evaluatec.evaluate(scanc.shape); 棋子颜色=棋子颜色*(-1); this.add(chesspoint_white); if(evaluatep.maxevaluatec.max) chesspoint_white.setBounds(evaluatep.max_y+2)*20-9,(evaluatep.max_x+2)*20-9,18,18); arrayevaluatep.max_xevaluatep.max_y=-1; text_1.setT

15、ext(请黑棋下子); 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 chesspoint_white.setBounds(evaluatec.max_y+2)*20-9,(evaluatec.max_x+2)*20-9,18,18); arrayevaluatec.max_xevaluatec.max_y=-1; if (Judge.judge(array,-1) text_2.setText(白棋赢!);棋子颜色=2;removeMous

16、eListener(this); else text_1.setText(请黑棋下子); for(int i=0;i19;i+) for(int j=0;j19;j+) for(int h=0;h5;h+) 9 scanp.shapeijh=0; scanc.shapeijh=0; if(i=2&棋子颜色=-1) autoPlay.autoPlay(array,b-2,a-2); this.add(chesspoint_white); 棋子颜色=棋子颜色*(-1); chesspoint_white.setBounds(autoPlay.y+2)*20-9,(autoPlay.x+2)*20-

17、9,18,18); arrayautoPlay.xautoPlay.y=-1; if (Judge.judge(array,-1) text_2.setText(白棋赢!);棋子颜色=2;removeMouseListener(this); else text_1.setText(请黑棋下子); text_2.setText(autoPlay.x+ +autoPlay.y); public void mouseReleased(MouseEvent e) public void mouseEntered(MouseEvent e) public void mouseExited(MouseEv

18、ent e) public void mouseClicked(MouseEvent e) public void actionPerformed(ActionEvent e) this.removeAll(); 棋子颜色=1; add(button);button.setBounds(10,5,60,26); add(text_1);text_1.setBounds(90,5,90,24); text_2.setText(); text_1.setText(请黑棋下子); add(text_2); text_2.setBounds(290,5,90,24); add(text_3); tex

19、t_3.setBounds(200,5,80,24); i=0; text_3.setText(这是第+i+步); 10 for(int i=0;i19;i+) for(int j=0;j19;j+) arrayij=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; addMouseListener(this); class ChessPoint_black extends Canvas implements MouseListener ChessP

20、ad chesspad=null; ChessPoint_black(ChessPad p) setSize(20,20); addMouseListener(this); chesspad=p; public void paint(Graphics g) g.setColor(Color.black);g.fillOval(0,0,18,18); public void mousePressed(MouseEvent e) /*if(e.getModifiers()=InputEvent.BUTTON3_MASK) chesspad.remove(this); chesspad.棋子颜色=1

21、; chesspad.text_2.setText(); chesspad.text_1.setText(请黑棋下子); */ public void mouseReleased(MouseEvent e) public void mouseEntered(MouseEvent e) public void mouseExited(MouseEvent e) public void mouseClicked(MouseEvent e) class ChessPoint_white extends Canvas implements MouseListener ChessPad chesspad

22、=null; ChessPoint_white(ChessPad p) setSize(20,20);addMouseListener(this); chesspad=p; public void paint(Graphics g) g.setColor(Color.white);g.fillOval(0,0,18,18); 11 public void mousePressed(MouseEvent e) /*if(e.getModifiers()=InputEvent.BUTTON3_MASK) chesspad.remove(this); chesspad.棋子颜色=-1; chessp

23、ad.text_2.setText(请白棋下子); chesspad.text_1.setText(); */ public void mouseReleased(MouseEvent e) public void mouseEntered(MouseEvent e) public void mouseExited(MouseEvent e) public void mouseClicked(MouseEvent e) public class Chess extends Frame ChessPad chesspad=new ChessPad(); Chess() setVisible(tr

24、ue); setLayout(null); Label label=new Label(五子棋,Label.CENTER); add(label);label.setBounds(70,55,440,26); label.setBackground(Color.orange); add(chesspad);chesspad.setBounds(70,90,440,440); addWindowListener(new WindowAdapter() public void windowClosing(WindowEvent e) System.exit(0); ); pack();setSiz

25、e(600,550); public static void main(String args) Chess chess=new Chess(); 12 public class AutoPlay/前2步棋走法 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;

26、 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

27、+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; 13 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=

28、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; 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

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

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