java五子棋.docx
《java五子棋.docx》由会员分享,可在线阅读,更多相关《java五子棋.docx(24页珍藏版)》请在冰豆网上搜索。
java五子棋
实习报告
课程名称信息系统认知实习
实习题目java五子棋
专业信息科学与工程学院
班级09网络1000班
学 号1
学生姓名巩奇
实习成绩100000000
指导教师
2010年1月
前言
摘要
五子棋作为一个棋类竞技运动,在民间十分流行,为了熟悉五子棋规则及技巧,以及研究简单的人工智能,决定用Java开发五子棋游戏。
主要完成了人机对战和玩家之间联网对战2个功能。
网络连接部分为Socket编程应用,客户端和服务器端的交互用ClassMessage定义,有很好的可扩展性,客户端负责界面维护和收集用户输入的信息,及错误处理。
服务器维护在线用户的基本信息和任意两个对战用户的棋盘信息,动态维护用户列表。
在人机对弈中通过深度搜索和估值模块,来提高电脑棋手的智能。
分析估值模块中的影响精准性的几个要素,以及提出若干提高精准性的办法,以及对它们搜索的节点数进行比较,在这些算法的基础上分析一些提高电脑AI方案,如递归算法、电脑学习等。
算法的研究有助于理解程序结构,增强逻辑思维能力,在其他人工智能方面也有很大的参考作用。
1引言
1.1课题背景
五子棋是起源于中国古代的传统黑白棋种之一。
现代五子棋日文称之为连珠,英译为Renju,英文称之为Gobang或FIR(FiveinaRow的缩写),亦有连五子、五子连、串珠、五目、五目碰、五格等多种称谓。
五子棋起源于古代中国,发展于日本,风靡于欧洲。
对于它与围棋的关系有两种说法,一说早于围棋,早在“尧造围棋”之前,民间就已有五子棋游戏;一说源于围棋,是围棋发展的一个分支。
在中国的文化里,倍受人们的青睐。
本世纪初五子棋传入欧洲并迅速风靡全欧。
通过一系列的变化,使五子棋这一简单的游戏复杂化、规范化,而最终成为今天的职业连珠五子棋,同时也成为一种国际比赛棋。
Java语言是当今最为流行的程序设计语言之一作为一门非常优秀和极为健壮的编程语言,它同时具有的面向对象,与平台无关,分布式应用,安全,稳定和多线程等优良的特征,使用Java语言,不仅可以开发出功能强大的大型应用程序,而且Java语言本身突出的跨平台的特性也使得它特别适合于Internet上的应用开发,可以这样说,Java的出现使得所开发的应用程序“一次编写,处处可用”的实现成为了可能。
1.2本课题研究的意义
近来随着计算机的快速发展,各种各样的电脑游戏层出不穷,使得我们能有更多的娱乐项目,而棋类游戏能起到锻炼人的思维和修身养性的作用,而且棋类游戏水平颇高,大有与人脑分庭抗礼之势。
其中战胜过国际象棋世界冠军-卡斯帕罗夫的“深蓝”便是最具说服力的代表;其它像围棋的“手淡”、象棋的“将族”等也以其优秀的人工智能深受棋迷喜爱。
越来越多的具有智能的机器进入了人类的生活,人工智能的重要性如今显而易见。
自己对人工智能比较感兴趣,而五子棋游戏程序的开发实现这个课题,正好提供给我这样一个研究的机会,通过对人工智能中博弈方面的研究(人机对弈),让我在简单的人机对弈全局设计,以及具体到相关算法上有了深入的了解。
人工智能属于计算机科学的领域,它以计算机技术为基础,近几十年来,它的理论和技术已经日益成熟,应用领域也正在不断扩大,显示出强大的生命力。
人工智能大致可以分成几个学科,它们每一个都是独特的,但是它们常常又互相结合起来完成设计任务,这时,这些学科之间的差别就变的很模糊。
人工智能在专家系统,自然语言理解,自动定理证明,自动程序设计,人工智能在机器人学、模式识别、物景分析、数据库的智能检索、机器下棋(实质上是博弈论问题)和家用电器智能化等领域都有广泛的应用。
而这个课题就是和人工智能中的博弈论领域紧密相关的。
这个题目核心是人工智能和Socekt编程,。
并且人工智能中的博弈部分,由于采用了大量的搜索算法,其中很多被利用到各方面。
它的概念、方法和技术,正在各行各业广泛渗透。
智能已经成为当今各种新产品、新装备的发展方向。
所以,趁着这个机会,对人工智能中比较容易实现的人机博弈进行了解研究学习,也是很实用且很有必要的。
1.3本课题的研究方法
在进行游戏设计之前,首先决定的第一个问题就是,使用什么开发环境来编写环境?
自己虽然比较熟悉Java语言,但是实际开发项目经验很少,所以决定用Jcreator,其拥有高亮语法编辑、使用向导以及完全定制的用户界面,最主要的是能够自动查找文件于Main方法或Html文件以支持Java小应用程序,然后启动相应的工具。
其次确定整个程序的结构框架。
由于Applet运行速度较慢,如果在加上算法搜索时间,显然不符合程序的设计要求,决定用Java应用程序开发.整个程序的功能实现流程是这样的:
网络对战涉及算法较少,所以先实现网络部分,实现基本的棋盘和棋子的类,添加判断胜负条件,这部是基础,也是很重要的,电脑AI也在这些基础上添加上来的。
这个题目的2个功能包括2个重要算法,电脑AI和胜负条件,胜负条件运算量不大,有固定的模式。
难点是人工智能,可以这样说,人工智能的好坏决定了这个题目的完成深度。
所以,大部份时间花在AI算法的研究和改进上,对于算法我掌握的不多,研究了一些国内的五子棋算法,参考了一些游戏设计算法,详细比较各种算法的优缺点,而且参考了现代五子棋比赛的各种规则和技巧,尽量联系实际,努力提高电脑AI。
1.1.1规则及解释
1:
黑棋先行,白棋随后。
从天元开始相互顺序落子。
2:
最先在棋盘的横向、竖向、斜向形成连续的相同色五个棋子的一方为胜利。
3:
黑棋禁手判负、白棋无禁手。
黑棋禁手包括“三、三”;“四、四”;“长连”。
黑方只能用“四、三”去取胜。
4:
如分不出胜负,则定位平局。
5:
对局中拔子、中途退场均判为负
6:
五连与禁手同时形成,先五为胜。
7:
黑方禁手形成时,白方应立即指出。
若白方未发现或发现后不立即指正,反而继续落子,则不能判黑方负。
五子棋是由两个人在一盘棋上进行对抗的竞技运动。
在对局开始时,先由执黑棋的一方将一枚棋子的落在“天元”上,然后由执白棋的一方在黑棋周围的交叉点上落子。
如此轮流落子直到某一方首先在棋盘的直线横线或斜线上形成连续的五子或五子以上,则该方就算获胜。
但是五子棋的特点是先行的一方优势很大。
因此,在职业比赛种对黑方做了种种限制,以利公平竞争。
黑白双方的胜负结果必须按照职业五子棋的规则要求来决定。
第一章技术介绍
Java技术介绍、编程环境介绍
JAVA技术介绍:
Java技术是一门编程语言,也是一个平台,它基于Java虚拟机技术,借助这个东西建立了跨平台的优势。
(题外话:
Java热门的原因之一就是一个跨平台的概念,和跨平台类似跨浏览器的好处也是如此,这也是现在AJAX技术流行的原因之一。
另外现在热炒的RIA富客户端的概念下的技术除了AJAX外还有Adobe的Flash/Flex,微软的SilverLight,SUN的JavaFX等,个人更看好FLash/Flex,原因是Flash插件在浏览器端占用率很高)
Java技术的重要性就不讲了,从最近流行的一个统计数据上来说,目前世界上编程语言Java、C、VB、C++依次排名前4位,这排名本身不说明什么,至少也是工业界对编程语言使用上一个侧面的反映吧。
Java编程语言与众不同之处在于:
Java程序既是编译型的(转换为一种称为Java字节码的中间语言),又是解释型的(JVM对字节码进行解析和运行)。
编译只进行一次,而解释在每次运行程序时都会进行。
编译后的字节码采用一种针对JVM优化过的机器码形式;解释器是JVM的实现。
这段是摘自网上的,编译原理学的不是很好,对这门语言的背后运行机制理解到这样了。
Java平台是一种纯软件平台,它有三个版本JavaSE、JavaEE、JavaME。
JavaSE(JavaPlatform,StandardEdition)这个版本以前叫做J2SE,后来版本号从1.4直接跳到5.0,其实也就是1.5,所以就叫成JavaSE5.0。
目前Java开发人员使用较多的版本是5.0,当然还有JavaSE6.0这个更新的版本。
它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的Java应用程序。
JavaSE还包含了支持JavaWeb服务开发的类,并为JavaEE这个版本提供基础。
虽说桌面应用程序,Java一直不被看好,但也稍微提一下,负责桌面GUI开发的类库我知道的有:
JDK自带的主要是AWT/SWING这个Java原生类库;也可以使用IBM的SWT/JFace这个第三方类库。
开发工具我了解的有:
NetBeans(最近已经是6.0final版了,做GUI有使用VB的感觉),Eclipse(SWT/JFace这个项目其实就是做Eclipse项目时扩展出来的,所以对SWT/JFace支持的也不错)。
JavaEE(JavaPlatform,EnterpriseEdition)这个版本以前叫做J2EE,也就是大家可能听得比较多的,也是Java比较流行的领域,Java的企业级版本。
JavaEE下有很多流行的开发框架,像Struts、Spring、Hibernate这种流行的所谓SSH组合等。
根据项目大小、应用领域,技术平台的选择面还是很多的,除了JavaEE,还有.Net,LAMP组合(Linux、Apatch、MySql、PHP组合),相对来说比较新Ruby在RubyonRails的框架应用,后两者可能在相对来说比较轻量级的Web领域运用成功案例比较多,更重量的企业级潜力还有待挖掘。
JavaME(JavaPlatform,MicroEdition)这个版本以前叫做J2ME。
应用领域像各种移动设备和嵌入式设备,比如:
手机、PDA、电视机顶盒和打印机。
JavaME不是太熟悉,不过移动设备和嵌入式设备的开发个人觉得算是比较有意思的领域,最近比较瞩目的业界新闻有一个就是Google发布开源智能手机操作系统开发平台Android,也就是前一阵子炒得很火的GPhone(原来Google出的不是手机,而是一个手机操作系统开发平台)。
这个平台貌似会对JavaME有些冲击,按照网上的消息,Android包括:
1、高度定制的Linux操作系统内核及智能手机硬件驱动支持;2、经过Google修改过的Java虚拟机Dalvik,这里的性能比SUN的Hotspot高,支持大部分Java核心类库;3、大量智能手机开发核心类库;4、大量现成的智能手机应用软件;5、基于Eclipse的开发环境。
也是按照网上的说法,JavaEE提供了统一的编程平台,但不能调用操作系统的资源;而Android下直达操作系统,上直达应用软件,如:
浏览器、日历、地图等。
Java开发工具很多,个人使用的IDE有Eclipse和NetBeans。
Eclispe比较流行,各种插件也多,当然用起来也不错;NetBeans现在也是越做越好了,介绍这两个IDE主要是开源的,当然还有其它工具如JBuilder、IntelliJ、JCreator。
这些IDE各有优势劣势,根据你开发的项目来选择了。
JAVA编程环境:
一.下载与安装开发工具箱(JDK)
1.java(TM)SEDevelopmentKits,即JDK
网址:
2.设置环境变量
右击我的电脑->属性->高级->环境变量
Path:
系统在任何路径下都可以识别Java命令需要设置的变量
Path:
;C:
\ProgranFiles\java\jdk1.6.0_01\bin
classpath:
为java加载类(包括class,lib)的路径,只有类在classpath中,
Java命令才能识别
classpath:
.;ProgranFiles\java\jdk1.6.0_01\lib\dt.jar
;ProgranFiles\java\jdk1.6.0_01\lib\tools.jar
JAVA_HOME:
java的安装路径
JAVA_HOME:
ProgranFiles\java\jdk1.6.0_01
二.下载Java开发工具
1.下载Eclipse
Eclipse3.3
网址:
http:
//www.eclipse.org/
点击『DownloadEclipse』找到『EclipseClassic3.3』下载
下载完后,解压即可使用
2.Eclipse插件
(1)XMLBuddy:
编辑xml文件;下载地址为
(2)FatJar:
打包插件,可以方便的完成各种打包任务,可以包含外部的包等;
下载地址为:
(3)Log4E:
Log4j插件,提供各种与log4j相关的任务,Log4j专用于为程序输入调试信息
下载地址为:
http:
//log4j.jayefem.de/index.php/Main_Page
(4)Lomboz:
Ecilpse的一个J2EE的插件,可以将很多java应用服务器,J2EE组件和
web应用开发集成到Eclipse中,可以帮助Java开发者使用Eclipse建立,测试和
部署J2ee应用。
支持jsp编写,包括语法着色和语法检查:
下载地址为:
http:
//forge.objectweb.org/projects/lomboz
(5)MyEclipse:
J2EE开发插件,支持jsp,EJB,数据库操作;
下载地址为:
(6)TomcatPlugin:
支持Tomcat插件;
下载地址为:
(7)语音包:
下载地址为:
http:
//download.eclipse.org/eclipse/downloads
第二章
程序的概括设计
画出流程图
1.键盘上事先设定8个按键,分作两组,每组四个,分别代表两个人用来控制棋子的上下左右键。
2.绘制棋盘,15条横线,15条竖线,在直线交点处下棋子(实心圆形)。
3.黑子先行,黑白交替下子,在棋盘上设定一个与棋盘格大小边长相等的正方形,初始状态,正方形的中心位于期盼的中心点。
当一方欲走棋的时候,应用四个按键来控制所要下棋的位置,每按一次按键,正方形都要向相应方向移动一个格,并且让喇叭发出某种声音,将要移出边界时,发出另一种警告声音并不让其移出边界。
当按下回车键时,应在正方形所在位置放下一个棋子,然后此组按键不能操作,换另一个人下棋,用另一组按键,规则同前。
4.当任何一方有五个棋子沿着横,竖,斜连在一起时,系统自动判断赢棋,并显示黑方或白方胜利。
棋局结束后,任何一方均不能继续操作。
第三章详细设计
//导入包
importjava.applet.*;
importjava.awt.*;
importjava.awt.event.*;
//构造applet程序
publicclass五子棋extendsAppletimplementsActionListener,MouseListener
{
Stringstr="五子棋游戏!
";
DimensioncurrentPos=newDimension();//实例化像素
intzuobiao[][]=newint[19][15];//声明一个19*15的棋盘
intx=20,y=20;
booleanunfirstpaint=false;
booleanone=false;
//======================================================================
publicvoidinit()//初始化(生存周期第一步)
{
addMouseListener(this);//对鼠标添加监听
for(inti=0;i<=18;i++)//使整个棋盘设置为0
{
for(intj=0;j<=14;j++)
zuobiao[i][j]=0;
}
}
//======================================================================
publicvoidpaint(Graphicsg)//画图(生存周期第二步)
{
intx0=30,y0=50,dx=30,dy=30,N=18,M=14;//x0,y0初始坐标,dx,dy每格间距
intx1,y1,x2,y2;
g.setColor(Color.green);//
y1=y0;
y2=y0+M*dy;
for(inti=0;i<=N;i++)//用绿色画棋盘中纵向的线
{
x1=x0+i*dx;
g.drawLine(x1,y1,x1,y2);
}
g.setColor(Color.red);//设置成红色
x1=x0;
x2=x0+N*dx;
for(intj=0;j<=M;j++)//用红色画棋盘中横向的线
{
y1=y0+j*dy;
g.drawLine(x1,y1,x2,y1);
}
g.setColor(Color.red);//设置成红色
g.setFont(newFont("TimesRoman",Font.BOLD,25));//设置字体
g.drawString(str,120,30);//在指定位置(120,30)写入“五子棋游戏!
”
g.setColor(Color.red);//设置成红色
g.fillOval(600,60,20,20)//用红色填充椭圆;
g.drawString(":
甲方",610,80);//在椭圆中写入字
g.setColor(Color.blue);//设置成蓝色
g.fillOval(600,100,20,20);//用蓝色填充椭圆;
g.drawString(":
乙方",610,120);//在椭圆中写入字
//======================================================================
//这里代码不全,currentPos没有赋值,不好推测
if(unfirstpaint)//判断是否为第一次画棋子,如果不是第一次,执行
{
for(inti=0;i<=18;i++)//画棋子
{
for(intj=0;j<=14;j++)
{
if(currentPos.width<=(45+i*30)&¤tPos.width>=(15+i*30))
//你的源文件不是这样写的,我觉得应该是这么写
x=i;
if(currentPos.height<=(65+j*30)¤tPos.height>=(35+j*30))
y=j;
}
}
}
//=====================================================================
if(x!
=20&&y!
=20)
if(zuobiao[x][y]==0)
{
if(one)
zuobiao[x][y]=1;//等于1说明是红色棋子
else
zuobiao[x][y]=2;//等于2说明是蓝色棋子
}
//画点图=====================================================================
for(inti=0;i<=18;i++)
for(intj=0;j<=14;j++)
{
if(zuobiao[i][j]==1)//如果为1,画红棋子
{
g.setColor(Color.red);
g.fillOval(20+i*30,40+j*30,20,20);
}
if(zuobiao[i][j]==2)//如果为2,画蓝棋子
{
g.setColor(Color.blue);
g.fillOval(20+i*30,40+j*30,20,20);
}
}
结论
通过上述代码运行可以运行处五子棋程序。
附录
全部程序代码
packagezh;
importjava.awt.*;
importjava.awt.event.*;
importjava.applet.Applet;
importjava.awt.Color;
publicclassGoBangextendsAppletimplementsActionListener,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)