资讯详情

资讯详情

27个经典趣味C++程序:从猜数字到贪吃蛇的练手合集

简介这份资源是面向C初学者与进阶学习者的27个经典趣味程序合集以“边玩边学”的方式帮助读者打通从语法基础到项目实战的路径。压缩包共184个文件约222KB包含28个cpp源码、26套VC工程文件dsw、dsp、opt、ncb、plg以及19个doc说明文档和若干txt、dat数据文件工程结构完整可直接编译运行。内容覆盖Hello World变体、数据类型与变量、数组与字符串处理、指针与内存管理、类与继承多态等面向对象特性并延伸至STL容器与算法、函数重载、异常处理、文件输入输出和模板编程还包含简单游戏、数学问题求解器、文本分析工具等趣味小项目。已有174人学习适合希望用短小案例巩固C核心概念、积累可复用代码片段的编程爱好者。1. 27个经典趣味C程序从猜数字到贪吃蛇一份能跑能改的练手合集很多人学完 C 语法就卡在“下一步写什么”上——指针、引用、类都懂了但打开 IDE 面对空白文件发呆。这份资源里打包了 27 个经典趣味程序从控制台猜数字、井字棋到贪吃蛇、俄罗斯方块、简易计算器覆盖了 C 初学者到进阶练手最需要的场景。它适合刚学完基础语法想找项目练手的学生也适合想拿几个小 Demo 快速验证编译器环境的老手。每个程序都是独立可编译的单文件或小工程拿来就能跑跑完就能改。下面我按“能干什么 → 怎么跑 → 怎么改”的顺序把这 27 个程序拆开讲清楚。2. 项目定位与技术栈27 个程序分别练什么2.1 程序分类与难度分布这 27 个程序不是随便凑数的按难度和知识点大致能分成四档。第一档是纯逻辑练习比如猜数字、九九乘法表、素数判断主要练循环和条件分支第二档引入数组和字符串比如学生成绩统计、字符串反转、简易通讯录第三档开始用结构体和类比如图书管理、银行账户模拟第四档是综合项目带图形界面或控制台动画比如贪吃蛇、俄罗斯方块、五子棋。难度档位代表程序核心知识点代码规模入门猜数字、乘法表循环、分支、随机数50100 行基础成绩统计、字符串处理数组、字符串、函数100200 行进阶图书管理、银行账户结构体、类、文件读写200400 行综合贪吃蛇、俄罗斯方块面向对象、图形库、游戏循环400800 行这个分布的好处是你不需要一上来就啃贪吃蛇可以从猜数字开始每完成一档就往上跳一级。我一般建议先挑一个入门档的跑通确认编译环境没问题再挑一个进阶档的读代码最后拿综合档的改功能。2.2 技术栈与依赖说明这批程序绝大多数是标准 C 写的不依赖第三方库用 g 或 MSVC 直接编译就能跑。少数几个带图形界面的程序用了 EasyX 或 SDL2这两个库在 Windows 上比较常见Linux 下需要额外装开发包。文件读写部分用的是 C 标准库的 fstream没有用数据库数据直接存文本文件。注意如果你在 Linux 或 macOS 下编译带图形界面的程序需要先把 EasyX 替换成 SDL2 或直接用控制台版本否则会报找不到头文件的错误。常见做法是先看程序开头 include 了哪些头文件如果只有 iostream、fstream、string 这些那就是纯标准 C随便哪个平台都能编。如果看到 graphics.h 或 easyx.h那就是 Windows 专用的换平台要改。2.3 目录结构与文件组织解压后一般是一个主目录下面按程序名分文件夹每个文件夹里有一个或多个 .cpp 文件偶尔带一个 .h 头文件。有些程序会把数据文件比如通讯录的 contacts.txt也放在同目录下。整体结构很扁平没有复杂的构建系统不需要 CMake 或 Makefile直接命令行编译就行。# 典型的目录结构 27个经典趣味C程序/ ├── 01_猜数字/ │ └── guess_number.cpp ├── 02_九九乘法表/ │ └── multiplication_table.cpp ├── ... ├── 15_图书管理/ │ ├── library.h │ └── library.cpp ├── ... └── 27_贪吃蛇/ ├── snake.cpp └── data.txt这种扁平结构的好处是找代码快坏处是程序之间没有共享代码每个都是独立的。如果你想把它改成一个统一的项目需要自己抽公共模块这个后面讲二次开发时会说。3. 编译与运行从第一个程序到贪吃蛇3.1 环境准备与编译器选择跑这批程序你只需要一个 C 编译器。Windows 下推荐 MinGW-w64 或 Visual Studio 的 MSVCLinux 下用 gmacOS 下用 clang。版本方面C11 及以上就行大部分程序没有用到 C17 的新特性。如果你用 Visual Studio新建空项目把 .cpp 文件加进去直接 F5 就能跑。# Linux/macOS 下编译单个程序 g -stdc11 guess_number.cpp -o guess_number ./guess_number # Windows MinGW 下编译 g -stdc11 guess_number.cpp -o guess_number.exe guess_number.exe参数说明-stdc11指定标准版本-o指定输出文件名。如果程序用了图形库需要额外加-lgraphics或-lSDL2链接选项。编译报错时先看是不是头文件路径不对再看是不是标准版本太低。3.2 控制台程序的运行流程以猜数字为例运行后程序会随机生成一个 1 到 100 的数然后提示你输入猜测。每次输入后告诉你是大了还是小了直到猜中为止。这个流程虽然简单但包含了 C 程序的基本骨架输入、处理、输出、循环、条件判断。// guess_number.cpp 核心逻辑 #include iostream #include cstdlib #include ctime int main() { srand(time(0)); // 用当前时间初始化随机种子 int target rand() % 100 1; // 生成 1-100 的随机数 int guess 0; int tries 0; std::cout 猜一个 1-100 的数字 std::endl; while (guess ! target) { std::cin guess; tries; if (guess target) { std::cout 大了 std::endl; } else if (guess target) { std::cout 小了 std::endl; } else { std::cout 猜中了用了 tries 次 std::endl; } } return 0; }这段代码的关键点有三个srand(time(0))保证每次运行随机数不同rand() % 100 1控制范围while循环让程序持续接收输入直到猜中。如果你想改成 1 到 1000只需要把 100 改成 1000其他不用动。3.3 图形界面程序的特殊处理贪吃蛇和俄罗斯方块这类程序在 Windows 下通常用 EasyX 图形库。你需要先安装 EasyX然后在 Visual Studio 里配置包含目录和库目录。如果不想装 EasyX可以找控制台版本的替代实现或者用 SDL2 重写绘图部分。// 贪吃蛇的初始化片段EasyX 版本 #include graphics.h #include conio.h int main() { initgraph(640, 480); // 创建 640x480 的窗口 setbkcolor(WHITE); // 设置背景色 cleardevice(); // 清屏 // ... 游戏主循环 closegraph(); // 关闭窗口 return 0; }initgraph创建窗口closegraph关闭窗口中间是游戏循环。如果你在 Linux 下跑需要把graphics.h换成 SDL2 的SDL.h把initgraph换成SDL_Init和SDL_CreateWindow绘图函数也要对应替换。这个改造量不大但需要你对 SDL2 有基本了解。提示图形界面程序最容易翻车的地方是窗口创建失败通常是库没链接对或者显卡驱动不兼容。先跑一个最小窗口测试确认环境没问题再跑完整游戏。4. 核心模块拆解从代码看设计思路4.1 数据结构与类的设计进阶档的程序开始用类和结构体组织数据。以图书管理为例通常会定义一个 Book 类包含书名、作者、ISBN、借阅状态等字段再用一个 vector 或数组存所有书。这种设计把数据和操作封装在一起比纯用数组清晰得多。// library.h 中的 Book 类定义 class Book { public: std::string title; std::string author; std::string isbn; bool isBorrowed; Book(std::string t, std::string a, std::string i) : title(t), author(a), isbn(i), isBorrowed(false) {} void borrow() { isBorrowed true; } void returnBook() { isBorrowed false; } bool isAvailable() const { return !isBorrowed; } };构造函数初始化字段borrow和returnBook修改借阅状态isAvailable查询是否可借。这种封装的好处是外部代码不需要直接改isBorrowed而是通过方法调用以后加日志或权限检查都方便。如果你要加一个“预约”功能只需要在类里加一个reserve方法不用改外部逻辑。4.2 文件读写与数据持久化通讯录、图书管理这类程序需要把数据存到文件里下次运行还能读回来。标准做法是用 fstream 写文本文件每行一条记录字段之间用逗号或制表符分隔。读的时候按行读再用字符串流拆分字段。// 保存图书数据到文件 void saveBooks(const std::vectorBook books, const std::string filename) { std::ofstream out(filename); for (const auto b : books) { out b.title , b.author , b.isbn , b.isBorrowed \n; } out.close(); } // 从文件加载图书数据 std::vectorBook loadBooks(const std::string filename) { std::vectorBook books; std::ifstream in(filename); std::string line; while (std::getline(in, line)) { std::stringstream ss(line); std::string title, author, isbn, borrowed; std::getline(ss, title, ,); std::getline(ss, author, ,); std::getline(ss, isbn, ,); std::getline(ss, borrowed, ,); Book b(title, author, isbn); if (borrowed 1) b.borrow(); books.push_back(b); } return books; }保存时用逗号分隔加载时用getline按逗号拆分。这里有个坑如果书名里本身有逗号就会拆错。常见做法是把逗号替换成其他不常用字符或者用引号把字段包起来。我一般会先用简单方案跑通等数据量大了再换成 JSON 或 SQLite。4.3 游戏循环与事件处理贪吃蛇和俄罗斯方块的核心是游戏循环每帧检测输入、更新状态、重绘画面。贪吃蛇的循环里蛇每移动一格就要判断是否吃到食物、是否撞墙、是否撞到自己。俄罗斯方块还要处理方块下落、旋转、消行。// 贪吃蛇主循环简化版 while (!gameOver) { if (_kbhit()) { // 检测键盘输入 char ch _getch(); switch (ch) { case w: dir UP; break; case s: dir DOWN; break; case a: dir LEFT; break; case d: dir RIGHT; break; } } moveSnake(); // 根据方向移动蛇 if (checkCollision()) gameOver true; if (eatFood()) growSnake(); draw(); // 重绘画面 Sleep(100); // 控制速度 }_kbhit检测是否有按键_getch读取按键Sleep(100)控制游戏速度。这个循环每 100 毫秒跑一次蛇就移动一格。如果你想调速度改Sleep的参数就行改小变快改大变慢。撞墙和撞自己的判断在checkCollision里吃到食物后蛇变长在growSnake里。注意_kbhit和_getch是 Windows 特有的Linux 下需要用kbhit和getch的替代实现或者用 ncurses 库。这是跨平台移植时最常见的坑。5. 避坑与常见问题编译报错、乱码、闪退怎么查5.1 编译报错找不到头文件现象编译时提示fatal error: graphics.h: No such file or directory。原因图形库没安装或者包含路径没配。解决Windows 下装 EasyX 后在项目属性里把 EasyX 的 include 目录加到“附加包含目录”Linux 下装 SDL2 开发包用pkg-config --cflags sdl2获取编译参数。5.2 控制台中文乱码现象程序输出中文变成乱码。原因源文件编码和终端编码不一致。解决Windows 下把源文件存成 GBK 编码或者在程序开头加system(chcp 65001)切到 UTF-8Linux 下一般默认 UTF-8不用改。我一般会在 Windows 下统一用 GBK省得折腾。5.3 程序运行一闪而过现象双击 exe 后窗口闪一下就没了。原因程序跑完直接退出没有暂停。解决在return 0前加system(pause)或std::cin.get()。这个坑新手最容易踩尤其是用 IDE 的“开始执行不调试”时。5.4 文件读写失败现象程序提示“无法打开文件”或读出来是空的。原因文件路径不对或者文件不存在。解决用绝对路径或者确认程序的工作目录和文件在同一层。Visual Studio 默认工作目录是项目目录不是 exe 所在目录这个很容易搞混。5.5 随机数每次一样现象猜数字每次目标数都相同。原因没调srand或者种子固定。解决在main开头加srand(time(0))并且只调一次。如果在循环里反复调srand随机数会变得有规律这也是个常见翻车点。6. 二次开发与改造把这 27 个程序变成自己的项目6.1 从单文件到多文件工程这 27 个程序大多是单文件适合练手但不适合做大。如果你想拿其中一个当基础做扩展第一步是把代码拆成 .h 和 .cpp。比如图书管理把 Book 类放到 book.h把增删改查逻辑放到 library.cppmain.cpp 只负责菜单和调用。这样改起来清晰也方便加单元测试。// book.h #pragma once #include string class Book { public: std::string title; std::string author; std::string isbn; bool isBorrowed; Book(std::string t, std::string a, std::string i); void borrow(); void returnBook(); bool isAvailable() const; };// book.cpp #include book.h Book::Book(std::string t, std::string a, std::string i) : title(t), author(a), isbn(i), isBorrowed(false) {} void Book::borrow() { isBorrowed true; } void Book::returnBook() { isBorrowed false; } bool Book::isAvailable() const { return !isBorrowed; }拆完之后编译命令变成g main.cpp library.cpp book.cpp -o library。如果文件多了写个 Makefile 或 CMakeLists.txt 会更省事。6.2 加功能从控制台到图形界面如果你想给猜数字加个图形界面可以用 Qt 或 SDL2 重写输入输出部分。核心逻辑不用动只把std::cin和std::cout换成界面控件。比如用 Qt 的话把猜数字逻辑放在一个 QWidget 子类里按钮点击触发判断文本框显示结果。改造方向原实现改造方案工作量加图形界面控制台输入输出Qt/SDL2 重写 UI中等加数据存储文本文件SQLite 或 JSON小加网络功能单机Socket 或 HTTP大加单元测试无Catch2 或 Google Test小我一般会先挑一个程序把它的核心逻辑抽成一个函数或类然后写两三个测试用例确保改 UI 的时候逻辑没坏。这个习惯能省很多调试时间。6.3 代码重构与性能优化这 27 个程序里有些写法比较老派比如用裸数组而不是 vector用 char* 而不是 string。如果你要拿它们当项目基础建议先做一轮现代化改造把数组换成 vector把 char* 换成 string把手动内存管理换成智能指针。这样代码更安全也更容易维护。// 改造前裸数组 int scores[100]; int count 0; // 改造后vector std::vectorint scores; scores.push_back(95);另一个优化点是减少全局变量。很多小程序喜欢用全局变量存状态改起来容易出玄学 bug。把状态封装到类里通过参数传递代码会清晰很多。这个改造不需要一次做完可以边加功能边改每次改一点跑一遍测试确认没问题再继续。6.4 验证方法与调试技巧改完代码怎么确认没改坏我的做法是先跑一遍原程序记下几个关键输出改完之后再跑对比输出是否一致。对于游戏类程序录一段操作序列改前改后各跑一遍看结果是否相同。如果输出不一致用断点或日志定位到具体哪一步开始偏的。提示改代码前先提交一次版本改完对比 diff这样出问题能快速回滚。没有版本控制的话至少复制一份原文件备份。从那以后我每次改这类练手项目都强制先跑通原版、再动代码、改完对比输出三步走完才提交。希望这些拆解能帮你把这 27 个程序真正用起来而不是解压完就放在硬盘里吃灰。本文还有配套的精品资源点击获取
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →