用简单思路开发游戏----贪吃蛇

原创 2015年07月09日 16:51:09
用简单思路开发游戏—----怎么想得就怎么写
贪吃蛇~   
规则:不能撞墙,不恩吃自己,吃一个蛋长大一点,速度变快


首先定义一个蛋
struct TEgg
{
    int x;
    int y;
};


蛇是由很多蛋连到一起组成
std::vector<TEgg> m_snake;//蛇


吃到的蛋是在到了尾巴处才能消化变成蛇,所以得记录下她吃了哪些蛋
std::vector<TEgg> m_eggs;//吃到的蛋


每次生成一个蛋给蛇吃
TEgg m_egg;


结构上欧了


开始搞个地图,蛇只能在固定区域肆无忌惮,
void Snake::initMap()
{
    for(int i = 0; i < KWidth; ++i)
    {
        for(int j = 0; j < KHeight; ++j)
        {
            m_pos[i][j] = Vec2(118 + KEggSize / 2 + KEggSize * i, 70 + KEggSize / 2 + KEggSize * j);
        }
    }
}


初始化一个蛇,由三个蛋组成,蛇头位置(3, 5)
void Snake::initSnake()
{
    m_snake.clear();
    m_snakeSprite.clear();
    
    int x = 3;
    int y = 5;
    
    for(int i = 0; i < 3; ++i)
    {
        TEgg egg;
        egg.x = x - i;
        egg.y = y;
        m_snake.push_back(egg);
        
        auto sprite = Sprite::create("test/egg.png");
        sprite->setPosition(m_pos[egg.x][egg.y]);
        addChild(sprite);
        m_snakeSprite.push_back(sprite);
    }
    
    m_eggSprite = Sprite::create("test/egg.png");
    m_eggSprite->setPosition(Vec2(-200, -200));
    addChild(m_eggSprite);
}


生成一个蛋,不能在蛇身上,位置随机
void Snake::initEgg()
{
    int x = rand() % KWidth;
    int y = rand() % KHeight;
    
    bool flag = false;
    
    for(int i = 0; i < m_snake.size(); ++i)
    {
        if(x == m_snake[i].x && y == m_snake[i].y)
        {
            flag = true;
            break;
        }
    }
    
    if(flag)
    {
        initEgg();
    }
    else
    {
        m_egg.x = x;
        m_egg.y = y;
        
        m_eggSprite->setPosition(m_pos[x][y]);
    }
}


开始操作蛇吃饭吧~  4个方向按钮。。


写一个调度,每过一段时间更新一次蛇的状态,随着游戏推进,蛇的速度越来越快


void Snake::step(float dt)
{
    //先取出蛇尾,便于吃到蛋后长大
    TEgg lastSnake = m_snake[m_snake.size() - 1];
    
    //后续的蛇身都挨个跟进
    for(int i = (int)m_snake.size() - 1; i > 0; --i)
    {
        m_snake[i].x = m_snake[i - 1].x;
        m_snake[i].y = m_snake[i - 1].y;
    }
    
    //判断方向,确定蛇头位置
    if(m_curDir == EDirL)
    {
        m_snake[0].x--;
    }
    else if(m_curDir == EDirR)
    {
        m_snake[0].x++;
    }
    else if(m_curDir == EDirT)
    {
        m_snake[0].y++;
    }
    else if(m_curDir == EDirB)
    {
        m_snake[0].y--;
    }
    
    //判断是否撞墙
    if(m_snake[0].x < 0 || m_snake[0].x > KWidth - 1 || m_snake[0].y < 0 || m_snake[0].y > KHeight - 1)
    {
        //gameover
        unschedule(schedule_selector(Snake::step));
        return;
    }
    
    //判断蛇头是否撞蛇身
    for(int i = 1; i < m_snake.size(); ++i)
    {
        if(m_snake[0].x == m_snake[i].x && m_snake[0].y == m_snake[i].y)
        {
            //gameover
            unschedule(schedule_selector(Snake::step));
            return;
        }
    }
    
    //判断是否吃到egg
    if(m_snake[0].x == m_egg.x && m_snake[0].y == m_egg.y)
    {
        m_eggs.push_back(m_egg);
        initEgg();//蛋被吃了,重新生成一个
        
        //每吃一个蛋,蛇速度增大0.02f
        m_dt -= 0.01f;
        unschedule(schedule_selector(Snake::step));
        schedule(schedule_selector(Snake::step), m_dt);
    }
    
    //判断是否蛇应该长大了
    if(m_eggs.size() > 0 && m_eggs[0].x == lastSnake.x && m_eggs[0].y == lastSnake.y)
    {
        m_snake.push_back(m_eggs[0]);
        m_eggs.erase(m_eggs.begin());
        
        auto sprite = Sprite::create("test/egg.png");
        sprite->setPosition(m_pos[lastSnake.x][lastSnake.y]);
        addChild(sprite);
        m_snakeSprite.push_back(sprite);
    }
    
    //修改eggsprite位置
    for(int i = 0; i < m_snakeSprite.size(); ++i)
    {
        m_snakeSprite[i]->setPosition(m_pos[m_snake[i].x][m_snake[i].y]);
    }
}


