2019独角兽企业重金招聘Python工程师标准>>>

在上一个小项目中,我们遗留了一个小问题,就是我们的蛇可以反向运动,这是不被允许的,因此呢,我们先来修复这么一个小BUG。其实问题很简单,我们只要保证蛇在向上的时候不能向下就是了,自然,我们想到的最普遍的就是通过if语句来进行判断。没错,这样我们确实可以达到目的,但是我们的代码却很臃肿,不好。因此,我们有更优雅的解决方案,还是来看代码:

        /** 蛇前进的方向,向上 */public static final int DIR_UP = -1;/** 蛇前进的方向,向下 */public static final int DIR_DOWN = 1;/** 蛇前进的方向,向左 */public static final int DIR_LEFT = -2;/** 蛇前进的方向,想右 */public static final int DIR_RIGHT = 2;/*** 改变蛇的运动方向* @param direction    蛇的新的运动方向*/public void changeDirection(int direction){if(this.direction + direction != 0){this.direction = direction;}} 

我想各位聪明的看官已经很清楚了,我们做了什么,这里运用了一点技巧,我们把相反方向上的两个方向的值设置为一正一负,那么我们的问题就解决了,也很优雅。嗯嗯,好了,再次运行你的程序,就算你把键盘戳烂了都不会出现那种情况了,呵呵。

解决了一点小问题,我们继续我们的贪吃蛇。我们的蛇到目前为止已经基本上OK了,接下来我们将要开始对蛇的食物进行编码,我们有吃的啦!!当然,我们新建一个叫Food的类,放在com.gulang.snake.entity包下面。下面就是我们编写的Food类,请看代码:

package com.gulang.snake.entity;import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;import com.gulang.snake.view.GameView;/*** 食物对象* @author jiladeyouxiang@qq.com**/
public class Food {/** 食物的大小,我们这里是和蛇的一个身体节点一样大 */public static final int FOOD_SIZE = Snake.BODY_SIZE;/** 食物的位置,横坐标 */private int x;/** 食物的位置,纵坐标 */private int y;/*** 构造一个食物对象,并且设置食物出现的位置在游戏的窗口上的任何一个有效的地方* 1.不能出现在窗口外;* 2.不能出现在有蛇的位置;* 3.不能出现在有石块的地方* * @param    游戏中的蛇的对象*/public Food(Snake snake){//我们先将我们的游戏窗口网格化,并计算出每一行有多少个单元格,每一列有多少个单元格int cellsInRow = GameView.WINDOW_WIDTH / Snake.BODY_SIZE;int cellsInCol = GameView.WINDOW_HEIGHT / Snake.BODY_SIZE;//我们用随机数类来产生我们的食物的横坐标和纵坐标,并且保证食物的坐标不产生在蛇的身体上Random r = new Random();do{createXY(r, cellsInRow, cellsInCol);} while (isInSnakeBody(snake));}/*** 生成新的食物的坐标* @param r                随机数对象* @param cellsInRow   一行中的单元格个数* @param cellsInCol   一列中的单元格个数*/private void createXY(Random r, int cellsInRow, int cellsInCol){x = r.nextInt(cellsInRow) * Snake.BODY_SIZE;y = r.nextInt(cellsInCol) * Snake.BODY_SIZE;}/*** 判断当前食物的位置是否在蛇的身体上* @param snake 蛇* @return     如果当前的食物在蛇的身体上则返回true,否则返回false*/public boolean isInSnakeBody(Snake snake){for(Snake.Body body : snake.getSnakeBody()){if(this.x == body.getX() && this.y == body.getY()){return true;}}return false;}/*** 将食物绘制出来* @param g*/public void drawMe(Graphics g){//获得画笔原来的颜色Color c = g.getColor();//将画笔的颜色设置为绿色g.setColor(Color.GREEN);//绘制一个3D的绿色方块作为食物g.fill3DRect(x, y, FOOD_SIZE, FOOD_SIZE, true);//将画笔的颜色还原回去g.setColor(c);}}

我们现在已经有了Snake类的经验,因此我想大家对于该类的理解应该不存在什么有困难的地方。当然,有几点关于游戏的细节还是需要注意的,比如我们Food的构造方法,我们食物的产生地必须满足几个条件,这些我都写在注释上了,大家应该也看到了。接着呢,为了看到效果,我们只需要在GameView中添加关于Food类的代码就可以了,我想能够看到这里的你也应该没有什么问题了,当然,惯例孤狼还是贴一下代码,请看:

        /*** 绘制界面的方法*/@Overridepublic void paint(Graphics g) {//将窗口清空g.clearRect(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);//绘制蛇的对象snake.drawMe(g);//绘制食物food.drawMe(g);}

到这里呢,还有一点小问题,是我们之前在写Snake类时留下来的,大家回想一下我们在写Snake类时设置的蛇的边长是30,但是我们的游戏的窗口的边长是800,这在我们将窗口网格化的时候就会出现问题,导致我们蛇的位置和食物的位置对不齐,因此呢我们首先将蛇的身体的大小改为20,然后再将蛇的初始化位置修正。我们原来是让蛇在窗口的正中央,但是网格化以后我们需要的其实是在最中间的那一个,因此我们修改蛇的构造方法,看代码:

        /*** 初始化一条蛇*/public Snake(){//初始化蛇最开始前进的方向为向右direction = DIR_RIGHT;//我们将蛇的第一节身体初始化在游戏窗口的中央int cellsInRow = GameView.WINDOW_WIDTH / BODY_SIZE;int cellsInCol = GameView.WINDOW_HEIGHT / BODY_SIZE;int startX = cellsInRow / 2 * BODY_SIZE;int startY = cellsInCol / 2 * BODY_SIZE;//初始化蛇的身体,即向body链表中添加数据,我们初始化蛇的初始节点为3个for(int i = 0; i < 3; i++){//逐个的计算出蛇的每一个节点的位置Body body = new Body(startX - i * BODY_SIZE, startY);snakeBody.add(body);}}

那么到这里呢,我们的这个小项目就做完了,运行一下看看吧,是不是感觉已经有一点贪吃蛇游戏的雏形了,还是小有成就感的吧,呵呵。我们现在可以控制我们的蛇去吃食物了,但是遗憾的是蛇现在经过食物的时候还不能吃掉食物,这个我们将在下一次的项目中来完成这个功能。那今天就到这里吧,晚安啦,各位,希望天亮以后我还有机会完成后面的博文,呵呵,芥末日快乐啦。

我把代码都放在迅雷快传上了,大家奔走相告吧,这里给出链接,一篇博文对应一个项目文件,大家直接导入工程就可以运行: 
http://kuai.xunlei.com/d/nNdkCSP3vUXTUAQAa50

转载于:https://my.oschina.net/u/554627/blog/97383

贪吃蛇系列之七——有吃的啦相关推荐

  1. Python游戏开发,Python实现贪吃蛇小游戏与吃豆豆 附带源码

    开发工具 Python版本: 3.6.4 相关模块: pygame模块: 以及一些Python自带的模块. 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 原理简介 贪吃蛇 ...

  2. 贪吃蛇系列之一——引入

    2019独角兽企业重金招聘Python工程师标准>>> 终于下定决心开始写自己的博客,谈不上什么经验之谈,我自己也不是什么大牛,我也是一个学习者,还在计算机这一行中不断的吸取新的知识 ...

  3. 语言写贪吃蛇墙角符号_从零基础到拥抱人工智能,您的孩子可能就差一个贪吃蛇游戏...

    去年寒假档,有一部孩子们喜欢的电影上映. 不知道家长们有没有陪孩子一起看过这部<无敌破坏王2:大闹互联网> 在电影中有一个印象深刻的镜头, 吃豆人.泡泡龙.还有贪吃蛇 他们都因为很久没有客 ...

  4. python贪吃蛇控制台_如何用Python写一个贪吃蛇AI

    前言 这两天在网上看到一张让人涨姿势的图片,图片中展示的是贪吃蛇游戏, 估计大部分人都玩过.但如果仅仅是贪吃蛇游戏,那么它就没有什么让人涨姿势的地方了. 问题的关键在于,图片中的贪吃蛇真的很贪吃XD, ...

  5. python贪吃蛇_如何用Python写一个贪吃蛇?

    阅读文本大概需要 5 分钟 作者:Hawstein http://hawstein.com/2013/04/15/snake-ai/ 前言 这两天在网上看到一张让人涨姿势的图片,图片中展示的是贪吃蛇游 ...

  6. 贪吃蛇游戏(c/c++)

    根据以前玩的贪吃蛇游戏,它的核心在于实现动态的蛇:首先为了将蛇动态的描述出来,通过不断的输出,清屏,修改,再输出这样的循环来实现动画的效果,动画本身就是由一张张图片表现出来的. 下一步需要一个类,它能 ...

  7. java超级简单贪吃蛇_java实现简易贪吃蛇游戏

    本文实例为大家分享了java实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下 1.封装贪吃蛇身体,抽象出贪吃蛇结点类Node,结点用ArrayList存储 import java.awt.*; pu ...

  8. 记事本贪吃蛇游戏代码_如何用Python10分钟绘制贪吃蛇小游戏?

    贪吃蛇是一款经典的益智游戏,有PC和手机等多种版本,既简单又耐玩.玩家通过上下左右键控制蛇的方向,寻找食物,每吃到一次食物,就能得到一定的积分,而且蛇的身体会越来越长.随着蛇的身体变长,游戏的难度就会 ...

  9. matlab cat函数_如何用Matlab编写贪吃蛇游戏?(持续更新)

    今后我们实验室的研究重点将会聚焦在"基于游戏的测评"和"教育游戏化"这两个主题上,因此很有必要研究实现"爆款"游戏的一些基本的技术方法.这篇 ...

最新文章

  1. 【复盘】端端,棒棒哒!
  2. 使用字节缓冲流在文件中写内容
  3. 【ModelArts-Lab AI实战营】使用Postman测试Modelarts在线服务(图像分类、物体检测)
  4. 大数据学习笔记14:MR案例——招聘数据分析
  5. ncurses其他特性:curs_set(),离开curses模式,ACS_扩展字符集,扩展库
  6. 华为会议电脑版_大家在用什么会议产品呢? 对企业的视频会议是如何规划的?...
  7. 活着只是你幸运--512汶川大地震募捐倡议
  8. react-hooks/exhaustive-deps警告
  9. android 距离感应器控制屏幕熄灭_华为nova3e、小米6X、OPPOA7x对比,选IPS屏幕还是TFT屏幕,自选...
  10. 【SpringBoot整合Dubbo和Zookeeper】
  11. docker(5、网络2) 1、容器间通信的三种方式 2、 容器如何访问外部 3、 外部如何访问容器
  12. python对文件重命名快捷键_Pycharm快捷键配置详细整理
  13. 网络营销推广怎么做 微信如何吸引粉丝
  14. Unity2D学习笔记Day6:无限跳跃bug和卡墙bug处理(补8.13)
  15. 定义一个html文档的范围用什么标签,定义一个HTML文档的范围用()标签 A.ol B.ul C.pre D.html...
  16. oracle pns配置,Oracle
  17. 神经网络学习(三)比较详细 卷积神经网络原理、手写字体识别(卷积网络实现)
  18. 【Oracle】—— 依次按多列排序
  19. 一般正态分布如何转化为标准正态分布?
  20. 各国黑客暗中较量网络战场 美国网络部队成型

热门文章

  1. 性能测试的基本流程【最新】
  2. 性能测试(一)性能测试是什么?有哪些分类?
  3. 输出指定个数所有枚举_【一天一大 lee】区间和的个数 (难度:困难) Day20201107
  4. c语言程序填空z=7,x=4,《C语言程序设计》复习题有答案
  5. android volley post 参数,带有标题和正文的Android Volley POST请求
  6. matlab ifft频率分辨率,[FFT] matlab中关于FFT的使用(理解频率分辨率、补零问题)
  7. 真实教育场景手写/表格/公式OCR数据集
  8. 中药说明书实体识别抽取top1
  9. 中科研研究生:从算法工程师转行产品经理之后
  10. 基于python+opencv的图像目标区域自动提取