C语言贪吃蛇用VC2022

C语言贪吃蛇用VC2022,第1张

用到函数的调用和实现,用到easyx,结构体,数组等

也可以用链表来写,在linux上用vim写贪吃蛇原理差不多。

进行初始化

原本想用srand(time(null))的发下有时食物出不来就用了GETtick...

移动蛇:

 

用键位控制:

 

_kbhit是确认是否有按键按下,有就为1否则为0,_getch()是输入的字符.

画图:

 

 调用easyx头文件,用来画图

食物随机出现:

蛇头碰到食物蛇尾加1

上面移动的是没有死亡的,下面这个移动到边界就是死亡:

 

打印菜单:

 

主函数:

 

 

 

#include
#include
#include
#include
#include
#include

void Game_draw();
void Game_Init();
void Move_snake();
void keyborad();
void snake_food();
int menu();
void snake_food_hard();
int Move_snake_siwang();

#define MAX_num 500
#define my_high 800
#define my_wide 800
enum dir
{
    RIGHT,
    DOWN,
    UP,
    LEFT,
};
struct Sanke
{
    int szie;//蛇的节数
    int dir;//蛇的方向
    int speed;//蛇的速度
    POINT coor[MAX_num];//坐标
}sanke;
struct Food
{
    int x;
    int y;
    int r;
    bool flag;

}food;

int main(void)
{    
k:
    int choose,i;
    int l = 1;
    choose=menu();
    switch (choose)
    {    
        case 3:
            Game_Init();
            while (1)
            {

                Game_draw();
                Move_snake();
                keyborad();
                snake_food();
                Sleep(100);
            }
            break;
        case 2:
            Game_Init();
            while (1)
            {

                Game_draw();
                if (l == 1)
                {
                    l = Move_snake_siwang();
                }
                else
                {
                    goto p;
                }
                keyborad();
                snake_food();
                Sleep(20);
            }
            break;
        case 1:
            Game_Init();
            while (1)
            {

                Game_draw();
                if (l == 1)
                {
                    l = Move_snake_siwang();
                }
                else
                {    
                    goto p;
                }
                keyborad();
                snake_food();
                Sleep(100);
            }
            break;

    }
p:    
    printf("you die ,please choose repeat or quit 1 or 0 :");
    scanf_s("%d", &i);
    if (i == 1)
    {
        goto k;
    }
        return 0;
}

void Game_Init()
{    
    initgraph(my_high,my_wide,SHOWCONSOLE);//设置命令框格,图形大小,SHOWCONSOLE显示控制台;
    sanke.szie = 3;//初始话蛇定义其节数
    sanke.speed = 10;
    sanke.dir=RIGHT;
    for (int i = 0; i<= sanke.szie-1; i++)
    {
        sanke.coor[i].y = 10;
        sanke.coor[i].x = 100-10*i;
    }
    srand(GetTickCount());
    food.x = rand() % my_wide+20;
    food.y = rand() % my_high+20;
    food.flag = true;
    food.r = rand() % 10 + 5;
    
}

void Move_snake()
{
    for (int i = sanke.szie- 1; i >0; i--)
    {
        sanke.coor[i] = sanke.coor[i - 1];
    }
    switch (sanke.dir)
    {
        case UP:
            if (sanke.coor[0].y <= 0)
            {
                sanke.coor[0].y = my_high;
            }
            sanke.coor[0].y -= sanke.speed;
            break;
        case DOWN:
            if (sanke.coor[0].y >= my_high)
            {
                sanke.coor[0].y = 0;
            }
            sanke.coor[0].y += sanke.speed;
            break;
        case LEFT:
            if (sanke.coor[0].x <= 0)
            {
                sanke.coor[0].x = my_wide;
            }
            sanke.coor[0].x -= sanke.speed;
            break; 
        case RIGHT:
            if (sanke.coor[0].x>=my_wide)
            {
                sanke.coor[0].x = 0;
            }
            sanke.coor[0].x += sanke.speed;
            break;

    }
}

