1、人工智能五子棋实现五子棋Java实现摘要本项目完成了一个人机对弈五子棋过程.首先,用java语言传建了一个简单美观的界面。同时获取界面元素的坐标位置,为相应的坐标元素添加鼠标事件。窗体上方添加了退出窗体响应事件,在窗体中间有两个标签组件,左边是一个15*15的棋局,右边是一个历史棋子的记录。窗体的最下面是一个图片组件,组件上的按钮事件分别是“开始”、“认输”和“悔棋”。玩家下子后,电脑会自动计算出格子上的最大权重,然后根据权重下子。在下子过程中,用一个链表来保存每个子的信息,用于悔棋时做出相应动作。如果棋局还没分出胜负,玩家中途退出,将会保存棋局所有信息,放在一个文本文件中,用于下次继续。1引
2、言1.1课题研究背景和研究现状1.1.1课题研究的背景和目的中华民族是一个有着几千年悠久历史和璀璨文化的国家,而棋类娱乐却早已突破了纯游戏的范畴而成为中国传统文化的一个分支。五子棋起源于中国古代的传统黑白棋种之一,现代五子棋日文称之为“连珠”,英译为Renju,英文称之为“Gobang”或“FIR”(Five in a Row 的缩写),中文亦有“连五子”、“五子连”、“串珠”、“五目”、“五目碰”、“五格”等多种称谓。五子棋的棋文化源渊流长,具有东方的神秘和西方的直观,是中西文化的交流点,是古今哲理的结晶。现在人们压力日益增大,需要劳逸结合才能获得更高的工作效率,工作之余的娱乐对每一个人来说
3、都是必不可少的。五子棋这种娱乐方式简单易学又具有深奥的技巧,非常富有趣味性和消遣性。在经过不断发展后,五子棋已经成为棋盘娱乐的一个重要的组成部分,它能够增强思维能力、开发智力,是人们休闲娱乐的不错选择。作为一名学生,在系统的学习了Java语言之后,需要用它来做一些小程序,以巩固对于Java语言的学习。这次毕业设计,正好将学过的Java语言中的各种技术综合起来,用Jbuilder集成开发工具编写一个五子棋小游戏,既对自己学过的技能进行一次检验,也能系统地将学过的知识复习巩固。 人类社会经历了五千多年的农业文明时代,又经历了三百多年的工业文明时代。经过漫长时间的发展,人类文明取得的不可想象的进步,
4、人也变的越来越聪明了。人类之所以变得聪明,是因为我们人类一直不断地再实践中思考,在思考中实践。五子棋不仅能增强思维能力,提高记忆力,而且富含哲理,有助于修身养性。五子棋既有现代休闲的明显特征“短、平、快”,又有古典哲学的高深学问“阴阳易理”;它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;它的棋文化源渊流长,具有东方的神秘和西方的直观;既有“场”的概念,亦有“点”的连接。它是中西文化的交流点,是古今哲理的结晶。五子棋游戏不但容易上手,而且它区别于别的游戏,它不但能使人娱乐,而且能使人的头脑变得更加聪明。而五子棋对战有两种模式:一.人机对战;二.双人对战。这些给人
5、无限乐趣的用途正是人工智能的杰作。正因为这样它鼓励着人们对它不断研究,这在很大程度上促进了人工智能的发展,反过来人工智能的理论和技术上的突破能够使五子棋程序更完美、更受欢迎!同时,五子棋游戏程序的开发也使得五子棋这个游戏得到了广泛的推广,让世界各地的人们知道五子棋,随时地玩上五子棋,这已经不再是梦想了。五子棋游戏程序使得越来越多的人喜欢上了五子棋,热爱下五子棋,它是具有很好的带动性的。随着互联网络的不断普及,越来越多的人可以在网络上就能够与他人下五子棋了。1.1.2课题研究的现状目前,连珠五子棋这一棋类运动已迅速在国际上发展起来。现在,有40多个国家和地区己开展了五子棋活动。许多国家的人对五子
6、棋都有不同的爱称,例如韩国人把五子棋称为“情侣棋”,言下之意是说情人之间下五子棋有利于增加情感的交流;欧洲人称之为“绅士棋”,喻棋手下五子棋的君子风度胜似绅士:美洲人称之为“商业棋”,意思可能是边下五子棋边谈生意,是商业贸易之桥;日本人则称之为“中老年棋”,表示五子棋适合成熟的中老年的生理特点和思维方式。不同语言、地区的人们都可以借助五子棋这一简单而又深奥的棋艺进行交流、比赛,以增进友谊。在所有棋类中五子棋发展最为迅速,在人群中最受欢迎!这一棋类运动已迅速在国际上发展起来。外国人都十分看好这一毫不起眼的智力游戏,并认为五子棋不仅能提高思维、开发智力、手脑并用、修身养性 而且富含哲理,具有东方的
7、神秘和西方的直观,是中西文化的交汇点。许多国家的人对五子棋都有不同的爱称,例如韩国人把五子棋称之为“情侣棋”,言下之意是情人之间下五子棋有利于增加情感的交流;欧洲人称之为“中老年棋”,表示五子棋适合中老年人的生理特点和思维方式;美洲人喜欢将五子棋称之为“商业棋”,就是说商人谈生意时可边下棋边谈生意,棋下完了生意也谈成了。由此可见,尽管国度不同,语言各异,但人们都可以借助五子棋这一简单而又深奥的棋艺进行交流、比赛,增进友谊。十余年来,随着各地五子棋组织的建立和五子棋的逐步普及,各种五子棋比赛应运而生,一些民间五子棋组织自筹经费与地方有关部门合作,运作了不少民间比赛。从国内的比赛来看,北京、天津、
8、上海、镇江、吉林、黑龙江、安徽、浙江等地先后自筹经费举办了地方性的五子棋比赛,同时,地区间的交流也不断增加,如1997年举办的京津冀五子棋对抗赛、2000年京津五子棋团体对抗赛、2000年在辽宁铁岭举办的“中行杯”北方五子棋友好邀请赛、在江苏镇江举办的“一品梅杯”江苏五子棋邀请赛等。2001年国家体育总局批准试办全国性五子棋比赛后,中国棋院在2002年和2003年连续举办了两届全国五子棋邀请赛,吸引了全国各地的高手参加,取得了圆满成功。2004年10月,中国棋院将举办第四届全国五子棋邀请赛。全国五子棋邀请赛作为全国参赛人数最多,规模最大,水平最高的比赛,已经成为一项全国性五子棋的传统赛事。到了
9、21世纪五子棋游戏在网络上面是非常火暴的,而且在棋牌游戏里面玩家人数排名总会占到很前面,不愧是风靡全球的棋牌游戏啊!在未来中,将会有越来越多的人关注五子棋,喜欢五子棋,那么将其变为商业化也会越来越多,而且还可以以教育孩子的方式来将其嵌套进去,或者用来做测试等等。随着人工智能技术的不断进步,我相信今后的五子棋游戏将会更加精彩、更加完善,让我们拭目以待吧。 随着五子棋事业的发展,五子棋在国际国内的交流和比赛越来越多,随之也带动了越来越多的五子棋爱好者。目前,五子棋在我国的很多大、中城市发展很快,尤其是首都北京,曾多次举办了五子棋的各种比赛,中央电视台体育频道也长期播放着五子棋的讲座,还有,一些大型
10、企业和单位也曾举办过五子棋的比赛。这些活动表明,五子棋在我国有着广泛的群众基础,是一项人民群众喜闻乐见的体育运动。五子棋在国内外的发展速度相当快,预计在几年后,五子棋能在很多国家形成热门运动。我国也不例外,在很多热衷于五子棋事业的棋手的共同努力下,有望在不久的将来成为五子棋运动的中心。1.2课题研究的意义和主要工作1.2.1课题研究的意义随着社会经济的发展,青少年的生活环境日益改善,再加上他们基本上都是独生子女,父母家庭对他们的关爱也就特别强烈。由于家庭给了孩子们太多的关爱,致使许多孩子养成了“以自我为中心”的陋习。围绕“自我”片面地分析问题,解决问题是很难把事情办好的。而五子棋是双人对弈的项
11、目,行棋过程中就必须同时考虑双方的意图和利益,只顾自己的利益,得到的往往是“速败”。再次,五子棋棋手必须从全局入手,正确分析全盘形势,尽最大限度调用自己的有利因素才能达到取胜的目的。由此看来,五子棋可以改善青少年的思维方式,让他们培学会“知己知彼” “大局入手”的思考方法,这对他们今后走上竞争日益激烈的社会是大有好处的另一方面,从技术角度来说,由于C/S 结构网络游戏的种种弊端,采用新兴的点对点网络(peer- to- peer,P2P)技术设计与开发了基于P2P 的网络游戏。它是分散式的,对等结点之间通过直接交互,来实现计算机资源和服务的共享。美国斯坦福大学Lawrence Lessig教授
12、认为P2P 系统将是互联网下一步最重要的发展方向。自从2000 年,Napster 在美国率先开创P2P 系统用于音乐下载以来,P2P 技术已经成为计算机学术界在网络研究方面的一个新热点。简单的说,P2P 直接将人们联系起来,让人们通过互联网直接交互。P2P 使得网络上的沟通变得容易、更直接共享和交互,真正地消除中间商。P2P 就是人可以直接连接到其他用户的计算机、交换文件,而不是像过去那样连接到服务器去浏览与下载。P2P 另一重要特点是改变互联网现在的以大网站为中心的状态、重返“非中心化”,并把权力交还给用户。P2P 网络弱化了服务器客户机角色的划分,任意网络节点可以互为服务器/客户机。将P
13、2P 技术与五子棋网络游戏设计结合起来,能把原来单机的五子棋游戏扩展成为网络游戏,实现人机对战与网络对战的同步进行,减轻服务器的负荷和通讯成本,也增强系统的健壮性。1.2.2课题研究的工作需求分析: 对该课题要解决的问题进行详细的分析,弄清楚项目的要求,包括需要输入什么数据,要得到什么结果,最后应输出什么,达到何种效果,说到底就是确定要计算机“做什么”。结构和功能分析: 选题完成之后对,对该选题做功能分析和结构设计,包括该课题的模块设计,各个模块的功能,其功能如:如何遍历棋盘、如何走棋、对走棋的记录以及胜负判断等等。框架设计:框架亦可称为应用架构,框架的一般定义就是:在特定领域基于体系结构的可
14、重用的设计。也可以认为框架是体系结构在特定领域下的应用,框架设计包含框架的选用以及框架各层所对应功能。代码编写、功能实现:按照所做设计编写代码,实现各个模块功能,对各个模块做衔接。编译调试、代码修正:代码编写好之后,对代码程序做调试优化以及免不了的改错,作一些功能的修正完善。报告撰写、结题:项目实现好后对项目各个部分和流程作报告说明,做出总结,结题。1.2.3课题研究的结构安排应用面向对象的设计方法,将课题结构做如下设计:1. 游戏(Game): 这是游戏的中心部分,负责整个游戏的控制。包括开局、悔棋、设定游戏模式、创建玩家、更改棋盘、通知玩家走棋、记录出棋方等。因为整个程序只有一个游戏对象,
15、所以使用单件模式。2. 玩家(Player):玩家类代表参与游戏的个体,一个棋局中有两个玩家,它们可以是计算机和人,也可以是两个人。计算机玩家调用智能机制构(aiAgent)来获得下一步的走法。将人和计算机抽象成玩家的好处是可以在下棋过程中随时改变游戏模式,双人或人机,而游戏(Game)不用做其它工作,除了将将玩家的类型(Type)改变即可。玩家的流程如下图所示。3. 棋盘(ChessBoard):一个游戏只应有一个棋盘,所以应用单件模式。内有一个1515的二维数组存储棋盘。4. 棋局(Situation): 棋局通过对棋盘的扫描,记录一方在四个方向上可形成攻势的情况。比如活三、死四等。它记录
16、在四个1515的表中。5. 智能机构(aiAgent): 通过搜索,对玩家(Player)提供走棋位置的决策。内有一个搜索树根节点;一个虚棋盘,在进行搜索时不断变化,记录每个搜索时的棋盘状态;两个虚棋局(Situation),记录每个搜索时双方的局面。智能机构应用单件模式。6. 计算机构(calcAgent):为智能机构提供计算支持,包括评价值的计算,搜索时的最大最小计算和优选结节的计算。计算机构应用单件模式。1.3 开发工具和开发环境开发工具:eclipse工具开发环境:硬件环境:CPUP3 800MHZ以上,建议P5 2.0GHZ硬盘100G以上,建议用250G显卡标准VGA,24位真彩色
17、内存256MB以上,建议512M其他键盘、鼠标、网卡、能连通互联网 软件环境:安装一个java的JDK包以及配置相应的环境变量参数1.4本章小结本章主要介绍了项目的背景,现状以及研究的意义。还对课题的结构进行了相应的安排已经对开发环境做了介绍。2.系统设计2.1概要设计 图1: 总体处理流程 图2:软件结构图表1 类模块列表类标识符类名功能Main五子棋主程序入口它主要是初始化组件,生成一个窗体类。CreateWindow五子棋窗体类它定义了完成人机对弈的窗体,生成一个棋盘类,定义了一个棋子链表,完成开始,悔棋和认输功能的事件相应。Battel棋盘类它主要是生成一个棋盘,及单击下子的事件。这个
18、类中主要包含了计算每个棋点的权重,根据权重来下子。此外,还包含了鼠标事件,设计鼠标的可用状态和不可用状态。CellPoint棋子类它定义了一个棋子的基本信息,包括状态、坐标和当前棋子的分数。Enums棋子状态类它声明了棋子的三种状态,包括空,白子和黑子。表2 组件中的事件定义列表事件描述windowClosing游戏关闭事件mouseClicked游戏中单击触发事件mouseEntered游戏中鼠标进入事件mouseExited游戏中鼠标移开事件 图3: 软件系统功能图2.2 详细设计具体类实现的功能:窗体类:Public class CreateWindowPublic CreateWind
19、ow()/构造函数,创建一个窗体,添加各个组件。Public void windowClosing()/关闭窗体事件,保存游戏或者直接退出。Public void mouseClicked()/功能单击响应事件,触发“悔棋”、“认输”和“重新开始”。Private void savePointData()/将目前棋局信息,保存到文本文件中Private CellPoint readPointData()/从文本文件中读取棋局信息,保存到二维数组中Public static void addTxtTwo()/在窗体中显示,下子信息。/窗口体类棋局类:Public class BattelPubl
20、ic LinkedList path;/定义棋子链表,用于悔棋操作boolean end;/定义棋局的结果,表明是否胜利或者输private CellPoint cellsPoint = new CellPoint1515;/用于存储棋盘按钮,白子,黑子或者空Private void resetScore()/重新设置各点的分值Private void evaluate()/判断并为各点打分Private void getMax()/获取最大分值的点Public Boolean valid()/判断点是否在棋盘里public void mouseEntered()/鼠标进入某个区域事件publ
21、ic void mouseExited()/鼠标移出某个区域事件Public void mousePressed()/鼠标单击下子事件/棋局类棋子类:Public class CellPointprivate Enums.chessState state;/ 当前子的状态 private Point point ;/ 当前子的坐标 private float score; / 当前子的分数,电脑以此为依据下子 相应的 set 、get 函数;/设置或者获取参数棋子状态类:Public Class EnumsPublic static enum chessStateWHITE,BLACK,NON
22、E;/声明棋子的三种状态流程图: 是 否 否 是 是 否 否 是 3.系统实现 3.1 主要代码实现 package fivaGame;import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.FileWriter;import java.io.IOExc
23、eption;import java.io.Writer;import java.util.LinkedList;/* * 生成一个窗口,并处理其中的各种按钮事件 * * author B.Lee * */public class CreatWindow extends JFrame private final JLabel head = new JLabel(new ImageIcon(icon/head.gif); private final JLabel boot = new JLabel(new ImageIcon(icon/boot.gif); private final stati
24、c JTextArea txtTwo = new JTextArea();/用于显示下棋的步骤 public LinkedList path1 = new LinkedList(); private final Battel battel; private boolean hasData=true; public CreatWindow(String name) super(name); setResizable(false); setSize(823, 650); setLayout(null); this.setIconImage(new ImageIcon(iconFive.gif).g
25、etImage(); Dimension scrSize = Toolkit.getDefaultToolkit().getScreenSize(); setLocation(scrSize.width - getSize().width) / 2, (scrSize.height - getSize().height) / 2);/ 最佳位置 CellPoint cellPoints=readPointData(info/fiveInfo.txt); if(hasData) int n=JOptionPane.showConfirmDialog(null, 是否继续以前的棋局?); if(n
26、=0) battel=new Battel(cellPoints,path1); else battel = new Battel(); else battel = new Battel(); head.setBounds(0, 0, 724, 85); boot.setBounds(0, 540, 724, 86); battel.setBounds(0, 0, 540, 540); txtTwo.setBounds(543, 0, 268, 540); txtTwo.setBackground(new Color(76, 76, 76); txtTwo.setFont(new Font(楷
27、体, Font.BOLD, 12); txtTwo.setForeground(Color.white); txtTwo.setLineWrap(true); / 换 行 add(boot); add(battel); add(txtTwo); this.setVisible(true); this.addWindowListener(new WindowAdapter() public void windowClosing(WindowEvent e) boolean isNull=true; for(int i=0;igetBattel().getCellsPoint().length;i+) for(int j=0;j 102 & x 22 & y 41) / 按在了悔棋上 if (getBattel().getEnd() / 游戏已经结束了悔棋不可用 else Ce
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1