我可以不吃啊 发表于 2025-1-23 23:33:24

c语言贪吃蛇(极简版,根本能玩)

c语言贪吃蛇

https://i-blog.csdnimg.cn/direct/7477ab99c53d4d3db6f7ed773b665579.png
团体逻辑


[*]界面绘制
[*]定义结构体以及结构体的初始化
2.1 一节变三节
[*]蛇的移动
3.1 监控键盘
3.2 蛇的移动
[*]食物
4.1 定义
4.2 初始化
4.3 食物的绘制
[*]食物的再生与身材增长、分数
[*]死亡与竣事
[*]优化
7.1 getch()函数会返回两个数值,过滤第一个,留下第二个真实键值
界面绘制与主函数

#include<graphics.h> //图形界面库
#include<stdio.h>
#include<stdlib.h>
int main()
{
        //界面绘制
        initgraph(WIN_WIDTH, WIN_HEIGTH);//初始化窗口
        setbkcolor(RGB(207, 214, 229));//设置背景颜色
        cleardevice();//刷新窗口
   
    //初始化
    GemeInit();
   
    while (1) {
        //绘制
        GameDraw();
        //移动
        GameMove();
        BeginBatchDraw();//双缓存机制,减少闪烁
        //控制键盘
        KeyControl;
        FlushBatchDraw();//刷新双缓冲区
        EatFood();
        Sleep(100);
}

}
定义和初始化



[*] 蛇
//定义蛇
struct Snake {
        int num; //蛇身长
        int dir; //方向
        int score; //分数
        int size; //蛇的宽和高 定位
        int speed;//蛇速度
        //坐标
        struct Pos coor;
}snake;
// 定位
struct Pos
{
        int x;
        int y;
};

[*] 食物
//定义食物
struct Food {
        int x;
        int y;
        bool flag;//判断食物是否存在
}food;

[*] 初始化
//初始化
void GemeInit() {
        snake.num = 3;
        snake.dir = RIGHT;
        snake.score = 0;
        snake.size = 15;
        snake.speed = 10;

        //三节蛇身的初始化
        snake.coor.x = 200;//修改初始位置,避免蛇身重叠
        snake.coor.y = 200;
        snake.coor.x = 185;
        snake.coor.y = 200;
        snake.coor.x = 170;
        snake.coor.y = 200;
   
    //食物的初始化
        food.x = rand() % (WIN_WIDTH / 10) * 10;
        food.y = rand() % (WIN_HEIGTH / 10) * 10;
        food.flag = true;
}

根据坐标绘制图形



[*] 绘制蛇身、食物、分数
void GameDraw() {
        cleardevice();//清屏
   
        //三节蛇身
        for (int i = 0; i < snake.num; i++)
        {
                //蛇的填充色
                setfillcolor(BLACK);
                //画矩形
                fillrectangle(snake.coor.x, snake.coor.y, snake.coor.x + snake.size, snake.coor.y + snake.size);
        }
   
    //食物,复用蛇身
        setfillcolor(BLACK);
        fillrectangle(food.x, food.y, food.x +                 snake.size, food.y + snake.size);
   
    //分数
    char temp = "";
        sprintf(temp, "分数%d", snake.score);
        outtextxy(10, 10, temp);
}

蛇的移动



[*] 监控键盘
void KeyControl() {
        //只有按键按下时才处理
        if (_kbhit()) {
                char key = _getch();//接收getch()函数的第一个返回值
                char key2 = _getch();//接收getch()函数的第二个返回值,即真实键值
                if (key == -32) {
                        switch (key2) {
                        case 72:
                                if (snake.dir != DOWN) {
                                        snake.dir = UP;
                                        printf("↑\n");
                                }
                                break;
                        case 75:
                                if (snake.dir != RIGHT) {
                                        snake.dir = LEFT;
                                        printf("←\n");
                                }
                                break;
                        case 77:
                                if (snake.dir != LEFT) {
                                        snake.dir = RIGHT;
                                        printf("→\n");
                                }
                                break;
                        case 80:
                                if (snake.dir != UP) {
                                        snake.dir = DOWN;
                  printf("↓\n");
                                }
                                break;
                        }
                }
        }
}


[*] 蛇的移动
void GameMove() {
        //从蛇尾开始覆盖,a,b,c三节考虑。
        for (int i = snake.num - 1; i > 0; i--) {
                snake.coor.x = snake.coor.x;
                snake.coor.y = snake.coor.y;
        }

        switch (snake.dir) {
        case UP:
                snake.coor.y -= snake.speed;
                break;
        case DOWN:
                snake.coor.y += snake.speed;
                break;
        case LEFT:
                snake.coor.x -= snake.speed;
                break;
        case RIGHT:
                snake.coor.x += snake.speed;
                break;
        }
}

吃食物



[*] 消失与再生
//吃食物
void EatFood() {
        if (food.flag && snake.coor.x == food.x && snake.coor.y == food.y) {
                food.flag = false;
                snake.num++;
                snake.score += 10;
        }
        CreateFood();
}

