贪吃蛇是一款经典的小游戏,游戏比较简单,实现也比较简单。

本篇博客将详细介绍我自己写的贪吃蛇的思路以及实现方式。

首先我们需要在游戏界面将游戏区域划分成无数个小方格,类似下图

画布(游戏区域)的宽为 width 高为 height ,列数 sizex=width/pointSize ,行数 sizey=height/pointSize. 由于画布的长宽不一定是pointSize的整数倍,所以为了所有的数据居中需要设置 x轴 y轴的偏移量(当前貌似偏移量可有可无,本人强迫症一定要加上),offsetX=(width - sizex*pointSize)/ 2,offsetY=(height - sizey*pointSize) / 2.

新建数组 spoints=new int[ sizex ][ sizey ] 用于保存方格矩阵 其中 spoints[x][y]==1说明该点属于当前小蛇身体的一部分, spoints[x][y]==0则表示小蛇当前未运动到此点。

新建 ArrayList<Point> points=new ArrayList<Point>(); 用于保存小蛇的身体的所有节点(points 中的 所有point的x,y对应的是 spoints数组的所有值为1的点的下标),points.get(0) 为头部坐标点,最后一个为尾部坐标点

   

上面两幅图片代表的意思相同,都表示小蛇的当前状态(小蛇画的比较丑,请见谅)

下面开始考虑的小蛇的移动,小蛇的移动可以看成是将小蛇的尾巴的移动到小蛇的头部(根据方向判断移动的上下左右位置),其他的节点保持不动,见图示

得到下图运动后的状态

然后修改spoints数组对应的坐标的值,新增的头部对应的值修改为 1,移除的尾部的值修改为 0. 并将对应的坐标点加入points链表的对应位置,移除尾部的坐标点

解决了小蛇的移动问题,再来解决小蛇吃食物点的问题。

当小蛇吃到食物的时候,相当于将食物的点当成新的头部,而尾部不变,这样就相当于吃了之后变长了

这样就完成了小蛇的增长。

没有代码那就是耍流氓!!下面开始贴代码

git代码下载: 贪吃蛇          https://gitee.com/wuchang0213/TCS.git

csdn下载:https://download.csdn.net/download/weixin_41191134/10832869

再提供一个数独小游戏的下载:https://download.csdn.net/download/weixin_41191134/10832903

只贴了要的游戏界面的代码

