C++ 多文件编程教学(纯控制台)
先说说什么是不要重复造轮子
"重复造轮子"的英文是"Reinventing the wheel",更准确的翻译是"重复发明轮子" 。大家都知道,圆形车轮是最好的选择,但如果你非要发明一种新形状的轮子,那就叫"重复发明轮子"。类比到IT行业,就是明知道你的项目不可能比前辈做得更好,却仍然坚持要做。比如一些框架、库、工具等等。根据这个定义来看,为什么说**"不要重复造轮子"的原因就显而易见了**。这是一种严重拖慢项目进度和工作节奏的做法 。我们都知道程序员每天都要跟代码打交道。但一个成熟的轮子,这不是简简单单一两个程序员就能完成的工作。
放着成熟的轮子不使用,反而闷头造轮子。浪费时间都是小事儿,新造的轮子是否稳定,能否完成项目需求,在使用过程中会不会引起其他问题,这些都是未知数 。一旦因为这样的问题导致项目搁浅或者崩盘,那就不是造不造轮子的问题了,而是要不要找工作的问题了。
任何事物都有两面性,造轮子也不例外 。比如,现成的所有轮子都不能完美匹配我们的需求 ,那就只能自己在这些轮子的基础上造适合自己的轮子。这是无奈之举,但也会对个人的能力带来很大的提升。除此之外,还有在学习过程中,单纯为了提升自己 。拿到一个轮子开始学着造,轮子就算做完也没指望能用在哪里,只是以此作为一个学习手段。这种学习方法无论是对于刚入行渴望提升技术的小白,还是希望在某些方面稍微精进一下的老手,都是极好的。
DevC++中使用EGE这个轮子
DevC++中配置EGE的过程参考
中的这个板块
EGE19这个库的用法
一、EGE 是什么
EGE 是一个C++ 图形库,可以让你用代码画出:窗口、线条、矩形、圆形、文字、图片、小游戏等。
二、必须会的 6 个基础函数(学生必背)
| 函数 | 作用 |
|---|---|
initgraph(width, height); |
创建图形窗口 |
closegraph(); |
关闭图形窗口 |
getch(); |
暂停窗口,不让它一闪而过 |
setcolor(RED); |
设置画笔颜色 |
line(x1,y1,x2,y2); |
画直线 |
outtextxy(x,y,"文字"); |
在窗口上输出文字 |
三、最简单入门程序:打开一个窗口
cpp
#include <graphics.h> // EGE 头文件
int main()
{
// 1. 创建窗口:宽 640,高 480
initgraph(640, 480);
// 窗口会停在这里
getch();
// 关闭窗口
closegraph();
return 0;
}

四、基础案例 1:画线条 + 矩形 + 圆形
cpp
#include <graphics.h>
int main()
{
initgraph(640, 480);
setcolor(RED); // 红色画笔
line(100,100, 300,100); // 画线
setcolor(GREEN);
rectangle(100,150, 300,250); // 画矩形
setcolor(BLUE);
circle(320,240, 50); // 画圆形
getch();
closegraph();
return 0;
}

五、基础案例 2:窗口上显示文字
cpp
#include <graphics.h>
int main()
{
initgraph(640, 480);
// 设置字体大小
setfont(40, 0, "微软雅黑");
// 在 (100,100) 位置输出文字
outtextxy(100, 100, "Hello EGE!");
outtextxy(100, 180, "欢迎来到图形编程");
getch();
closegraph();
return 0;
}
需要注意的事情,在DevC++中,可以直接输出中文,而在VSCode中需要加宽字符
cpp
// EGE图形库核心头文件,必须包含
#include <graphics.h>
// 宽字符支持头文件(用于处理中文等多字节字符)
#include <cwchar>
// 本地化头文件,用于解决中文显示乱码问题
#include <locale.h>
// 程序主函数,程序入口
int main()
{
// ======================================
// 【核心】设置编码为 UTF-8,解决中文乱码
// 全程统一使用 UTF-8 编码,不报错、不乱码
// ======================================
setlocale(LC_ALL, ".UTF-8");
// ======================================
// 1. 初始化图形窗口
// 参数:宽度 800,高度 400
// ======================================
initgraph(800, 400);
// ======================================
// 2. 设置窗口背景颜色为白色
// ======================================
setbkcolor(WHITE);
// ======================================
// 3. 清空屏幕,应用背景色
// ======================================
cleardevice();
// ======================================
// 4. 设置字体样式
// 参数1:字体高度 40
// 参数2:字体宽度 0(自动适配)
// 参数3:字体名称:微软雅黑
// 【注意】这里不使用 L,全程 UTF-8 兼容
// ======================================
setfont(40, 0, "微软雅黑");
// ======================================
// 5. 设置文字颜色为蓝色
// ======================================
setcolor(BLUE);
// ======================================
// 6. 在窗口指定坐标输出中文文本
// 格式:outtextxy(x坐标, y坐标, "文字内容")
// 直接写中文,无需 L 前缀,UTF-8 稳定显示
// ======================================
outtextxy(200, 100, "欢迎使用 EGE 图形库");
outtextxy(200, 180, "全程 UTF-8 编码,无乱码");
outtextxy(200, 260, "不报错、不炸编码、稳定运行");
// ======================================
// 等待用户按任意键,防止窗口一闪而过
// ======================================
getch();
// ======================================
// 关闭图形窗口,释放资源
// ======================================
closegraph();
// 程序正常结束
return 0;
}