启动调度
schedule(schedule_selector(Snake::step), m_dt);

OK,现在开始尽情肆虐吧~



源码地址:http://download.csdn.net/detail/heyanru/8884461


【贪吃蛇,C++实现】,由简单游戏开始学习OOP,的编程新手

{我又来写黑历史了}.... 以前学习C语言的时候,老是感觉只能做点数学题什么的(事实程序就是由许多道数学题构成)。 然后最近两个月开始学习C++,接触到OOP,然后感觉视界扩大了(误)特别是最近...
  • lu3664198
  • lu3664198
  • 2015年05月07日 16:07
  • 2223

基于java的贪吃蛇设计与实现

 基于java的贪吃蛇的设计与实现   界面的设计;包括: 蛇体本身; 界面; 贪吃蛇的控制:控制部件,控制蛇体,根据蛇体再去做...
  • bigbug_zju
  • bigbug_zju
  • 2015年08月18日 13:21
  • 1885

Java简易版贪吃蛇的原理与制作

贪吃蛇实际上是一个较为简单的线程游戏,其制作思路主要为以下几个步骤: 1.主框架类(GameFrame):作为游戏的顶层容器和游戏程序的入口点。在代码中我将它写入了GamePanel里。 2.游戏...
  • mjc1235
  • mjc1235
  • 2017年06月28日 00:41
  • 938

js开发实现简单贪吃蛇游戏(20行代码)

曾经诺基亚的贪吃蛇风靡一时,在游戏匮乏的年代,用java实现太难,现在网页制作20行代码就做成一个简单的demo了,时代在进步啊 代码: 01 02 html>...
  • hj7jay
  • hj7jay
  • 2016年03月30日 09:45
  • 46177

贪吃蛇小游戏java实现代码分析

贪吃蛇小游戏java实现代码分析贪吃蛇的小游戏,网上的代码比较多,今天周五,在教研室没啥事做,在电脑中发现了一个贪吃蛇的小游戏,于是就看了下实现的源码,发现别人写的代码确实挺好的,自己也是边加注释边进...
  • u010412719
  • u010412719
  • 2015年07月03日 22:07
  • 5041

细致的C语言写贪吃蛇教程+详细思路-适合新手附源码

#史上最详细的C语言贪吃蛇教程#前言在有用C写贪吃蛇的一个想法之后,上网查了几个教程,觉得不是很能看懂。恩。。。或者说不是一下子就能看出来思路+具体怎么实现。所以,我花了早自习的时间想了想如何用最简单...
  • u013764814
  • u013764814
  • 2016年12月15日 13:12
  • 9284

最简单的HTML5游戏——贪吃蛇

贪吃蛇                                      const WIDTH = 1000;     const HEIGHT = 7...
  • qpfjalzm123
  • qpfjalzm123
  • 2015年08月24日 18:23
  • 2135

java GUI编程-贪吃蛇游戏简单实现

例子简单,界面简陋 请见谅 项目结构如下 Constant.jvava 代码如下: package snake; /**  *   * @author hjn  *   */ public...
  • h348592532
  • h348592532
  • 2013年11月07日 15:00
  • 3889

python模仿开发贪食蛇小游戏历程

说起来,对python颇感兴趣的我开始尝试一下用python
  • u010183402
  • u010183402
  • 2014年09月03日 15:39
  • 2319

功能异常简单的贪吃蛇(队列实现)

#include #include #include #include #define u 0 #define r 1 #define l 2 #define d 3 #define fail 0 #...
  • u010327109
  • u010327109
  • 2016年04月22日 12:22
  • 379
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用简单思路开发游戏----贪吃蛇
举报原因:
原因补充:

(最多只允许输入30个字)