Android-贪吃蛇小游戏-分析与实现-Kotlin语言描述

Overview

本章的主要的内容是贪吃蛇小游戏的分析和实现,关于实现的具体代码可以在,文章底部的github的链接中找到。

整个游戏通过通过在,View不断的绘制实现的。

先看看效果图

分析有哪些游戏对象

毫无疑问,不管Kotlin还是Java都是面向对象编程语言,那么我们要实现贪吃蛇游戏的第一步就是要分析游戏中有哪些对象,已有将对象都分析完全了,我们再能进行开发,从示意图中我们可以发现最少有两个对象。

  • 食物,贪吃蛇吃到食物后会增长
  • 贪吃蛇, 可以明显的看出来贪吃蛇是由一个个小方块组成的,那么其中每一个方块就是一个对象,将所有的方块对象放入一个集合中,这个集合就组成了贪吃蛇。集合的第一个元素就是 蛇头为了以示区别,将蛇头使用了不同的颜色跟身体区分出来。
  • 提取父类,不管是组成贪吃蛇的块还是食物对象,本质上都是游戏对象,那么我们可以将这两个对象提取取来一个公共的父类,在父类中定义通用的属性和方法。

Well,不管是贪吃和还是食物,都是需要绘制出来的,那么一提到绘制那么就不得不提到坐标了,坐标的计算是相当繁琐且容易出错的,那么我们得想办法将坐标给抽象一下。从游戏的示例图我们我们可以发现,所有的游戏对象都是可以通过一个行的索引,和一个类的索引来确定的二维的平面结构,那么我们就可以将本来的坐标抽象成行列结构。到这里公共父类的成员那就基本上就可以确定了,同时我们的类的结构也可以确定了。抽取出来的类的结构如下。

  1. /**
  2. * 贪吃蛇游戏中所有游戏的父类,所有的游戏对象都将会从此类继承
  3. * */
  4. open class GameObject(var row: Int, var column: Int) {
  5. /**
  6. * 绘制游戏对象
  7. * @param canvas 画布对象
  8. * @param paint 画笔对象
  9. * */
  10. open fun draw(canvas: Canvas, x: Float, y: Float, paint: Paint) {
  11. canvas.drawRect(x, y, x + SnakeGameConfiguration.GRID_WIDTH, y + SnakeGameConfiguration.GRID_HEIGHT, paint)
  12. }
  13. }
  14. /**
  15. * 贪吃蛇吃的食物
  16. * */
  17. class Food(row: Int, column: Int) : GameObject(row, column) {
  18. override fun draw(canvas: Canvas, x: Float, y: Float, paint: Paint) {
  19. val gw = SnakeGameConfiguration.GRID_WIDTH
  20. val gh = SnakeGameConfiguration.GRID_HEIGHT
  21. canvas.drawCircle(x + (gw / 2), y + (gh / 2), gw / 2, paint)
  22. }
  23. }
  24. /**
  25. * 因为蛇的组成是块状的,此对象就是组成蛇的块
  26. * */
  27. class SnakeBlock(row: Int, column: Int, val isHead: Boolean) : GameObject(row, column) {
  28. }

抽取游戏的配置参数

在贪吃蛇的游戏中,地图的长度是固定的(也就是 的数量是固定的),每一个游戏对象的宽度和高度是根据View的大小和行和列的数量来计算的。这些值我们都可以存储为全局的变量,方便以后修改和调用。

  1. object SnakeGameConfiguration {
  2. var GRID_WIDTH = 0F
  3. var GRID_HEIGHT = 0F
  4. val GAME_COLUMN_COUNT = 20
  5. val GAME_ROW_COUNT = 20
  6. }

贪吃蛇是如何移动的

这个逻辑在贪吃和游中算是个难点,因为贪吃蛇是可以多次拐弯的,移动蛇头的实现思路如下。

  1. 首先从蛇的尾部开始,向前一个组成蛇的块的对象的位置移动
  2. 然后倒数第二个想倒数第三个的位置移动,依次类图
  3. 到蛇头的位置以后,那么根据移动的方向移动蛇头

当移动了贪吃蛇的位置以后就可以进行碰撞检测了

碰撞检测

对于有序对象的碰撞检测分为三种情况, 至于如何碰撞检测只需要检测行和列是否超出游戏地图范围,或者是否是与其他的游戏对象重合即可。

  1. 贪吃蛇超出地图的边界-可以看做为撞墙
  2. 贪吃和吃到自己
  3. 贪吃蛇迟到食物,需要将贪吃蛇的长度+1,即在蛇的尾部在增加一个组成蛇的块

对于上面的三种情况我们可以提取出来两个回调函数

  1. interface OnCrashListener {
  2. fun onCrash()
  3. }
  4. /**
  5. * 贪吃蛇吃到食物的回调
  6. * */
  7. interface OnEatenFoodListener {
  8. fun onEaten()
  9. }

源码下载

剩下一些比较简单的地方,也就没再文章中讲解,大家可以到我的Github上下载全部的源码。

贪吃蛇小游戏源码下载

