这个贪吃蛇怎么改才能提升

  1. 我用的是win11的VS2019,运行时黑框可以一闪而过,但要将主运行窗口点击为黑框才能操控
  2. 如何改成每吃5个食物加一个食物
#undef UNICODE
#undef _UNICODE//为了使用outtextxy函数
#define _CRT_SECURE_NO_WARNINGS//为了使用sprintf函数
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h>//随机函数头文件
#include<graphics.h>//easyx里的头文件
/*********************
* 坐标属性
* 蛇属性
* 食物属性
**********************/
typedef struct pointXY//坐标属性
{
    int x;
    int y;
}MYPOINT;
struct Snake
{
    int num;//节数
    MYPOINT xy[100];//蛇最多100节
    char postion;//方向
}snake;
struct Food
{
    MYPOINT fdxy;//食物的x,y坐标
    int eatgrade;
    int flag;
}food;
HWND hwnd = NULL;//表示主窗口
enum movPostion
{
    UP = 72,
    DOWN = 80,
    LEFT = 75,
    RIGHT = 77
};
/*****************************/
void initSnake();//初始化蛇
void drawSnake();//画蛇
void moveSnake();//移动蛇
void keyDown();//按键处理
void initFood();
void drawFood();
void eatFood();
void showGrade();//展示分数
int snakeDie();//蛇死掉
void pauseMoment();//暂停函数
/*****************************/
int main()

//int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)

    //游戏程序的主体部分

{
    srand((unsigned int)time(NULL));//随机函数种子
    hwnd = initgraph(640, 480);
    setbkcolor(WHITE);//设置窗口颜色
    initSnake();
    while (1)
    {
        cleardevice();//刷新
        if (food.flag == 0)
        {
            initFood();
        }
        drawFood();
        drawSnake();
        if (snakeDie())
        {
            break;
        }
        eatFood();
        showGrade();
        moveSnake();
        while (_kbhit())
        {
            pauseMoment();
            keyDown();
        }
        Sleep(100);//多少ms移动一单位
    }


    //getchar();//防止闪退
    closegraph();
    return 0;
}
void initSnake()
{
    snake.xy[2].x = 0;
    snake.xy[2].y = 0;
    snake.xy[1].x = 10;
    snake.xy[1].y = 0;
    snake.xy[0].x = 20;
    snake.xy[0].y = 0;
    snake.num = 3;
    snake.postion = RIGHT;
    food.flag = 0;
    food.eatgrade = 0;
}

void drawSnake()
{
    for (int i = 0; i < snake.num; i++)
    {
        setlinecolor(BLACK);//矩形边框颜色黑色
        setfillcolor(RGB(rand() % 255, rand() % 255, rand() % 255));//炫彩蛇
        fillrectangle(snake.xy[i].x, snake.xy[i].y, snake.xy[i].x + 10, snake.xy[i].y + 10);
        //画矩,写形左上与右下的坐标
    }



}

void moveSnake()
{
    //除了第一节,后的每一节都是前面的坐标
    for (int i = snake.num - 1; i > 0; i--)
    {
        snake.xy[i].x = snake.xy[i - 1].x;
        snake.xy[i].y = snake.xy[i - 1].y;
    }
    //第一节处理
    switch (snake.postion)

    {
    case RIGHT:
        snake.xy[0].x += 10;
        break;
    case LEFT:
        snake.xy[0].x -= 10;
        break;
    case DOWN:
        snake.xy[0].y += 10;
        break;
    case UP:
        snake.xy[0].y -= 10;
        break;
    default:
        break;
    }

}

void keyDown()
{
    char userkey = 0;
    userkey = _getch();
    switch (userkey)
    {
    case RIGHT:
        if (snake.postion != LEFT)
            snake.postion = RIGHT;
        break;
    case LEFT:
        if (snake.postion != RIGHT)
            snake.postion = LEFT;
        break;

    case DOWN:
        if (snake.postion != UP)
            snake.postion = DOWN;
        break;
    case UP:
        if (snake.postion != DOWN)
            snake.postion = UP;
        break;

    }


}

