贪吃蛇详解Windows编程(三)

蛇已经动起来了,接下来就是吃食物,身体变长!

4.制作食物
分为两步,设定食物坐标,画出食物
4.1设定食物坐标

POINT ptFood = { 20,20 };//初始化食物坐标
//[其他代码]
//初始化蛇
VOID InitSnake()
{
    //先清空坐标
    vSnakePoint.clear();
    //给蛇坐标分配空间
    vSnakePoint.resize(SNAKEMAX);
    //游戏结束后再次初始化
    ucSnakeHead = 4;//初始化蛇头为4,实际上是vSnakePoint[3];
    ucSnakeTail = 0;//初始化蛇尾为0
    ucSnakekLen = 4;//初始化蛇身长度为4
    uiSnakeSpeed = SNAKESPEED;//初始化蛇的速度为200ms
    ptDirectHead = { 1,0 };//初始化蛇头方向
    ptFood = { 20,20 };//初始化食物坐标
    //初始化每一节的蛇身坐标
    for (int i = 0;i < ucSnakekLen;i++)
    {
        vSnakePoint[i].x = i;
        vSnakePoint[i].y = 0;
    }
}
//设置食物坐标
void SetFood()
{
    POINT ptNow = {0};//新的食物坐标
    int x = 0, y = 0,i=0;
    while (true)
    {
        srand(time(0));//随机器种子
        x = rand() % GAME_WIDE; //设置食物随机坐标
        y = rand() % GAME_HEIGHT;
        for ( i = 0;i < ucSnakekLen;i++)
        {
            ptNow = GetSnakeNode(i);
            if (ptNow.x == x && ptNow.y == y)
                break;//如果食物出现在蛇身,则重新设置食物
        }//如果食物不在蛇身,就退出循环
        if(ucSnakekLen == i) break;
    }
    ptFood.x = x;
    ptFood.y = y;
}

4.2画食物

画食物也是在WM_PAINT消息中调用

 //画食物
void DrawFood(HWND hWnd)
{
    HDC hdc = GetDC(hWnd);
    HBRUSH hBrush = CreateSolidBrush(RGB(255, 0, 0));
    SelectObject(hdc, hBrush);
     //椭圆食物
      Ellipse(hdc,BOUNDSIZE+ptFood.x*SNAKESIZE, BOUNDSIZE + ptFood.y*SNAKESIZE
          , BOUNDSIZE + (ptFood.x + 1)*SNAKESIZE, BOUNDSIZE + (ptFood.y + 1)*SNAKESIZE);
      ReleaseDC(hWnd, hdc);
      DeleteObject(hBrush);
}

5.让蛇吃食物
首先先判断蛇是否吃到食物,只要蛇头坐标和食物坐标一样就是吃到了

//判断是否吃到食物
BOOL IsEat(POINT ptHead)
{
    return (ptHead.x == ptFood.x && ptHead.y == ptFood.y)?TRUE:FALSE;
}

6.吃食物后蛇身增长
只要增长蛇头就行了。

//增加蛇的长度
void AddSnakeLen(POINT ptHead)
{
    vSnakePoint[ucSnakeHead++] = ptHead;//蛇头增长
    ucSnakekLen++;//长度+1
    IsOverTake();//判断是否超出范围
}

然后可以把这些小函数加入到SnakeMove()函数中

//让蛇动起来
BOOL  SnakeMove()
{
    BOOL bRet = FALSE;
    do 
    {
        POINT ptNewNode = { 0 };//新的蛇头
        ptNewNode.x = GetSnakeNode(ucSnakekLen-1).x + ptDirectHead.x;
        ptNewNode.y = GetSnakeNode(ucSnakekLen - 1).y + ptDirectHead.y;
        if (!IsStrikeWall(ptNewNode))//判断新的蛇头是否撞墙
             break;     
        if (!IsStrikeSelf(ptNewNode))//判断蛇是否撞到自己
              break;    
        if (IsEat(ptNewNode))//判断是否吃到食物
        {
            SetFood();//重新设置食物坐标
            uiScore += 10;//吃到一个食物加10分
            AddSnakeLen(ptNewNode);//增加蛇的长度
            break;
        }
        vSnakePoint[ucSnakeHead].x = ptNewNode.x;//蛇头移动
        vSnakePoint[ucSnakeHead++].y = ptNewNode.y;
        ucSnakeTail++;
        IsOverTake();
        bRet = TRUE;
    } while (FALSE);
    return bRet;
}

效果如图:

贪吃蛇详解Windows编程(三)_第1张图片
吃到食物后,蛇身增长了,原来是4下变成5了!

到这里基本的蛇移动并且吃食物增长长度已经OK了,后面的就是一些修修补补了!
下一篇贴出所有源码,仅供参考!有问题不懂的可以提问,最好是自己百度能找到答案。

你可能感兴趣的:(编程,windows,贪吃蛇)