博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
简单的贪吃蛇的另一种做法
阅读量:5061 次
发布时间:2019-06-12

本文共 7842 字,大约阅读时间需要 26 分钟。

今天带来一个贪吃蛇游戏,虽然我见过SDK例子里面有关于贪吃蛇的demo,但是那个过于繁琐,而且涉及太多不是贪吃蛇游戏算法的东西,不大适合初学者,

所以我编写了这个工程(其中算法可能和官方例子大相径庭),希望能帮到像我一样初学android,同时又对游戏编程感兴趣的你。
简单说明一下源码:
1,因为追求简洁,所以只有一个主要源文件——游戏的view类,此类中实现了最基本的贪吃蛇控制与显示模块(这些加起来不到区区两百行代码)
2,发现有的像我一样的初学者刚刚接触自定义view的知识,会不知道如何在view中实现button的功能,所以,代码中有一百多行左右来说明这个的用法(上下左右四个颜色不同的circle就是按键,按下还会产生动画效果)
再说明一点,这只是实现了最基本的贪吃蛇,并没有加入音效,管卡等处理,控制蛇运动速度的是Thread的延迟时间,加以更改便可以让蛇运动的更快,代码中重要地方有必要注释
还有就是在模拟器运行时会由于主机性能而照成蛇的运动会延迟一到两个节拍,而在真机测试时则不存在此问题。
下面加几个图片看看效果

   

部分代码:

GameViewSnake1类:

public GameViewSnake1(Context context)     {        super(context);                flag=true;        snake=new SNAKE[50];        food=new FOOD();        bitmapback=BitmapFactory.decodeResource(getResources(), R.drawable.snackwall);                holder = this.getHolder();        holder.addCallback(this);        setFocusable(true);        setFocusableInTouchMode(true);                paint=new Paint();        Snake_Init();                //new Thread(this).start();        // TODO Auto-generated constructor stub    }        public void Snake_Init()    {        Random r=new Random();        int m=r.nextInt(100);                snake[0]=new SNAKE(x,y);                switch(a%4)        {            case 0://右                snake[1]=new SNAKE(x-1,y);                //snake[1].x=snake[0].x-1;                //snake[1].y=snake[0].y;                direct=RIGHT;                break;            case 1://左                snake[1]=new SNAKE(x+1,y);                //snake[1].x=snake[0].x+1;                //snake[1].y=snake[0].y;                direct=LEFT;                break;            case 2://下                snake[1]=new SNAKE(x,y-1);                //snake[1].x=snake[0].x;                //snake[1].y=snake[0].y-1;                direct=DOWN;                break;            case 3://上                snake[1]=new SNAKE(x,y+1);                //snake[1].x=snake[0].x;                //snake[1].y=snake[0].y+1;                direct=UP;                break;        }        Log.d("angang", "snake[0]"+snake[0].x+" "+snake[0].y+"        "+"snake[1]"+snake[1].x+" "+snake[1].y+"    direct="+direct);        length=2;        score=0;        food.need=true;        Snake_Food();    }    public void Snake_Food()    {        int x0,y0,i;        if(food.need)        {            while(food.need)            {                Random r=new Random();                int m=r.nextInt(100);                int n=r.nextInt(100);                                food.x=x0;                food.y=y0;                for(i=0;i
=170 && event.getX()<(230))//down { if(event.getY()>=620 && event.getY()<(680)) { down_down=true; } } if(event.getX()>=95 && event.getX()<(155)) //left { if(event.getY()>=570 && event.getY()<(630)) { left_down=true; } } if(event.getX()>=245 && event.getX()<(305)) //right { if(event.getY()>=570 && event.getY()<(630)) { right_down=true; } } if(event.getX()>=backx1 && event.getX()<(backx2)) //back { if(event.getY()>=backy1 && event.getY()<(backy2)) { esc_down=true; } } break; case MotionEvent.ACTION_MOVE: break; case MotionEvent.ACTION_UP: // if(event.getX()>=170 && event.getX()<(230)) //up { if(event.getY()>=520 && event.getY()<(580)) { if(up_down) { up_down=false; direct=UP; Log.d("angang", "up 抬起"); } } } if(event.getX()>=170 && event.getX()<(230))//down { if(event.getY()>=620 && event.getY()<(680)) { if(down_down) { down_down=false; direct=DOWN; } } } if(event.getX()>=95 && event.getX()<(155)) //left { if(event.getY()>=570 && event.getY()<(630)) { if(left_down) { left_down=false; direct=LEFT; } } } if(event.getX()>=245 && event.getX()<(305)) //right { if(event.getY()>=570 && event.getY()<(630)) { if(right_down) { right_down=false; direct=RIGHT; } } } if(event.getX()>=backx1 && event.getX()<(backx2)) //back { if(event.getY()>=backy1 && event.getY()<(backy2)) { esc_down=false; flag=false; } } break; default: break; }//switch Draw(); //return super.onTouchEvent(event); return true; } public void run() { // TODO Auto-generated method stub int i; Log.d("angang", "draw food(**"+food.x +food.y+"**)"); SNAKE tempsnake=new SNAKE(0,0); while (flag) { //更新画面 Draw(); if(direct==ESC) { flag=false; //return; } //更新蛇的位置 tempsnake=snake[length-1]; for(i=length-1;i>0;i--) { //snake[i]=snake[i-1]; snake[i].x=snake[i-1].x; snake[i].y=snake[i-1].y; } //更新蛇头的位置,并判断是否出界 if(direct==LEFT) { snake[0].x--; if(snake[0].x<0) { flag=false; //return; } } if(direct==RIGHT) { snake[0].x++; if(snake[0].x>=GAME_WIDTH) { flag=false; //return; } } if(direct==UP) { snake[0].y--; if(snake[0].y<0) { flag=false; //return; } } if(direct==DOWN) { snake[0].y++; if(snake[0].y>=GAME_HEIGHT) { flag=false; //return; } } //判断蛇头是否撞到蛇身上 for(i=1;i
=SNAKE_LENGTH) { flag=false; //return; } Log.d("angang", "draw food(##"+food.x +food.y+"##)"+"flag="+flag); //postInvalidate(); try { Thread.sleep(500); } catch (Exception e) { } //synchronized (holder) { //Draw(); //} } }

 

 原文:

 

转载于:https://www.cnblogs.com/nuliniaoboke/archive/2012/12/18/2823482.html

你可能感兴趣的文章
Hadoop流程---从tpch到hive
查看>>
数据结构3——浅谈zkw线段树
查看>>
Introduction to my galaxy engine 2: Depth of field
查看>>
V2019 Super DSP3 Odometer Correction Vehicle List
查看>>
Python 3.X 练习集100题 05
查看>>
设计器 和后台代码的转换 快捷键
查看>>
在线视频播放软件
查看>>
用代码生成器生成的DAL数据访问操作类 基本满足需求了
查看>>
28初识线程
查看>>
Monkey测试结果分析
查看>>
Sublime Text 3 设置
查看>>
浅谈C++底层机制
查看>>
STL——配接器、常用算法使用
查看>>
第9课 uart
查看>>
Range和xrange的区别
查看>>
STL容器之vector
查看>>
无法向会话状态服务器发出会话状态请求
查看>>
数据中心虚拟化技术
查看>>
01入门
查看>>
复习文件操作
查看>>