六、基础案例 3:彩色背景 + 文字
cpp
#include <graphics.h>
int main()
{
initgraph(640, 480);
setbkcolor(WHITE); // 白色背景
cleardevice(); // 刷新背景
setcolor(BLACK);
setfont(35, 0, "黑体");
outtextxy(120, 200, "这是我的第一个EGE程序");
getch();
closegraph();
return 0;
}

七、基础案例 4:移动的小球(最简单动画)
cpp
// 包含 EGE 图形库头文件(必须有,才能使用画图函数)
#include <graphics.h>
// 主函数:程序入口
int main()
{
// 1. 初始化图形窗口,宽度 640,高度 480
initgraph(640, 480);
// 小球的初始坐标 x(横向)、y(纵向)
int x = 50, y = 240;
// 2. 死循环:不断刷新画面,形成动画
while (1)
{
// 设置背景颜色为白色
setbkcolor(WHITE);
// 清空屏幕,用背景色刷新整个窗口
cleardevice();
// 设置画笔颜色为红色
setcolor(RED);
// 画一个圆形:圆心 (x,y),半径 30
circle(x, y, 30);
// 让小球每次向右移动 2 个像素
x += 2;
// 暂停 10 毫秒,控制移动速度
Sleep(10);
}
// 下面两行理论上不会执行,因为上面是死循环
// 关闭图形窗口
closegraph();
// 程序正常结束
return 0;
}

八、基础案例5:根据WASD移动的小球
cpp
// 包含 EGE 图形库头文件(必须有,才能使用画图函数)
#include <graphics.h>
// 主函数:程序入口
int main()
{
// 1. 初始化图形窗口,宽度 640,高度 480
initgraph(640, 480);
// 小球的初始坐标 x(横向)、y(纵向)
int x = 50, y = 240;
// 小球每次移动的速度
int speed = 5;
// 2. 死循环:不断刷新画面,形成动画
while (1)
{
// ==========================================
// 【键盘检测】获取用户按下的键
// ==========================================
if (kbhit()) { // 如果有按键被按下
char key = getch(); // 获取按键字符
// W:向上移动(y 减小)
if (key == 'w' || key == 'W') {
y -= speed;
}
// S:向下移动(y 增大)
else if (key == 's' || key == 'S') {
y += speed;
}
// A:向左移动(x 减小)
else if (key == 'a' || key == 'A') {
x -= speed;
}
// D:向右移动(x 增大)
else if (key == 'd' || key == 'D') {
x += speed;
}
}
// ==========================================
// 绘制画面
// ==========================================
// 设置背景颜色为白色
setbkcolor(WHITE);
// 清空屏幕,用背景色刷新整个窗口
cleardevice();
// 设置画笔颜色为红色
setcolor(RED);
// 画一个圆形:圆心 (x,y),半径 30
circle(x, y, 30);
// 暂停 10 毫秒,控制画面刷新率
Sleep(10);
}
// 关闭图形窗口
closegraph();
// 程序正常结束
return 0;
}
九、5 条超简规则
- 必须写
#include <graphics.h> - 必须先
initgraph创建窗口 - 画图前可以用
setcolor设置颜色 - 最后用
getch()让窗口停留 - 结束用
closegraph()关闭