void keyborad()
{
    if (_kbhit())
    {
        switch (_getch())
        {
            case 'W':
            case 'w':
                if (sanke.dir != DOWN)
                {
                    sanke.dir =UP;
                }
                break;
            case 'S':
            case 's':
                if (sanke.dir != UP)
                {
                    sanke.dir = DOWN;
                }
                break;
            case 'A':
            case 'a':
                if (sanke.dir != RIGHT)
                {
                    sanke.dir = LEFT;
                }
                break;
            case 'D':
            case 'd':
                if (sanke.dir != LEFT)
                {
                    sanke.dir = RIGHT;
                }
                break;
            case ' ':
                while (1)
                {
                    if (_kbhit())
                    {
                        if (_getch() == ' ')
                        {
                            break;
                        }
                    }
                }
                break;

        }
    }
}

void Game_draw()
{
    BeginBatchDraw();
    setbkcolor(RGB(28, 115, 119));//设置背景颜色
    cleardevice();
    setfillcolor(WHITE);
    //绘制蛇
    for (int i =0; i <= sanke.szie-1; i++)
    {
        solidcircle(sanke.coor[i].x, sanke.coor[i].y, 5);//绘制⚪函数
    }
    if (food.flag)
    {
        solidcircle(food.x, food.y, food.r);
    }
    //solidcircle(sanke.coor[0].x, sanke.coor[0].y, 5);
    EndBatchDraw();
}

void snake_food()
{
    if (sanke.coor[0].x <= food.x +food.r && sanke.coor[0].x >= food.x -food.r&&sanke.coor[0].y >= food.y - food.r && sanke.coor[0].y <= food.y + food.r)
    {
        food.flag = false;
        sanke.szie++;
    }
    if (!food.flag)
    {    
        srand(GetTickCount());
        food.x = rand() % my_wide+1;
        food.y = rand() % my_high+1;
        food.flag = true;
        food.r = rand() % 10 + 5;
    }
}

int menu()
{    
    int a;
    printf("#############################\n");
    printf("####  welcome to    game ####\n");
    printf("####  1.start easy  game ####\n");
    printf("####  2.start hard  game ####\n");
    printf("####  3.start wudi  game ####\n");
    printf("####  4.close       game ####\n");
    printf("#############################\n");
    printf("  please choose the number:");
    scanf_s("%d", &a);
    return a;
}

void snake_food_hard()
{
    if (sanke.coor[0].x <= food.x + food.r && sanke.coor[0].x >= food.x - food.r && sanke.coor[0].y >= food.y - food.r && sanke.coor[0].y <= food.y + food.r)
    {
        food.flag = false;
        sanke.szie++;
        sanke.speed ++;
    }
    if (!food.flag)
    {    
        srand(GetTickCount());
        food.x = rand() % my_wide+1;
        food.y = rand() % my_high+1;
        food.flag = true;
        food.r = rand() % 10 + 5;
    }
}

int Move_snake_siwang()
{    
    int l = 1;
    for (int i = sanke.szie - 1; i > 0; i--)
    {
        sanke.coor[i] = sanke.coor[i - 1];
    }
    switch (sanke.dir)
    {
    case UP:
        if (sanke.coor[0].y <= 0)
        {
            l = 0;
            return l;
        }
        sanke.coor[0].y -= sanke.speed;
        break;
    case DOWN:
        if (sanke.coor[0].y >= my_high)
        {
            l = 0;
            return l;
        }
        sanke.coor[0].y += sanke.speed;
        break;
    case LEFT:
        if (sanke.coor[0].x <= 0)
        {
            l = 0;
            return l;
        }
        sanke.coor[0].x -= sanke.speed;
        break;
    case RIGHT:
        if (sanke.coor[0].x >= my_wide)
        {
            l = 0;
            return l;
        }
        sanke.coor[0].x += sanke.speed;
        break;

    }
    return 1;
}

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/872689.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-13
下一篇2022-05-13

发表评论

登录后才能评论

评论列表(0条)

    保存