连连看游戏的设计与实现(源码)
摘要:连连看是一款趣味性很强的经典小游戏,一直以来都深受广大玩家的喜爱。本文针对传统连连看的特点以及一些玩家的需求,使用面向对象方法设计实现了一个不同的连连看游戏,创新之处在于在传统单机版游戏的基础上添加了局域网联机对战的功能,使得小范围内多人联机对战更加方便。整个游戏在eclipse平台上实现开发, 基于java Swing完成界面设计,使用java语言实现了游戏的功能细节,如游戏中如何实现游戏图片的管理、图片连接判断以及联机对战时游戏画面的实时传输。关键字:连连看;面向对象;javaDesign and Implementation of LinkgameStudent majoring in computer science and technology Chen Feifei Tutor Xu Yan Abstract:Linkgame is a very fun classic games, has been well received by the players love. In this paper, the characteristics of traditional Linkgame and some players need to use object-oriented design methods, a different Linkgame, innovation is based on the traditional stand-alone version of the game on the line to add a LAN multiplayer capability, the small range within multiplayer online gaming more convenient. On the eclipse platform development of the game, complete interface design java Swing, use java language of the games functional details, such as how to play the game image management, image and online real-time tra
*好棒文|www.hbsrm.com +Q: *351916072*
nsmission connection judgment on the war game screen.随着计算机与网络的飞速发展,人们的学习、工作和娱乐方式也发生了极大的改变,这其中计算机游戏是一个重要的组成部分。由于大多数人玩游戏的时间都是工作之余的闲暇时间, 所以游戏时间灵活、游戏规则简单但是耐玩的小游戏或者网页游戏就受到了越来越多的喜爱。使得很多设计新颖,玩法独特的小游戏已经成为经典, 连连看就是其中之一。1.选题背景1.1选题目的及意义因此,本文设计开发一个全新的连连看游戏, 实现了连连看的基本游戏功能,并且增加了局域网联机对战功能,增加了游戏的趣味性。采用面向对象的开发方法,用java语言完成整体的代码编写,使用eclipse作为开发工具,在Windows7上进行游戏的设计及开发。1.2发展研究状况“连连看”最早是来自台湾的一款游戏,自从传入大陆后就吸引了大量玩家,这也促使了它的快速发展。总体来说,“连连看”的发展经历了桌面游戏、在线游戏、社交游戏三个过程。早期,由于Flash应用的流行,网上出现了多种在线Flash版本“连连看”。如:“动物连连看”、“果蔬连连看”等,这一时期的“连连看”主要以华丽界面及简单易上手的操作吸引了一大批的女性玩家[1]。2008年,社交网络的普及和开放平台的兴起,“连连看”被引入了社交网络。“连连看”与个人空间相结合,被快速的传播,成为一款热门的社交游戏,人们得以通过游戏在社交网站上结识新的朋友以及获得别样的成就感,所以十分火热,其中以开发者Jonevey在Manyou开放平台上推出的“宠物连连看”最为流行。目前,从现有的连连看游戏来说,移动端和网页在线的“连连看”主要特点就是趋于主题化,无论是动物类、果蔬类还是人物明星类都是围绕着一个主题进行的。而社交游戏中的“连连看”的主要特点就是在增加玩家间的互动性例如QQ游戏连连看。不仅如此,现今的连连看游戏还在其他领域有了发展,一些简单的图片识别连连看游戏成为了幼儿识别教育使用的教具[2]。不过,它们的共同特点就是界面越来越华丽、地图越来越多样化等等,游戏美术的制作越来越精美,使得玩家能有更好的游戏体验[3]。可见,连连看游戏的发展是丰富多彩全面开花的。2.开发平台及应用技术该程序采用面向对象的开发方法,用java语言完成整体的代码编写,基于java Swing完成界面设计,使用eclipse作为开发工具,在Windows7上进行游戏的设计及开发。虽然Java开发的游戏还是有一定的限制,画面表现、场景效果没有其他语言开发的那么好,但是Java开发的游戏反应比较快,随着Java的广泛应用,以及Java开发系统的可移植性大大提高,Java开发的游戏会广受欢迎[4]。2.1java简介Java是由Sun Microsystems公司推出的Java面向对象程序设计语言和Java平台的总称。由James Gosling和同事们共同研发,并在1995年正式推出。Java最初被称为Oak,是1991年为消费类电子产品的嵌入式芯片而设计的。1995年更名为Java,并重新设计用于开发Internet应用程序。Java语言是一门非常纯粹的面向对象编程语言,它吸引了C++语言的各种优点,又摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,很好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程开发。在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。2.2Eclipse简介Eclipse是开放源代码的、基于 Java的可扩展开发平台。它由IBM作为主发起人投资开发,并被 Borland、Sybase等众多公司所支持。 Eclipse不仅仅是一个集成开发环境(IDE),也是一个工具集成的开发平台,它提供了一个用于开发插件的框架,使创建、集成和使用软件工具更容易。就其本身而言,它只是一组规则,满足了以下需求: ①支持多种应用开发工具的构建;②能独立地开发处理各种内容的插件(html、Java、C、JSP、EJB、XML和GIF等);③开发者可以自己独立地开发工具, 与其他标准工具无缝集成;④可以在多种平台上运行,包括Windows和Linux平台[5]。事实上,Eclipse本身是一个核心的运行时绑定了一些在插件之上构建的插件, 换句话说, Eclipse本身就是一系列的插件, 这样随着使用Eclipse构建Eclipse的经验累积,这种插件模式就变得日臻成熟。目前全球有上百万开发人员在使用Eclipse[6]。2.3面向对象编程概述面向对象编程(Object?Oriented?Programming,OOP)指的是采用面向对象的程序设计工具,以类的设计、实现和使用为中心,进行软件开发,是一种计算机编程架构。面向对象编程的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。OOP达到了软件工程的三个主要目标:重用性、灵活性和扩展性。为了实现整体运算,每个对象都能够接收信息、处理数据和向其它对象发送信息[7]。?同时,面向对象方法对软件开发的贡献是也不可估量的, 它是一种运用对象、类、继承、封装、聚合、消息传送、多态性等概念来构造系统的软件开发方法[4]。用面向对象方法开发软件,通常需要建立3种形式的模型,它们分别是数据结构(对象模型),执行操作(动态模型), 完成数据值的变化(功能模型) [5]。采用了面向对象的方法后, 软件不仅易于被人理解,而且易于维护和修改,从而提高了软件的可靠性和可维护性;同时,可以提高公共问题域中软件模块化和重用化的可能性[7]。3.游戏流程分析打开游戏,首先出现的是开始界面,玩家可以选择单机游戏、联机对战或者退出游戏,点击单机游戏或者联机对战就可进入相应的游戏。3.1单机游戏流程进入单机游戏界面之后,玩家可以先对游戏进行难度设置以及排行榜的查看,开始后,游戏过程中玩家可以使用道具来辅助完成游戏。游戏胜利后玩家可以输入自己昵称来将成绩存入排行榜。主要流程图如下: 图3-1 单机流程图3.2联机游戏流程进入联机对战游戏,玩家首先将选择新建一局游戏或者加入已存在的游戏,加入游戏需要输入服务器端的ip以及端口号,进入游戏后服务器端玩家需等待加入玩家准备好后才能开始游戏,然后以游戏完成的用时长短来判断游戏胜负。主要流程图如下: 图3-2联机对战流程图4游戏的设计实现4.1游戏规则简介开始游戏后,玩家需要找出游戏地图中两个相同的图案连接起来,连接转折点不多于两个,就能成功将两个图片消除,在规定时间里将游戏地图内的所有图片全部消除掉即为游戏胜利,否则就是游戏失败。另外,在本次设计的游戏中,联机对战的玩家若双方在规定时间内都未将图片全部消除,那将以游戏时间结束时的得分来判断胜负。 4.2功能设计游戏主要设计了单机版和双人联机对战版,除了基本的游戏功能及死局判断功能之外,还有难度选择、排行榜查看、背景音乐以及道具使用。其中难度选择设置了初级、中级和高级三个选项,玩家可以通过自主选择来制定游戏难度;排行榜根据玩家用时长短排序,从短到长显示玩家姓名以及完成游戏花掉的时间;道具主要设计了重列、加时、炸弹三种,重列的功能为将游戏界面内剩余图案重新排列到界面,加时功能为增加游戏时间10s,炸弹功能为自动消除一对相同游戏图案。三个道具的使用都是玩家每点击一次就使用一次该道具对应的游戏功能。4.3界面设计游戏基于java Swing完成界面设计,主要使用了JTable表格控件、JButton按钮控件、JFrame框架、JPanel等。主要界面有游戏主界面、单机游戏页面和联机对战页面。其中单机游戏中还有排行榜和难度选择界面,联机对战中还有游戏设置界面。具体如下图: 图4-3-1游戏开始界面 图4-3-2单机游戏界面图4-3-3难度设置界面图4-3-4排行榜查看界面图4-3-5联机对战进入界面图4-3-6客户端界面图4-3-7客户端界面4.4类的设计关于类的设计,我主要先将程序分为几个包,然后再将相关类存入对应的包。这些包分别为:保存局域网相关类的lan包;游戏入口的main包;保存游戏设置的commons包;保存监听类的listener包;保存接口类的service包;保存实现类的impl包;保存时间控制的timer包;保存图片工具类的utils包;控制游戏界面图像的view包。Lan包服务器类:LanServer,主要服务器端的界面设计代码以及启动服务端的线程方法。联机对战设置类:LanLink,主要是联机设置的界面以及ip和端口号的设置方法。并将设置的值传递到客户端以及服务端。客户端类:LanClient,主要是客户端的界面设计代码以及连接服务端的线程方法。图片序号类:LanMap,主要功能是将图片存入map使得一个图片对应一个序号。main包游戏主界面类:mainIn,负责游戏主界面,是游戏的入口。单机游戏主界面类:LinkGame,负责单机游戏的界面,并调用其他类来完成整个单机游戏。Commons包游戏基本设置类:GameConfiguration,负责设置游戏棋盘二维数组的一维和二维长度、游戏分数、游戏时间以及第一张图片的开始坐标。并且提供了相应的get()方法。游戏异常类:GameException,负责处理游戏异常。链接信息类:LinkInfo,主要是对应三种连接情况提供了三种对应构造方法,分别是有两个连接点、三个连接点和四个连接点。并且提供了一个返回链接集合的get()方法。图片方块类:Piece,主要负责保存每个图片方块的开始及结束坐标、在棋盘数组中的一二维位置和图片信息。并且提供对应的get()方法。连接点类:Point,保存每个连接点的x、y坐标,并提供对应get()和set()方法,重写equals方法使得只要x和y坐标相同就返回ture。背景音乐控制类:PlaySound,负责控制背景音乐的开启和关闭。游戏死局判断类:EndJudge,负责判断游戏地图是否出现死局状况方便提醒玩家。Listen包开始按钮监听类:BeginListener,主要调用其他类的方法来开始游戏。炸弹按钮监听类:BoomListener,从当前游戏棋盘中随机消除掉一对图片。 加时按钮监听类:ClockListener,调用时间控制类中的addgametime()方法增加游戏时间。重列按钮监听类:RandListener,调用图片工具类中方法获取当前图片并将其重新打乱。游戏地图监听类:GameListener,监听着游戏棋盘的变化,将玩家选区的图片交给游戏逻辑类来判断。Service包游戏地图抽象类:AbstractBoard,调用图片工具类获取文件中的图片,并建立了一个createPieces()交给子类去实现。游戏逻辑接口:GameService,定义了获取方块数组方法getPieces()、设置方块数组方法setPieces()、游戏开始方法start()、查找方块方法findPiece()、连接方法link()、分数计算方法countGrade()、判断这个方块数组是否为空方法hasPieces()。Impl包游戏逻辑实现类:GameService,实现游戏逻辑接口类定义的方法,并且封装了一些连接判断的工具方法。游戏地图子类:SimpleBoard,继承了AbstractBoard,实现createPieces(),完成游戏地图具体的布局,简单版地图。游戏地图子类:SquareBoard,继承了AbstractBoard,实现createPieces(),完成游戏地图具体的布局,加强版地图。Timer包游戏时间控制类:TimerTask,使用java内部的Timer和TimerTask类来进行时间控制,重写TimerTask的run()方法,然后在开始监听类里调用timer.schedule(task,0,1000)来使得每隔一秒调用一次run()方法。Utils包图片工具类:ImageUtil,主要有负责从文件中获取图片的getImages()方法和打乱图片顺序的randomImages()方法。联机图片管理类:LinkImage,将取出图片存入map,使之有对应关系。View包地图画面控制类:GamePanel,主要有负责画出棋盘数组情况的paint(Graphics g)方法和画连接线的drawLine()方法。4.5道具设计 本次游戏主要设计了三个游戏道具,分别是炸弹、重列和加时,炸弹道具主要是帮助玩家在找不到下一个连接图片的时候,遍历游戏地图上的图片找到可以消除的一对,并将其自动消除掉;重列就是将游戏地图上图片重新随机排列后再显示在地图上;加时就是为了帮助玩家增加游戏时间,将游戏时间增加10s。4.6连接判断设计由于在连连看游戏规则中,连接转折点不能超过两个,所以判断图案是否能连接消除可分为三种情况:没有转折点;一个转折点;两个转折点(如图4-6-1)。其中要用到两个关键类Point、LinkInfo以及获取通道的工具方法,Point类表示连接点,用于保存点的x和y坐标,重写了equals方法,用于判断两个Point对象是否为同一个点,判断标准为两个点的x坐标与y坐标是否一致;LinkInfo类表示连接信息,该类只提供三个构造器和一个返回存放连接点集合的方法,构造器用于创造连接点信息对象,如果两点可以直接连接,则调用两个参数的构造器,两个点之间需要有一个转折点才可以相连的话,需要调用三个参数的构造器,两个点之间有两个转折点的话,就需要调用四个参数的构造器;通道就是一个Piece对象四个方向没有障碍的地方(如图4-6-2)。所以,每一个piece对象都有四个方向的通道。接下来的链接判断编码就是按照这三种方式来实现,先判断能不能直接相连,再判断一个转折点的情况,最后为两个转折点的情况。如下图:图4-6-1三种连接情况图4-6-2通道的解释没有转折点如果两个连接点具有相同的X坐标或者Y坐标,那就可以进行没有转折点的链接判断。首先,判断两个连接点是否为同一点以及两点图片是否相同,若满足不为同一点且图片相同则继续下面的判断。如果是Y坐标相同则从靠左那点向右遍历;如果是X坐标相同则从靠上那点向下遍历,根据两点中间是否有障碍来判断是否连接成功。如果两点之间没有障碍,连接成功,则返回一个新的连接对象LinkInfo(p1 Point, p2 Point)。主要代码如下: //判断两个y座标相同的点对象之间是否有障碍, 以p1为中心向右遍历 private boolean isXBlock(Point p1, Point p2, int pieceWidth) { //如果p2在p1左边, 调换参数位置调用本方法 if (p2.getX() < p1.getX()) return isXBlock(p2, p1, pieceWidth); for (int i = p1.getX() + pieceWidth; i < p2.getX(); i = i + pieceWidth) { //如果有障碍 if (hasPiece(i, p1.getY())) return true; } return false; } //判断两个x座标相同的点对象之间是否有障碍, 以p1为中心向下遍历 private boolean isYBlock(Point p1, Point p2, int pieceHeight) { //如果p2在p1的上面, 调换参数位置重新调用本方法 if (p2.getY() < p1.getY()) return isYBlock(p2, p1, pieceHeight); for (int i = p1.getY() + pieceHeight; i < p2.getY(); i = i + pieceHeight) { if (hasPiece(p1.getX(), i)) return true; } return false; }一个转折点如果两点只经过一个转折点就可连接,那只有两种情况,就是第二点在第一点的右上方或者第二点在第一点的右下方(如下图),若第二点在第一点的左侧交换两点即可。图4-6-3情况一图4-6-4情况二 所以,判断这种情况下两点是否能连接成功的关键就是找到这个转折点,这里就需要用到上述过的通道,只要获取如图中p1向右、向上、向下的三个通道,p2向下、向左、向下的三个通道。如果p2在p1右上角,则分别获取p1向右和p2向下的交点,p1向上和p2向左的交点;如果p2在p1右下角,则分别获取p1向右和p2向上的交点,p1向下和p2向左的交点。有交点返回即代表连接成功,则返回一个新的连接对象LinkInfo(p1 Point, cornerPoint,p2 Point)。主要代码如下://获取两个不在同一行或者同一列的座标点的直角连接点, 即只有一个转折点private Point getCornerPoint(Point point1, Point point2, int pieceWidth, int pieceHeight) { //获取p1向右, 向上, 向下的三个通道 Listpoint1RightChanel = getRightChanel(point1, point2.getX(), pieceWidth); List point1UpChanel = getUpChanel(point1, point2.getY(), pieceHeight); Listpoint1DownChanel=getDownChanel(point1,point2.getY(), pieceHeight); //获取p2向下, 向左, 向下的三个通道 Listpoint2DownChanel=getDownChanel(point2,point1.getY(), pieceHeight); List point2LeftChanel = getLeftChanel(point2, point1.getX(), pieceWidth); List point2UpChanel = getUpChanel(point2, point1.getY(), pieceHeight); if (isRightUp(point1, point2)) {//point2在point1的右上角 //获取p1向右和p2向下的交点 Point linkPoint1 = getWrapPoint(point1RightChanel, point2DownChanel); //获取p1向上和p2向左的交点 Point linkPoint2 = getWrapPoint(point1UpChanel, point2LeftChanel); //返回其中一个交点, 如果没有交点, 则返回null return (linkPoint1 == null) ? linkPoint2 : linkPoint1; } if (isRightDown(point1, point2)) {//point2在point1的右下角 //获取p1向下和p2向左的交点 Point linkPoint1 = getWrapPoint(point1DownChanel, point2LeftChanel); //获取p1向右和p2向下的交点 Point linkPoint2 = getWrapPoint(point1RightChanel, point2UpChanel); return (linkPoint1 == null)?linkPoint2 : linkPoint1; } return null; }两个转折点最后一种情况,两个Point通过两个转折点进行相连可以分为以下几种:在同一行,不能直接相连,就必须有两个转折点,分向上与向下两种连接情况。图4-6-5两个转折点,p1与p2在同一行如上图, p1与p2相连,可以在上面连,也可以在下面连,这两种情况都代表它们可以相连,先把这两种情况都加入结果中,到最后再去计算最近的距离。实现时可以先构建一个Map,Map的key为第一个转折点,map的value为第二个转折点,如map的size不止1的话,证明这两个Point有多种连接途径,我们先返回第一个连接途径,最后再计算最小的连接方式。在同一列,不能直接相连,也必须有两个转折点,分向左与向右两种连接情况。图4-6-6两个转折点,p1与p2在同一列跟前一种情况相似,上图中的黑色竖线两端,就是我们结果Map中保存的key和value,如果这key和value这两个点之间没有障碍的话,就加到结果的Map中去,如果有障碍,将不会加到结果的Map中。p2在p1的右下角,这里就有六种转折情况(如下图)。图4-6-7两个转折点p2在p1右下角的情况1图4-6-8两个转折点p2在p1右下角的情况2图4-6-9两个转折点p2在p1右下角的情况3图4-6-10两个转折点p2在p1右下角的情况4图4-6-11两个转折点p2在p1右下角的情况5图4-6-12两个转折点p2在p1右下角的情况6第一种情况获取point1向右遍历, point2向左遍历时纵向可连接的点;第二种情况获取point1向下遍历, point2向上遍历时横向可连接的点;第三种情况获取point1向右遍历, point2向右遍历时纵向可以连接的点;第四种情况获取point1向左遍历, point2向左遍历时纵向可连接的点;第五种情况获取point1向上遍历, point2向上遍历时横向可连接的点;第六种情况获取point1向下遍历, point2向下遍历时横向可连接的点。把所有可以连接的点都加入结果集中,最后在根据计算找出连接最短距离的结果返回new LinkInfo(p1Point, point1, point2, p2Point)。主要代码如下://获取point1向下遍历, point2向上遍历时横向可连接的点Map downUpLinkPoints = getXLinkPoints(p1DownChanel, p2UpChanel, pieceWidth);//获取point1向右遍历, point2向左遍历时纵向可连接的点Map rightLeftLinkPoints = getYLinkPoints(p1RightChanel, p2LeftChanel, pieceHeight);//获取以p1为中心的向上通道p1UpChanel = getUpChanel(point1, 0, pieceHeight);//获取以p2为中心的向上通道p2UpChanel = getUpChanel(point2, 0, pieceHeight);//获取point1向上遍历, point2向上遍历时横向可连接的点 Map upUpLinkPoints = getXLinkPoints(p1UpChanel, p2UpChanel, pieceWidth);//获取以p1为中心的向下通道p1DownChanel = getDownChanel(point1, heightMax, pieceHeight);//获取以p2为中心的向下通道p2DownChanel = getDownChanel(point2, heightMax, pieceHeight);//获取point1向下遍历, point2向下遍历时横向可连接的点MapdownDownLinkPoints=getXLinkPoints(p1DownChanel,p2DownChanel, pieceWidth);//获取以p1为中心的向左通道List p1LeftChanel = getLeftChanel(point1, 0, pieceWidth);//获取以p2为中心的向左通道p2LeftChanel = getLeftChanel(point2, 0, pieceWidth);//获取point1向左遍历, point2向左遍历时纵向可连接的点Map leftLeftLinkPoints = getYLinkPoints(p1LeftChanel, p2LeftChanel, pieceHeight);//获取以p1为中心的向右通道p1RightChanel = getRightChanel(point1, widthMax, pieceWidth);//获取以p2为中心的向右通道List p2RightChanel = getRightChanel(point2, widthMax, pieceWidth);//获取point1向右遍历, point2向右遍历时纵向可以连接的点MaprightRightLinkPoints = getYLinkPoints(p1RightChanel, p2RightChanel, pieceHeight);result.putAll(downUpLinkPoints);result.putAll(rightLeftLinkPoints);//将可以连接的所有点都放到结果中result.putAll(upUpLinkPoints);result.putAll(downDownLinkPoints);result.putAll(leftLeftLinkPoints);result.putAll(rightRightLinkPoints);p2在p1的右上角,同样地也有六种转折情况。 参考上一种情况,用同样方法即可获取连接信息。4.7联机对战设计联机对战的实现主要使用了java中的socket、serversocket以及多线程来进行局域网中的信息传送和监听。然后每次信息传递时,在不同的信息前加上特定的标识符,以便接收方可以判断信息的用途。例如begin为开始游戏的标识符;game为图片消除的标识符;exit为退出游戏的标识符等等。其中游戏图片的实时传递是通过传送方传递图片的索引,接收方根据索引画出对应图片来实现的。4.7.1客户端设计玩家在进入联机对战的局域网设置时如果选择了加入游戏,就意味着要作为客户端一方连接到其他玩家的游戏,则需要输入作为服务器的玩家的ip地址和端口号,然后即可加入游戏。在游戏过程中,客户端负责通过socket传送当前玩家的准备信息和游戏消除情况以及接收服务器端传来的开始指令和游戏信息。设计的主要流程为玩家在点击准备按钮后,客户端就会给服务器传送ready标志,然后就等待服务器端玩家传送来的开始游戏标志以及游戏图片索引,根据索引画出游戏地图,然后在游戏结束前如果每当客户端玩家消除一对图片,就将game加上这对图片的索引传送给服务器端同时也一直接收服务器端是否有消除图片信息。如果成功完成游戏就传送sheng标志代表客户端玩家赢得胜利同时也一直接收服务器端是否有胜利标志传来。一旦有任何一方胜利则游戏结束。主要代码如下:public void run() { try { String line=null; Timer timer = new Timer(); TimerTask task; while((line=br.readLine())!=null){ if(line.startsWith("begin")) { game1.setOverImage(null); game2.setOverImage(null); gameService1.setLevel(1); gameService1.start(); task = new TimerTask(game1,config.getGameTime(),timeLabel,ps,1,pointLabel); timer.schedule(task, 0, 1000); // 对gamePanel进行重新绘制 pointLabel.setText("0"); timeLabel.setText(String.valueOf(config.getGameTime())); limage.init(); String[] strarr = line.split(","); int[] imageid = new int[strarr.length]; for(int i=1;i= grade2) { game1.setOverImage(ImageUtil.getImage("images/sheng.gif")); game1.repaint(); game2.setOverImage(ImageUtil.getImage("images/bai.gif")); game2.repaint(); ps.println("sheng"); }else { game2.setOverImage(ImageUtil.getImage("images/sheng.gif")); game2.repaint(); game1.setOverImage(ImageUtil.getImage("images/bai.gif")); game1.repaint(); ps.println("bai"); } } } } else{ JOptionPane.showMessageDialog(frame,"该服务器玩家已满!请选择加入其他玩家服务器!"); } } catch (IOException e) { // TODO Auto-generated catch block JOptionPane.showMessageDialog(frame,"服务器启动失败!是否端口"+18080+"已被占用?"); e.printStackTrace(); } }5游戏运行与测试分析5.1游戏运行单机游戏运行图5-1单机游戏运行联机游戏运行图5-1-2联机对战运行5.2测试分析游戏测试主要是分为图片连接判断测试、分数和时间的控制测试、道具测试和联机对战测试四个部分。首先进行的是关系到游戏核心功能的图片连接判断测试,分别对应之前链接判断设计中的三种情况进行测试,保证游戏的准确性;然后进行的就是分数和时间的控制测试,观察游戏开始后游戏时间是否能够正常计时和游戏结束时游戏时间是否能够正常停止,以及在游戏过程中玩家每成功消除一对图片时得分是否正常累加;之后进行的是道具测试,主要就是分别对炸弹、重列和加时三个道具功能是否正常实现的测试;最后是联机对战的测试,用两台处于同一个局域网的电脑来进行,测试两个玩家进行游戏时是否有时间的迟疑以及游戏画面传输是否正确。6总结致谢参考文献[1] 龚应军.论小游戏的现状与发展[J].艺术生活-福州大学厦门工艺美术学报,2012(05):18-19.[2] 张琪,陈琳.我国教育游戏研究述评及展望[J].开放教育研究,2009(05):11.[3] 邵东.论游戏美术设计在游戏设计中的重要性[J].中国科教创新导刊,2011(23):10.[4] Eckel B.Thinking in Java[M].4th ed.Prentice Hall PTR,2006:5-6.[5] 刘洪星,谢玉山.Eclipse开发平台及其应用[J].武汉理工大学学报(信息与管理工程版),2005(02):16-17.[6] John Kellerman.Eclipse的历史、现状和未来[J].软件世界,2006(14):25.[7] 张志强,白妙清.谈面向对象编程[J].太原师范学院学报(自然科学版),2003(01):16.[8] Berard E V. Essays on Object -Oriented Software Engineer ing[ M] . New Jersey: Addison -Wesley, 1993:20-21.[9] Lo renz M,Kidd J. Object -Oriented Software Metr ics[ M] . New Jersey: Prentice –Hall,1994:11.[10] 吴华.面向对象编程基本思想[J].山西煤炭管理干部学院学报,2002(03):8-9.附录 大学学院信息科技学院计算机科学与技术姓名论文题目一、对待毕业实习的态度及实习期间遵守纪律情况优良(15—11分)一般(10—6分)较差(5—0)二、观察、收集、整理、查阅资料及运用数据的水平优良(30—21分)一般(20—11分)较差(10—0分)三、学生的独立工作能力和动手能力优良(20—16分)一般(15—11分)较差(10—0分)四、毕业论文写作的规范化程度优良(15—11分)一般(10—6分)较差(5—0分)五、毕业论文(设计)总体评价优良(20—16分)一般(15—6分)较差(5—0分)审查意见、成绩及能否提交答辩:教务处制表大学学院信息科技学院计算机科学与技术姓名论文题目一、论文选题的价值与合理性优秀(15—11分)一般(10—6分)较差(5—0)二、论文的难度、工作量大小和创新性优秀(30—21分)一般(20—11分)较差(10—0分)三、数据资料分析、归纳、概括及运算的能力优秀(20—16分)一般(15—11分)较差(10—0分)四、文字表达水平、文章的逻辑性优秀(15—11分)一般(10—6分)较差(5—0分)五、论文写作的规范化程度优秀(20—16分)一般(15—6分)较差(5—0分)评阅意见、成绩及能否提交答辩:教务处制表大学本科生毕业论文(设计)答辩及综合评分表(由答辩小组填写)学院信息科技学院计算机科学与技术姓名论文题目一、内容的科学性、应用性和创新性优秀(30—21分)一般(20—11分)较差(10—0)二、论文写作水平及知识面掌握程度优秀(30—21分)一般(20—11分)较差(10—0分)三、语言表达能力、逻辑思维能力、回答问题的正确性优秀(40—31分)一般(30—11分)较差(10—0分)论文答辩意见及成绩:答辩小组负责人(签名): 年 月 日本科生毕业论文(设计)综合评定成绩(由答辩小组填写)毕业论文(设计)评阅成绩30%毕业论文(设计)答辩成绩40%综合评定成绩100%注:综合评定成绩等级:优秀(90-100),良好(80-89),中等(70-79),及格(60-69),不及格(60分以下)。答辩小组负责人(签名): 年 月 日
目录
摘要.....................................................................1
关键词....................................................................1
Abstract..................................................................1
Key words.................................................................1
引言.....................................................................1
1选题背景.................................................................1
1.1选题目的及意义.........................................................1
1.2发展研究状况...................................................2
2开发平台及应用技术...................................................2
2.1 java简介..............................................................2
2.2 Eclipse简介..........................................................2
2.3面向对象编程概述...................................................3
3游戏流程分析....................................................3
3.1单机游戏流程......................................................3
3.2联机游戏流程......................................................4
4游戏设计实现...................................................4
4.1游戏规则简介..................................................5
4.2功能设计....................................................5
4.3界面设计....................................................5
4.4类的设计...................................................9
4.5道具设计...................................................10
4.6链接判断设计...................................................10
4.7联机对战设计...................................................18
4.7.1客户端设计...................................................18
4.7.2服务端设计...................................................20
5运行与测试.......................................................22
5.1游戏运行...................................................22
5.2测试分析 ...................................................23
6总结...................................................23
致谢...................................................23
参考文献..................................................24连连看游戏的设计与实现
计算机科学与技术学生 陈飞飞
引言
*好棒文|www.hbsrm.com +Q: *351916072*
nsmission connection judgment on the war game screen.随着计算机与网络的飞速发展,人们的学习、工作和娱乐方式也发生了极大的改变,这其中计算机游戏是一个重要的组成部分。由于大多数人玩游戏的时间都是工作之余的闲暇时间, 所以游戏时间灵活、游戏规则简单但是耐玩的小游戏或者网页游戏就受到了越来越多的喜爱。使得很多设计新颖,玩法独特的小游戏已经成为经典, 连连看就是其中之一。1.选题背景1.1选题目的及意义因此,本文设计开发一个全新的连连看游戏, 实现了连连看的基本游戏功能,并且增加了局域网联机对战功能,增加了游戏的趣味性。采用面向对象的开发方法,用java语言完成整体的代码编写,使用eclipse作为开发工具,在Windows7上进行游戏的设计及开发。1.2发展研究状况“连连看”最早是来自台湾的一款游戏,自从传入大陆后就吸引了大量玩家,这也促使了它的快速发展。总体来说,“连连看”的发展经历了桌面游戏、在线游戏、社交游戏三个过程。早期,由于Flash应用的流行,网上出现了多种在线Flash版本“连连看”。如:“动物连连看”、“果蔬连连看”等,这一时期的“连连看”主要以华丽界面及简单易上手的操作吸引了一大批的女性玩家[1]。2008年,社交网络的普及和开放平台的兴起,“连连看”被引入了社交网络。“连连看”与个人空间相结合,被快速的传播,成为一款热门的社交游戏,人们得以通过游戏在社交网站上结识新的朋友以及获得别样的成就感,所以十分火热,其中以开发者Jonevey在Manyou开放平台上推出的“宠物连连看”最为流行。目前,从现有的连连看游戏来说,移动端和网页在线的“连连看”主要特点就是趋于主题化,无论是动物类、果蔬类还是人物明星类都是围绕着一个主题进行的。而社交游戏中的“连连看”的主要特点就是在增加玩家间的互动性例如QQ游戏连连看。不仅如此,现今的连连看游戏还在其他领域有了发展,一些简单的图片识别连连看游戏成为了幼儿识别教育使用的教具[2]。不过,它们的共同特点就是界面越来越华丽、地图越来越多样化等等,游戏美术的制作越来越精美,使得玩家能有更好的游戏体验[3]。可见,连连看游戏的发展是丰富多彩全面开花的。2.开发平台及应用技术该程序采用面向对象的开发方法,用java语言完成整体的代码编写,基于java Swing完成界面设计,使用eclipse作为开发工具,在Windows7上进行游戏的设计及开发。虽然Java开发的游戏还是有一定的限制,画面表现、场景效果没有其他语言开发的那么好,但是Java开发的游戏反应比较快,随着Java的广泛应用,以及Java开发系统的可移植性大大提高,Java开发的游戏会广受欢迎[4]。2.1java简介Java是由Sun Microsystems公司推出的Java面向对象程序设计语言和Java平台的总称。由James Gosling和同事们共同研发,并在1995年正式推出。Java最初被称为Oak,是1991年为消费类电子产品的嵌入式芯片而设计的。1995年更名为Java,并重新设计用于开发Internet应用程序。Java语言是一门非常纯粹的面向对象编程语言,它吸引了C++语言的各种优点,又摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,很好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程开发。在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。2.2Eclipse简介Eclipse是开放源代码的、基于 Java的可扩展开发平台。它由IBM作为主发起人投资开发,并被 Borland、Sybase等众多公司所支持。 Eclipse不仅仅是一个集成开发环境(IDE),也是一个工具集成的开发平台,它提供了一个用于开发插件的框架,使创建、集成和使用软件工具更容易。就其本身而言,它只是一组规则,满足了以下需求: ①支持多种应用开发工具的构建;②能独立地开发处理各种内容的插件(html、Java、C、JSP、EJB、XML和GIF等);③开发者可以自己独立地开发工具, 与其他标准工具无缝集成;④可以在多种平台上运行,包括Windows和Linux平台[5]。事实上,Eclipse本身是一个核心的运行时绑定了一些在插件之上构建的插件, 换句话说, Eclipse本身就是一系列的插件, 这样随着使用Eclipse构建Eclipse的经验累积,这种插件模式就变得日臻成熟。目前全球有上百万开发人员在使用Eclipse[6]。2.3面向对象编程概述面向对象编程(Object?Oriented?Programming,OOP)指的是采用面向对象的程序设计工具,以类的设计、实现和使用为中心,进行软件开发,是一种计算机编程架构。面向对象编程的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。OOP达到了软件工程的三个主要目标:重用性、灵活性和扩展性。为了实现整体运算,每个对象都能够接收信息、处理数据和向其它对象发送信息[7]。?同时,面向对象方法对软件开发的贡献是也不可估量的, 它是一种运用对象、类、继承、封装、聚合、消息传送、多态性等概念来构造系统的软件开发方法[4]。用面向对象方法开发软件,通常需要建立3种形式的模型,它们分别是数据结构(对象模型),执行操作(动态模型), 完成数据值的变化(功能模型) [5]。采用了面向对象的方法后, 软件不仅易于被人理解,而且易于维护和修改,从而提高了软件的可靠性和可维护性;同时,可以提高公共问题域中软件模块化和重用化的可能性[7]。3.游戏流程分析打开游戏,首先出现的是开始界面,玩家可以选择单机游戏、联机对战或者退出游戏,点击单机游戏或者联机对战就可进入相应的游戏。3.1单机游戏流程进入单机游戏界面之后,玩家可以先对游戏进行难度设置以及排行榜的查看,开始后,游戏过程中玩家可以使用道具来辅助完成游戏。游戏胜利后玩家可以输入自己昵称来将成绩存入排行榜。主要流程图如下: 图3-1 单机流程图3.2联机游戏流程进入联机对战游戏,玩家首先将选择新建一局游戏或者加入已存在的游戏,加入游戏需要输入服务器端的ip以及端口号,进入游戏后服务器端玩家需等待加入玩家准备好后才能开始游戏,然后以游戏完成的用时长短来判断游戏胜负。主要流程图如下: 图3-2联机对战流程图4游戏的设计实现4.1游戏规则简介开始游戏后,玩家需要找出游戏地图中两个相同的图案连接起来,连接转折点不多于两个,就能成功将两个图片消除,在规定时间里将游戏地图内的所有图片全部消除掉即为游戏胜利,否则就是游戏失败。另外,在本次设计的游戏中,联机对战的玩家若双方在规定时间内都未将图片全部消除,那将以游戏时间结束时的得分来判断胜负。 4.2功能设计游戏主要设计了单机版和双人联机对战版,除了基本的游戏功能及死局判断功能之外,还有难度选择、排行榜查看、背景音乐以及道具使用。其中难度选择设置了初级、中级和高级三个选项,玩家可以通过自主选择来制定游戏难度;排行榜根据玩家用时长短排序,从短到长显示玩家姓名以及完成游戏花掉的时间;道具主要设计了重列、加时、炸弹三种,重列的功能为将游戏界面内剩余图案重新排列到界面,加时功能为增加游戏时间10s,炸弹功能为自动消除一对相同游戏图案。三个道具的使用都是玩家每点击一次就使用一次该道具对应的游戏功能。4.3界面设计游戏基于java Swing完成界面设计,主要使用了JTable表格控件、JButton按钮控件、JFrame框架、JPanel等。主要界面有游戏主界面、单机游戏页面和联机对战页面。其中单机游戏中还有排行榜和难度选择界面,联机对战中还有游戏设置界面。具体如下图: 图4-3-1游戏开始界面 图4-3-2单机游戏界面图4-3-3难度设置界面图4-3-4排行榜查看界面图4-3-5联机对战进入界面图4-3-6客户端界面图4-3-7客户端界面4.4类的设计关于类的设计,我主要先将程序分为几个包,然后再将相关类存入对应的包。这些包分别为:保存局域网相关类的lan包;游戏入口的main包;保存游戏设置的commons包;保存监听类的listener包;保存接口类的service包;保存实现类的impl包;保存时间控制的timer包;保存图片工具类的utils包;控制游戏界面图像的view包。Lan包服务器类:LanServer,主要服务器端的界面设计代码以及启动服务端的线程方法。联机对战设置类:LanLink,主要是联机设置的界面以及ip和端口号的设置方法。并将设置的值传递到客户端以及服务端。客户端类:LanClient,主要是客户端的界面设计代码以及连接服务端的线程方法。图片序号类:LanMap,主要功能是将图片存入map使得一个图片对应一个序号。main包游戏主界面类:mainIn,负责游戏主界面,是游戏的入口。单机游戏主界面类:LinkGame,负责单机游戏的界面,并调用其他类来完成整个单机游戏。Commons包游戏基本设置类:GameConfiguration,负责设置游戏棋盘二维数组的一维和二维长度、游戏分数、游戏时间以及第一张图片的开始坐标。并且提供了相应的get()方法。游戏异常类:GameException,负责处理游戏异常。链接信息类:LinkInfo,主要是对应三种连接情况提供了三种对应构造方法,分别是有两个连接点、三个连接点和四个连接点。并且提供了一个返回链接集合的get()方法。图片方块类:Piece,主要负责保存每个图片方块的开始及结束坐标、在棋盘数组中的一二维位置和图片信息。并且提供对应的get()方法。连接点类:Point,保存每个连接点的x、y坐标,并提供对应get()和set()方法,重写equals方法使得只要x和y坐标相同就返回ture。背景音乐控制类:PlaySound,负责控制背景音乐的开启和关闭。游戏死局判断类:EndJudge,负责判断游戏地图是否出现死局状况方便提醒玩家。Listen包开始按钮监听类:BeginListener,主要调用其他类的方法来开始游戏。炸弹按钮监听类:BoomListener,从当前游戏棋盘中随机消除掉一对图片。 加时按钮监听类:ClockListener,调用时间控制类中的addgametime()方法增加游戏时间。重列按钮监听类:RandListener,调用图片工具类中方法获取当前图片并将其重新打乱。游戏地图监听类:GameListener,监听着游戏棋盘的变化,将玩家选区的图片交给游戏逻辑类来判断。Service包游戏地图抽象类:AbstractBoard,调用图片工具类获取文件中的图片,并建立了一个createPieces()交给子类去实现。游戏逻辑接口:GameService,定义了获取方块数组方法getPieces()、设置方块数组方法setPieces()、游戏开始方法start()、查找方块方法findPiece()、连接方法link()、分数计算方法countGrade()、判断这个方块数组是否为空方法hasPieces()。Impl包游戏逻辑实现类:GameService,实现游戏逻辑接口类定义的方法,并且封装了一些连接判断的工具方法。游戏地图子类:SimpleBoard,继承了AbstractBoard,实现createPieces(),完成游戏地图具体的布局,简单版地图。游戏地图子类:SquareBoard,继承了AbstractBoard,实现createPieces(),完成游戏地图具体的布局,加强版地图。Timer包游戏时间控制类:TimerTask,使用java内部的Timer和TimerTask类来进行时间控制,重写TimerTask的run()方法,然后在开始监听类里调用timer.schedule(task,0,1000)来使得每隔一秒调用一次run()方法。Utils包图片工具类:ImageUtil,主要有负责从文件中获取图片的getImages()方法和打乱图片顺序的randomImages()方法。联机图片管理类:LinkImage,将取出图片存入map,使之有对应关系。View包地图画面控制类:GamePanel,主要有负责画出棋盘数组情况的paint(Graphics g)方法和画连接线的drawLine()方法。4.5道具设计 本次游戏主要设计了三个游戏道具,分别是炸弹、重列和加时,炸弹道具主要是帮助玩家在找不到下一个连接图片的时候,遍历游戏地图上的图片找到可以消除的一对,并将其自动消除掉;重列就是将游戏地图上图片重新随机排列后再显示在地图上;加时就是为了帮助玩家增加游戏时间,将游戏时间增加10s。4.6连接判断设计由于在连连看游戏规则中,连接转折点不能超过两个,所以判断图案是否能连接消除可分为三种情况:没有转折点;一个转折点;两个转折点(如图4-6-1)。其中要用到两个关键类Point、LinkInfo以及获取通道的工具方法,Point类表示连接点,用于保存点的x和y坐标,重写了equals方法,用于判断两个Point对象是否为同一个点,判断标准为两个点的x坐标与y坐标是否一致;LinkInfo类表示连接信息,该类只提供三个构造器和一个返回存放连接点集合的方法,构造器用于创造连接点信息对象,如果两点可以直接连接,则调用两个参数的构造器,两个点之间需要有一个转折点才可以相连的话,需要调用三个参数的构造器,两个点之间有两个转折点的话,就需要调用四个参数的构造器;通道就是一个Piece对象四个方向没有障碍的地方(如图4-6-2)。所以,每一个piece对象都有四个方向的通道。接下来的链接判断编码就是按照这三种方式来实现,先判断能不能直接相连,再判断一个转折点的情况,最后为两个转折点的情况。如下图:图4-6-1三种连接情况图4-6-2通道的解释没有转折点如果两个连接点具有相同的X坐标或者Y坐标,那就可以进行没有转折点的链接判断。首先,判断两个连接点是否为同一点以及两点图片是否相同,若满足不为同一点且图片相同则继续下面的判断。如果是Y坐标相同则从靠左那点向右遍历;如果是X坐标相同则从靠上那点向下遍历,根据两点中间是否有障碍来判断是否连接成功。如果两点之间没有障碍,连接成功,则返回一个新的连接对象LinkInfo(p1 Point, p2 Point)。主要代码如下: //判断两个y座标相同的点对象之间是否有障碍, 以p1为中心向右遍历 private boolean isXBlock(Point p1, Point p2, int pieceWidth) { //如果p2在p1左边, 调换参数位置调用本方法 if (p2.getX() < p1.getX()) return isXBlock(p2, p1, pieceWidth); for (int i = p1.getX() + pieceWidth; i < p2.getX(); i = i + pieceWidth) { //如果有障碍 if (hasPiece(i, p1.getY())) return true; } return false; } //判断两个x座标相同的点对象之间是否有障碍, 以p1为中心向下遍历 private boolean isYBlock(Point p1, Point p2, int pieceHeight) { //如果p2在p1的上面, 调换参数位置重新调用本方法 if (p2.getY() < p1.getY()) return isYBlock(p2, p1, pieceHeight); for (int i = p1.getY() + pieceHeight; i < p2.getY(); i = i + pieceHeight) { if (hasPiece(p1.getX(), i)) return true; } return false; }一个转折点如果两点只经过一个转折点就可连接,那只有两种情况,就是第二点在第一点的右上方或者第二点在第一点的右下方(如下图),若第二点在第一点的左侧交换两点即可。图4-6-3情况一图4-6-4情况二 所以,判断这种情况下两点是否能连接成功的关键就是找到这个转折点,这里就需要用到上述过的通道,只要获取如图中p1向右、向上、向下的三个通道,p2向下、向左、向下的三个通道。如果p2在p1右上角,则分别获取p1向右和p2向下的交点,p1向上和p2向左的交点;如果p2在p1右下角,则分别获取p1向右和p2向上的交点,p1向下和p2向左的交点。有交点返回即代表连接成功,则返回一个新的连接对象LinkInfo(p1 Point, cornerPoint,p2 Point)。主要代码如下://获取两个不在同一行或者同一列的座标点的直角连接点, 即只有一个转折点private Point getCornerPoint(Point point1, Point point2, int pieceWidth, int pieceHeight) { //获取p1向右, 向上, 向下的三个通道 List
目录
摘要.....................................................................1
关键词....................................................................1
Abstract..................................................................1
Key words.................................................................1
引言.....................................................................1
1选题背景.................................................................1
1.1选题目的及意义.........................................................1
1.2发展研究状况...................................................2
2开发平台及应用技术...................................................2
2.1 java简介..............................................................2
2.2 Eclipse简介..........................................................2
2.3面向对象编程概述...................................................3
3游戏流程分析....................................................3
3.1单机游戏流程......................................................3
3.2联机游戏流程......................................................4
4游戏设计实现...................................................4
4.1游戏规则简介..................................................5
4.2功能设计....................................................5
4.3界面设计....................................................5
4.4类的设计...................................................9
4.5道具设计...................................................10
4.6链接判断设计...................................................10
4.7联机对战设计...................................................18
4.7.1客户端设计...................................................18
4.7.2服务端设计...................................................20
5运行与测试.......................................................22
5.1游戏运行...................................................22
5.2测试分析 ...................................................23
6总结...................................................23
致谢...................................................23
参考文献..................................................24连连看游戏的设计与实现
计算机科学与技术学生 陈飞飞
引言
版权保护: 本文由 hbsrm.com编辑,转载请保留链接: www.hbsrm.com/jsj/jsjkxyjs/2251.html