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

打印 上一主题 下一主题

主题 1047|帖子 1047|积分 3141

c语言贪吃蛇


团体逻辑


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

  1. #include<graphics.h> //图形界面库
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. int main()
  5. {
  6.         //界面绘制
  7.         initgraph(WIN_WIDTH, WIN_HEIGTH);//初始化窗口
  8.         setbkcolor(RGB(207, 214, 229));//设置背景颜色
  9.         cleardevice();//刷新窗口
  10.    
  11.     //初始化
  12.     GemeInit();
  13.    
  14.     while (1) {
  15.         //绘制
  16.         GameDraw();
  17.         //移动
  18.         GameMove();
  19.         BeginBatchDraw();//双缓存机制,减少闪烁
  20.         //控制键盘
  21.         KeyControl;
  22.         FlushBatchDraw();//刷新双缓冲区
  23.         EatFood();
  24.         Sleep(100);
  25. }
  26. }
复制代码
定义和初始化




    1. //定义蛇
    2. struct Snake {
    3.         int num; //蛇身长
    4.         int dir; //方向
    5.         int score; //分数
    6.         int size; //蛇的宽和高 定位
    7.         int speed;//蛇速度
    8.         //坐标
    9.         struct Pos coor[MAX_SNAKE];
    10. }snake;
    11. // 定位
    12. struct Pos
    13. {
    14.         int x;
    15.         int y;
    16. };
    复制代码
  • 食物
    1. //定义食物
    2. struct Food {
    3.         int x;
    4.         int y;
    5.         bool flag;//判断食物是否存在
    6. }food;
    复制代码
  • 初始化
    1. //初始化
    2. void GemeInit() {
    3.         snake.num = 3;
    4.         snake.dir = RIGHT;
    5.         snake.score = 0;
    6.         snake.size = 15;
    7.         snake.speed = 10;
    8.         //三节蛇身的初始化
    9.         snake.coor[0].x = 200;  //修改初始位置,避免蛇身重叠
    10.         snake.coor[0].y = 200;
    11.         snake.coor[1].x = 185;
    12.         snake.coor[1].y = 200;
    13.         snake.coor[2].x = 170;
    14.         snake.coor[2].y = 200;
    15.    
    16.     //食物的初始化
    17.         food.x = rand() % (WIN_WIDTH / 10) * 10;
    18.         food.y = rand() % (WIN_HEIGTH / 10) * 10;
    19.         food.flag = true;
    20. }
    复制代码
根据坐标绘制图形



  • 绘制蛇身、食物、分数
    1. void GameDraw() {
    2.         cleardevice();//清屏
    3.    
    4.         //三节蛇身
    5.         for (int i = 0; i < snake.num; i++)
    6.         {
    7.                 //蛇的填充色
    8.                 setfillcolor(BLACK);
    9.                 //画矩形
    10.                 fillrectangle(snake.coor[i].x, snake.coor[i].y, snake.coor[i].x + snake.size, snake.coor[i].y + snake.size);
    11.         }
    12.    
    13.     //食物,复用蛇身
    14.         setfillcolor(BLACK);
    15.         fillrectangle(food.x, food.y, food.x +                 snake.size, food.y + snake.size);
    16.    
    17.     //分数
    18.     char temp[20] = "";
    19.         sprintf(temp, "分数%d", snake.score);
    20.         outtextxy(10, 10, temp);
    21. }
    复制代码
蛇的移动



  • 监控键盘
    1. void KeyControl() {
    2.         //只有按键按下时才处理
    3.         if (_kbhit()) {
    4.                 char key = _getch();//接收getch()函数的第一个返回值
    5.                 char key2 = _getch();//接收getch()函数的第二个返回值,即真实键值
    6.                 if (key == -32) {
    7.                         switch (key2) {
    8.                         case 72:
    9.                                 if (snake.dir != DOWN) {
    10.                                         snake.dir = UP;
    11.                                         printf("↑\n");
    12.                                 }
    13.                                 break;
    14.                         case 75:
    15.                                 if (snake.dir != RIGHT) {
    16.                                         snake.dir = LEFT;
    17.                                         printf("←\n");
    18.                                 }
    19.                                 break;
    20.                         case 77:
    21.                                 if (snake.dir != LEFT) {
    22.                                         snake.dir = RIGHT;
    23.                                         printf("→\n");
    24.                                 }
    25.                                 break;
    26.                         case 80:
    27.                                 if (snake.dir != UP) {
    28.                                         snake.dir = DOWN;
    29.                     printf("↓\n");
    30.                                 }
    31.                                 break;
    32.                         }
    33.                 }
    34.         }
    35. }
    复制代码
  • 蛇的移动
    1. void GameMove() {
    2.         //从蛇尾开始覆盖,a,b,c三节考虑。
    3.         for (int i = snake.num - 1; i > 0; i--) {
    4.                 snake.coor[i].x = snake.coor[i - 1].x;
    5.                 snake.coor[i].y = snake.coor[i - 1].y;
    6.         }
    7.         switch (snake.dir) {
    8.         case UP:
    9.                 snake.coor[0].y -= snake.speed;
    10.                 break;
    11.         case DOWN:
    12.                 snake.coor[0].y += snake.speed;
    13.                 break;
    14.         case LEFT:
    15.                 snake.coor[0].x -= snake.speed;
    16.                 break;
    17.         case RIGHT:
    18.                 snake.coor[0].x += snake.speed;
    19.                 break;
    20.         }
    21. }
    复制代码
