Java案例-贪吃蛇小游戏

Java案例-贪吃蛇小游戏

先来看看,这个游戏的截图。

这里可以自定义难度系数(其实就是蛇自己移动的速度),共分10级。这里后面我会说实现方法,这都可以改的。

这里是初始的状态,食物是随机生成的,蛇位于地图的中央。其中灰色代表的是石头,白色是空地,蓝色是食物,红色是蛇头,绿色是蛇身。

这里,你可以用键盘的方向键来控制蛇的移动,但遇到上面俩种情况(蛇撞墙或蛇咬到自己)就会死亡。

这是一个扩展的地图的例子。

实现的方法: 首先,我们知道java是面向对象编程方法,所以实现过程也肯定是面向对象的。其次,我们要明白“数据”与“界面”分离的思想,做界面不是难事,只要用的熟练就好,难的是核心的算法的实现。所以看到贪吃蛇这个游戏,我们首先想的是他的业务逻辑是什么,而不是这界面是咋做的,其实说真的,我的代码里,有关做图形界面的代码只有50行左右,而全部代码是400行左右,可见做界面之占1/8的任务量。(源码在最下方

第一步: 我们先分析,在这个游戏里我们看到了那些对象或者说是变量。 1、地图 2、蛇 3、食物 (你可能还会说“石头”,但石头其实包含在地图里,因为地图就是由石头和空地组成的呀)

第二步: 下面我们一个一个的说: 1、地图如何实现? 首先,想用什么来储存地图的信息,呐,我们可以这样,地图由石头和空地组成,那么我们可以用字符 * 来表示石头,用空字符(就是一个空格键)来表示空地 ,这样我们就可以用char型的数组来存储地图。 然后就是,如何初始化地图,我们可以写一个intiMap()的方法来初始化地图(具体看代码,这里只粘部分代码,关键是思想)

2、蛇如何实现? 蛇分为蛇头和蛇身,我们可以用字符 表示蛇头,用字符 # 表示蛇身。呐,是不是我们就也用字符数组来储存蛇,NO,蛇是会动的,蛇移动时蛇头或蛇身的字符是不变的。用和 # 只是为了表示蛇,但不能用来储存蛇的信息。我们可以这样,蛇是在地图上动的,如果地图有坐标,我们就可以用坐标来储存蛇的每一个状态。因为一条蛇是由多个节点组成的,即由多个坐标组成,所以我们可以用链表容器来存储Point类型的节点。 呐,我们接下来就是初始化蛇,这个好办,因为初始的时候蛇是静止的,在最中央。写个方法就OK了。 难的来了,就是蛇的移动,我们如何让蛇在地图上移动? 其实也不难,蛇的移动我们可以看作链表添加节点和删除节点的操作,什莫意思呐,就是如果我们给蛇添加一个头,再删一个尾,不就相当于蛇走了吗。 因为 蛇有四个方向,所以可以定义四个常量表示四个方向(看代码,这里的代码是截取的,所以会用一些整体的方法,还是主要看思想,不用太在意代码)。

3、食物如何实现? 这个相比蛇就很容易了,首先食物虽然不会动,但他是随机在地图中生成的,所以我们用Point类,即用坐标来储存食物信息,并用 字符@来表示食物。 初始化食物,我们要明白一点,食物既不能长在墙上也不能长在蛇身上,所以在初始化食物的时候,要避开这些位置。并且,还有一点食物是随机的,这个好办,产生随机数就好了。(看代码)

第三步: 我们在上面已经定义好了,地图、蛇、食物,三个事物,并一一初始化。下面是如何讲这三样事物之间起建立联系。这个很重要,就是如何把蛇的信息、把食物的信息反馈给地图,以实现互动。 我们可以通过两个函数,showSnake() 和 showFood() 来实现,如何做呐? 其实,不难,我们只要将蛇 或 食物 的位置即坐标 反馈给地图就好了呀,然后让地图去显示他们就好了。

第四步: 好了,现在你的蛇和食物,可以在地图上显示了,并且蛇也可以在地图上自由的动了。但蛇还吃不了食物呀,还有蛇不会死呀。 如何让蛇吃到食物呐,我们这样,我们写个函数eatFood()返回值为boolean ,当蛇头的坐标和食物重合是返回真,否则假。然后,在第二步中的蛇的移动函数move()中判断eatFood(), 如果吃到了则就步删除尾结点了,不就好了吗。这样蛇吃了食物并且变长了。美滋滋(滑稽) 还有咋判断蛇死了? 我们还是写一个函数叫 Isover() ,在定义Game Over的布尔常量,当蛇头对应坐标下的地图坐标的值为 字符 * 或 # 时 ,就说明蛇撞墙了 或 咬到自己了 。然后在主函数中判断Game Over的真假,一旦为真,就结束。

有了以上四步,一个贪吃蛇的雏形就大概好了,具体的实现自己琢磨。下面讲一下如何画图,并把数据给图形。 添加事件监听器,要加一个keyListener,并重写keypressed方法,来实现用方向键来控制蛇的移动 这里要定义一个用来改变方向的函数,就是通过方向键来改变蛇的方向,这里我们可以用到之前的方向常量了,具体看代码

利用数据画图,其实不难,比如地图,你把地图的宽(横向的方格数)和高(竖向的方格数)的参数传给画笔,让画笔画就好了。再比如石头,食物,蛇,当坐标位置的值为 *时 用灰色画笔画,为 $ 时用红笔,为 #时用绿笔,为 @时蓝笔,就好了。 下面只展示重写的JPanel类的paint(Graphics g)方法。

最后提一下,常出现的难题: 1、数组越界的问题,因为键盘可以控制一直向某个方向,所以很容易越界。2、要实现蛇自己动,有点难度,我可想了好一会儿(滑稽)。

对了,有关扩展性是因为,你可以有继承,把你的贪吃蛇的类继承一下,然后重写 intiMap()方法就好呀,其他的不用重写。是不是扩展性很好呐(滑稽)

源码:

本文分享自微信公众号 - Java帮帮(javahelp),作者:奋斗蒙

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-02-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【选择题】Java基础测试七

    【选择题】Java基础测试七 86.欲构造ArrayList类的一个实例,此类继承了List接口,下列哪个方法是正确的?( B ) A、ArrayList m...

    Java帮帮
  • 第二十一天 IO-递归&字节流&字符流【悟空教程】

    递归就是“在一个方法内可以再次调用自身”,如下,method方法又调用了method方法。

    Java帮帮
  • 10(02)总结形式参数,包,修饰符,内部类

    6:内部类(理解) (1)把类定义在另一个类的内部,该类就被称为内部类。 举例:把类B定义在类A中,类B就被称为内部类。 (2)内部类的访问规则 A:可...

    Java帮帮
  • ASP.Net Core 开发笔记

    此处以一个Web API 项目为例, 针对不太大的项目,采用了一个划分为三层的结构。

    李郑
  • 网络研讨会:后疫之后,“通用远程办公安全之道”

    2020开年,不期而遇的“疫情”俨然打乱了全国乃至全球的日程表,在“疫情”被迫的催化下,远程办公成为当下不二选择并持续发酵,因为对于非制造业等诸多企业,只要有电...

    腾讯安全
  • 下午2点准时开播,听技术大咖讲透云原生最新实践

    ? 云+社区沙龙online「云原生」专场将于今天下午14:00~17:30准时举行,7位业界大V同台共享云原生领域的最新实践,与你一起探讨优秀程序员,如何更...

    腾小云
  • 国内首个云原生百科知识直播,精彩尽在每周二晚7点半!

    ? 云原生在近几年的发展越来越火热,作为云上最佳实践而生的设计理念,也有了越来越多的实践案例,而一个个云原生案例的背后,是无声的巨大变革。 腾讯云主办首个云原...

    腾讯云原生
  • 有奖调研|2021 中国云原生用户调研,邀您来答

    导语:为进一步了解我国云原生产业发展全貌,腾讯云联合中国信息通信研究所共同启动2021年《中国云原生用户调查报告》的征集活动,诚邀业界同仁参与本次调研。 01...

    腾讯云原生
  • ARTS第三周

    判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

    zx钟
  • 一份3万字的云原生路线图手册待你打开

    ? 在今天的腾讯2020 Techo Park开发者大会上,腾讯云正式发布“云原生最佳实践路线图”,同时发布的还有一份3万多字的《腾讯云原生路线图手册》。手册...

    腾讯云原生

扫码关注云+社区

领取腾讯云代金券