Android-贪吃蛇小游戏-分析与实现-Kotlin语言描述的更多相关文章

  1. 贪吃蛇小游戏-----C语言实现

    1.分析 众所周知,贪吃蛇游戏是一款经典的益智游戏,有PC和手机等多平台版本,既简单又耐玩.该游戏通过控制蛇头方向吃食物,从而使得蛇变得越来越长,蛇不能撞墙,也不能装到自己,否则游戏结束.玩过贪吃蛇的 ...

  2. C++ 简单的控制台贪吃蛇小游戏

    由于比较懒,所以不怎么写,觉得这样不应该.我应该对自己学的做出整理,不管是高端低端,写出来是自己的. // 贪吃蛇.cpp : 定义控制台应用程序的入口点. // #include "std ...

  3. JS高级---案例:贪吃蛇小游戏

    案例:贪吃蛇小游戏 可以玩的小游戏,略复杂,过了2遍,先pass吧 先创建构造函数,再给原型添加方法.分别创建食物,小蛇和游戏对象. 食物,小蛇的横纵坐标,设置最大最小值,运动起来的函数,按上下左右键 ...

  4. Java GUI学习,贪吃蛇小游戏

    JAVA GUI练习 贪吃蛇小游戏 前几天虽然生病了,但还是跟着狂神学习了GUI的方面,跟着练习了贪吃蛇的小项目,这里有狂神写的源码点我下载,还有我跟着敲的点我下载,嘿嘿,也就注释了下重要的地方,这方 ...

  5. 用GUI实现java版贪吃蛇小游戏

    项目结构 新建一个JFrame窗口,作为程序入口 public class GameStart{ public static void main(String[] args) { JFrame jFr ...

  6. Java 用java GUI写一个贪吃蛇小游戏

    目录 主要用到 swing 包下的一些类 上代码 游戏启动类 游戏数据类 游戏面板类 代码地址 主要用到 swing 包下的一些类 JFrame 窗口类 JPanel 面板类 KeyListener ...

  7. html5面向对象做一个贪吃蛇小游戏

    canvas加面向对象方式的贪吃蛇 2016-08-25 这个小游戏可以增加对面向对象的理解,可以加强js逻辑能力,总之认真自己敲一两遍收获还是不少啊!!适合刚学canvas的同学练习!! 废话不多说 ...

  8. 用python+pygame写贪吃蛇小游戏

    因为python语法简单好上手,前两天在想能不能用python写个小游戏出来,就上网搜了一下发现了pygame这个写2D游戏的库.了解了两天再参考了一些资料就开始写贪吃蛇这个小游戏. 毕竟最开始的练手 ...

  9. Java贪吃蛇小游戏

    贪吃蛇 思路 首先构思游戏布局,计算合理的坐标系. 绘制静态数据(广告.初始小蛇.提示信息.棋盘) 添加键盘监听事件,改变游戏状态以及小蛇运动方向 添加定时器,让小蛇在一段时间内移动一定的距离 随机产 ...

随机推荐

  1. OOP的函数方法

    <?php class Computer{ //我要创建一个构造方法 public function __construct(){ echo '我是比较先进的构造方法!'; //构造方法一般用于 ...

  2. Python基础【day01】:PyChram使用技巧总结(六)

    本节内容 1.添加或者修改文件模板 2. python版本管理切换 3.已有文件重命名4.Python模块安装5.在PyChram中直接浏览文件目录6. 断点调试7.常用快捷键8.PyChram设置字 ...

  3. docker 原理

    docker项目的目标是实现轻量级的操作系统虚拟化,Docker的基础是Linux容器(LXC)等技术. 在LXC的基础上,Docker做了进一步的封装,让用户不关心容器的管理,使得操作更为简单.用户 ...

  4. Solr记录-solr介绍及配置

    Solr是一个开源搜索平台,用于构建搜索应用程序. 它建立在Lucene(全文搜索引擎)之上. Solr是企业级的,快速的和高度可扩展的. 使用Solr构建的应用程序非常复杂,可提供高性能. 为了在C ...

  5. 【DS】排序算法之快速排序(Quick Sort)

    一.算法思想 快速排序,顾名思义,效率比较于其他算法,效率比较高.<算法导论>也专门对其进行讲解.其算法设计使用分治思想,如下: 1)从数组A[p...r]中选择一个元素,将数组划分成两个 ...

  6. Dubbo学习笔记11:使用Dubbo中需要注意的一些事情

    指定方法异步调用 前面我们讲解了通过设置ReferenceConfig的setAsync()方法来让整个接口里的所有方法变为异步调用,那么如何指定某些方法为异步调用呢?下面讲解下如何正确地设置默写方法 ...

  7. 何凯文每日一句打卡||DAY14

  8. Sublime Text 之运行 js 方法[2015-5-6更新mac下执行js]

    昨天说完<Sublime Text 2 绿化与汉化 [Windows篇]>,今天我们来说说怎么用st直接运行 js 吧.群里的小伙伴一直对我的 ST 能直接运行js感到非常好奇,今天我就公 ...

  9. html5 canvas贝塞尔曲线篇(下)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. 关于SQL注入,你应该知道的那些事

    戴上你的黑帽,现在我们来学习一些关于SQL注入真正有趣的东西.请记住,你们都好好地用这些将要看到的东西,好吗? SQL注入攻击因如下几点而是一种特别有趣的冒险: 1.因为能自动规范输入的框架出现,写出 ...