JAVA课程设计

一、设计背景

        近几年,随着一个体闲游戏贪吃蛇大作战的火爆,越来越多的人选择在无聊的时候玩这款游戏,比起以前在那种按键手机玩的贪吃蛇,这款游戏不管是画面还是游戏的玩法都做的升级,在试玩了这款游戏以后,我就在想,我可不可以用这学期学的java界面编程也来做一款类似这样的游戏呢,于是通过查找资料发现可以实现这样的游戏,这样我的项目带有登陆界面的贪吃蛇这款小游戏就产生了。

二、需求分析

  1. 采用java Swing界面编程来实现。
  2. 游戏的实现细节:

        (1)需要这款贪吃蛇小游戏带有登陆界面。

        (2)实现不同用户通过不同的账号和密码登陆。

        (3)登陆账号或者密码错误需要有提示。

        (4)进入贪吃蛇界面后小蛇的初始长度需要为3。

        (5)每次吃一次食物,小蛇的身体加一个长度。

        (6)小蛇可以实现通过墙壁,从另一侧墙壁出来。

        (7)按下空格键实现游戏暂停,需要有提示暂停文字。

        (8)如果小蛇的头碰到了自己的身体,游戏就会结束。

三、概要设计

3.1项目环境说明

(1)本次项目是以win10操作系统和jdk1.8为基础环境。

(2)在IDEA2021中进行代码的编写。

(3)需要用到java.awt、java.Swing、long包、java.io、java.util、java.net等类下面的一些子类和方法。

3.2项目进度安排

(1)第一天:进行对登陆界面和游戏界面的布局设计。

(2)第二天:进行登陆界面和游戏界面中的逻辑设计。

(3)第三天:解决一些游戏开发中出现的bug。

(4)第四天:编写项目报告和程序调优。

3.3项目流程

3.4总体设计

第一步:首先编写用户类User,序列化类SerializaProcess和反序列化类ReveseSerializeProcess。

第二步: 其次编写登陆界面类Login,在Login类下再创建一个类ActionHAndle,在此类中创建一个容器frame,在这个容器中创建各个组件,以及需要监听的事件,实现用户的登陆。

第三步:然后编写游戏界面的类GamePanel,在这个类中实现游戏的一些细节。包括游戏画面的绘制,事件的监听和键盘的监听。

第四步:然后编写存放小蛇头、小蛇尾、食物、界面图片的相对地址的类Date,此类主要服务于Login和GamePanel类。用到的图片是保存在static文件夹下。

第五步:编写主类StartGame类实现程序的运行。

四、系统功能模块结构

        带有登陆界面的贪吃蛇小游戏这个项目一共有七个类,分别是是游戏界面的图片素材类Date、贪吃蛇游戏界面开发类GamePanel、用户登陆界面及游戏界面启动类Login、用户类User、将用户类的对象实现序列化类SerializaProcess、将用户对象实现反序列化类ReveseSerializeProcess、项目启动类StartGame。

4.1用户登陆类Login

        在这个类中我先定义了一个容器fram,并将这个容器的标题定义为用户登陆,然后我定义了两个按钮,和两个文本输入框以及一些标签。其中两个按钮分别为登陆按钮和重置按钮。在这两个按钮中我实现了事件的监听,在按钮的添加事件监听的方法中添加事件监听的对象,重写了actionPerformed这个方法。在重置按钮中我实现的事件监听是:首先判断触发源是否为重置按钮,如果是再判断输入的用户名是否为空,如果是空将下面标签的文字设置为用户登陆,如果不是则将文本输入框中的内容置为空,并将下面标签的文字设置为重新登陆。实现重置这一功能。

在登陆这个按钮中我实现的事件监听是:同样判断触发源是否为登陆按钮,如果是再判断输入的账号和密码与系列化后再反序列化后的对象所对应的账号和密码是否一致,在此处我是通过for循环和if判断来实现,在序列化类中通过定义一个静态变量count来记录用户的总数,这样避免的空指针异常。如果输入的账号和密码正确,将下面的标签文字设置为登陆成功。并在此基础上让登陆界面消失,让游戏界面出现,所以此时也定义了游戏界面的容器。并设置游戏窗体的大小和颜色等操作。

        剩下的代码就是实现登陆界面的大小和标签、文本框的位置,这里是通过不断调试最终确认位置和大小。

4.2图片素材类Date

        这个类是服务于Login类和GamePanel类,这个类主要是获取在其他两个类中用到的一些图片素材的相对路径。

4.3用户类User

        要想将用户类的对象实现序列化,需要用户类实现Serializable接口,然后定义用户名字和密码两个成员变量,以及无参、有参构造函数和get、set方法。

4.4序列化和反序列化

        为了实现用户类的对象保存在磁盘中,而不是内存中,这里通过序列化类SerializeProcess的输出流实现将对象保存在磁盘中,保存完成后,那么还需要获取对象的信息,这里通过反序列化类ReveseSerializeProcess利用输入流将对象还原到内存中,保存到一个数组中,在Login类中利用for循环遍历数组,在利用get方法来获取账号和密码,从而判断与文本框输入的账号和密码是否一致。


