是男人就下100层【第四层】——Crazy贪吃蛇(3)
上一篇《是男人就下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{
@Override
public 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);
}
} @Override
protected 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)的更多相关文章
- 是男人就下100层【第四层】——Crazy贪吃蛇(2)
在上一篇<是男人就下100层[第四层]--Crazy贪吃蛇(1)>中我们让贪吃蛇移动了起来,接下来我们来实现让贪吃蛇能够绕着手机屏幕边线移动而且能够改变方向 一.加入状态并改动代码 首先我 ...
- 超多经典 canvas 实例,动态离子背景、移动炫彩小球、贪吃蛇、坦克大战、是男人就下100层、心形文字等等等
超多经典 canvas 实例 普及:<canvas> 元素用于在网页上绘制图形.这是一个图形容器,您可以控制其每一像素,必须使用脚本来绘制图形. 注意:IE 8 以及更早的版本不支持 &l ...
- Unity经典游戏教程之:是男人就下100层
版权声明: 本文原创发布于博客园"优梦创客"的博客空间(网址:http://www.cnblogs.com/raymondking123/)以及微信公众号"优梦创客&qu ...
- 是男人就下100层【第四层】——Crazy贪吃蛇(1)
贪吃蛇是一款非常经典的游戏,这些经典游戏给我们的童年添加了不少乐趣,今天開始我们来一步一步的在Android设备上实现一款贪吃蛇游戏,我也是第一次写这个游戏,有可能会写错,或者走弯路,可是终于希望能有 ...
- HTML5游戏开发_是男人就下100层
项目流程 市场调研(可行性分析)--> 可行性报告书 需求分析师.客户经理 需求分析--> 需求说明书 项目经理.需求分析师 概要设计--> 概要设计说明书(ER图, UML) ...
- Cocos2d-x 版本小游戏 《是男人就下100层》 项目开源
这个是很久就开始动手写的一个小游戏了,直到最近才把它收尾了,拖拖拉拉的毛病总是很难改啊. 项目是基于 cocos2d-x v2.2 版本 ,目前只编译到了 Win8 平台上,并且已经上传到了商店,支持 ...
- 『HTML5挑战经典』是英雄就下100层-开源讲座(二)危险!英雄
本篇为<『HTML5挑战经典』是英雄就下100层-开源讲座>第二篇,需要用到开源引擎lufylegend,可以到这里下载: 下载地址:http://lufylegend.googlecod ...
- 『HTML5挑战经典』是英雄就下100层-开源讲座(一)从天而降的英雄
是英雄就下100层是一款经典的手机小游戏,以前是在诺基亚手机上十分有名.今天我们就用HTML5和lufylegend一步步地实现它. 一,准备工作 首先,你需要下载lufylegend,下载地址如下: ...
- gdufe1538-是男人就上100层-(三维bfs)
Problem Description: 桐老爷和UGO终于来到了名为“是男人就上一百层的塔”的下面,听说大祭司在第100层沉睡.为了题目需要,我把这个塔的层数随机打乱,层数的话大家就忘了前面的100 ...
随机推荐
- Selenium爬取淘宝商品概要入mongodb
准备: 1.安装Selenium:终端输入 pip install selenium 2.安装下载Chromedriver:解压后放在…\Google\Chrome\Application\:如果是M ...
- Java第三方工具库/包汇总
一.科学计算或矩阵运算库 科学计算包: JMathLib是一个用于计算复杂数学表达式并能够图形化显示计算结果的Java开源类库.它是Matlab.Octave.FreeMat.Scilab的一个克隆, ...
- 移动GPU全解读(二)
[编者按]:本文作者为爱搞机特约作者.技术达人"炮神"@ioncannon. 在上一篇移动GPU解读中,对移动GPU的架构.相关參数进行了介绍,本部分介绍的则是移动GPU的Shad ...
- HBase高速导入数据--BulkLoad
Apache HBase是一个分布式的.面向列的开源数据库.它能够让我们随机的.实时的訪问大数据.可是如何有效的将数据导入到HBase呢?HBase有多种导入数据的方法.最直接的方法就是在MapRed ...
- 妙味css3课程---1-2、css3中新增的伪类和伪元素有哪些
妙味css3课程---1-2.css3中新增的伪类和伪元素有哪些 一.总结 一句话总结: 1.div:target{}是什么意思? 比如a标签的锚点链接到div,div:target{}就可以找到这个 ...
- Linux库文件路径的添加
库文件在连接(静态库和共享库)和运行(仅限于使用共享库的程序)时被使用,其搜索路径是在系统中进行设置的.一般 Linux 系统把 /lib 和 /usr/lib 两个目录作为默认的库搜索路径,所以使用 ...
- 一个理性战胜感性的成功案例:P2P投资和活期理财,纠结中提炼出来的1个数学问题
我经常是投资了P2P,然后用钱,因而损失了一部分收益. 这是一个让我纠结的问题,为了解决这个问题,我不再凭感觉,而是从现实情况,提炼出来1个数学题,解答我的疑惑. 这是一个理性战胜感性的成功案例~ P ...
- 邮件协议与port
电子邮箱的协议有SMTP.POP2.POP3.IMAP4等.都隶属于TCP/IP协议簇,默认状态下.分别通过TCPport25.110和143建立连接.针对不同的用途和功能,我们在邮件se ...
- VPS的centOS6安装远程桌面
VPS的centOS6安装远程桌面 64位系统的需要编译安装 ttp://www.landui.com/help/Show-991.html xrdp是在图形界面下使用的,首先要确定您的centos系 ...
- Python 极简教程(十二)逻辑控制语句 if else
计算机软件之所以能够对不同的情况进行不同的处理,就是我们在编码的时候,通过逻辑控制语句,告诉软件在不同的情况下应该做什么处理. 比如我们在登录的时候,那么当你输入正确的账号密码和错误的账号密码,完全是 ...