当前位置: 首页 > news >正文

【项目思维】通过编写一个贪吃蛇小程序,并移植到嵌入式设备上,解析编程思维的本质

这篇文章是一个 专门服务于新手向 的博客,通过编写一个贪吃蛇小程序,并将这个小游戏移植到嵌入式设备上(运行在 STM32 上、通过 OLED 显示、GPIO 按键控制的贪吃蛇小游戏)。

最重要的是,通过经历这个过程 讲述编程思维的本质。 在我们初学技术时,很多时候会被海洋一般的技术所围绕,这个时候需要通过一个小项目将此前学过的所有技术栈融合贯通的运用起来。而这个过程中,不仅是技术实现的展示,更是一次对 编程思维本质的深度剖析。

技术无远弗届,而这其中所蕴含的 编程思维制作一个完整项目的思维方式,才是更为关键的能力。往后的博客更新中,我会通过大型项目陆续介绍 项目运作能力。现在这篇文章解释 “什么是编程的思维”。


一、第一阶段,项目的初始版本

首先,我们需要用原生代码的方式编写一个小项目的初始模型:

下面是对 贪吃蛇小游戏实现(C语言 + 控制台)的流程步骤分解:
  1. ✅ 控制台显示界面
  2. ✅ 键盘控制(上下左右)
  3. ✅ 食物生成、得分、撞墙/自咬结束
  4. ✅ 清晰的函数组织结构
  5. ✅ 每行代码都有注释
  6. ✅ 提供伪代码 + 流程图式结构说明
项目结构与设计

✅ 1. 游戏流程伪代码

开始游戏:初始化地图和蛇生成食物显示初始界面进入主循环:如果有键盘输入,更新方向移动蛇判断是否吃到食物判断是否撞墙或撞自己如果游戏结束,跳出循环重新绘制地图延时控制速度

✅ 2. 游戏核心模块划分(函数设计)(基于伪代码)

函数名 功能
init_game() 初始化地图、蛇、食物
draw_map() 绘制游戏地图
draw_snake() 绘制蛇身
generate_food() 随机生成食物
move_snake() 控制蛇运动
check_collision() 检查是否撞墙或自撞
process_input() 获取用户按键
game_loop() 主循环

✅ 3. 每一步功能汇总

步骤 功能
1️⃣ 初始化游戏 设置蛇初始位置、长度、方向
2️⃣ 生成食物 随机不重复位置
3️⃣ 用户输入 通过 w a s d 改变方向
4️⃣ 移动蛇身 改变头部,移动身体,判断是否吃食物
5️⃣ 碰撞检测 判断撞墙或自撞
6️⃣ 绘制界面 显示蛇、食物、边框、分数
7️⃣ 游戏结束 打印 Game Over 和分数
完整 C 语言代码(Windows 控制台)[第一版]

