C++ 贪吃蛇一维

#include <iostream>
#include <conio.h>
#include <windows.h>
#include <time.h>

int g_Dir = 3;
#define UP         0
#define DOWN  1
#define LEFT       2
#define RIGHT   3

struct FOOD
{
    int X = 0;
    int Y = 0;
    bool State = 0;
}Food;

//方向控制
void SnekeMove()
{
    if (::GetAsyncKeyState(VK_UP) & 1)
        g_Dir = 0;
    if (::GetAsyncKeyState(VK_DOWN) & 1)
        g_Dir = 1;
    if (::GetAsyncKeyState(VK_LEFT) & 1)
        g_Dir = 2;
    if (::GetAsyncKeyState(VK_RIGHT) & 1)
        g_Dir = 3;
}

//主函数
int main()
{
    srand((unsigned int)time(NULL));
    int W = 20;
    int H = 20;
    int Len = 3;
    int Map[20 * 20] = { 0 };
    int Snake[50] = { 0 };
    //Snake[0] = 2;//为蛇头
    
    for (int i = 0; i < Len; i++)
    {
        Snake[i] = Len - i - 1;
    }
    Food.X = W / 2;
    Food.Y = H / 2;
    Map[Food.Y * W + Food.X] = 2;

    const char *SNAKE[] = { "  ", "" ,""};
    while (true)
    {
        system("cls");
        for (int i = 0; i < Len; i++)
        {
            // 2 1 0
            // 1 1 1

            // 3 2 1
            // 0 1 1 1
            //这里需要注意
            Map[Snake[i]] = 1;
        }
        Map[Food.Y * W + Food.X] = 2;
        if (Map[Snake[0]] == Map[Food.Y * W + Food.X])
        {
            Map[Food.Y * W + Food.X] = 0;
            do
            {
                bool FoodState = false;
                Food.X = rand() % W;
                Food.Y = rand() % H;
                for (int i = 0; i < Len; i++)
                {
                    if (Map[Food.Y * W + Food.X] != Map[Snake[i]])
                    {
                        FoodState = true;
                    }
                }
                if (FoodState)
                {
                    Map[Food.Y * W + Food.X] = 2;
                    break;
                }
            } while (true);
            Len++;
        }

        for (int i = 0; i < H; i++)
        {
            for (int j = 0; j < W; j++)
            {
                //蛇头在地图上的坐标
                if (i * W + j == Snake[0])
                {
                    if (i == H - 1 || j == W - 1)
                    {
                        //撞墙
                        system("pause");
                        return 0;
                    }
                }
            }
        }

        for (int i = 0; i < H; i++)
        {
            for (int j = 0; j < W; j++)
            {
                std::cout << SNAKE[Map[i * W + j]];
            }
            std::cout << std::endl;
        }
        std::cout << std::endl;
        //for (int i = 0; i < Len; i++)
        //{
        //    std::cout << Snake[i]<<"  ";
        //}
        //std::cout << std::endl;
        std::cout <<"蛇的长度为 : "<<Len<<std::endl;
        memset(Map, 0, sizeof(Map));

        SnekeMove();


        for (int i = Len; i > 0; i--)
        {
            // 2 1 0
            //默认往右挪
            // 2 2 1 0
            //后面++
            // 3 2 1 0
            //完成一次移动
            Snake[i] = Snake[i - 1];
            /*
            比如往下
            // 3 2 1 0
            // 23 3 2 1 0
            */
        }
        if (g_Dir == UP)
        {
            Snake[0] -= W;
        }
        if (g_Dir == DOWN)
        {
            Snake[0] += W;
        }
        if (g_Dir == LEFT)
        {
            Snake[0]--;
        }
        if (g_Dir == RIGHT)
        {
            Snake[0]++;
        }
        


        Sleep(50);
    }


    //https://www.bilibili.com/video/av29007126/?spm_id_from=333.788.videocard.1
    system("pause");
    return 0;
}

 

posted @ 2019-11-02 08:32  YZFHKMS-X  阅读(280)  评论(0编辑  收藏  举报