连连看游戏的设计与实现(源码)
*景先生毕设|www.jxszl.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连连看游戏的设计与实现
计算机科学与技术学生 陈飞飞
引言
原文链接:http://www.jxszl.com/jsj/jsjkxyjs/44593.html