public class TcsView extends View {private Paint paint;//小蛇的组成点private ArrayList<Point> points=new ArrayList<Point>();private Point pointFood=new Point();//食物点//游戏界面的 方格划分private int[][] spoints;//方格数组的大小private int sizex;private int sizey;//小蛇的头部对应在数组中的位置private int headerX;private int headerY;//食物的坐标点private int foodX;private int foodY;//偏移量private int offsetX=0;private int offsetY=0;//随机数private Random random=new Random();private boolean isStart=true;//屏幕宽高private int width;private int height;//小蛇方块的大小private int pointSize=20;//方向private int direction=0;// 0 上 -1 下  1 左 2 右//触摸点坐标private float tdx;private float tdy;private boolean isStop=false;private TcsScoreListener tcsScoreListener;private Handler handler=new Handler(new Handler.Callback() {@Overridepublic boolean handleMessage(Message message) {switch (message.what){case 1:headerNext();break;}return false;}});private void headerNext(){if(points.size()==0||isStop||foodX==-1) return;//小蛇的移动控制,可以看成是小蛇的首尾发生了移动,// 头部根据下一次移动的方向移动到下一格,然后去掉结尾switch (direction){case 0:headerY--;break;case -1:headerY++;break;case 1:headerX--;break;case 2:headerX++;break;}//判断是否到达边界if(headerX<0||headerY<0){isStop=true;}else {//判断小蛇是否吃到自己if(spoints[headerX][headerY]==1){isStop=true;}points.add(0,new Point(headerX,headerY));spoints[headerX][headerY]=1;if(tcsScoreListener!=null){tcsScoreListener.onTCSScore(points.size());}if(headerX==foodX && headerY==foodY){foodX=-1;foodY=-1;initPointFood();}else {Point move=points.get(points.size()-1);spoints[move.x][move.y]=0;points.remove(points.size() - 1);}if (!isStop){invalidate();}}}public TcsView(Context context, @Nullable AttributeSet attrs) {super(context, attrs);init();}private void init() {paint=new Paint();paint.setStrokeJoin(Paint.Join.ROUND);paint.setStrokeCap(Paint.Cap.ROUND);paint.setStrokeWidth(1);paint.setAntiAlias(true);//100为时间的发生间隔,即小蛇多久移动一次,此处修改可调节小蛇的速度new Timer().schedule(new TimerTask() {@Overridepublic void run() {handler.sendEmptyMessage(1);}},0,100);}public void setTcsScoreListener(TcsScoreListener tcsScoreListener) {this.tcsScoreListener = tcsScoreListener;}@SuppressLint("DrawAllocation")@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);width=getWidth();height=getHeight();if(isStart){//根据宽高以及 pointSize 将游戏区域划分成不同的矩形区块,sizex=width/pointSize;sizey=height/pointSize;spoints=new int[sizex][sizey];//计算偏移量offsetX=(width-(sizex*pointSize))/2;offsetY=(height-(sizey*pointSize))/2;//头部起始坐标默认在屏幕中央headerX=sizex/2;headerY=sizey/2;spoints[headerX][headerY]=1;points.add(0,new Point(headerX,headerY));initPointFood();isStart=false;}for(int i=0;i<points.size();i++){Point point=points.get(i);drawPoint(canvas,paint,point);}drawPoint(canvas,paint,pointFood);}@SuppressLint("ClickableViewAccessibility")@Overridepublic boolean onTouchEvent(MotionEvent event) {if(!isStop) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:tdx = event.getX();tdy = event.getY();break;case MotionEvent.ACTION_UP:float dx = Math.abs(tdx - event.getX());float dy = Math.abs(tdy - event.getY());if (dx > 40 || dy > 40) {//判断为滑动,不是点击Log.d("*****onTouchEvent****", "/**/*/*//**98*8/*9*/89*898565/*** ");} else {if (direction == 0 || direction == -1) {if (tdx > points.get(0).x) {direction = 2;} else {direction = 1;}} else if (direction == 1 || direction == 2) {if (tdy > points.get(0).y) {direction = -1;} else {direction = 0;}}handler.sendEmptyMessage(1);}break;}}return super.onTouchEvent(event);}//根据点的左边画出对应的点private void drawPoint(Canvas canvas,Paint paint,Point point){RectF rectF=new RectF(offsetX+point.x*pointSize,offsetY+point.y*pointSize,offsetX+(point.x+1)*pointSize,offsetY+(point.y+1)*pointSize);canvas.drawRect(rectF,paint);}/*** 确定食物点的位置*/private void initPointFood(){foodX=random.nextInt(sizex);//获取随机的坐标点foodY=random.nextInt(sizey);//判断当前坐标点是否在小蛇的轨迹上if(spoints[foodX][foodY]==1){initPointFood();}else {//标准化坐标位置pointFood.set(foodX,foodY);}}/*** 根据传入的参数 修改小蛇的运动方向* @param dire*/public void changeDirection(int dire) {switch (dire){case 0:// 小蛇上下运动时 可修改为左右运动case -1:if(direction==1||direction==2){direction=dire;}break;case 1://小蛇左右运动时 可修改方向为上下运动case 2:if(direction==0||direction==-1){direction=dire;}break;}}/*** 设置重新开始*/public void restart(){isStop=false;isStart=true;points.clear();invalidate();}
}

