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

embedded/2025/1/25 3:43:22/

c语言贪吃蛇

在这里插入图片描述

整体逻辑

  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<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[MAX_SNAKE];
    }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[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 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[i].x = snake.coor[i - 1].x;snake.coor[i].y = snake.coor[i - 1].y;}switch (snake.dir) {case UP:snake.coor[0].y -= snake.speed;break;case DOWN:snake.coor[0].y += snake.speed;break;case LEFT:snake.coor[0].x -= snake.speed;break;case RIGHT:snake.coor[0].x += snake.speed;break;}
    }
    

吃食物

  • 消失与再生

    //吃食物
    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();
    }//生成食物
    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[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() {//从蛇尾开始覆盖,a,b,c三节考虑。for (int i = snake.num - 1; i > 0; i--) {snake.coor[i].x = snake.coor[i - 1].x;snake.coor[i].y = snake.coor[i - 1].y;}switch (snake.dir) {case UP:snake.coor[0].y -= snake.speed;break;case DOWN:snake.coor[0].y += snake.speed;break;case LEFT:snake.coor[0].x -= snake.speed;break;case RIGHT:snake.coor[0].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[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);}
}

http://www.ppmy.cn/embedded/156739.html

相关文章

Vue3初学之Element Plus Dialog对话框,Message组件,MessageBox组件

Dialog的使用&#xff1a; 控制弹窗的显示和隐藏 <template><div><el-button click"dialogVisible true">打开弹窗</el-button><el-dialogv-model"dialogVisible"title"提示"width"30%":before-close&qu…

matlab绘图——彩色螺旋图

代码生成的图形是一个动态的彩色螺旋&#xff0c;展示了如何利用极坐标和颜色映射创建视觉吸引力强的图形。该图形可以用于数据可视化、艺术创作或数学演示&#xff0c;展示了 MATLAB 在图形处理方面的强大能力。通过调整 theta 和 r 的范围&#xff0c;可以创建出不同形状和复…

数据结构——实验八·学生管理系统

嗨~~欢迎来到Tubishu的博客&#x1f338;如果你也是一名在校大学生&#xff0c;正在寻找各种编程资源&#xff0c;那么你就来对地方啦&#x1f31f; Tubishu是一名计算机本科生&#xff0c;会不定期整理和分享学习中的优质资源&#xff0c;希望能为你的编程之路添砖加瓦⭐&…

RPC是什么?和HTTP区别?

RPC 是什么&#xff1f;HTTP 是什么&#xff1f; 作为一个程序员&#xff0c;假设我们需要从A电脑的进程发送一段数据到B电脑的进程&#xff0c;我们一般会在代码中使用 Socket 进行编程。 此时&#xff0c;可选性一般就是 TCP 和 UDP 二选一&#xff0c;由于 TCP 可靠、UDP 不…

GitCode 助力 AutoTable:共创 MyBatis 生态的自动表格管理新篇章

项目仓库https://gitcode.com/dromara/auto-table 解放双手&#xff0c;专注业务&#xff1a;MyBatis 生态的“自动表格”创新 AutoTable 是一款致力于为 MyBatis 生态赋予“自动表格”功能的创新插件。其核心理念是通过 Java 实体类自动生成和维护数据库的表结构&#xff0c…

汽车制造行业案例 | 发动机在制造品管理全解析(附解决方案模板)

目录 前言概述 业务背景 典型业务难题 智能制造解决思路 1.建立工序协同机制与动态调度系统 2.构建在制品全生命周期质量追溯平台 3.自定义搭建数字化智能生产计划 4.全方位设备预防性管理与应急管理 智能制造模板 前言概述 在制品管理是指对企业生产过程中处于加工、…

把网站程序数据上传到服务器的方法和注意事项

将网站程序数据上传到服务器是一个常见的网站开发和部署流程。主要涉及到FTP上传、FileZilla、rsync(在Linux下)、或其他相关的文件同步工具。以下是一般步骤和方法&#xff1a; 使用FTP&#xff1a; 1. 选择FTP客户端软件&#xff1a; - 常见的FTP客户端包括FileZilla(开源)、…

No.36 学习 | Python 函数:从基础到实战

最近我在学 Python 编程&#xff0c;今天可算是狠狠钻研了一把 Python 里的函数&#xff0c;感觉脑袋里的知识又充实了不少&#xff0c;赶紧来记一记。 一、Python函数基础概念 &#xff08;一&#xff09;pass语句&#xff1a;代码块的“占位符” 在编写代码时&#xff0c;有…