上一篇《 是男人就下100层【第四层】——Crazy贪吃蛇(2)》实现了贪吃蛇绕着屏幕四周移动,这一篇我们来完成贪吃蛇的所有功能。

一、随机产生苹果

    private void addAppleBox(){int randomX = random.nextInt(xMaxBoxCount);int randomY = random.nextInt(yMaxBoxCount);for(int i=0; i<boxs.size(); i++){if(boxs.get(i).getX() == randomX){addAppleBox();break;}if(boxs.get(i).getY() == randomY){addAppleBox();break;}appleBox = new Box(randomX, randomY);} }

二、判断边界值

        //判断是否撞墙了if(headBox.getX() < 0 || headBox.getY() < 0 || headBox.getX() > xMaxBoxCount || headBox.getY() > yMaxBoxCount){currentState = State.LOSE;}//判断是否装到自己身上了for(int i=0; i<boxs.size(); i++){if(boxs.get(i).getX() == headBox.getX() && boxs.get(i).getY() == headBox.getY()){currentState = State.LOSE;}}isGroup = false;//判断是否吃到苹果了~~for(int i=0; i<boxs.size(); i++){if(boxs.get(i).getX() == appleBox.getX() && boxs.get(i).getY() == appleBox.getY()){isGroup = true;addAppleBox();}}

三、全部代码