4.5游戏界面类GamePanel

        首先定义成员变量,有小蛇的长度lenth,小蛇的x坐标和y坐标,小蛇头的初始位置fd,判断游戏的开始,初始为false,食物的x坐标和y坐标,随机数random,定时器timer,判断游戏的结束,初始为false,游戏得分。

        然后定义一个初始化方法init,在初始化方法中定义小蛇的初始长度为3,蛇头和蛇身的初始位置,然后蛇头的初始方向为右,分数为0,添加键盘监听事件为当前类的对象,因为当前类实现了KeyListener这个接口,设置焦点事件为true,设置食物的初始位置,这个位置是通过随机数来确定,设置定时器为开始状态。

由于本类继承了JPanel,利用画笔来画游戏界面,那么就要重写父类的paintComponent方法,而且界面中的所有东西都是通过这一支画笔来实现,首先使游戏界面整体为白色,然后确定广告头的位置,然后将画笔的颜色设置为白色,将长度和得分这两项内容设置在广告头最右边的位置,用来记录小蛇长度和得分情况。

        然后设置游戏画面在一个宽度为850,长度为600的黑色矩形框里面。通过if语句来判断蛇头在哪个方向,就使用哪个方向的蛇头图片,小蛇身体的长度用for循环来实现,如果游戏没有开始,也就是start为false时,在游戏界面中间会显示一句话:按下空格开始游戏。如果游戏结束了,也就是end为true时,界面中间会显示:游戏结束,按下空格重新开始。

        本类实现了ActionListener接口,那么就重写actionPerformed这个方法,这个方法中主要实现在进行游戏的过程中,如果蛇头坐标和食物的坐标重合时,也就是小蛇把这个食物吃掉了,那么实现小蛇长度加1,得分加1,并显示在广告栏右侧的位置上,然后再改变食物的坐标,这里通过随机数来实现。对于小蛇的移动,先将每节身体向前移动,然后再将蛇头向前移动,就实现了小蛇的移动。如果小蛇移动到界面边缘,就将蛇头显示在另一边的界面边缘,这样就实现了穿墙的动作,是通过if判断来实现。如果小蛇的蛇头和其中任何一节身体坐标重合,也就是小蛇咬到自己身体,那么游戏结束,这时的end变为true。最后将画面重画一遍。计时器开始计时。 

        此类也实现了KeyListener这个接口,那么就需要重写它的几个方法,只对键盘按压监听事件keyPressed方法进行重写。当按了空格时,判断游戏是否为结束状态,如果是结束状态,那么将end置为false,调用初始化方法init,这样就将游戏的参数初始化了,也就变成新的一局游戏,否则将start取反,这个作用是游戏进行时,可以实现游戏暂停。然后调用repaint方法实现画面的重画。也需要监听上下左右四个键,来确定使用哪个方向的蛇头。 

4.6项目启动类StartGame

        在项目启动类的main方法中先new一个序列化类的匿名对象,反序列化类是在Login这个类的登陆按钮的监听事件下来new的。然后再new一个Login类的对象,实现了整个项目的启动。

、运行结果展示

账号或者密码错误:

按下重置按钮后:

账号密码正确后,进入游戏主界面:

 游戏结束画面:

六、心得体会

        通过这次实训,我收获了很多,一方面学习了很多java中的类,比如io包下的类、Swing包下的类、awt包下的类,同时丰富了我所学知识的宽度和广度,另一方面,我还提高了自己动手做项目,自己独立编程的能力。本次实训,是对我能力的进一步锻炼,也是一种考验。

        实训是一个人综合能力的检验。要想优秀完成工作,除了基础知识功底深厚外,还需要有一定的实践动手能力、应对突发状况的能力。实训是学习一门新知识,大家都是从零基础开始,但是完成项目的效率有的高有的低,这大概就是实践能力高低者的区别所在吧。此次实训,让我学会了冷静思考,从容面对自己遇到的问题。一个星期的实训,不长不短,不易不难,但每一天的学习笔记都是自己用心记的,每一次的项目都是根据自己的想法思路来设计算法的,因为只有靠自己,我更学会了冷静思考,遇到错误上网搜集资料并解决问题,正是这样的状态,本次项目我都能有效率的完成,而在完成之后,自己特别有成就感,自信心也大大增强了。作为学生,我要树立终身学习的观念,不断提高和充实自己。诚然,我们会被日常的琐事烦恼,但作为学生的我们,目前主要的任务仍是学习。在信息时代,知识更迭飞快,每天都有新问题和新技术,紧跟时代的步伐。在以后的学习生活中,我会把自己更多的时间投入学习,通过学习,一方面弥补自己知识的贫瘠,另一方面让自己的精神生活、精神世界更加丰富。作为学生,学习能力只是证明自己的一个维度,只有多维自由全方面的发展才是新时代合格的学生。以前的我也是那个只注重学业绩点的学生,后来在经历了一些事情后,一个人的情商、一个人的智慧、一个人的格局对其来说也是很重要的。一个人学生纵使学业成绩异常优秀,但其做人让人心生厌恶,也算是不是一个合格的学生,至少我不会把其视为合格的学生。

        总的来说,这次实训不仅使我学到了知识,丰富了经验。也帮助我缩小了实践和理论的差距,使我对java语言编程有了进一步了解。这次实训将会有利于我更好的适应以后毕业的工作。我会把握和珍惜实训的机会,在未来的工作中我会把学到的理论知识和实践经验不断的应用到实际工作中,为实现理想而努力。最后,我要感谢学院组织的这次十分有意义的实训,使我们学到了很多,也领悟了很多。同时,也要感谢为这次实训默默付出的老师,是他辛苦的汗水使这次实训得以完美结束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yourheads

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值