📌 当前编译环境:Windows + gcc(支持 <conio.h>

由于内容较为简答,目前不需要模块化。

#include <stdio.h>
#include <conio.h>     // 用于 _kbhit() 和 _getch()
#include <windows.h>   // 用于 Sleep() 和清屏
#include <stdlib.h>    // 用于 rand()// 地图大小
#define WIDTH  40
#define HEIGHT 20// 方向定义
#define UP    1
#define DOWN  2
#define LEFT  3
#define RIGHT 4// 蛇身最大长度
#define MAX_SNAKE_LENGTH 100// 蛇结构
typedef struct {int x;int y;
} Point;// 游戏数据
Point snake[MAX_SNAKE_LENGTH]; // 蛇身数组
int snake_length = 3;          // 初始长度为3
int direction = RIGHT;         // 初始方向向右
Point food;                    // 食物位置
int score = 0;                 // 游戏得分
int game_over = 0;             // 游戏结束标志// 函数声明
void init_game();
void draw_map();
void draw_snake();
void generate_food();
void move_snake();
void check_collision();
void process_input();
void goto_xy(int x, int y);
int is_snake_body(int x, int y);
void game_loop();// 主函数
int main() {init_game();     // 初始化游戏game_loop();     // 开始游戏循环return 0;
}// 初始化游戏
void init_game() {// 初始蛇身snake[0].x = 10;snake[0].y = 5;snake[1].x = 9;snake[1].y = 5;snake[2].x = 8;snake[2].y = 5;generate_food(); // 生成第一个食物draw_map();      // 绘制初始地图
}// 绘制地图边框
void draw_map() {system("cls"); // 清屏for (int y = 0; y <= HEIGHT; y++) {for (int x = 0; x <= WIDTH; x++) {if (x == 0 || x == WIDTH || y == 0 || y == HEIGHT)printf("#"); // 边界else if (x == food.x && y == food.y)printf("@"); // 食物else if (is_snake_body(x, y))printf("O"); // 蛇身elseprintf(" "); // 空白}printf("\n");}printf("Score: %d\n", score); // 显示分数
}// 判断坐标是否在蛇身上
int is_snake_body(int x, int y) {for (int i = 0; i < snake_length; i++) {if (snake[i].x == x && snake[i].y == y)return 1;}return 0;
}// 随机生成食物,不能生成在蛇身上
void generate_food() {do {food.x = rand() % (WIDTH - 2) + 1;food.y = rand() % (HEIGHT - 2) + 1;} while (is_snake_body(food.x, food.y));
}// 移动蛇身
void move_snake() {// 保存头部位置Point new_head = snake[0];// 根据方向更新头部位置switch (direction) {case UP:    new_head.y--; break;case DOWN:  new_head.y++; break;case LEFT:  new_head.x--; break;case RIGHT: new_head.x++; break;}// 吃到食物if (new_head.x == food.x && new_head.y == food.y) {snake_length++;      // 蛇身变长score += 10;         // 得分增加generate_food();     // 生成新食物}// 蛇身移动:从尾到头依次移动位置for (int i = snake_length - 1; i > 0; i--) {snake[i] = snake[i - 1];}// 更新头部snake[0] = new_head;// 检查是否撞墙或自咬check_collision();
}// 检查碰撞
void check_collision() {// 撞墙if (snake[0].x <= 0 || snake[0].x >= WIDTH || snake[0].y <= 0 || snake[0].y >= HEIGHT) {game_over = 1;}// 撞自己for (int i =<
http://www.dtcms.com/a/356159.html

相关文章:

  • mysql中的通用语法及分类
  • Ubuntu下配置并远程连接MySQL
  • 平安养老险深分开展“金融护航,安居鹏城”新市民金融服务宣传活动
  • Unity+URP+WebGL抗锯齿设置
  • MTK Linux DRM分析(二十二)- MTK mtk_drm_crtc.c(Part1)
  • PDF,HTML,md格式文件在线查看工具
  • CosyVoice win10启用记
  • 【mysql】SQL 中 IS 与 = 的区别:一个 NULL 值引发的思考
  • 编译esp32报错解决办法
  • 光谱相机多层镀膜技术如何提高透过率
  • [新启航]白光干涉仪在太阳能电池片栅线高度 3D 轮廓测量中的应用解析
  • 【C语言】递归
  • 屏随人动+视觉魔方+多样主题+智能留言,涂鸦Wukong AI 2.0助力打造爆款带屏云台相机
  • 从0开始学习Java+AI知识点总结-28.Linux部署
  • PDF 24 Tools, PDF编辑工具, PDF压缩, PDF转换, PDF删除, PDF加密, 添加水印
  • 创业灵感第一集
  • OpsManage:基于Django的企业级AWS云资源运维管理平台
  • 《零基础入门AI:YOLOv2算法解析》
  • Vue开发准备
  • 医疗AI时代的生物医学Go编程:高性能计算与精准医疗的案例分析(四)
  • OpenHarmony设备使用统计深度实战:从数据埋点到信息采集的全链路方案
  • 使用 Bright Data Web Scraper API + Python 高效抓取 Glassdoor 数据:从配置到结构化输出全流程实战
  • C++ 8.28
  • Dify学习
  • Python 正则表达式完全指南:从基础语法到实战案例
  • 深入理解文本向量嵌入(Vector Embeddings):原理、实践与应用场景
  • Linux---gdb和cgdb
  • UML状态图中entry/do/exit动作的深入解析与C/C++实现
  • 《深度讲解 C 语言动态内存:函数用法、错误规避与经典笔试题》
  • 同类软件对比(二):VS Code 与 PyCharm 的 Python 开发对比与使用建议