package com.example.crazysnake;  import java.util.ArrayList;
import java.util.List;
import java.util.Random;import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
/*** CSDN博客:http://blog.csdn.net/dawanganban* @author 阳光小强*/
public class MySnake extends View {  private Paint paint; private Paint textPaint;private RectF rect;  private static int boxSize = 20;  private static int xMaxBoxCount;  //x轴方向最多的box数量private static int yMaxBoxCount;  //y轴方向最多的box数量private List<Box> boxs = new ArrayList<Box>(); private Box appleBox;private Random random;private boolean isGroup = false;private static final int[] colors = {  Color.RED,  Color.BLUE,   Color.GRAY,  Color.YELLOW  };  private enum Derectory{  LEFT,  RIGHT,  TOP,  BOTTOM;  }  private enum State{READY,    //就绪PAUSE,    //暂停RUNNING,  //运行LOSE      //失败}private Derectory currentDerect = Derectory.LEFT;  private State currentState = State.READY;private RefreshHandler mRefreshHandler = new RefreshHandler();class RefreshHandler extends Handler{@Overridepublic void handleMessage(Message msg) {MySnake.this.update();MySnake.this.invalidate();}public void sleep(long delayMillis) {this.removeMessages(0);sendMessageDelayed(obtainMessage(0), delayMillis);}}public MySnake(Context context, AttributeSet attrs) {  super(context, attrs);  paint = new Paint(); textPaint = new Paint();textPaint.setColor(Color.RED);textPaint.setTextSize(60);rect = new RectF(); random = new Random();  }  private void update(){if(currentState == State.RUNNING){move();mRefreshHandler.sleep(150);}}private void initData(){  Box box;  for(int i=xMaxBoxCount - 5; i<xMaxBoxCount; i++){  box = new Box(i, 3);  boxs.add(box);  }  }  @Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);xMaxBoxCount = (int) Math.floor(w / boxSize);yMaxBoxCount = (int) Math.floor(h / boxSize);}private float mDownX;  private float mDownY;  @Override  public boolean onTouchEvent(MotionEvent event) {System.out.println("onTouch");  switch (event.getAction()) {  case MotionEvent.ACTION_DOWN:  mDownX = event.getX();  mDownY = event.getY();  break;  case MotionEvent.ACTION_UP:  float disX = event.getX() - mDownX;  float disY = event.getY() - mDownY;  System.out.println("disX = " + disX);  System.out.println("dixY = " + disY);  if(Math.abs(disX) > Math.abs(disY)){  if(disX > 0){  if(currentDerect != Derectory.LEFT){currentDerect = Derectory.RIGHT;  }}else{  if(currentState != State.RUNNING){currentState = State.RUNNING;currentDerect = Derectory.LEFT;boxs.clear();initData();addAppleBox();update();}else if(currentDerect != Derectory.RIGHT){        currentDerect = Derectory.LEFT;  }}  }else{  if(disY > 0){  if(currentDerect != Derectory.TOP){currentDerect = Derectory.BOTTOM;  }}else{ if(currentDerect != Derectory.BOTTOM){currentDerect = Derectory.TOP;  }}  }  break;  }  return true;  }  private void move(){  Box headBox = new Box(0, 0);  switch (currentDerect) {case LEFT:  headBox = new Box(boxs.get(0).getX() - 1, boxs.get(0).getY());break;  case RIGHT:  headBox = new Box(boxs.get(0).getX() + 1, boxs.get(0).getY());  break;  case TOP:  headBox = new Box(boxs.get(0).getX(), boxs.get(0).getY() - 1); break;  case BOTTOM:  headBox = new Box(boxs.get(0).getX(), boxs.get(0).getY() + 1);break;  } //判断是否撞墙了if(headBox.getX() < 0 || headBox.getY() < 0 || headBox.getX() > xMaxBoxCount || headBox.getY() > yMaxBoxCount){currentState = State.LOSE;}//判断是否装到自己身上了for(int i=0; i<boxs.size(); i++){if(boxs.get(i).getX() == headBox.getX() && boxs.get(i).getY() == headBox.getY()){currentState = State.LOSE;}}isGroup = false;//判断是否吃到苹果了~~for(int i=0; i<boxs.size(); i++){if(boxs.get(i).getX() == appleBox.getX() && boxs.get(i).getY() == appleBox.getY()){isGroup = true;addAppleBox();}}boxs.add(0, headBox);if(!isGroup){boxs.remove(boxs.size() - 1);}}  private void addAppleBox(){int randomX = random.nextInt(xMaxBoxCount);int randomY = random.nextInt(yMaxBoxCount);for(int i=0; i<boxs.size(); i++){if(boxs.get(i).getX() == randomX){addAppleBox();break;}if(boxs.get(i).getY() == randomY){addAppleBox();break;}appleBox = new Box(randomX, randomY);}   }@Override  protected void onDraw(Canvas canvas) {  super.onDraw(canvas);  for(int i=0; i<boxs.size(); i++){  paint.setColor(colors[i % colors.length]);  rect.set(boxs.get(i).getX() * boxSize, boxs.get(i).getY() * boxSize, (boxs.get(i).getX() + 1) * boxSize, (boxs.get(i).getY() + 1) * boxSize);  canvas.drawRect(rect, paint);  } if(appleBox != null){paint.setColor(Color.RED);rect.set(appleBox.getX() * boxSize, appleBox.getY() * boxSize, (appleBox.getX() + 1) * boxSize, (appleBox.getY() + 1) * boxSize);canvas.drawRect(rect, paint);}if(currentState == State.READY){canvas.drawText("请向左滑动", (xMaxBoxCount * boxSize - textPaint.measureText("请向左滑动")) / 2,xMaxBoxCount * boxSize / 2, textPaint);}if(currentState == State.LOSE){canvas.drawText("失败!左滑继续", (xMaxBoxCount * boxSize - textPaint.measureText("失败!左滑继续")) / 2,(float)xMaxBoxCount * boxSize / 2, textPaint);canvas.drawText("长度:" + boxs.size() , (xMaxBoxCount * boxSize - textPaint.measureText("长度:" + boxs.size())) / 2,(float)xMaxBoxCount * boxSize / 4 * 3, textPaint);}}
}

CODE代码地址:https://code.csdn.net/lxq_xsyu/crazysnake

