五子棋项目文档之终结篇.docx
- 文档编号:5490711
- 上传时间:2022-12-17
- 格式:DOCX
- 页数:10
- 大小:211.76KB
五子棋项目文档之终结篇.docx
《五子棋项目文档之终结篇.docx》由会员分享,可在线阅读,更多相关《五子棋项目文档之终结篇.docx(10页珍藏版)》请在冰豆网上搜索。
五子棋项目文档之终结篇
Java五子棋项目结题
项目组成员:
赵成龙张涛王硕夏丽丽洪燕
日期:
2010-12-18
1.概述
五子棋是起源于中国古代的传统黑白棋种之一。
现代五子棋日文称之为"连珠",英译为"Renju",英文称之为"Gobang"或"FIR"(FiveinaRow的缩写),亦有"连五子"、"五子连"、"串珠"、"五目"、"五目碰"、"五格"等多种称谓。
五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。
五子棋既有现代休闲的明显特征"短、平、快",又有古典哲学的高深学问"阴阳易理";它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;它的棋文化源渊流长,具有东方的神秘和西方的直观;既有"场"的概念,亦有"点"的连接。
它是中西文化的交流点,是古今哲理的结晶。
基于五子棋的简单性和趣味性,我们以java这种面向对象的编程语言构建五子棋游戏。
以此来提高对java语言的认识。
2.需求分析
经过分析五子棋游戏需求画出项目用例图如图2.1所示。
图2.1五子棋游戏用例图
本游戏在设计过程中,可以完成人人对战和人机对战两种模式。
参与游戏者可以选择执子颜色,选择黑色或白色,在单机模式下具备普通AI功能,可以进行一步的悔棋,在网络模式下可以进行聊天。
3.总体设计
3.1代码管理
为了利于项目的管理,将项目代码划分成类似图3.1所示的包结构。
图3.1项目包图
3.2项目结构
为了使项目中各个各部分尽量清晰,我们采用的原则是一个类建一个文件。
同时尽量将UI和事件处理等部分分开。
具体结构如图3.2所示。
图3.2项目结构图(客户端部分)
从图中可以看到,我们将GUI层和对应的事件处理部分分开来进行设计,这样做类似于系统设计中的MVC的架构方式,虽然本系统实际并不大,但是通过这样的方式对于熟悉和了解设计过程非常有帮助。
因为本系统没有过多的信息,所以我们并没有考虑去做Model层,而是将他分割到各个类当中。
这样无疑会有一定的代码冗余。
但是对本系统来言并不会造成太大的问题。
3.3系统类结构图
项目类之间的主要关系如图3.3所示:
图3.3五子棋项目类图
主要类的说明:
Ø界面部分
1)Test
用于测试整个五子棋客户端。
2)MainFrame
用户主界面。
包含GameJPanel、ChessJPanel、PlayerJPanel的界面自定义组件。
3)GameJPanel
游戏操作界面实现。
如开始,选择棋子颜色等。
4)ChessJPanel
棋盘界面实现。
5)PlayerJPanel
用户聊天界面实现。
Ø游戏逻辑部分
1)Logic
抽象类,定义基础的所需判断的操作和存储量等,如是否有五子相连等。
2)NetLogic
网络对战时使用的逻辑类,继承自Logic。
3)AILogic
人机对战时使用的逻辑类,继承自Logic。
ØGobangControl
用于实现界面事件的相应等。
Ø网络部分
1)ChessConfigNet
客户端配置服务器信息类。
2)GobangServer
服务器类。
3.4棋子存储方式
本项目采用二维int数组形式来存放棋子,声明部分为:
protectedint[][]board;
需要注意的是,采用的存储方式是和屏幕坐标统一的,即倒置式的坐标平面。
其中0表示无子,1表示黑子,-1表示白子。
4.部分实现
具体实现请参照源代码,在这里给出人机对战时的画面,如图4.1所示。
图4.1人机对战界面
5.博弈树
5.1博弈树的起源
为了探讨一下难度较大的棋类游戏程序,比如五子棋等等。
用这些程序来同人或其他程序对弈。
然而,有些程序是把计算机精心设计成一个棋盘,人们可以在其上对弈(或者是一种单人玩的棋盘游戏)。
这种程序更接近于系统模拟的领域,而不属于人工智能的范畴。
我们此处所要介绍的却是让计算机能够“思考”如何下棋。
假定有两个人或者两台机器在下棋。
我们把其中一名称为棋手,另一名称为对手。
而我们始终从棋手的角度来观看这场竞赛。
这样一来,如果棋手赢了、对手输了,我们就说这盘棋赢了;如果棋手输了、对手赢了,我们就说这盘棋输了。
假设现在该轮到棋手走了。
在大多数情况下,棋手对这步棋可以有若干种选择。
对于棋手的每一种选择,对手也有若干可供选择的相应棋步。
对于棋手的每一步棋以及对手的每一步回棋,棋手又有自己进一步的选择。
显然,这里所遇到的分支情况同我们在状态搜索中遇到的情形相同的。
实际上,我们可以把一盘棋想象成具有一个入口(起始位置)和一组出口的迷宫。
有些出口标上了赢的记号;有些出口标上了输的记号;而有些出口标上了和局的记号。
在入口处,棋手选择某条路径起步,在路径的一个岔口,对手挑选了自己的路径回步,棋手和对手就这样轮流选择自己的路径走下去。
棋手总是力争通向胜利的出口,而对手却总是把棋路引向输的出口。
有时双方各自的努力不相上下,最后在和局出口结束棋局。
或者他们一直在这个迷宫中徘徊,直到形势变得非常明朗:
双方循环兜圈子,这时只好双方握手言和。
因此,下棋游戏同状态图搜索是相似的,就是要在状态图中找出一条从初始状态到目的状态的路径。
但是,它们之间却有一个很大的差别。
在状态图搜索中,总是由一名选手来选择下一步往哪走。
而在棋类的对弈中,棋手只有一半选择的权利,另一半由对手作出决定。
棋手是一直朝着目标努力,而对手却是通过它每一步棋对此设置障碍。
寻找机会把棋手从通往目标的路径上引开。
对于任何一种博弈竞赛,我们可以构成一个博弈树。
它类似于状态图和问题求解搜索中使用的搜索树。
博弈树的结点对应于某一个棋局,其分支表示走一步棋;根部对应于开始位置,其叶表示对弈到此结束。
在叶节点对应的棋局中,竞赛的结果可以是赢、输或者和局。
所谓棋局,就是所有那些必须记录下来的信息。
根据这些信息,比赛在按计划暂停以后能够得以继续进行下去。
显然,这些信息包括了此时棋子在棋盘上的位置以及指出下一步是轮到棋手走,还是对手走。
5.2博弈树的简介
博弈树是一棵与或树,不同于在状态搜索中使用的纯粹的或树。
其原因是:
当轮到棋手走时,他可以决定选择哪一步棋走。
如果起码有一步可以担保棋手能够到达赢的棋局,那么棋手就会选择这一步并保证能够取胜。
因此对应于棋手走的节点是一个或节点。
当轮到对手走时,选择是由对手决定的。
棋手没有任何选择的权利。
只有对手的所有可以走的棋布都会导致棋手赢时,这时棋手才能保证会赢。
因此,对于对手走的结点是一个与节点。
对于一场经过深思熟虑地棋局来说,其博弈树是非常庞大的(国际象棋来说有10^120个节点)。
以至于不可能把这样大的博弈树装入计算机,也不可能在任何合理的、有限的时间内进行详细的搜索。
尽管如此,首先深入的考察一下完整的博弈树,然后再看看如何来修正我们的原来的想法,以便把搜索树修整到一个合理的范围。
这样做还是很有意义的。
5.3博弈的策略
假设我们对所讨论的博弈问题构造了一棵完整的博弈树,我们希望能从中找出棋手应采用的策略。
这种策略应当确保棋手会赢,或者起码能够得到和局的结果。
几乎所有的棋类问题,都可以用博弈树来描述。
博弈树是把计算机和用户所有可能的走法和局面罗列出来的一颗树。
黑白双方交替地按合理走法把树展开,树的每一个节点都表示某一个特定局面。
根节点表示的是当前需要计算的局面,中间节点表示的是对弈过程中的某一个局面,叶子节点是树的最底端,表示可以推导的局面。
叶子节点和根节点之间的最大距离,称为搜索深度。
整个博弈树描述的是从当前局面出发,包含所有可能的对弈过程的搜索树。
六子棋计算机博弈问题也就转化为寻求最佳路径的问题。
我们假设博弈树是有限的,这样我们就不会遇到永无止境的棋局或者一步有无限多种着法的棋局。
一般搜索树中有三种类型的结点:
(1)偶数层的中间结点,代表棋手甲要走的局面;
(2)奇数层的中间结点,代表棋手乙要走的局面;
(3)叶子结点,代表棋局结束的局面,即棋手甲或乙获胜,或者是和局。
实际上需要考虑在这六个位置上某一方所形成的子的布局的情况,对于在还没有子的地方落子以后的当前局面的评分,主要是为了说明在这个地方下子的重要性程度,设定了一个简单的规则来表示当前棋面对机器方的分数。
6.JavaGUI程序简介
6.1Applet工作原理
Applet小应用程序的实现主要依靠java.Applet包中的Applet类。
与一般的应用程序不同,Applet应用程序必须嵌入在HTML页面中,才能得到解释执行;同时Applet可以从Web页面中获得参数,并和Web页面进行交互。
Applet是一种Java的小程序,它通过使用该Applet的HTML文件,由支持Java的网页浏览器下载运行。
也可以通过java开发工具的appletviewer来运行。
Applet程序离不开使用它的HTML文件。
这个HTML文件中关于Applet的信息至少应包含以下三点:
1)字节码文件名(编译后的Java文件,以.class为后缀)
2)字节码文件的地址
3)在网页上显示Applet的方式。
含有Applet的网页的HTML文件代码中部带有这样一对标记,当支持Java的网络浏览器遇到这对标记时,就将下载相应的小应用程序代码并在本地计算机上执行该Applet。
JavaApplet是用Java语言编写的一些小应用程序,这些程序是直接嵌入到页面中,由支持Java的浏览器(IE或Nescape)解释执行能够产生特殊效果的程序。
它可以大大提高Web页面的交互能力和动态执行能力。
包含Applet的网页被称为Java-powered页,可以称其为Java支持的网页。
在javaView中运行的效果如图6.1所示。
图6.1javaApplet运行效果
当用户访问这样的网页时,Applet被下载到用户的计算机上执行,但前提是用户使用的是支持Java的网络浏览器。
由于Applet是在用户的计算机上执行的,所以它的执行速度不受网络带宽或者Modem存取速度的限制,用户可以更好地欣赏网页上Applet产生的多媒体效果。
在JavaApplet中,可以实现图形绘制,字体和颜色控制,动画和声音的插入,人机交互及网络交流等功能。
Applet还提供了名为抽象窗口工具箱(AbstractWindowToolkit,AWT)的窗口环境开发工具。
AWT利用用户计算机的GUI元素,可以建立标准的图形用户界面,如窗口、按钮、滚动条等等。
6.2双缓冲技术
当数据量很大时,绘图可能需要几秒钟甚至更长的时间,而且有时还会出现闪烁现象,为了解决这些问题,可采用双缓冲技术来绘图。
双缓冲即在内存中创建一个与屏幕绘图区域一致的对象,先将图形绘制到内存中的这个对象上,再一次性将这个对象上的图形拷贝到屏幕上,这样能大大加快绘图的速度。
双缓冲实现过程如下:
1、在内存中创建与画布一致的缓冲区
2、在缓冲区画图
3、将缓冲区位图拷贝到当前画布上
4、释放内存缓冲区
在图形图象处理编程过程中,双缓冲是一种基本的技术。
我们知道,如果窗体在响应WM_PAINT消息的时候要进行复杂的图形处理,那么窗体在重绘时由于过频的刷新而引起闪烁现象。
解决这一问题的有效方法就是双缓冲技术。
因为窗体在刷新时,总要有一个擦除原来图象的过程OnEraseBkgnd,它利用背景色填充窗体绘图区,然后在调用新的绘图代码进行重绘,这样一擦一写造成了图象颜色的反差。
当WM_PAINT的响应很频繁的时候,这种反差也就越发明显。
于是我们就看到了闪烁现象。
我们在项目中即是采用了这种技术来解决屏幕闪烁问题。
7组员感受
7.1赵成龙
通过本项目的练习,虽然在整个过程中遇到了各种各样的问题,但是通过各种渠道去查找和搜集资料并解决。
使我们充分感受到了Java是一门实践性非常强的学科,对于项目本身而言或许并不是非常难,但是当我们从一个项目的角度去思考的时候,仍会发现一些甚至在大项目中所可能接触到的一些过程和步骤。
正是基于此,我作为本组的项目总体设计和整理者,才尝试从系统设计或者大言不惭地说一句架构的角度来考虑。
正是因为站在了这样的角度,所以在整个设计的过程中才会充分的考虑系统的灵活性、代码的易管理性等等方面,而从过这中思考,也确实使我得到了一定程度的锻炼。
同时对于java有了更加感性化的认识和了解。
虽然在最后,因为时间和其他的原因,我们并没能将预想设计的东西完全地做完。
这点比较遗憾,但是,有些时候过程真的比结果重要的多。
只有经历了才会发现不足,才能够进步。
而如果仅仅因为惧怕失败而不去做,那么在这个过程中我们所经历的遇到问题、自己思索问题和解决问题以及解决过后那种兴奋的心情的体验又从何谈起呢?
经此项目,收获良多。
但同时也非常地感谢与我同组的组员们,独木不成林,没有你们,我们走不了这么远。
感谢你们的关心、鼓励和支持。
同时感谢辛勤工作的老师和助教。
7.2张涛
7.3洪燕
7.4王硕
7.5夏丽丽
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 五子棋 项目 文档 终结