吃食物



  • 消失与再生
    1. //吃食物
    2. void EatFood() {
    3.         if (food.flag && snake.coor[0].x == food.x && snake.coor[0].y == food.y) {
    4.                 food.flag = false;
    5.                 snake.num++;
    6.                 snake.score += 10;
    7.         }
    8.         CreateFood();
    9. }
    10. //生成食物
    11. void CreateFood() {
    12.         if (!food.flag) {
    13.                 food.x = rand() % (WIN_WIDTH / 10) * 10;
    14.                 food.y = rand() % (WIN_HEIGTH / 10) * 10;
    15.                 food.flag = true;
    16.         }
    17. }
    复制代码
完备代码

  1. /*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[MAX_SNAKE];}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[0].x = 200;  //修改初始位置,制止蛇身重叠        snake.coor[0].y = 200;        snake.coor[1].x = 185;        snake.coor[1].y = 200;        snake.coor[2].x = 170;        snake.coor[2].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[i].x, snake.coor[i].y, snake.coor[i].x + snake.size, snake.coor[i].y + snake.size);        }        //食物的填充色        setfillcolor(BLACK);        //画矩形        fillrectangle(food.x, food.y, food.x + snake.size, food.y + snake.size);        char temp[20] = "";        sprintf(temp, "分数%d", snake.score);        outtextxy(10, 10, temp);}//蛇的移动void GameMove() {
  2.         //从蛇尾开始覆盖,a,b,c三节考虑。
  3.         for (int i = snake.num - 1; i > 0; i--) {
  4.                 snake.coor[i].x = snake.coor[i - 1].x;
  5.                 snake.coor[i].y = snake.coor[i - 1].y;
  6.         }
  7.         switch (snake.dir) {
  8.         case UP:
  9.                 snake.coor[0].y -= snake.speed;
  10.                 break;
  11.         case DOWN:
  12.                 snake.coor[0].y += snake.speed;
  13.                 break;
  14.         case LEFT:
  15.                 snake.coor[0].x -= snake.speed;
  16.                 break;
  17.         case RIGHT:
  18.                 snake.coor[0].x += snake.speed;
  19.                 break;
  20.         }
  21. }
  22. //监控键盘void KeyControl() {
  23.         //只有按键按下时才处理
  24.         if (_kbhit()) {
  25.                 char key = _getch();//接收getch()函数的第一个返回值
  26.                 char key2 = _getch();//接收getch()函数的第二个返回值,即真实键值
  27.                 if (key == -32) {
  28.                         switch (key2) {
  29.                         case 72:
  30.                                 if (snake.dir != DOWN) {
  31.                                         snake.dir = UP;
  32.                                         printf("↑\n");
  33.                                 }
  34.                                 break;
  35.                         case 75:
  36.                                 if (snake.dir != RIGHT) {
  37.                                         snake.dir = LEFT;
  38.                                         printf("←\n");
  39.                                 }
  40.                                 break;
  41.                         case 77:
  42.                                 if (snake.dir != LEFT) {
  43.                                         snake.dir = RIGHT;
  44.                                         printf("→\n");
  45.                                 }
  46.                                 break;
  47.                         case 80:
  48.                                 if (snake.dir != UP) {
  49.                                         snake.dir = DOWN;
  50.                     printf("↓\n");
  51.                                 }
  52.                                 break;
  53.                         }
  54.                 }
  55.         }
  56. }
  57. //生成食物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[0].x == food.x && snake.coor[0].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企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

我可以不吃啊

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表