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)

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏趣学算法

数据结构 第10讲 好玩贪吃蛇——数字矩阵

11130
来自专栏ACM算法日常

唯快不破的01序列——位运算初识

众所周知,计算机的运算使用的就是二进制,它会把十进制的数转化为二进制,然后进行二进制运算,最后再转回十进制展现给我们。而位运算指的是:由于数字在计算机里...

14930
来自专栏C语言C++游戏编程

「C语言」编程学习—控制语句goto语句解析!

C语言共有9种控制语句:if/else,for,while,do-while,switch/case,break,continue,return,goto。

14930
来自专栏程序员与猫

使用抽象类和接口的优解

1. 前言 笔者相信,每个使用面向对象语言的开发者自编码以来,肯定便琢磨过抽象类(Abstract)和接口(Interface)的区别。可能一些人已经找到了适...

23650
来自专栏韩伟的专栏

你真的理解数码技术吗?(二)

1.2 文字是如何用数字来记录的 在人类创造的各种信息当中,文字信息一直被我们认为是知识和智慧的重要载体,古代无数僧侣和学者,终身都献身于书籍文字的保存和传达...

35680
来自专栏C语言及其他语言

[每日一题]台球碰撞

今天这题可大有来头了,湖南省第六届大学生计算机程序设计竞赛题目,比较经典也比较有名 题目描述 在平面直角坐标系下,台球桌是一个左下角在(0,0),右上...

37460
来自专栏数说工作室

统计师的Python日记【第八天:数据清洗(2)文本处理】

本文是【统计师的Python日记】第8天的日记 回顾一下: 第1天学习了Python的基本页面、操作,以及几种主要的容器类型。 第2天学习了python的函数、...

73660
来自专栏大神带我来搬砖

锱铢必较:程序员生存指南——正则表达式中使用断言

18430
来自专栏区块链中本聪

什么是区块链技术?

区块链是一种分类帐,它使用加密技术和激励措施并以防篡改的方式记录交易。这使匿名双方进行信任最小化(trust-minimized)交易,而不需要可信中介。

20820
来自专栏程序员与猫

使用抽象类和接口的优解

9910

扫码关注云+社区

领取腾讯云代金券