毕业五子棋开题报告-

时间:2024.3.23

 

唐 山 学 院

毕业设计(论文)开题报告

设计(论文)题目:  基于LabVIEW的五子棋游戏开发                            

 

系       别:_________________________

专       业:_________________________

姓      名:_________________________


指 导 教 师:_________________________

20##年2月25日



第二篇:五子棋毕业论文


第一章 绪论

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的运行环境是用ANSI C实现的。

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企业应用编程接口(Java Enterprise APIs)为企业计算及电子商务应用系统提供了有关技术和丰富的类库。

MyEclipse是对Eclipse IDE的扩展,利用它我们可以在数据库和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. 具有认输功能;

3. 具有提示该轮到哪一方下棋的功能;

4. 退出游戏功能;

5. 判断胜负功能;

6. 时间设置功能;

7. 悔棋功能。

还有用户对游戏界面的要求,通过上述的用户需求,我们可以得出一个总体的设计方案。由上述的用户需要,可以对程序的基本功能进行一个有效的分析,规定下游戏的基本功能,基本功能如下结构图。

3.2软件功能结构图:

此五子棋程序最主要的四大功能是:下棋,判断胜负,重新开始与认输,游戏时间设置。大体的功能如下图:

五子棋毕业论文

五子棋毕业论文

五子棋毕业论文

五子棋毕业论文

五子棋毕业论文

五子棋毕业论文

五子棋毕业论文

3.3软件各个功能的简要说明:

1. 绘制十九行十九列的棋盘:首先是每行每列的距离都是一样的,并且棋盘上面有八个星,棋盘中间有个天元点,跟围棋的棋盘一样。 2. 棋盘上面落子:点击鼠标以后,会在相应位置落下棋子,并被绘制出来,黑子是一个实心的黑圆,白子是一个实心的白圆加上一个等大空心的黑圆。棋子落在交点上:我们在下五子棋棋的时候,棋子都是会落在交点上的,而并非落在格子里面,那么我们就要规定当我点击鼠标时,选取距离鼠标所取点的最近的左上交点为绘制棋子的中心点,那么就可以实现棋子落在交点上了。

3. 黑白双方轮流落子:黑方落子以后就要轮到白方,交替进行,这是下棋的基本要求,因此我们就要弄一个互斥事件进去,让他们交替的落子。不能落在相同位置:当我们落子时,

五子棋毕业论文

会不小心落到相同位置上去,

那么就要出现提示,不能落在相同位置上,需要重新落子,实现的设

想是当这个点已经绘制过棋子以后,我们就要给一个布尔变量,让它

为假,那么只能在它为真时才能绘制棋子,否则就要重新落子到别的

地方去。

4. 判断输赢:当五个相同颜色子都连在了一起的时候,我们就要判其为赢,这五个子可以在横竖方向上连起,也可以在斜方向上连起。

5. 游戏信息:我们应该在棋盘的上面设置一个游戏信息的,用来提示当前轮到哪一方下棋了,以便于玩家知道谁在下,这个功能只要在黑白

双方轮流下棋功能的过程中添加一个提示信息用于显示到界面上的

就可以了。

6. 重新开始游戏就是把棋盘上的子全部清空,回复到一开始的时候的状态,重置之前所有的数据。认输的功能就是在判断输赢功能的基础上

添加的,让玩家对自己没信心的时候使用。退出游戏的功能就是直接

把窗口关闭就可以了。

7. 时间设置:时间设置功能要调用到线程和监听,他的主要作用是给玩家设置规定的时间,也是五子棋游戏的一个下法规则,当哪一个玩家

超出了规定的时间时,那么就会判断他输了,并且弹出对话框提示以

及重新开始游戏。

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此类是所有 Abstract Window Toolkit 实际实现的抽象超类。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(MouseEvent e) ; //监听鼠标点击事件的操作,对鼠标点击以后进行处理。

mouseEntered(MouseEvent e) ; //监听鼠标进入事件的操作,对鼠标进入某个指定区域以后进行处理。

mouseExited(MouseEvent e) ; //监听鼠标离开事件的操作,对鼠标离开某个指定区域以后进行处理。

mousePressed(MouseEvent e) ; //监听鼠标按下事件的操作,对鼠标按下以后进行处理,这个在我们的五子棋用需要着重用到的。

mouseReleased(MouseEvent e) ; //监听鼠标抬起事件的操作,对鼠标按下后抬起进行处理。