void initFood()//食物的设计
{
    food.fdxy.x = rand() % 65 * 10;//产生食物坐标为10的倍数
    food.fdxy.y = rand() % 48 * 10;
    food.flag = 1;//食物存在
    //如果食物出现在蛇身上,食物重新生成
    for (int i = 0; i > snake.num; i++)
    {
        if (food.fdxy.x == snake.xy[i].x && food.fdxy.y == snake.xy[i].y)
        {
            food.fdxy.x = rand() % 65 * 10;
            food.fdxy.y = rand() % 48 * 10;
        }
    }
}
void drawFood()
{
    setlinecolor(BLACK);
    setfillcolor(RGB(rand() % 255, rand() % 255, rand() % 255));
    fillrectangle(food.fdxy.x, food.fdxy.y, food.fdxy.x + 10, food.fdxy.y + 10);

}
void eatFood()
{
    //蛇边长,分数增加,食物重新生成
    if (snake.xy[0].x == food.fdxy.x && snake.xy[0].y == food.fdxy.y)
    {
        snake.num++;
        food.eatgrade += 10;
        food.flag = 0;
    }

}
int snakeDie()
{
    if (snake.xy[0].x > 640 || snake.xy[0].x < 0 || snake.xy[0].y>480 || snake.xy[0].y < 0)
    {
        outtextxy(200, 200, "你撞墙了");
        MessageBox(hwnd, "Gameover!", "撞墙警告", MB_OK);
        return 1;//返回1结束
    }
    for (int i = 1; i < snake.num; i++)
    {
        if (snake.xy[0].x == snake.xy[i].x && snake.xy[0].y == snake.xy[i].y)
        {
            outtextxy(200, 200, "你撞自己了");
            MessageBox(hwnd, "Gameover!", "自杀警告", MB_OK);
            return 1;
        }
    }
    return 0;
}
void showGrade()
{
    char grade[100] = "0";
    sprintf(grade, "%d", food.eatgrade);//将整形转化为字符串
    setbkmode(TRANSPARENT);//设置为透明的方式
    settextcolor(LIGHTBLUE);//颜色为青蓝
    outtextxy(560, 20, "分数:");
    outtextxy(580 + 30, 20, grade);
}
void pauseMoment()
{
    if (_getch() == 32)//空格暂停
    {
        while (_getch() != 32);
    }
}


我要的是每吃5个食物,食物增加,不是蛇的节数增加

以下答案由GPT-4.0Plus大模型与博主A努力中.......共同编写:
这里有一些可以提高贪吃蛇游戏玩法和体验的改进方案:

  1. 增加游戏难度
    可以通过增加食物数量、加快食物出现频率、缩小窗口大小等方式增加游戏难度,提高游戏挑战性。
  2. 增加弹窗提示
    可以在蛇死亡、通过一定关卡时增加弹窗提示,如“Game Over!”、“Level Up!”等,提高游戏体验。
  3. 增加游戏音效
    添加背景音乐、食物出现音效、蛇死亡音效等可以增加游戏immersive感。
  4. 增加游戏关卡
    可以将游戏划分为多个关卡,每个关卡具有不同的食物数量、出现频率、窗口大小等。通过关卡可以提高游戏的趣味性和挑战度。
  5. 新增游戏元素
    可以新增障碍物、加速器、瞬移器、锤子等游戏元素,增加游戏的变化性。但需要注意新增元素不会影响游戏体验和难度的平衡。
  6. 优化代码并添加注释
    优化现有代码,使之更加清晰易读。添加详细注释,便于他人理解。这可以降低后续开发和维护成本。
  7. 发布游戏并加入排行榜
    可以将游戏发布为Web游戏或App,设置排行榜并记录最高分,让玩家之间产生竞争,增加游戏的趣味性和可玩性。

总之,通过增加游戏难度、优化用户体验、加入更多游戏元素和模式、提高代码质量等方式可以显著提高一个简单贪吃蛇游戏的质量与体验。