系统简介
本文用java语言开发设计了成语拼图小游戏,此次设计运用可视化编程软件Eclipse来制作,采用网格布局来设计操作的界面,给与每个网格添加鼠标监听事件,使其拥有点击交换功能。使用图片切割函数将图片进行切割并且将切割完毕的图片放置在每一个网格上。在网格的定义上采用了对象数组的形式,便于后期属性的调用。游戏主要模块为查看原图、图片重排以及计时挑战模式,并给游戏添加背景图片和背景音乐。
关键词 JAVA 成语拼图游戏 可视化编程 点击交换
1 系统概述
1.1 游戏定义
游戏曾经是人类的一种本能,是一种为了满足自我精神层面愉悦的方式。在如今游戏的定义已然改变,它是现代人的一种娱乐手段,是一种不可多得也不可缺少的东西。游戏过度会使人麻木,适度游戏可以使人身心健康。与此同时游戏也是一种锻炼能力的途径,它能够锻炼一些其他方法所无法做到的能力,所以在一定程度上游戏也是一种推动社会发展的力量。
1.2 拼图游戏的类型
1.2.1 树叶拼图
在自然界中的树叶有着各种不同的色彩、形状、脉络以及透明度,因此即使是使用同一棵树上的树叶,不同的人也可以发挥各自的想象力来拼接出各种独一无二的图画。是一种充分发挥自身想象力的拼图游戏。
1.2.2 还原式拼图
将一张图片分割成指定数量且大小相同的图片块,可以使用传统的平移还原方式,也可以使用互换位置的还原方式,是一种考验逻辑判断力的拼图游戏。
1.2.3 硬纸板拼图玩具
用一种称作为“全面互锁”的零片边缘样式,把一张带有图案的硬纸板分割成指定数量的零片,使得已拼接的零片不易散掉,是一种考验眼力和耐心的拼图游戏。
除此以外,还有许多目前已知的以及未来待开发的拼图游戏,这里就不一一列举了。
1.3 游戏的发展状况
2020年是游戏机遇与挑战共存的一年,随着高性能智能机的全面普及,移动游戏便渐渐成为部分用户的生活必需品之一。虽然移动游戏的操作性和可玩性远不及主机游戏和PC端游戏,但是当前业界人员也在不断发掘压榨手机性能去达到更高的操作性和可玩性来满足玩家的需求。最为关键的是移动游戏的宿主是手机,可以随身携带是最为方便也是最大的优势。
自2013年起无论是在国内,或是全球游戏市场,移动游戏产业占比开始疯狂地增长,至2016年超越PC端游戏成为游戏的主流,也使手机成为毋庸置疑的最重要的游戏设备之一。
虽然移动游戏已然成为游戏的霸主,但是其他平台上的游戏依然是那么令人惊讶的,许多主机上的3A大作,逼真的环境特效、舒适的背景音乐以及扣人心弦的剧情,这些都是在移动端上的游戏所望尘莫及的。也就是说,移动游戏目前只是在经济层面上的第一,想要真正的体验好的游戏还是得找一个空闲的周末,窝在家里享受主机游戏的乐趣。
在未来游戏发展中可能会成为重要发展方向的游戏类型如下:
知名IP、品牌、影视联动游戏——如今已经有许多影视和游戏关联的游戏获得成功,发展的趋势也在朝这个方向靠拢。许多知名影视作品可以作为游戏的基本核心来开展剧情及游戏性,这类游戏可以让玩家扮演电影的主角从而获得极强的代入感,体验身为主角的快感。这让游戏和影视作品相互促进,吸引并且留住更多的粉丝。
移动游戏——在空余闲暇时间可以掏出手机,消磨一下时间碎片,随时随地的进行游戏,不同与PC端游戏局限与地点,因此非常的方便。同时也随着手机性能的提高,移动游戏的趣味性也在不断提高。
休闲游戏——这类游戏玩法简单,入门门槛低,开发也相对简单,大部分休闲游戏都是益智型游戏,所以适用于所有年龄段的用户。本文便是根据传统拼图游戏,开发的一款休闲游戏,来放松人们紧绷的神经。
硬核游戏——电子竞技类、角色扮演类、动作类的游戏,有着紧张刺激的游戏节奏,充满着竞技性,满足喜欢挑战的玩家。由于难度偏大,入门门槛高,会使新人去寻找攻略,此时也相对促进直播行业的发展。
2 成语拼图游戏系统分析
2.1 系统背景介绍
如今,忙碌且快节奏的都市生活,各式各样的文化输入冲淡了当代年轻人对于中华传统文化的认知,新奇地网络流行语使人们渐渐地忘记了汉语精华“成语”。人们也很难做到回到课桌上重新学习成语。
益智游戏是相当受欢迎的一个游戏种类,拼图游戏正是其中一类,它能够锻炼人的观察力。而此次拼图游戏是成语拼图,它具有娱乐性、学习性于一体的特性,更能够提升词汇量,激发对学习成语的兴趣。并且操作简单,可以用于学习与复习成语,体会中华古代汉语文化的风韵。
2.2 系统需求分析
2.2.1 系统功能需求
成语拼图游戏不同于传统九宫格拼图游戏,传统的九宫格游戏它拥有一个空白格,可用于临近方块的置换,而成语拼图游戏则不同,它共有十六格方格,并且一个方格都不可缺少,缺少就会导致成语无法组成。
因此,不能够采用和传统九宫格拼图相同的算法来实现成语拼图的操作方式。所以此处便采用鼠标点击交换形式,鼠标点击事件分两步,点击第一个图片与点击第二个图片,当完成这两步时即可成功判断并交换。在每次点击的时候添加音效,用于方便知晓是否选择图块成功。
在观察猜测成语的时候往往并不能第一时间知道它究竟是哪一个成语,也会导致游戏无法顺利的进行,造成劝退玩家的后果。这时需要添加提示功能,在必要的位置添加呼出原图按钮,可以让无法知晓答案的玩家得到提示,从而顺利的完成游戏。
当然,每一款游戏都需要注入一个灵魂,BGM是游戏不可缺少的成分,没有合适BGM的游戏必然是沉闷、无趣使人困倦的。所以需要一个有趣的灵魂来塑造一个给人乐趣的游戏。
没有挑战性的游戏会大大减少它的受众面,既然如此,就需要添加计时模式来供喜欢挑战的玩家来游玩。
2.2.2 系统界面需求
对于一款游戏,最重要的部分就是吸引人的眼球,只有让人视觉上感到舒服了,才有玩这款游戏的欲望,因此需要设置一些新颖的、让人眼前一亮的背景。同时在操作拼图游戏时,盯着的时间长了容易造成眼疲劳,所以更需要选择合适的色调来让人适应。在最后,也是最重要的是界面需要精简,复杂的界面会让人感到烦躁,因为人不像计算机,一次能够处理的事件有限,只有简洁明了的界面才让人有心情继续停留而不是连忙按推出按钮。
2.2.3 系统约束条件
在Java平台或其他计算机语言平台进行可视化开发。
2.3 可行性研究
2.3.1 技术可行性
计算机编程语言是一门人们用来与计算机沟通的语言,是人与计算机之间传递信息的媒介。更多的,计算机编程语言被用来开发供人们使用的应用程序,所有的程序都可以用它组成的一行行代码来搭建起来。就像用钢筋水泥筑成大楼一样,游戏也是一样可以由计算机编程语言制作出来。本设计由JAVA语言所开发,本人已经可以运用java代码来编写,了解并可以运用基本思想来进行开发。由此可得成语拼图游戏具有技术可行性。
2.3.2 经济可行性
本设计工程量较小,基本算法也很简单,开发平台免费对外开放。仅需一台个人PC即可进行开发,并且在开发过程中的参考资料均为免费资料,所需要的技术也是本人自身所学,因此不需要额外资金投入。由此可得成语拼图游戏具有经济可行性。
3 JAVA简介
3.1 开发语言
本次开发选用的编程语言为Java,相对于其他语言,他的优势在于它是一门面向对象的语言,并且它没有难以理解的多继承以及指针等概念,这就使它变得简单易懂。由于拼图游戏是对象与对象之间的交互,JAVA能够很好的对拼图块进行设置和调用,并实现它的各项功能需求。更因为JAVA有强大的分布式来满足拼图游戏的框架,贴切的展现它的形态。当然JAVA的用途远远不止以上这些,还可以后期简单地为程序装饰,插入音乐、音效以及图片等。
3.2 开发工具
Eclipse实质上是一个框架平台,但是由于众多的插件可以应用在其中,使得Eclipse拥有更加多的功能,更加的灵活。Eclipse的核心非常的小,其余的所有功能都以插件的形式附加在这个核心之上。他的插件机制采用了轻型软件组件化架构,也就是说它能后支持将任意的扩展内容加入到现有的环境当中去。在RCP平台上,它使用插件来实现所有附加功能,这些插件已经能够支持许多其他语言的开发。
在此次设计中,为了更方便的使用swing的组件,我们要用到Eclipse中一个非常方便地插件:windowbuilder,这个插件可以直接让代码所生成的界面直观地显示出来,并且可以在这个界面中自由地改动和添加所要地组件,即使不懂得java语言也可以用它来制作一些简单的界面,正因为它拥有如此强大的功能,所以它可以在我们开发中节省大量的时间与精力,来进行其他的工作。
另外,在Eclipse中使用的jdk为javaSE-13,为了配合新版的jdk还用到了一个用于载入音频的插件JLayer。
4 成语拼图游戏设计与实现
4.1 概述
拼图早在两百多年前的英法两国就开始流行,起初的这些图片都是带有教育意义的,有适于年轻人学习的小短文,或是一些富有地理知识的区域地图,是用于宣扬和传授知识的存在。
拼图游戏虽说是一款游戏,但是它的教育意义要远远大于它的游戏意义,而且面向的对象不仅仅是儿童,成年人以及老年人也可以选择进阶高难的拼图来锻炼和保持自己的观察力和判断力。
成语是中国古代人民经过漫长的岁月提炼出来的固定短语,其中富有深刻的内涵,能够恰到好处的描述所要表达的东西,非常容易记住。并且常常带有丰富地感情色彩,褒贬不一。大多数成语地字数为四个字,但是不是不存在其他字数的成语,甚至还有用逗号隔开的长型成语。
在中国文化历史上,有多著作中的用词被用作成语,这些成语很好的诠释了中华民族精神,对后世影响深远。符合我们国家目前的国情,要建设社会主义核心价值体系,正是需要推进学习中华民族文化,发挥优秀传统文化的强大影响力。
当然此处想要达到的目的正是传扬中国汉语的精华,提倡去学习去了解成语并熟练的使用,学习成语对于中华儿女具有很大的意义。做一个关于成语的游戏也许能够帮助人们更好的学习成语。
4.2 功能分析
为了满足成语拼图游戏的需求,必须有游戏主体、辅助游戏功能和各类选项,故将程序分为三大部分:初始化、提示模式、游戏模式,下列为分别对应的模块。
4.2.1 游戏图片载入
打开程序时,会自动初始化,将图片读取并且显示在面板上。并且将图片平均分为16个图块,随机打乱,供玩家点击触发事件。同时加入重置功能,将已经进行过操作的图块重新打乱。
4.2.2 查看原图功能
无法推测出各图块所构成的成语时,可以点击界面上的按钮查看没有分割打乱时的原图,避免无法找到正确答案,保证游戏的顺利进行。
4.2.3 计时挑战模式
正式的开始游戏,点击后会在“剩余时间:”的文本下出现倒计时框并且倒数,在规定时间内,将图块还原到原本的位置就可以取得胜利,否则就会显示挑战失败。
4.3界面设计与具体实现
根据上述的要求可得本程序的流程图(图4.3)如下:
图4.3
4.3.1 绘制主界面
图4.3.1
使用JFrame图形组件绘制基本的界面框体(图4.3.1),首先在JFrame的框架上再使用JButton绘制三个分别名为“查看原图”、“图片重排”、“开始游戏”的按钮。再用JLabel和线程来制作一块用于计时的区域。最后绘制一个JPanel用来盛放拼图的主体。
4.3.2 拼图结构
由于拼图是一块一块均匀分布的,所以采用了GirdLayout式布局,在JPanel上创建了十六个JButton。拼图需要让系统知道图块原本的位置,因此创建一个Cell[]对象数组用于存放图块的位置信息。紧接着需要先将位置信息按顺序分配给每一个按钮,并且存入数组。
创建一个cutImage函数定义四个变量图片总宽度allWidth、图片总高度allHeight、每块 图块的宽度width、每块图块的高度height,用allWidth、allHeight分别除以每行每列所 需切割的块数得出width、height,最后按照得出的数据对图片进行切割,并使用for循环 按照顺序添加到每个网格按钮上。最后也是关键的一个步骤是在每一个JButton上添加鼠标 监听事件,便于后期调用移动函数来实现交换功能。
4.3.3 显示原图
重新创建一个类TotalPicture用于给“查看原图”按钮添加功能,首先给按钮添加鼠标监听事件,用于触发调用TotalPicture类来呼出原图窗口(图4.3.3)。在TotalPicture类中继承JFrame,创建一个JPanel用于添加JLabel来存放并显示原图,使用setIcon方法给JLabel添加图片。最后再JPanel以外的空余区域创建用于退出的JButton。
图4.3.3
实现点击交换功能需要用到对象数组,所以创建一个Cell类来定义数组的结构,对象数组中每个对象分别带有四个属性:图片Icon、编号id、宽度width、和高度height。由于我们需要调用对象数组中的某些属性,在Cell类中定义三个方法:
Public int getID(){return ID;}//用于获取对象的编号
Public int getX(){return this.getBounds().x;}//用于获取对象的左上角x坐标位置
Public int getY(){return this.geyBounds().y;}//用于获取对象的左上角y坐标位置
有了这三个方法就可方便的调用Cell数组中各个对象的编号、x坐标和y坐标来实现后续的操作。
在拼图结构中给每一个拼图块都添加了鼠标监听事件,为了鼠标监听事件能够真正发挥它的作用,创建一个mouseClicked函数来实现分别点击图片后交换的功能。需要定义四个参数和两个对象,分别为对象左上角坐标x1、x2、y1、y2和对象click1、click2。因为需要判断两次的点击,所以需要用到if else函数来分别判断两次点击所触发的事件,第一次点击来获取第一个对象的坐标:
Click1=(cell) e.getSource();//获取对象的事件源
x1=click1.getX();y1=click2.getY();//获取对象的横纵坐标
点二次点击有三个事件:获取第二个对象的坐标、交换两个对象的位置以及判断是否结束游戏。获取第二个对象的坐标的方法和第一个对象一样,交换对象使用了setlocation函数来实现互换(先后位置见图4.3.6.1和图4.3.6.2):
Click1.setLocation(x2,y2);//将对象Click1的位置放到对象Click2的位置
Click2.setLocation(x1,y1);//将对象Click2的位置放到对象Click1的位置
最后调用check函数来判断是否结束游戏,check函数主要根据for循环来判定打乱并归位的拼图块是否在原本初始的位置,若归位以boolean的形式输出true,否则false。
4.3.7添加游戏背景图片、音乐
添加背景图片用到了JLabel来加载图片,JLabel有一个setIcon方法可以把图片设置为JLabel图标,只要把它的大小设置为和主界面大小一致并放在容器的底部就可以作为背景图片了。
由于在本次设计中使用的jdk为javaSE-13,它已经把过往用来设置播放音乐的AudioClip类弃用了,所以无法用老方法来为游戏添加背景音乐了。在这里我选择下载额外的jar包JLayer来导入到项目当中去。JLayer是一个用于播放mp3的开源项目,它的使用方法很简单,只要重写一个继承Thread线程的music类来导入音频。其中需要定义两个变量:
Player player;// 获取的mp3
String music;//存储音频的地址
最后在main方法中调用并开启线程就可以播放背景音乐了。
5 运行测试
于是我便去网上查询了一下缘由,得知在最新版的jdk中AudioClip类已经被弃用淘汰了。一时之间无法找到新的方法去实现这个功能,然后我在论坛中发现一个可以用来播放mp3文件的插件JLayer,将JLayer包应用到我的工程当中去。然后使用调用它的功能,问题就迎刃而解了。
5.2 解决无法实现鼠标点击交换
在这个问题中又有两个小问题,第一个问题是当经过两次点击后,两个图块并没有交换,而是图中(图5.2.1、图5.2.2)的“花”把“鸟”覆盖掉了。
图5.2.1
图5.2.2
起初认为是没有设置中间变量所导致的,其实并不是。而是我采用的if else方法中,其中的数据无法共同使用,所以这个功能才实现了它的一半作用。最终将方法中的变量定义到了方法外中才解决了问题。
第二个小问题,鼠标点击的两个图块,他们的位置信息并没有真正的交换,仅仅只是两张在表面的图块进行了交换。原先使用了setIcon方法实现了两图片的交换,这也是导致上述问题的根本所在。最后重新定义了对象数组,将其中的信息全部捆绑了起来,再使用setlocation方法将两图片交换,如此便实现了图片和位置信息同时交换。
5.3 解决无法正确判断胜利
在错误判断中我使用了我自己定义的对象数组中的getID方法,来放入for循环中判断当前图块和初始图块的位置是否相同。由于两者使用了同样的ID信息(图5.3.1),所以它们总是相同的,就出现了错误位置移动也会触发游戏胜利。于是重新定义一个数组来存放初始的位置信息,当ID对应重新定义后的数组中的信息时才能触发游戏的胜利(图5.3.2)。
图5.3.1
图5.3.2
由两图可见触发胜利的原理是当两个位置信息相同时才能够正确触发胜利,单一的位置信息则难以处理这个问题。