鼠标点击时执行的顺序是:

mousePrssed ? mouseReleased ? mouseClicked //由此可以判断按西与抬起是否在同一个位置。

MouseEvent类有以下两个需要用到的方法:

getX() ; //得到鼠标的横向位置的坐标,用于判断棋子的位置的时候是需要到的。

getY() ; //得到鼠标的纵向位置的坐标,用于判断棋子的位置的时候是需要到的。

Graphics 类, 它的功能是类似于画笔的功能,用来在窗口中绘制文字以及图形等。他的调用是通过覆写JFrame 的 paint() 方法来使用的,通过 repaint() 方法来调用。它有以下方法:

drawstring() ; //绘制字符串。

drawOval() ; //绘制一个空心的圆形,用与绘制我们一会五子棋中的白棋需要到的。

fillOval() ; //绘制实心的圆形,也是用到来绘制棋子。

drawline() ; //绘制一条直线,用来画我们的棋盘。

drawRect() ; //绘制一个空心的矩形,功能按钮用到。

fillRect() ; //绘制一个实心的矩形。

drawImage() ; //绘制一个已经存在的图片,将一个图片直接显示到窗体只中去。

setColor() ; //设置画笔的颜色。比如:setColor(Color.RED),那么就把它的颜色设置成了红色。

setFont() ; //设置绘制文字的字体类型。比如:

setFont(new Font(“黑体”,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 这个监听的接口,有下面拓展 public class FiveChessFrame extend JFrame implements MouseListener。那么这个类里面就会有监听的一些命令:

@Override

@Override public void mousePressed(MouseEvent e) { } //鼠标离开监听操作。 @Override public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub } //鼠标进入监听操作。 @Override public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub } //鼠标点击监听操作。 public void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub

// TODO Auto-generated method stub

} ////鼠标按下监听操作。

@Override

} //鼠标抬起监听操作。 public void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub

4.2建立游戏窗口界面:

开始开发游戏的第一步就是先制作出游戏的窗口界面,一个漂亮美丽大方的游戏界面,往往先能吸引玩家去尝试,所以这个地方不能够马虎。

先把我们需要的窗口按需求创建出来:

public FiveChessFrame() {

//设置标题 this.setTitle("五子棋"); //窗体大小 this.setSize(500,500); //窗体出现位置 this.setLocation((width - 500) / 2, (height - 500) /

2);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //加入鼠标监听 this.addMouseListener(this); //将窗体显示出来 //窗体设置为大小不可变 this.setResizable(false); //将窗体的关闭方式设置为默认关闭后程序结束

} this.setVisible(true);

然后建立一个测试类,来测试一下我刚才写的窗口是否符合我的要求: import fiveframe.FiveChessFrame;

public class Test {

public static void main(String[] args){ }

}

运行这个测试类得到如下窗口:

五子棋毕业论文

FiveChessFrame ff=new FiveChessFrame();

得出这个窗体以后,我们就开始编写界面,我先是调用一个图片作为我这个五子棋程序棋盘的背景,大家都喜欢在木棋盘上面下五子棋,那种会让人感觉到很高雅,所以我就选了一张木质的图片来当我的五子棋的背景图片。 先定义一个背景图片:

//背景图片

BufferedImage bgImage = null ;

下面是调用背景文件,要用try来调用,要不然会出错。

try{ bgImage = ImageIO.read(new File("e:/JAVA/bg.jpg")); }catch(Exception e){ } e.printStackTrace();

由上面的语句可以知道我加入的背景图片存放在e:/JAVA/这个目录下,现在加入把背景显示出来的方法:

public void paint(Graphics g){

}

这样我们就把背景图片调用到了,再看一下现在的窗口界面: //绘制背景 g.drawImage(bgImage, 1, 20, this);

五子棋毕业论文

现在已经可以看到背景图象了,很有木质感,一看到这个背景就让人有想下棋的冲动,当然,要等程序写好了才能下。

那么,下面我要开始绘制棋盘了,我需要绘制一个十九乘十九的棋盘,绘制棋盘需要注意到的问题是,我们点击棋盘的时候,会出现跳动也就是屏幕闪烁的问题,因为我们每下一步棋子,都会需要再绘制一次棋盘的。所以我们就要用到双缓冲技术了,双缓冲技术的使用会使得屏幕不再闪烁,一般双缓冲技术用在手机游戏中,因为手机内存小,屏幕闪烁问题比较明显。在画棋盘的时候需要计算棋盘中每一条线的间距,这里用的是十九乘十九的围棋棋盘那么总宽度可以为360像素,分成18份,没分是20像素,总高度也同样是360像素,如宽度一样分。实现语句:

public void paint(Graphics g){ //双缓冲技术防止屏幕闪烁

BufferedImage bi = new Graphics g2 = bi.createGraphics() ; g2.setColor(Color.BLACK); //绘制背景 g2.drawImage(bgImage, 1, 20, this); //控制字体 g2.setFont(new Font("黑体",Font.BOLD,20)); //输出标题信息 g2.drawString("下棋提示:" , 130, 60); //把前面改过的字体改回来 g2.setFont(new Font("宋体",0,14)); //输出时间信息 g2.drawString("黑方时间:无限制 ", 30 , 470); g2.drawString("白方时间: 无限制", 260, 470); //添加下棋需要到的功能说明 g2.setFont(new Font("黑体",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); BufferedImage(500,500,BufferedImage.TYPE_INT_ARGB);

//绘制棋盘 for (int i=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完成下棋的功能:

现在我需要在我完成的游戏界面上可以下棋,也就是可以把通过鼠标点击,我可以在相应的位置上放下棋子。

先绘制棋子,黑棋我用一个实心的黑圆来表示,白棋用一个实心的白圆再加上一个同大小的空心的黑圆来表示通过一个二维的数组来保存之前已经下过的棋子。

点击鼠标对应位置的时候,把棋子落在距离点击处最近的左上一个交点上,这样使得棋子都能落在交点上,美观而且符合五子棋实际下棋的要求:

//保存棋子的坐标

int x = 0; int y = 0; //保存之前下过的全部棋子的坐标 //内容为0表示没有棋子,为1表示黑子,为2表示白子

int[][] allChess = new int[19][19];

//绘制棋子

/*g.fillOval(x, y, 10, 10);*/ for (int i = 0; i < 19; i++){ for (int j = 0; j < 19; j++) { if (allChess[i][j] == 1) { //黑子 int tempX = i * 20 + 10 ; int tempY = j * 20 + 70 ; g2.fillOval(tempX - 7, tempY - 7, 14, 14); }

if (allChess[i][j] == 2) {

//白子

int tempX = i * 20 + 10 ;

int tempY = 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); }

}

}

点击鼠标时让棋子下在棋盘范围之内,那么就要用到鼠标按下这个类了: @Override

public void mousePressed(MouseEvent e) { // TODO Auto-generated method stub

/*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();

那么,下棋的功能就已经可以实现了,下棋的时候我们是需要互斥的下子的,先是黑棋下了然后到白棋,而且当棋盘上有棋子的时候就不可以再往那个地方下棋了,所以我们还需要做一下互斥的功能,并用下棋的游戏信息来提示玩家该轮到谁落子了,同时当棋子落在同一个位置的时候,就要放出提示框来提示已经有棋子,不能再下棋。

//标识当前是黑棋还是白棋下下一步

boolean isBlack = true ; //标识当前游戏是否可以继续 boolean canPlay = true ; //保存显示的提示信息

String message = "黑方先行" ;

@Override public void mousePressed(MouseEvent e) { 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 = "轮到黑方";

}

//判断是否胜利了

boolean winFlag = this.checkWin(); if (winFlag == true){

JOptionPane.showMessageDialog(this, ""+(allChess[x][y]==1?"黑方":"白方") + "获胜!"); canPlay = false ;

}

}else {

JOptionPane.showMessageDialog(this, "了,请重新下");

}

//重新执行一次paint()方法

this.repaint();

} 游戏结束,当前有棋子

五子棋毕业论文

那么现在就可以显示出我所需要的下棋提示信息了,如下图:

这里就提示出了黑方先行,当黑方落子以后就会提示到白方,但是白棋子要是再落在黑方已经落过的位置,那么将回出现提示,让其重新落子:

五子棋毕业论文

上面的这些步骤就把下棋的功能完成了,现在可以下棋了。

4.4完成判断胜负的功能:

判断胜负是这个游戏的核心,一个游戏最重要的部分,如果连判断胜负都不可以实现的话,那么这个游戏程序是没有用的。依据五子棋的基本规则,判断某一方向上是否有同一颜色的棋子连成五个,如果有,那么游戏就结束了,并判连成五子的一方获得了胜利。

先判断横向的棋子是否可以五连,这里就需要用到了鼠标抬起的监听的类了,先判断颜色,在判断横向够不够五个,如下:

@Override

public void mouseReleased(MouseEvent e) {

// TODO Auto-generated method stub

} private boolean checkWin() { boolean flag = false ; //保存共有相同颜色多少棋子相连 int count = 1; //判断横向有无5连 即纵坐标相同 int color = allChess[x][y]; if (color == allChess [x+1][y]){ } //用循环来判断棋子相连 int i = 1; while(color == allChess[x+i][y]){ } i = 1; while(color == allChess[x-i][y]){ } if (count >= 5) { flag = true;

} count++; i++; count++; i++; count++; if(color == allChess[x+2][y]){ } count++;

现在判断完了横向了,下面就是到纵向了,它个横向的判断也是差不多的,代码如下:

//纵向判断

int i2 = 1 ; int count2 = 1 ; while(color == allChess[x][y + i2]){

} count2++; i2++; i2 = 1; while(color == allChess[x][y - i2]){ } if (count2 >= 5) { flag = true;

} count2++; i2++;

然后是斜方向的判断,斜方向有四个方向,左上和左下,然后是右上和右下,但是我们可以将它看成两个方向,就跟前面横向与纵向一样的道理: //斜方向的判断(右上和左下)

int i3 = 1 ; int count3 = 1 ; while(color == allChess[x+i3][y - i3]){ } i3 = 1; while(color == allChess[x-i3][y + i3]){ } if (count3 >= 5) { } //斜方向的判断(右下和左上) int i4 = 1 ; int count4 = 1 ; while(color == allChess[x+i4][y + i4]){ count4++; i4++; flag = true; count3++; i3++; count3++; i3++;

} i4 = 1; while(color == allChess[x-i4][y - i4]){ } if (count4 >= 5) { flag = true;

} count4++; i4++;

这样,我们就可以把横向,纵向还有斜方向都可以判断胜负了,那么就来下一盘测试看看是不是可以判断胜负了,如图:

五子棋毕业论文

现在可以看到,确实可以判断出胜负了,最基本的游戏规则已经实现了,上图是斜方向的,横向和纵向的也都可以判胜负,就不一一列举了。那么判断胜负的功能就已经可以实现了。

4.5完成一些按钮的功能:

从图中我们可以看到我列出了几个功能按钮,但是这些按钮都还是没有任何作用的,只是能看,那么现在我就把上面这些按钮的功能给加进去,让他们完成相应的功能。

首先是认输这个按钮的功能,认输只是一个提示,然后进行判断就可以了,这个是比较容易实现的功能。代码如下:

//认输按钮

if (e.getX() >= 400 && e.getX() <= 470 && e.getY() >= int result = JOptionPane.showConfirmDialog(this, "290 && e.getY() <= 320 ){ 是否确认认输?");

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() >= int result = JOptionPane.showConfirmDialog(this, " 90 && e.getY() <= 120 ){

是否重新开始游戏?");

if (result == 0){

//重新开始游戏 1)把棋盘请空,allChess这个数组数据归零 2)游戏信息回到开始 3)将isBlack改回1,即改为黑先下

for (int i = 0; i < 19 ; i++){ } message = "黑方先行"; isBlack = true ; blackmessage = "无限制" ; whitemessage = "无限制" ; this.repaint() ;//重新绘制一次窗体 for (int j = 0; j < 19 ; j++){ } allChess[i][j] = 0 ;

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游戏时间设置

游戏时间设置这个功能比较复杂,它需要到调用线程的操作了,我们需要给它定义一个接口:public class FiveChessFrame extend JFrame implements MouseListener,Runnabel.然后给它定义一些需要用到的变量: //保存最多拥有多少时间(秒)

int maxTime = 0 ; //做倒计时的线程类 Thread t = new Thread(this) ; //保存黑白双方的剩余时间 int blackTime = 0 ;

int whiteTime = 0 ; //保存双方剩余时间信息 String blackmessage = "无限制" ; String whitemessage = "无限制" ;

下面是启动线程的命令:

//线程开始并挂起 t.start();

在游戏设置这个按钮上面设置一下,输入的时间不能是字符串,也不能是负数,当输入的是0的时候,表示时间无限制,当输入的为大于0的数字时,表示的是设置的分钟数并且只能输入整数。而且在下方的黑白双方的时间剩余那里要把分钟变换成秒来显示出来。代码如下:

//游戏设置按钮 if (e.getX() >= 400 && e.getX() <= 470 && e.getY() >= 140 && e.getY() <= 170 ){

String input = JOptionPane.showInputDialog("请输入游戏的最大时间(分钟),如输入0表示无限制!");

try { maxTime = Integer.parseInt(input) * 60 ; if (maxTime < 0){ JOptionPane.showMessageDialog(this, "不允许输入负数,请正确输入信息");

} if (maxTime == 0){ int result = JOptionPane.showConfirmDialog(this, "设置完成,是否重新开始游戏");

if (result == 0){ //重新开始游戏 1)把棋盘请空,allChess这个数组数

据归零 2)游戏信息回到开始 3)将isBlack改回1,即改为黑先下

} if (maxTime > 0){ int result = JOptionPane.showConfirmDialog(this, } for (int i = 0; i < 19 ; i++){ } message = "黑方先行"; isBlack = true ; blackTime = maxTime ; whiteTime = maxTime ; blackmessage = "无限制" ; whitemessage = "无限制" ; this.repaint() ;//重新绘制一次窗体 canPlay = true ; for (int j = 0; j < 19 ; j++){ } allChess[i][j] = 0 ; "设置完成,是否重新开始游戏");

if (result == 0){ //重新开始游戏 1)把棋盘请空,allChess这个数组数据归零 2)游戏信息回到开始 3)将isBlack改回1,即改为黑先下

for (int i = 0; i < 19 ; i++){ } for (int j = 0; j < 19 ; j++){ } allChess[i][j] = 0 ; message = "黑方先行"; isBlack = true ; blackTime = maxTime ;

whiteTime = maxTime ;

//把输入的分钟数转换成下方所表示的读秒数

blackmessage = maxTime/3600+":"+ (maxTime/60 - whitemessage = maxTime/3600+":"+ (maxTime/60 - this.repaint() ;//重新绘制一次窗体 canPlay = true ; } } maxTime/3600*60 ) +":"+ (maxTime - maxTime/60*60); maxTime/3600*60 ) +":"+ (maxTime - maxTime/60*60); }catch (NumberFormatException e1){ JOptionPane.showMessageDialog(this, "请正确输入信息");

}

}

读秒的功能,每过去一秒种规定时间就少一秒,当时间到0的时候给判一方为负,哪一方先到0哪一方先输,用到一个run的类:

@Override public void run() { // TODO Auto-generated method stub //判断是否有时间限制 if (maxTime > 0){ while (true){ if (isBlack) { blackTime-- ; if (blackTime == 0){ int result =

JOptionPane.showConfirmDialog(this, "黑方超时间,白方赢,是否重新游戏?");

if (result==0){

//重新开始游戏 1)把棋盘请空,allChess这个数组数据归零 2)游戏信息回到开始 3)将isBlack改回1,即改为黑先下

for (int i = 0; i < 19 ; i++){ } message = "黑方先行"; isBlack = true ; blackTime = maxTime ; whiteTime = maxTime ; if (maxTime > 0 ) { blackmessage = maxTime/3600+":"+ for (int j = 0; j < 19 ; j++){ } allChess[i][j] = 0 ; (maxTime/60 - maxTime/3600*60 ) +":"+ (maxTime -

maxTime/60*60);

whitemessage = maxTime/3600+":"+ (maxTime/60 - maxTime/3600*60 ) +":"+ (maxTime -

maxTime/60*60);

} } whiteTime--; if (whiteTime == 0){ }else { blackmessage = "无限制" ; whitemessage = "无限制" ; } this.repaint() ;//重新绘制一次窗体 canPlay = true ; canPlay = false ; }else { }else {

int result =

JOptionPane.showConfirmDialog(this, "白方超时间,黑方赢,是否重新游戏?");

if (result==0){ //重新开始游戏 1)把棋盘请空,allChess这个数组数据归零 2)游戏信息回到开始 3)将isBlack改回1,即改为黑先下

for (int i = 0; i < 19 ; i++){ } message = "黑方先行"; isBlack = true ; blackTime = maxTime ; whiteTime = maxTime ; if (maxTime > 0 ) { blackmessage = maxTime/3600+":"+ for (int j = 0; j < 19 ; j++){ } allChess[i][j] = 0 ; (maxTime/60 - maxTime/3600*60 ) +":"+ (maxTime -

maxTime/60*60);

whitemessage = maxTime/3600+":"+ (maxTime/60 - maxTime/3600*60 ) +":"+ (maxTime -

maxTime/60*60);

}else { blackmessage = "无限制" ; whitemessage = "无限制" ; } this.repaint() ;//重新绘制一次窗体 canPlay = true ; canPlay = false ; }else {

} } } 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 { } this.repaint(); System.out.println(blackTime + " -- " + Thread.sleep(1000); // TODO Auto-generated catch block e.printStackTrace(); } catch (InterruptedException e) { whiteTime);

测试如图:

五子棋毕业论文

五子棋毕业论文

图中下方已经开始读秒了,只要读到了就判为负:

上方黑方已经没时间了,那么黑方就输掉了游戏。

现在,整个程序就已经完成了,上面提到的功能都已经可以实现了,只差一点其他的需要调整而已了。

第五章 五子棋功能的演示

5.1软件的调试以及改错。

更多相关推荐:
五子棋开题报告

本科毕业设计论文开题报告题目五子棋游戏的设计和开发学院部信息科学与技术学院专业软件工程学生姓名青龙学号20xx10413132年级07指导教师黄爱明职称讲师20xx年2月23日

五子棋开题报告

五子棋游戏的设计与实现开题报告班级学号姓名指导教师一综述本课题研究的意义研究的现状及已有成果毕业设计不仅是一个人大学四年以来学习的总结同时也是我自己综合运用所学解决实际问题的一次锻炼五子棋是一种两人对弈的纯策略...

五子棋开题报告

一选题的依据及意义五子棋是一种两人对弈的纯策略型棋类游戏是起源于中国古代的传统黑白棋种之一发展于日本流行于欧美容易上手老少皆宜而且趣味横生引人入胜五子棋不仅能增强思维能力提高智力而且富含哲理有助于修身养性五子棋...

JAVA 五子棋开题报告

江苏科技大学毕业设计论文开题报告概述表注如页面不够可加附页

五子棋开题报告

本科毕业设计论文开题报告题目五子棋游戏的设计和开发学院部信息科学与技术学院专业软件工程学生姓名学号年级指导教师职称年月日

五子棋开题报告

本科生毕业论文设计开题报告题目基于Android五子棋游戏学院计算机科学与技术专业班级计科11101姓名麦笃锐学号20xx17010107指导教师谭文学20xx年12月30日

中北五子棋开题报告

中北大学信息商务学院毕业设计开题报告学生姓名学院系专业设计题目指导教师20xx年3月10日Xxx学号0806xxxxxx电子与计算机科学技术系计算机科学与技术手机单机版五子棋游戏设计与开发毕业设计开题报告1庞大...

java五子棋开题报告

一选题的依据及意义伴随着计算机技术和网络技术的发展19xx年世界第一款图形化网络游戏网络创世纪问世挟计算机与网络技术之高精尖融传统视听与数码娱乐之精华集娱乐性竞技性仿真性互动性于一体网络创世纪迅速风靡全球备受青...

QT-五子棋游戏设计-课程设计报告

20xx20xx学年秋季学期Windows程序设计课程设计报告学院序号姓名学号指导教师完成时间20xx年05月29日目录一课程设计的目的1二课程设计的内容及要求1三关键技术及相关原理介绍1四系统的总体设计2五设...

“计算机下五子棋”智能程序开发-实验报告模板

计算机下五子棋智能程序设计与开发实验报告实验小组成员20xx年11月14日1实验目标我们小组使用C开发用VisualStudio20xx来开发是用了老师给的局域网内人人对战五子棋程序的源代码在此基础上增加机器下...

实验二五子棋程序

C网络应用编程实验报告实验题目网络五子棋游戏姓名班级网络工程学号一实验目的1熟悉基于C的TCP编程2练习NetworkStream的用法3练习BinaryRead和BinaryWriter4掌握线程的创建和使用...

《C++语言程序设计》课程设计报告--五子棋

C语言程序设计课程设计报告课程题目年级专业学号姓名指导教师江苏师范大学数学与统计学院摘要五子棋是我国古代的传统的黑白棋种之一五子棋不仅能增强思维能力提高智力而且富含哲理有助于修身养性本游戏是以C语言作为开发工具...

五子棋开题报告(15篇)