//生成食物
void CreateFood() {
        if (!food.flag) {
                food.x = rand() % (WIN_WIDTH / 10) * 10;
                food.y = rand() % (WIN_HEIGTH / 10) * 10;
                food.flag = true;
        }
}

完备代码

/*1. 界面绘制2. 定义结构体以及结构体的初始化        2.1 一节变三节,绘制蛇身3. 蛇的移动        3.1 监控键盘        3.2 蛇的移动4. 绘制食物        4.1 定义        4.2 初始化        4.3 食物的绘制5. 食物的再生与身材增长、分数6. 死亡与竣事7. 优化        7.1 getch()函数会返回两个数值,过滤第一个,留下第二个真实键值*/#include<graphics.h> //图形界面库#include<stdio.h>#include <conio.h> //键盘监控#include<stdlib.h>#define MAX_SNAKE 500#define WIN_WIDTH 640#define WIN_HEIGTH 480// 定位struct Pos{        int x;        int y;};// 蛇的结构体struct Snake {        int num; //蛇身长        int dir; //方向        int score; //分数        int size; //蛇的宽和高 定位        int speed;//蛇速率        //坐标        struct Pos coor;}snake;struct Food {        int x;        int y;        bool flag;//判断食物是否存在}food;//枚举范例定义方向enum DIR {        UP,        DOWN,        LEFT,        RIGHT};//初始化void GemeInit() {        snake.num = 3;        snake.dir = RIGHT;        snake.score = 0;        snake.size = 15;        snake.speed = 10;        //三节蛇身        snake.coor.x = 200;//修改初始位置,制止蛇身重叠        snake.coor.y = 200;        snake.coor.x = 185;        snake.coor.y = 200;        snake.coor.x = 170;        snake.coor.y = 200;        //食物        food.x = rand() % (WIN_WIDTH / 10) * 10;        food.y = rand() % (WIN_HEIGTH / 10) * 10;        food.flag = true;}// 绘制三节蛇身、食物、分数void GameDraw() {        cleardevice();//        for (int i = 0; i < snake.num; i++)        {                //蛇的填充色                setfillcolor(BLACK);                //画矩形                fillrectangle(snake.coor.x, snake.coor.y, snake.coor.x + snake.size, snake.coor.y + snake.size);        }        //食物的填充色        setfillcolor(BLACK);        //画矩形        fillrectangle(food.x, food.y, food.x + snake.size, food.y + snake.size);        char temp = "";        sprintf(temp, "分数%d", snake.score);        outtextxy(10, 10, temp);}//蛇的移动void GameMove() {
        //从蛇尾开始覆盖,a,b,c三节考虑。
        for (int i = snake.num - 1; i > 0; i--) {
                snake.coor.x = snake.coor.x;
                snake.coor.y = snake.coor.y;
        }

        switch (snake.dir) {
        case UP:
                snake.coor.y -= snake.speed;
                break;
        case DOWN:
                snake.coor.y += snake.speed;
                break;
        case LEFT:
                snake.coor.x -= snake.speed;
                break;
        case RIGHT:
                snake.coor.x += snake.speed;
                break;
        }
}
//监控键盘void KeyControl() {
        //只有按键按下时才处理
        if (_kbhit()) {
                char key = _getch();//接收getch()函数的第一个返回值
                char key2 = _getch();//接收getch()函数的第二个返回值,即真实键值
                if (key == -32) {
                        switch (key2) {
                        case 72:
                                if (snake.dir != DOWN) {
                                        snake.dir = UP;
                                        printf("↑\n");
                                }
                                break;
                        case 75:
                                if (snake.dir != RIGHT) {
                                        snake.dir = LEFT;
                                        printf("←\n");
                                }
                                break;
                        case 77:
                                if (snake.dir != LEFT) {
                                        snake.dir = RIGHT;
                                        printf("→\n");
                                }
                                break;
                        case 80:
                                if (snake.dir != UP) {
                                        snake.dir = DOWN;
                  printf("↓\n");
                                }
                                break;
                        }
                }
        }
}

//生成食物void CreateFood() {        if (!food.flag) {                food.x = rand() % (WIN_WIDTH / 10) * 10;                food.y = rand() % (WIN_HEIGTH / 10) * 10;                food.flag = true;        }}//吃食物void EatFood() {        if (food.flag && snake.coor.x == food.x && snake.coor.y == food.y) {                food.flag = false;                snake.num++;                snake.score += 10;        }        CreateFood();}int main(){        //界面绘制        initgraph(WIN_WIDTH, WIN_HEIGTH);//初始化窗口        setbkcolor(RGB(207, 214, 229));//设置配景颜色        cleardevice();//刷新窗口        GemeInit();        while (1) {                //绘制                GameDraw();                //移动                GameMove();                BeginBatchDraw();//双缓存机制,淘汰闪烁                //控制键盘                KeyControl;                FlushBatchDraw();//刷新双缓冲区                EatFood();                Sleep(100);        }}
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: c语言贪吃蛇(极简版,根本能玩)