android 简单的贪吃蛇小游戏相关推荐

  1. Android Studio实现贪吃蛇小游戏

    项目目录 一.项目概述 二.开发环境 三.详细设计 四.运行演示 五.项目总结 六.源码获取 一.项目概述 贪吃蛇是一款经典的街机游戏,不仅在电子游戏史上占有一席之地,也在很多人的童年回忆中留下了深刻 ...

  2. STM32+LCD实现简单的贪吃蛇小游戏

    寒假放假回家,只能宅在家里,无聊之余,幸好带了一块开发板回来,以前做项目都是在网上找相似或者有关联的项目,把别人的代码拿过来,修改修改,拼拼凑凑出自己项目,既然无聊就自己动脑筋思考,自己动手写贪吃蛇的 ...

  3. Python 简单实现贪吃蛇小游戏

    文章目录 1. pygame库的简介2. pygame库的安装3. python代码实现贪吃蛇小游戏4. pyinstaller打包成exe 很多人学习python,不知道从何学起. 很多人学习pyt ...

  4. 基于面向对象 来写一个简单的贪吃蛇小游戏(代码可直接用)

    分析一下用到的对象(这个案例的地图过于简单,可以不用创建为对象)     食物对象(food)     蛇对象(snake)     游戏对象(game) 1.food对象     属性 :x, y, ...

  5. QT实现简单的贪吃蛇小游戏

    一.新建一个Qt项目 新建Qt Widgets Application,项目名称为HappySnake,基类选择QWidget,类名默认 二.添加要用到的头文件 #include <QKeyEv ...

  6. python简易贪吃蛇小游戏任务书含代码

    目  录 第一章 绪论 1.1 开发的背景 1.2 开发的目的 1.3 开发的意义 1.4 开发工具简介 第二章 需求分析 (1) 利用方向键来改变蛇的运行方向. (2) 在随机的地方产生食物. (3 ...

  7. python编程小游戏-10分钟用Python编写一个贪吃蛇小游戏,简单

    贪吃蛇,大家应该都玩过.小编当初第一次接触贪吃蛇的时候 ,还是能砸核桃的诺基亚上,当时玩的不亦乐乎.今天,我们用Python编程一个贪吃蛇游戏,下面我们先看看效果: 好了,先介绍一个思路 所有的游戏最 ...

  8. 基于C语言Ncurse库和链表的简单贪吃蛇小游戏

    参考:基于C语言Ncurse库和链表的简单贪吃蛇小游戏 作者:三速何时sub20 发布时间:2020-09-29 10:23:51 网址:https://blog.csdn.net/weixin_44 ...

  9. C# 制作贪吃蛇小游戏,最简单的实现

    C# 制作贪吃蛇小游戏 目录 画蛇 实现蛇的上下左右移动 随机生成目标物 开始游戏 计分 重新开始 增加难度 死亡判定 1.1 画蛇的一节 Class Element()Graphics g;publ ...

最新文章

  1. 内核调试相关变量说明
  2. wegame饥荒一直连接中_怪诞画风下的异世界生存,一款让你吃到撑的游戏——《饥荒》...
  3. hibernate4调用mysql存储过程_hibernate调用存储过程
  4. Linux内核Socket参数调优
  5. 在Android应用中使用Pull解析XML文件(传智播客视频笔记)
  6. 计算几何模板中的代码
  7. 具有Spring Boot和数据功能的Java头优先弹性搜索
  8. 图像 理想低通滤波_图像处理之滤波(下)
  9. 多重背包单调队列优化思路_多重背包问题
  10. Unity中设置Transform的forward/up/right旋转异常问题
  11. SpringCloud学习笔记022---SpringBoot中集成使用MongoDb进行增删改查
  12. 小红的记谱法(模拟+前缀和)
  13. 洛谷 P2341 [HAOI2006]受欢迎的牛 解题报告
  14. php 快递打印设置,京麦工作台打印机设置 快递单连打设置
  15. 安装JDK与配置java环境变量
  16. MTK-MT65-MT67系列对比
  17. Solaris下网卡绑定多个IP
  18. 好用免费的电脑摄像头录视频软件分享!
  19. linux相关的东东,来自dbanotes
  20. 百度推送网站url到搜索引擎方式 : 主动推送sitemap

热门文章

  1. 如何获取layui表格选中行的数据
  2. 现代控制原理专业词汇中英文对照
  3. uhs3内存卡有哪些_什么是UHS超高速SD卡?三代有什么区别
  4. Shift 键的一些技巧
  5. Android 点击图片全屏
  6. Web开发者的实用网址
  7. 一套asp.net开发的快递单打印系统源码
  8. PHP快手直播弹幕采集,获取斗鱼弹幕php版(原创)
  9. 李振杰:腾讯入股京东=京东引狼入室
  10. 移除未排序链表中的重复节点,保留最开始出现的节点