是男人就下100层【第四层】——Crazy贪吃蛇(3)相关推荐

  1. 是男人就下100层【第四层】——Crazy贪吃蛇(2)

    在上一篇<是男人就下100层[第四层]--Crazy贪吃蛇(1)>中我们让贪吃蛇移动了起来,接下来我们来实现让贪吃蛇能够绕着手机屏幕边线移动而且能够改变方向 一.加入状态并改动代码 首先我 ...

  2. 是男人就下100层【第五层】——2048游戏从源代码到公布市场

    上一篇<是男人就下100层[第五层]--换肤版2048游戏>中阳光小强对2048游戏用自己的方式进行了实现,并分享了核心源码,这一篇阳光小强打算将该项目的全部源码公开并结合这个实例在这篇文 ...

  3. 是男人就下100层【第一层】——高仿微信界面(4)

    上一篇<是男人就下100层[第一层]--高仿微信界面(3)>中我们完成了登录,这一篇看完成登录后的一个短暂加载和引导界面. 加载界面: <RelativeLayout xmlns:a ...

  4. 《是男人就下100层》真的有隐藏剧情!B站up主数月破解,原作者点赞致谢

    边策 杨净 发自 凹非寺 量子位 报道 | 公众号 QbitAI <是男人就下100层>,曾经风靡一代的flash小游戏.炙手可热的休闲游戏之最. 它让多少人没日没夜地想去尝试" ...

  5. Unity经典游戏教程之:是男人就下100层

    版权声明: 本文原创发布于博客园"优梦创客"的博客空间(网址:http://www.cnblogs.com/raymondking123/)以及微信公众号"优梦创客&qu ...

  6. 是男人就下100层【第五层】——2048游戏从源码到发布市场

    上一篇<是男人就下100层[第五层]--换肤版2048游戏>中阳光小强对2048游戏用自己的方式进行了实现,并分享了核心源码,这一篇阳光小强打算将该项目的所有源代码公开并结合这个实例在这篇 ...

  7. cocos2d-x 是男人就下100层 附源码

    1.效果图: 玩法: 一个不断下降的小人,点击屏幕的left或者right控制小人的移动方向,尽可能生存久些.为什么要搞这个游戏呢?因为在2012年的8月份,我完成它的android版本,见<自 ...

  8. OpenGL2D小游戏——是男人就下100层

    2019独角兽企业重金招聘Python工程师标准>>> 是男人就下100层想必大家一定都玩过,在这里给大家简单介绍一下游戏规则. 游戏规则: 游戏人物从屏幕上方按一定速率下落,同时台 ...

  9. 是男人就下100层【第一层】——高仿微信界面(8)

    上一篇<是男人就下100层[第一层]--高仿微信界面(7)>中我们实现了下弹式菜单,这一篇我们来看看如何实现微信中的摇一摇功能. 首先我们来布局我们的摇一摇界面 布局文件如下: <? ...

最新文章

  1. JavaScript-原生Array对象方法详解(一)
  2. MATLAB实战系列(八)-头脑风暴优化(BSO)算法求解旅行商问题(TSP)(附MATLAB代码)
  3. Object/Relation Mapping 对象关系映射
  4. DFS深搜与BFS广搜专题
  5. iostat -x命令诊断
  6. docker 安装 mysql 并映射数据库存放路径及配置文件
  7. [机器学习-实战篇]Imdb数据集情感分析之贝叶斯
  8. 基于redis购物车java代码_基于redis实现购物车基本功能
  9. 基于ffmpeg的kxmovie的使用
  10. sketch软件_产品经理基础知识构成之图像处理工具sketch(1)
  11. oracle静默安装集群,Oracle RAC 静默安装实践
  12. 2015 Autumn Training #0
  13. EV SSL证书和其证书品牌
  14. Google I/O 2021: 在重要时刻提供帮助
  15. 天善智能网络爬虫学习~
  16. 【C++】图书管理系统(完整版)
  17. 华为手机充满有提醒吗_手机充满电铃声提醒软件下载-华为手机充满电铃声提醒软件app下载 v1.0-友情手机站...
  18. first-child、last-child、nth-child( )失效问题
  19. tinymce vue 部分工具不显示_TinyMCE:按需显示和隐藏内联工具栏
  20. vue日程安排_vue日历/日程提醒/html5本地缓存

热门文章

  1. linux 之虚拟环境
  2. DT720-CS改桥接
  3. 内网横向渗透神器-CS
  4. 泰坦尼克号生存者数据的预测
  5. 要在HTML页面显示如下数字图案,上机实验 7
  6. 数据库专题训练实验-------存储过程
  7. ajax实例里面的函数,AJAX实例:用callback函数的AJAX实例
  8. 推荐系统之---UGC标签推荐方式
  9. win系统修改右键新建菜单
  10. JavaScript基础语法及小案例