• 2.59 MB
  • 2022-04-22 13:54:55 发布

java五子棋游戏程序设计毕业论文.doc

  • 41页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'java五子棋游戏程序设计毕业论文第一章绪论1.1开发背景:游戏软件是当今世界发展最迅速,最有影响力,最有潜力与活力的领域之一。游戏软件深受广大青年人喜爱,而且在发达国家中老年人也有大部分喜欢游戏的,因此游戏软件在很大程度上给予绝大部分人精神上的娱乐。第二次世界大战以后,电子计算机技术得到了突飞猛进的发展。先是由晶体管代替了笨重的真空管,后来出现了集成电路和大规模集成电路,使电子子计算机一代一代实现更新,同时软件技术也发展迅速。在美国,集中了许多计算机软件的设计人才,他们工作之余,时常喜爱编一种能与人斗智的“游戏”,以此来锻炼编程的能力。这种“游戏”花样繁多,但其特点都是利用计算机软件事先设计好的“分析”、“判断”能力反过来与人较量。由于不断修改更新,使计算机的“智力”水平与人难分高低。到了90年代,游戏软件已经为世界各国的人使用,BLACKISLAND和Blizzard.这两个强大的游戏制作组起到了巨大的带动作用,还有中国的洛河工作室在国内也起到了巨大作用,他们让很多很多人喜欢上了游戏软件,打开了这个市场。如今游戏软件产业已经受到了广泛的关注,它年轻有潜力而且吸引人,让人们日益丰富的生活需求得以满足。五子棋游戏更是吸引着不同年龄段的人群,无论男女老少都可以玩,都喜欢玩,而当前微型计算机已经是在广大人群中流行着,用电脑来下五子棋更是一种时尚。五子棋相传起源于四千多年前的尧帝时期,比围棋的历史还要悠久,可能早在“尧造围棋”之前,民间就已有五子棋游戏。有关早期五子棋的文史资料与围棋有相似之处,因为古代五子棋的棋具与围棋是完全相同的。在上古的神话传说中有“女娲造人,伏羲做棋”一说,《增山海经》中记载:“休舆之山有石焉,名曰帝台之棋,五色而文状鹑卵。”李善注引三国魏邯郸淳《艺经》中曰:“棋局,纵横各十七道,合二百八十九道,白黑棋子,各一百五十枚”。可见,五子棋颇有渊源。亦有传说,五子棋最初流行于少数民族地区,以后渐渐演变成围棋并在炎黄子孙后代中遍及开来,可以说五子棋是我们的国粹之一了。而当前五子棋程序的发展也非常快,从最初的双人发展到人机(有AI),然后到现在的网络对战,已经受到越来越多人的喜爱和重视。1.2课题意义: 人类之所以不断在进步,是因为我们人类一直不断的在思考,五子棋游戏程序的开发符合人类进步也是促进人类进步的一大动力之一。五子棋游戏程序让人们方便快捷的可以下五子棋,让人们在何时都能通过下棋来提高逻辑思维能力,同时也培养儿童的兴趣以及爱好,让孩子更加聪明。同时,五子棋游戏程序的开发也使得五子棋这个游戏得到了广泛的推广,让世界各地的人们知道五子棋,玩上五子棋,这已经不是局限。五子棋游戏程序使得越来越多的人喜欢上了五子棋,热爱下五子棋,它是具有很好的带动性的。随着互联网络的不断普及,越来越多的人可以在网络上就能够与他人下五子棋了。1.3五子棋游戏的发展与现状:目前,连珠这一棋类运动已迅速在国际上发展起来。外国人都十分看好这一不起眼的智力游戏,并认为五子棋不仅能提高思维、开发智力、手脑并用、修身养性而且富含哲理,具有东方的神秘和西方的直观,是中西文化的交汇点。许多国家的人对五子棋都有不同的爱称,例如韩国人把五子棋称之为“情侣棋”,言下之意是情人之间下五子棋有利于增加情感的交流;欧洲人称之为“中老年棋”,表示五子棋适合中老年人的生理特点和思维方式;美洲人喜欢将五子棋称之为“商业棋”,就是说商人谈生意时可边下棋边谈生意,棋下完了生意也谈成了。由此可见,尽管国度不同,语言各异,但人们都可以借助五子棋这一简单而又深奥的棋艺进行交流、比赛,增进友谊。当前,有40多个国家和地区都在下五子棋,并有各种规模和级别的比赛。1989年8月在日本京都、1991年8月在俄罗斯联邦的莫斯科、1993年8月在瑞典、1995年8月在爱沙尼亚的塔林分别举行了第一、二、三、四届世界锦标赛。除第三届的冠军是爱沙尼亚人之外,其余三届的冠军都是日本人。五子棋的世界锦标赛,每两年举办一次,其申国竞争也十分激烈。日本目前拥有自己的五子棋职业棋手,并且对连珠(五子棋)技术的研究也相当普遍和全面,就水平也正在日益增强。同时,五子棋的理论研究与探索也呈现蓬勃发展的势头,从1858年第一部五子棋专著问世以来,目前,全世界有2000多种五子棋的书籍及期刊,分别以日文、俄文、英文、瑞典文及中文出版发行。 五子棋在我国的北京、上海、天津、云南、浙江、广东、四川、湖北、辽宁、新疆、河北等省(区)市都有很大的发展。北京多次举办了北京地区的五子棋赛,如“思曼杯”、“京空杯”、“奇奇童杯”、“北京第六届民族团结杯”和“北京第四岂民族运动会”的五子棋比赛。上海地区举办了“上文杯”五子棋大赛。云南省以及其他省市亦举办过许多五子棋比赛。所有这些赛事都越来越多地吸引了无数人们的关注,表明了根埴于中国的五子棋有着广泛的群众基础,是群众喜闻乐见的体育活动。而现在,很多很多游戏平台上面都有五子棋游戏供我们玩,任何游戏平台上面只要有棋牌类游戏的,那么它就有五子棋在里面,网络五子棋比赛,在联众,263,QQ游戏,UC里进行了10几年了可见,五子棋游戏在网络上面是非常火暴的,而且在棋牌游戏里面玩家人数排名总会占到很前面,不愧是风靡全球的棋牌游戏啊!在未来中,将会有越来越多的人关注五子棋,喜欢五子棋,那么将其变为商业化也会越来越多,而且还可以以教育孩子的方式来将其嵌套进去,或者用来做测试等等,可以说以后的五子棋游戏会是那么的精彩,那么的让人憧憬。那么对于它的游戏开发和发展也将会上升到举足轻重的地位去,它的发展会是相当之快的,就让我们拭目以待吧。1.4论文的组织结构:本文由第一章绪论,第二章介绍软件的基本功能和特点,第三章软件的总体设计,第四章软件各个功能的设计与实现,第五章总结,参考文献和致谢七部分组成。第一章绪论由研究背景、五子棋的发展前景、五子棋程序的基本步骤和本文的组织结构组成。第二章介绍软件的开发工具和和软件的基本功能,另外介绍软件所要实现的目标。第三章软件总体设计和软件的总体分析。第四章详细分析软件各模块的设计与实现包括绘制棋盘、下棋功能、判断胜负、下棋信息、时间设置、认输以及悔棋等功能组成。第五章介绍软件的操作以及演示。最后第六章为总结和致谢。 第二章五子棋程序的介绍与规划2.1软件的基本功能:1.显示一个十九行十九列的围棋棋盘。2.在棋盘上面在对应位置通过点击鼠标下子,棋盘上将在相应的位置上显示棋子,并且棋子在横纵交点上。3.可以自动判断游戏是否结束,是否黑方或者是白方已经胜利,并且跳出对话框来提示玩家。4.在游戏棋盘上方会有一个游戏信息,这个游戏信息是用来提示当前是黑白双方的哪一方下子,玩家可以根据这个提示来相应的下棋,而不会导致不清楚轮到哪一方下棋。5.可以重新开始游戏,并且有认输功能,在下棋提示上提示哪方时点认输,哪一方就输了,并且有悔棋功能。6.还可以对游戏时间进行设置,判断是否超出规定的时间,如果超出时间则自动判断为输。2.2开发运行环境:1.中心处理器:双核1.6GHZ;2.内存:1G;3.硬盘:320G;4.操作系统:WINDOWSXP;5.开发工具:MyEclipse7.5;6.编程语言:JAVA。2.3软件的开发手段以及工具的介绍:此软件我是通过MyEclipse 这个开发软件来开发的,用的是JAVA语言编写。将会用到Swing来编程序,Swing是在JAVA的基础图形化用户界面AWT的基础上拓展的API集,Swing的功能是通过JAVA代码编写窗口程序,创建图形化的用户界面(GUI)。Swing可以创建窗体、面版,在窗口中导入或者绘制图片,或者输入文本信息等等,结合JAVA的JDBC和/或IO操作可以实现数据的保存。Java是一种简单的,面向对象的,分布式的,解释型的,健壮安全的,结构中立的,可移植的,性能优异、多线程的动态语言。JAVA的特点是:1、Java语言是简单的。Java语言的语法与C语言和C++语言很接近,使得大多数程序员很容易学习和使用Java。另一方面,Java丢弃了C++中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。特别地,Java语言不使用指针,并提供了自动的废料收集,使得程序员不必为内存管理而担忧。  2、Java语言是一个面向对象的。Java语言提供类、接口和继承等原语,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为implements)。Java语言全面支持动态绑定,而C++语言只对虚函数使用动态绑定。总之,Java语言是一个纯的面向对象程序设计语言。   3、Java语言是分布式的。Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java.net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。   4、Java语言是健壮的。Java的强类型机制、异常处理、废料的自动收集等是Java程序健壮性的重要保证。对指针的丢弃是Java的明智选择。Java的安全检查机制使得Java更具健壮性。   5、Java语言是安全的。Java通常被用在网络环境中,为此,Java提供了一个安全机制以防恶意代码的攻击。除了Java语言具有的许多安全特性以外,Java对通过网络下载的类具有一个安全防范机制(类ClassLoader),如分配不同的名字空间以防替代本地的同名类、字节代码检查,并提供安全管理机制(类SecurityManager)让Java应用设置安全哨兵。  6、Java语言是体系结构中立的。Java程序(后缀为java的文件)在Java平台上被编译为体系结构中立的字节码格式(后缀为class的文件),然后可以在实现这个Java平台的任何系统中运行。这种途径适合于异构的网络环境和软件的分发。   7、Java语言是可移植的。这种可移植性来源于体系结构中立性,另外,Java还严格规定了各个基本数据类型的长度。Java系统本身也具有很强的可移植性,Java编译器是用Java实现的,Java的运行环境是用ANSIC实现的。   8、Java语言是解释型的。如前所述,Java程序在Java平台上被编译为字节码格式, 然后可以在实现这个Java平台的任何系统中运行。在运行时,Java平台中的Java解释器对这些字节码进行解释执行,执行过程中需要的类在联接阶段被载入到运行环境中。   9、Java是高性能的。与那些解释型的高级脚本语言相比,Java的确是高性能的。事实上,Java的运行速度随着JIT(Just-In-Time)编译器技术的发展越来越接近于C++。   10、Java语言是多线程的。在Java语言中,线程是一种特殊的对象,它必须由Thread类或其子(孙)类来创建。通常有两种方法来创建线程:其一,使用型构为Thread(Runnable)的构造子将一个实现了Runnable接口的对象包装成一个线程,其二,从Thread类派生出子类并重写run方法,使用该子类创建的对象即为线程。值得注意的是Thread类已经实现了Runnable接口,因此,任何一个线程均有它的run方法,而run方法中包含了线程所要运行的代码。线程的活动由一组方法来控制。Java语言支持多个线程的同时执行,并提供多线程之间的同步机制(关键字为synchronized)。   11、Java语言是动态的。Java语言的设计目标之一是适应于动态变化的环境。Java程序需要的类能够动态地被载入到运行环境,也可以通过网络来载入所需要的类。这也有利于软件的升级。另外,Java中的类有一个运行时刻的表示,能进行运行时刻的类型检查。  Java语言的优良特性使得Java应用具有无比的健壮性和可靠性,这也减少了应用系统的维护费用。Java对对象技术的全面支持和Java平台内嵌的API能缩短应用系统的开发时间并降低成本。Java的编译一次,到处可运行的特性使得它能够提供一个随处可用的开放结构和在多平台之间传递信息的低成本方式。特别是Java企业应用编程接口(JavaEnterpriseAPIs)为企业计算及电子商务应用系统提供了有关技术和丰富的类库。MyEclipse是对EclipseIDE的扩展,利用它我们可以在数据库和J2EE的开发、发布,以及应用程序服务器的整合方面极大的提高工作效率。它是功能丰富的J2EE集成开发环境,包括了完备的编码、调试、测试和发布功能,完整支持HTML,Struts,JSF,CSS,Javascript,SQL,Hibernate。在结构上,MyEclipse的特征可以被分为7类:1.J2EE模型2.WEB开发工具3.EJB开发工具4.应用程序服务器的连接器5.J2EE项目部署服务6.数据库服务7.MyEclipse整合帮助 对于以上每一种功能上的类别,在Eclipse中都有相应的功能部件,并通过一系列的插件来实现它们。MyEclipse结构上的这种模块化,可以让我们在不影响其他模块的情况下,对任一模块进行单独的扩展和升级。简单而言,MyEclipse是Eclipse的插件,也是一款功能强大的J2EE集成开发环境,支持代码编写、配置、测试以及除错。2.4软件的实现目的:五子棋游戏程序所要实现的目的是让我们可以在电脑上下棋,而不需要去买,可以随时玩,方便快捷。而且能更好的推广五子棋于世界各地,此软件也在于提供给爱好五子棋的人,也吸引更多的人喜欢上五子棋,也具有很大很大的商业价值。使五子棋游戏程序在以后的制作中功能越来越强大,外观越来越好看。第三章软件总体设计与分析3.1用户需求分析:通过软件功能的分析,根据五子棋爱好者的需求,得出以下需求信息:1.具有重新开始功能;2.具有认输功能; 1.具有提示该轮到哪一方下棋的功能;2.退出游戏功能;3.判断胜负功能;4.时间设置功能;5.悔棋功能。还有用户对游戏界面的要求,通过上述的用户需求,我们可以得出一个总体的设计方案。由上述的用户需要,可以对程序的基本功能进行一个有效的分析,规定下游戏的基本功能,基本功能如下结构图。3.2软件功能结构图:此五子棋程序最主要的四大功能是:下棋,判断胜负,重新开始与认输,游戏时间设置。大体的功能如下图: 五子棋程序十九行十九列的棋盘。黑白双方轮流落子,不能重复落同一位置。在棋盘上下子,棋子落在交点上。判断横,竖,斜方向够五子相连为赢。显示游戏信息,提示当前轮到哪一方落子。重新开始游戏和认输以及退出游戏功能。时间设置,在规定时间内下完,否则判输。3.3软件各个功能的简要说明:1.绘制十九行十九列的棋盘:首先是每行每列的距离都是一样的,并且棋盘上面有八个星,棋盘中间有个天元点,跟围棋的棋盘一样。2.棋盘上面落子:点击鼠标以后,会在相应位置落下棋子,并被绘制出来,黑子是一个实心的黑圆,白子是一个实心的白圆加上一个等大空心的黑圆。棋子落在交点上:我们在下五子棋棋的时候,棋子都是会落在交点上的,而并非落在格子里面,那么我们就要规定当我点击鼠标时,选取距离鼠标所取点的最近的左上交点为绘制棋子的中心点,那么就可以实现棋子落在交点上了。3. 黑白双方轮流落子:黑方落子以后就要轮到白方,交替进行,这是下棋的基本要求,因此我们就要弄一个互斥事件进去,让他们交替的落子。不能落在相同位置:当我们落子时,会不小心落到相同位置上去,那么就要出现提示,不能落在相同位置上,需要重新落子,实现的设想是当这个点已经绘制过棋子以后,我们就要给一个布尔变量,让它为假,那么只能在它为真时才能绘制棋子,否则就要重新落子到别的地方去。1.判断输赢:当五个相同颜色子都连在了一起的时候,我们就要判其为赢,这五个子可以在横竖方向上连起,也可以在斜方向上连起。2.游戏信息:我们应该在棋盘的上面设置一个游戏信息的,用来提示当前轮到哪一方下棋了,以便于玩家知道谁在下,这个功能只要在黑白双方轮流下棋功能的过程中添加一个提示信息用于显示到界面上的就可以了。3.重新开始游戏就是把棋盘上的子全部清空,回复到一开始的时候的状态,重置之前所有的数据。认输的功能就是在判断输赢功能的基础上添加的,让玩家对自己没信心的时候使用。退出游戏的功能就是直接把窗口关闭就可以了。4.时间设置:时间设置功能要调用到线程和监听,他的主要作用是给玩家设置规定的时间,也是五子棋游戏的一个下法规则,当哪一个玩家超出了规定的时间时,那么就会判断他输了,并且弹出对话框提示以及重新开始游戏。3.4软件设计中使用到的JAVA软件包以及类和方法:在用JAVA设计软件的时候,使用到SUM公司提供的一些软件包,这样使得我们编写程序更加简便,以下是使用到的软件包:Javax.swing.JFrame//javax.swing软件包提供一组“轻量级”(全部是Java语言)组件,尽量让这些组件在所有平台上的工作方式都相同。JFrame类是java.awt.Frame的扩展版本,该版本添加了对JFC/Swing组件架构的支持。JFrame是用来创建窗体的swing类,用来创建一个图形界面的原始窗口,并且可以设置其大小,位置等属性,是swing编程的基础类之一。JFrame这个类中,我们将要用到的主要方法是:setVisible();//设置窗体是否显示,里面填上true,那么窗体就可以显示出来了,如果填false,窗体不显示。setTitle();//设置窗体的标题,需要什么标题,就在里面写上你的标题就可以了,比如我要填入五子棋作为标题,那么可以这样写:setTitle(“五子棋”)。 setSize();//设置窗体大小,这里需要设置的窗体是一个平面的,所以设置窗体大小的时候有高度和宽度这两个像素,输入两个像素就可以确定窗体的大小了。setLocation();//设置窗体初始显示的位置,作用是把窗体初始显示的位置摆到让用户看起来舒服的位置。setResizable();//设置窗体的大小是否可以改变,为了方便用户使用,可让用户自己拉大或者拉小窗体,达到用户需要的要求。setDefaultCloseOperation(JFrame_EXIT_ON_CLOSE);//设置窗体关闭方式,关闭窗体的同时结束程序,这样就不会一直占用用户的内存去运行程序,只要不玩了,程序就会自动关闭,这个是游戏软件最基础的以及最必要的一个功能作用。Java.awt//java.awt软件包包含用于创建用户界面和绘制图形图像的所有类。Java.awt.Toolkit//Toolkit此类是所有AbstractWindowToolkit实际实现的抽象超类。Toolkit的子类被用于将各种组件绑定到特定本机工具包实现。Toolkit.geiDefaultToolkit().getScreenSize().width;Toolkit.geiDefaultToolkit().getScreenSize().height;//以上这两个方法的作用是取得我们电脑显示屏幕的宽度以及高度。geiDefaultToolkit()为获取默认工具包,如果名为"java.awt.headless"的系统属性被设置为true,则使用Toolkit的headless实现。如果不存在"java.awt.headless"或"java.awt.headless"被设置false,且存在名为"awt.toolkit"的系统属性,则该属性将被视为Toolkit子类的名称;否则将使用特定于平台的默认Toolkit实现。getScreenSize()这个方法是获取屏幕的大小。在具有多个显示屏的系统上,使用主显示屏。从GraphicsConfiguration和GraphicsDevice可以获得多屏幕感知显示尺寸。Javax.swing.JOptionPane//JOptionPane有助于方便地弹出要求用户提供值或向其发出通知的标准对话框。下面用到JOptionPane的方法有以下几个:JOptionPane.showMessageDialog();//这个方法是显示一个消息对话框,主要用来提示信息。showMessageDialog(mf,”我要输入的信息”),这样用以提示用户现在的情况。JOptionPane.showConfirmDialog();//这个方法跟前一个方法有点类似,不过它是有判断的。作用是显示一个确认对话框,用户选择对话框中的选项,然后根据选项返回结果进行判断,需要判断什么,写程序的时候可以自己添加进去,功能更加强大。 JOptionPane.showInputDialog();//显示请求用户输入内容的问题消息对话框,它以parentComponent为父级。输入值将被初始化为initialSelectionValue。该对话框显示于Component的窗体的上部,通常位于Component之下。显示一个信息输入对话框,它的作用是用来保存用户输入的信息。Java.awt.event.MouseListener//MouseLinstener是鼠标监听,功能是接收用户通过鼠标所做的操作,可以取得用户点击鼠标的坐标,从而进行其他的操作。MouseLinstener的使用方法是需要调用到JFrame的addMouseListener方法加入监听。它有以下几个方法,是我们写程序需要用到和了解的:mouseClicked(MouseEvente);//监听鼠标点击事件的操作,对鼠标点击以后进行处理。mouseEntered(MouseEvente);//监听鼠标进入事件的操作,对鼠标进入某个指定区域以后进行处理。mouseExited(MouseEvente);//监听鼠标离开事件的操作,对鼠标离开某个指定区域以后进行处理。mousePressed(MouseEvente);//监听鼠标按下事件的操作,对鼠标按下以后进行处理,这个在我们的五子棋用需要着重用到的。mouseReleased(MouseEvente);//监听鼠标抬起事件的操作,对鼠标按下后抬起进行处理。鼠标点击时执行的顺序是:mousePrssedàmouseReleasedàmouseClicked//由此可以判断按西与抬起是否在同一个位置。MouseEvent类有以下两个需要用到的方法:getX();//得到鼠标的横向位置的坐标,用于判断棋子的位置的时候是需要到的。getY();//得到鼠标的纵向位置的坐标,用于判断棋子的位置的时候是需要到的。Graphics类,它的功能是类似于画笔的功能,用来在窗口中绘制文字以及图形等。他的调用是通过覆写JFrame的paint()方法来使用的,通过repaint()方法来调用。它有以下方法:drawstring();//绘制字符串。drawOval();//绘制一个空心的圆形,用与绘制我们一会五子棋中的白棋需要到的。fillOval();//绘制实心的圆形,也是用到来绘制棋子。drawline();//绘制一条直线,用来画我们的棋盘。 drawRect();//绘制一个空心的矩形,功能按钮用到。fillRect();//绘制一个实心的矩形。drawImage();//绘制一个已经存在的图片,将一个图片直接显示到窗体只中去。setColor();//设置画笔的颜色。比如:setColor(Color.RED),那么就把它的颜色设置成了红色。setFont();//设置绘制文字的字体类型。比如:setFont(newFont(“黑体”,10,10)),那么它的字体就是黑体,大小是10。Java.io.File//这个是产生中断并且调用文件用到的类。Java.io通过数据流、序列化和文件系统提供系统输入和输出。File类文件和目录路径名的抽象表示形式。Java.awt.image.BufferedImage//BufferedImage子类描述具有可访问图像数据缓冲区的Image。BufferedImage由图像数据的ColorModel和Raster组成。Raster的SampleModel中band的数量和类型必须与ColorModel所要求的数量和类型相匹配,以表示其颜色和alpha分量。所有BufferedImage对象的左上角坐标都为(0, 0)。因此,用来构造BufferedImage的任何Raster都必须满足:minX=0且minY=0。可以用来调用一个图片作为我们下棋的背景图片使用。第四章软件的具体实现 4.1准备工作:首先用MyEclipse来建一个工程,我将此工程的名字命为:fivechess。然后在我所建的工程里建立一个包,包名为fiveframe。再在包里面建立我需要的类,建立一个名字为FiveChessFrame的JAVA类,继承Javax.swing.JFrame这个类,而且同时引入MouseListener这个监听的接口,有下面拓展publicclassFiveChessFrameextendJFrameimplementsMouseListener。那么这个类里面就会有监听的一些命令:@OverridepublicvoidmouseClicked(MouseEvente){//TODOAuto-generatedmethodstub}//鼠标点击监听操作。@OverridepublicvoidmouseEntered(MouseEvente){//TODOAuto-generatedmethodstub}//鼠标进入监听操作。@OverridepublicvoidmouseExited(MouseEvente){//TODOAuto-generatedmethodstub}//鼠标离开监听操作。@OverridepublicvoidmousePressed(MouseEvente){//TODOAuto-generatedmethodstub}////鼠标按下监听操作。@OverridepublicvoidmouseReleased(MouseEvente){//TODOAuto-generatedmethodstub }//鼠标抬起监听操作。4.2建立游戏窗口界面:开始开发游戏的第一步就是先制作出游戏的窗口界面,一个漂亮美丽大方的游戏界面,往往先能吸引玩家去尝试,所以这个地方不能够马虎。先把我们需要的窗口按需求创建出来:publicFiveChessFrame(){//设置标题this.setTitle("五子棋");//窗体大小this.setSize(500,500);//窗体出现位置this.setLocation((width-500)/2,(height-500)/2);//窗体设置为大小不可变this.setResizable(false);//将窗体的关闭方式设置为默认关闭后程序结束this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//加入鼠标监听this.addMouseListener(this);//将窗体显示出来this.setVisible(true);}然后建立一个测试类,来测试一下我刚才写的窗口是否符合我的要求:importfiveframe.FiveChessFrame;publicclassTest{publicstaticvoidmain(String[]args){FiveChessFrameff=newFiveChessFrame();}}运行这个测试类得到如下窗口: 得出这个窗体以后,我们就开始编写界面,我先是调用一个图片作为我这个五子棋程序棋盘的背景,大家都喜欢在木棋盘上面下五子棋,那种会让人感觉到很高雅,所以我就选了一张木质的图片来当我的五子棋的背景图片。先定义一个背景图片://背景图片BufferedImagebgImage=null;下面是调用背景文件,要用try来调用,要不然会出错。try{bgImage=ImageIO.read(newFile("e:/JAVA/bg.jpg"));}catch(Exceptione){e.printStackTrace();}由上面的语句可以知道我加入的背景图片存放在e:/JAVA/这个目录下,现在加入把背景显示出来的方法: publicvoidpaint(Graphicsg){//绘制背景g.drawImage(bgImage,1,20,this);}这样我们就把背景图片调用到了,再看一下现在的窗口界面:现在已经可以看到背景图象了,很有木质感,一看到这个背景就让人有想下棋的冲动,当然,要等程序写好了才能下。 那么,下面我要开始绘制棋盘了,我需要绘制一个十九乘十九的棋盘,绘制棋盘需要注意到的问题是,我们点击棋盘的时候,会出现跳动也就是屏幕闪烁的问题,因为我们每下一步棋子,都会需要再绘制一次棋盘的。所以我们就要用到双缓冲技术了,双缓冲技术的使用会使得屏幕不再闪烁,一般双缓冲技术用在手机游戏中,因为手机内存小,屏幕闪烁问题比较明显。在画棋盘的时候需要计算棋盘中每一条线的间距,这里用的是十九乘十九的围棋棋盘那么总宽度可以为360像素,分成18份,没分是20像素,总高度也同样是360像素,如宽度一样分。实现语句:publicvoidpaint(Graphicsg){//双缓冲技术防止屏幕闪烁BufferedImagebi=newBufferedImage(500,500,BufferedImage.TYPE_INT_ARGB);Graphicsg2=bi.createGraphics();g2.setColor(Color.BLACK);//绘制背景g2.drawImage(bgImage,1,20,this);//控制字体g2.setFont(newFont("黑体",Font.BOLD,20));//输出标题信息g2.drawString("下棋提示:",130,60);//把前面改过的字体改回来g2.setFont(newFont("宋体",0,14));//输出时间信息g2.drawString("黑方时间:无限制",30,470);g2.drawString("白方时间:无限制",260,470);//添加下棋需要到的功能说明g2.setFont(newFont("黑体",Font.BOLD,15));g2.drawString("开始游戏",405,110);g2.drawString("游戏设置",405,160);g2.drawString("游戏说明",405,210);g2.drawString("悔棋",425,260);g2.drawString("认输",425,310);g2.drawString("关于",425,360);g2.drawString("退出",425,410);//绘制棋盘for(inti=0;i<19;i++){g2.drawLine(10,70+20*i,370,70+20*i);g2.drawLine(10+20*i,70,10+20*i,430);} //标点位,棋盘上的八个星和一个天元点。g2.fillOval(68,128,4,4);g2.fillOval(308,128,4,4);g2.fillOval(308,368,4,4);g2.fillOval(68,368,4,4);g2.fillOval(308,248,4,4);g2.fillOval(188,128,4,4);g2.fillOval(68,248,4,4);g2.fillOval(188,368,4,4);g2.fillOval(188,248,4,4);//在背景上绘制以后调用,实现双缓冲。g.drawImage(bi,0,0,this);} 通过上面的几段代码,现在就可以得到一个我需要的界面了,那么界面就算是绘制完成了,测试一下看:这就是五子棋游戏的基本界面,以后要补全的功能也在上面了。4.3完成下棋的功能:现在我需要在我完成的游戏界面上可以下棋,也就是可以把通过鼠标点击,我可以在相应的位置上放下棋子。先绘制棋子,黑棋我用一个实心的黑圆来表示,白棋用一个实心的白圆再加上一个同大小的空心的黑圆来表示通过一个二维的数组来保存之前已经下过的棋子。点击鼠标对应位置的时候,把棋子落在距离点击处最近的左上一个交点上,这样使得棋子都能落在交点上,美观而且符合五子棋实际下棋的要求://保存棋子的坐标intx=0; inty=0;//保存之前下过的全部棋子的坐标//内容为0表示没有棋子,为1表示黑子,为2表示白子int[][]allChess=newint[19][19];//绘制棋子/*g.fillOval(x,y,10,10);*/for(inti=0;i<19;i++){for(intj=0;j<19;j++){if(allChess[i][j]==1){//黑子inttempX=i*20+10;inttempY=j*20+70;g2.fillOval(tempX-7,tempY-7,14,14);}if(allChess[i][j]==2){//白子inttempX=i*20+10;inttempY=j*20+70;g2.setColor(Color.WHITE);g2.fillOval(tempX-7,tempY-7,14,14);g2.setColor(Color.BLACK);g2.drawOval(tempX-7,tempY-7,14,14);}}}点击鼠标时让棋子下在棋盘范围之内,那么就要用到鼠标按下这个类了:@OverridepublicvoidmousePressed(MouseEvente){//TODOAuto-generatedmethodstub/*System.out.println("X:"+e.getX());System.out.println("Y:"+e.getY());*/if(canPlay==true){x=e.getX(); y=e.getY();if(x>=10&&x<=370&&y>=70&&y<=430){//重新执行一次paint()方法this.repaint();}那么,下棋的功能就已经可以实现了,下棋的时候我们是需要互斥的下子的,先是黑棋下了然后到白棋,而且当棋盘上有棋子的时候就不可以再往那个地方下棋了,所以我们还需要做一下互斥的功能,并用下棋的游戏信息来提示玩家该轮到谁落子了,同时当棋子落在同一个位置的时候,就要放出提示框来提示已经有棋子,不能再下棋。//标识当前是黑棋还是白棋下下一步booleanisBlack=true;//标识当前游戏是否可以继续booleancanPlay=true;//保存显示的提示信息Stringmessage="黑方先行";@OverridepublicvoidmousePressed(MouseEvente){if(canPlay==true){x=e.getX();y=e.getY();if(x>=10&&x<=370&&y>=70&&y<=430){/*System.out.println("在棋盘范围之内:"+x+"--"+y);*/x=(x-10)/20;y=(y-70)/20;if(allChess[x][y]==0){//判断要下棋子的颜色if(isBlack==true){allChess[x][y]=1;isBlack=false;message="轮到白方";}else{allChess[x][y]=2;isBlack=true; message="轮到黑方";}//判断是否胜利了booleanwinFlag=this.checkWin();if(winFlag==true){JOptionPane.showMessageDialog(this,"游戏结束,"+(allChess[x][y]==1?"黑方":"白方")+"获胜!");canPlay=false;}}else{JOptionPane.showMessageDialog(this,"当前有棋子了,请重新下");}//重新执行一次paint()方法this.repaint();} 那么现在就可以显示出我所需要的下棋提示信息了,如下图:这里就提示出了黑方先行,当黑方落子以后就会提示到白方,但是白棋子要是再落在黑方已经落过的位置,那么将回出现提示,让其重新落子: 上面的这些步骤就把下棋的功能完成了,现在可以下棋了。4.4完成判断胜负的功能:判断胜负是这个游戏的核心,一个游戏最重要的部分,如果连判断胜负都不可以实现的话,那么这个游戏程序是没有用的。依据五子棋的基本规则,判断某一方向上是否有同一颜色的棋子连成五个,如果有,那么游戏就结束了,并判连成五子的一方获得了胜利。先判断横向的棋子是否可以五连,这里就需要用到了鼠标抬起的监听的类了,先判断颜色,在判断横向够不够五个,如下:@OverridepublicvoidmouseReleased(MouseEvente){//TODOAuto-generatedmethodstub }privatebooleancheckWin(){booleanflag=false;//保存共有相同颜色多少棋子相连intcount=1;//判断横向有无5连即纵坐标相同intcolor=allChess[x][y];if(color==allChess[x+1][y]){count++;if(color==allChess[x+2][y]){count++;}}//用循环来判断棋子相连inti=1;while(color==allChess[x+i][y]){count++;i++;}i=1;while(color==allChess[x-i][y]){count++;i++;}if(count>=5){flag=true;}现在判断完了横向了,下面就是到纵向了,它个横向的判断也是差不多的,代码如下://纵向判断inti2=1;intcount2=1;while(color==allChess[x][y+i2]){count2++;i2++; }i2=1;while(color==allChess[x][y-i2]){count2++;i2++;}if(count2>=5){flag=true;}然后是斜方向的判断,斜方向有四个方向,左上和左下,然后是右上和右下,但是我们可以将它看成两个方向,就跟前面横向与纵向一样的道理://斜方向的判断(右上和左下)inti3=1;intcount3=1;while(color==allChess[x+i3][y-i3]){count3++;i3++;}i3=1;while(color==allChess[x-i3][y+i3]){count3++;i3++;}if(count3>=5){flag=true;}//斜方向的判断(右下和左上)inti4=1;intcount4=1;while(color==allChess[x+i4][y+i4]){count4++;i4++;}i4=1;while(color==allChess[x-i4][y-i4]){ count4++;i4++;}if(count4>=5){flag=true;}这样,我们就可以把横向,纵向还有斜方向都可以判断胜负了,那么就来下一盘测试看看是不是可以判断胜负了,如图:现在可以看到,确实可以判断出胜负了,最基本的游戏规则已经实现了,上图是斜方向的,横向和纵向的也都可以判胜负,就不一一列举了。那么判断胜负的功能就已经可以实现了。4.5完成一些按钮的功能: 从图中我们可以看到我列出了几个功能按钮,但是这些按钮都还是没有任何作用的,只是能看,那么现在我就把上面这些按钮的功能给加进去,让他们完成相应的功能。首先是认输这个按钮的功能,认输只是一个提示,然后进行判断就可以了,这个是比较容易实现的功能。代码如下://认输按钮if(e.getX()>=400&&e.getX()<=470&&e.getY()>=290&&e.getY()<=320){intresult=JOptionPane.showConfirmDialog(this,"是否确认认输?");if(result==0){if(isBlack){JOptionPane.showMessageDialog(this,"黑方已经认输,结束游戏!");}else{JOptionPane.showMessageDialog(this,"白方已经认输,结束游戏!");}canPlay=false;}从上面可以看出,只要认输了,canPlay就是假的了,那么我们就不可以再下棋了。 如图:下面是重新开始这个按钮,重新开始游戏这个设定需要考虑到四点:1.要把棋盘先清空。2.allChess这个记录下棋的二维数组要清空。3.游戏下棋信息要回到开始状态。4.isBlack改为1,即黑先下棋。那么它的代码如下://点击开始游戏按钮if(e.getX()>=400&&e.getX()<=470&&e.getY()>=90&&e.getY()<=120){intresult=JOptionPane.showConfirmDialog(this,"是否重新开始游戏?");if(result==0){//重新开始游戏1)把棋盘请空,allChess这个数组数据归零2)游戏信息回到开始3)将isBlack改回1,即改为黑先下 for(inti=0;i<19;i++){for(intj=0;j<19;j++){allChess[i][j]=0;}}message="黑方先行";isBlack=true;blackmessage="无限制";whitemessage="无限制";this.repaint();//重新绘制一次窗体canPlay=true;}}重新开始游戏如下图:当我点击是的时候,就重新开始游戏了,变回原来的样子: 接来是游戏说明,关于,和退出这三个按钮了,这三个按钮很容易设置,只要加个提示信息就可以了,只是退出的按钮要给他多加上一个退出系统的方法,代码如下://游戏说明按钮if(e.getX()>=400&&e.getX()<=470&&e.getY()>=190&&e.getY()<=220){JOptionPane.showMessageDialog(this,"这是个五子棋游戏:黑白双方谁先五子相连为胜。"+"可以横,纵,斜线五子相连。"+"下法:1、对局双方各执一色棋子,黑先、白后交替下子,每次只能下一子。"+"2、棋子下在棋盘的交叉点上,棋子下而后定。");}//关于按钮if(e.getX()>=400&&e.getX()<=470&&e.getY()>= 340&&e.getY()<=370){JOptionPane.showMessageDialog(this,"此游戏由飞佛顶山独立开发!");}//退出按钮if(e.getX()>=400&&e.getX()<=470&&e.getY()>=390&&e.getY()<=420){JOptionPane.showMessageDialog(this,"游戏结束");System.exit(0);}测试一下运行画面:点关于这个按钮的时候就出现了我刚才在代码上所输入的信息了,其他的按钮也是一样的,就不多做演示了。4.6游戏时间设置游戏时间设置这个功能比较复杂,它需要到调用线程的操作了,我们需要给它定义一个接口:publicclassFiveChessFrameextendJFrameimplementsMouseListener,Runnabel.然后给它定义一些需要用到的变量://保存最多拥有多少时间(秒)intmaxTime=0;//做倒计时的线程类Threadt=newThread(this);//保存黑白双方的剩余时间intblackTime=0;intwhiteTime=0;//保存双方剩余时间信息Stringblackmessage="无限制";Stringwhitemessage="无限制";下面是启动线程的命令://线程开始并挂起t.start();t.suspend(); 在游戏设置这个按钮上面设置一下,输入的时间不能是字符串,也不能是负数,当输入的是0的时候,表示时间无限制,当输入的为大于0的数字时,表示的是设置的分钟数并且只能输入整数。而且在下方的黑白双方的时间剩余那里要把分钟变换成秒来显示出来。代码如下://游戏设置按钮if(e.getX()>=400&&e.getX()<=470&&e.getY()>=140&&e.getY()<=170){Stringinput=JOptionPane.showInputDialog("请输入游戏的最大时间(分钟),如输入0表示无限制!");try{maxTime=Integer.parseInt(input)*60;if(maxTime<0){JOptionPane.showMessageDialog(this,"不允许输入负数,请正确输入信息");}if(maxTime==0){intresult=JOptionPane.showConfirmDialog(this,"设置完成,是否重新开始游戏");if(result==0){//重新开始游戏1)把棋盘请空,allChess这个数组数据归零2)游戏信息回到开始3)将isBlack改回1,即改为黑先下for(inti=0;i<19;i++){for(intj=0;j<19;j++){allChess[i][j]=0;}}message="黑方先行";isBlack=true;blackTime=maxTime;whiteTime=maxTime;blackmessage="无限制";whitemessage="无限制";this.repaint();//重新绘制一次窗体canPlay=true;}}if(maxTime>0){ intresult=JOptionPane.showConfirmDialog(this,"设置完成,是否重新开始游戏");if(result==0){//重新开始游戏1)把棋盘请空,allChess这个数组数据归零2)游戏信息回到开始3)将isBlack改回1,即改为黑先下for(inti=0;i<19;i++){for(intj=0;j<19;j++){allChess[i][j]=0;}}message="黑方先行";isBlack=true;blackTime=maxTime;whiteTime=maxTime;//把输入的分钟数转换成下方所表示的读秒数blackmessage=maxTime/3600+":"+(maxTime/60-maxTime/3600*60)+":"+(maxTime-maxTime/60*60);whitemessage=maxTime/3600+":"+(maxTime/60-maxTime/3600*60)+":"+(maxTime-maxTime/60*60);t.resume();this.repaint();//重新绘制一次窗体canPlay=true;}}}catch(NumberFormatExceptione1){JOptionPane.showMessageDialog(this,"请正确输入信息");}}读秒的功能,每过去一秒种规定时间就少一秒,当时间到0的时候给判一方为负,哪一方先到0哪一方先输,用到一个run的类:@Overridepublicvoidrun(){//TODOAuto-generatedmethodstub//判断是否有时间限制 if(maxTime>0){while(true){if(isBlack){blackTime--;if(blackTime==0){intresult=JOptionPane.showConfirmDialog(this,"黑方超时间,白方赢,是否重新游戏?");if(result==0){//重新开始游戏1)把棋盘请空,allChess这个数组数据归零2)游戏信息回到开始3)将isBlack改回1,即改为黑先下for(inti=0;i<19;i++){for(intj=0;j<19;j++){allChess[i][j]=0;}}message="黑方先行";isBlack=true;blackTime=maxTime;whiteTime=maxTime;if(maxTime>0){blackmessage=maxTime/3600+":"+(maxTime/60-maxTime/3600*60)+":"+(maxTime-maxTime/60*60);whitemessage=maxTime/3600+":"+(maxTime/60-maxTime/3600*60)+":"+(maxTime-maxTime/60*60);t.resume();}else{blackmessage="无限制";whitemessage="无限制";}this.repaint();//重新绘制一次窗体canPlay=true;}else{ canPlay=false;}}}else{whiteTime--;if(whiteTime==0){intresult=JOptionPane.showConfirmDialog(this,"白方超时间,黑方赢,是否重新游戏?");if(result==0){//重新开始游戏1)把棋盘请空,allChess这个数组数据归零2)游戏信息回到开始3)将isBlack改回1,即改为黑先下for(inti=0;i<19;i++){for(intj=0;j<19;j++){allChess[i][j]=0;}}message="黑方先行";isBlack=true;blackTime=maxTime;whiteTime=maxTime;if(maxTime>0){blackmessage=maxTime/3600+":"+(maxTime/60-maxTime/3600*60)+":"+(maxTime-maxTime/60*60);whitemessage=maxTime/3600+":"+(maxTime/60-maxTime/3600*60)+":"+(maxTime-maxTime/60*60);t.resume();}else{blackmessage="无限制";whitemessage="无限制";}this.repaint();//重新绘制一次窗体canPlay=true; }else{canPlay=false;}}}blackmessage=blackTime/3600+":"+(blackTime/60-blackTime/3600*60)+":"+(blackTime-blackTime/60*60);whitemessage=whiteTime/3600+":"+(whiteTime/60-whiteTime/3600*60)+":"+(whiteTime-whiteTime/60*60);//读秒,要用到try,否则回出错try{Thread.sleep(1000);}catch(InterruptedExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}this.repaint();System.out.println(blackTime+"--"+whiteTime);}}测试如图: 图中下方已经开始读秒了,只要读到了就判为负:上方黑方已经没时间了,那么黑方就输掉了游戏。现在,整个程序就已经完成了,上面提到的功能都已经可以实现了,只差一点其他的需要调整而已了。 第五章五子棋功能的演示5.1软件的调试以及改错。'