82 节课从环境安装一路讲到算法竞赛与游戏开发,页内还有 机器人闯关 与 Flappy 游戏教程;学完就回 题库评测 练真题,通过题目能赚 Kimi 币。
跟着下面 6 步走,你将在自己的电脑上编译出一款真正能玩的 Flappy Bird:小鸟下落、按空格扇翅膀、躲管道、计分、Game Over 重开——图形游戏的一切核心概念(窗口、素材、游戏循环、碰撞检测)都会在过程中学会。所需环境:Windows 电脑 + Dev-C++(或 Visual Studio)+ EasyX 图形库,全部免费。
C++ 标准库只能做黑窗口(控制台),画图需要图形库。国内最常用的是 EasyX——专门为初学者设计的 Windows 图形库,一个头文件就能画图。
1. 到官网 easyx.cn 下载 EasyX 安装包;
2. 双击运行,它会自动检测你电脑上的编译器(Dev-C++ 对应 TDM-GCC,Visual Studio 对应 VC),勾选后点「Install」;
3. 装完重启 Dev-C++,新建一个「Source File」,输入 #include <graphics.h> 不报错就成功了。
所有 2D 游戏的第一步都是「开一扇窗」。EasyX 里就一个函数:
#include <graphics.h>
int main() {
initgraph(480, 700); // 开一扇 480 x 700 像素的窗口
while (!getch()); // 等按任意键(先占住画面)
closegraph(); // 关闭窗口
return 0;
}
运行它,你会得到一个空黑的窗口——这就是游戏的画布,接下来所有东西都画在上面。
游戏画面=背景图+角色图。EasyX 用三步导入素材:定义 → 载入 → 绘制:
IMAGE bg; // 1. 定义图像对象
loadimage(&bg, "bg.jpg", 480, 700); // 2. 从文件载入(自动缩放到窗口大小)
putimage(0, 0, &bg); // 3. 画到屏幕 (0,0) 处
注意:图片文件要和编译出的 .exe 在同一个文件夹(Dev-C++ 编译后 .exe 在源代码目录里)。背景、云朵等不透明素材用 putimage;小鸟这种带轮廓的角色图,底色填纯黑,用透明绘制函数叠上去:
IMAGE bird;
loadimage(&bird, "bird.bmp", 48, 42);
transparentimage(BX, y, &bird); // 黑色部分自动变透明
Flappy Bird 的「飞」其实非常简单:小鸟一直在下落,按键只是把速度瞬间改成向上。这就是所有平台跳跃游戏的物理雏形:
double by = 320, v = 0; // 纵坐标、速度
const double G = 0.5, JUMP = -8.5; // 重力加速度、起跳速度
while (1) {
if (GetAsyncKeyState(VK_SPACE) & 0x8000) v = JUMP; // 空格被按住
v += G; // 重力:每帧加速下落
by += v; // 位置 = 位置 + 速度
// 画小鸟 → 翻页 → Sleep(16) 控制约 60 帧/秒
}
实时游戏的骨架就是「输入 → 更新 → 绘制」每秒转 60 圈的死循环。画面闪烁的话,用 EasyX 的双缓冲三件套解决:BeginBatchDraw() 开头开一次,每帧末尾 FlushBatchDraw(),循环外 EndBatchDraw()。
管道本质是三根「从右往左走、带随机缺口」的柱子。用数组存它们的状态,每帧左移,走出屏幕就回到右边并换随机高度:
double px[3] = {480, 700, 920}; // 三根管道的 x
int gy[3]; // 每根管道缺口中心
for (int i = 0; i < 3; i++) gy[i] = 200 + rand() % 300;
// 每帧:
for (int i = 0; i < 3; i++) {
px[i] -= SPD; // 左移
if (px[i] < -PW) { // 完全走出屏幕
px[i] += 660; // 回到最右边
gy[i] = 200 + rand() % 300; // 换一个新缺口
}
}
绘制时以上下两根实心矩形夹出缺口:solidrectangle(x, 0, x+PW, gy-GAP/2) 和 solidrectangle(x, gy+GAP/2, x+PW, 700)。
碰撞:把小鸟看成一个圆、管道看成矩形,x 方向重叠且小鸟越出缺口上下沿就算撞:
if (BX + R > px[i] && BX - R < px[i] + PW) // 横向重叠
if (by - R < gy[i] - GAP/2 || by + R > gy[i] + GAP/2)
dead = 1; // 撞了
计分:给每根管道一个 pass 标记,管道完全越过小鸟时加 1 分,防止重复计分。结束与重开:dead 后停掉物理更新、画 GAME OVER,按 R 键把所有状态变量恢复初值——「重开」不过是给状态变量重新赋值而已。
到这里所有部件都齐了,把它们拼进同一个 while 循环 ↓
// Flappy Bird · EasyX 版 —— Kimi 大厅游戏开发教程毕业作
// 环境:Windows + Dev-C++(需先安装 EasyX,见第 0 步)
#include <graphics.h>
#include <stdio.h>
#include <time.h>
int main() {
initgraph(480, 700); // 开窗
srand((unsigned)time(NULL));
BeginBatchDraw(); // 双缓冲防闪
// 小鸟:纵坐标 by、速度 v、固定横坐标 BX、半径 R
double by = 320, v = 0;
const double G = 0.5, JUMP = -8.5;
const int BX = 120, R = 18;
// 三根管道:x 坐标 / 缺口中心 / 是否已计分
double px[3] = {480, 700, 920};
int gy[3], pass[3] = {0};
for (int i = 0; i < 3; i++) gy[i] = 200 + rand() % 300;
const double PW = 70, GAP = 210, SPD = 3.2; // 宽 / 缺口 / 速度
int score = 0, dead = 0;
while (1) {
// ---- 1. 输入 ----
if (GetAsyncKeyState(VK_SPACE) & 0x8000) v = JUMP;
if (dead && GetAsyncKeyState('R') & 0x8000) { // R 重开
dead = 0; score = 0; by = 320; v = 0;
for (int i = 0; i < 3; i++) { px[i] = 480 + i * 220; gy[i] = 200 + rand() % 300; pass[i] = 0; }
}
if (!dead) {
// ---- 2. 更新 ----
v += G; by += v; // 重力下落
if (by > 700 - R) dead = 1; // 掉地
if (by < R) { by = R; v = 0; } // 顶到天花板
for (int i = 0; i < 3; i++) {
px[i] -= SPD;
if (px[i] < -PW) { px[i] += 660; gy[i] = 200 + rand() % 300; pass[i] = 0; }
if (!pass[i] && px[i] + PW < BX - R) { pass[i] = 1; score++; }
}
for (int i = 0; i < 3 && !dead; i++) // 碰撞检测
if (BX + R > px[i] && BX - R < px[i] + PW)
if (by - R < gy[i] - GAP / 2 || by + R > gy[i] + GAP / 2) dead = 1;
}
// ---- 3. 绘制 ----
cleardevice();
setfillcolor(RGB(112, 219, 112));
for (int i = 0; i < 3; i++) {
solidrectangle((int)px[i], 0, (int)px[i] + PW, gy[i] - GAP / 2);
solidrectangle((int)px[i], gy[i] + GAP / 2, (int)px[i] + PW, 700);
}
setfillcolor(RGB(255, 200, 40));
solidellipse(BX - R, (int)by - R, BX + R, (int)by + R); // 小鸟
setfillcolor(WHITE);
solidcircle(BX + 8, (int)by - 5, 4); // 眼睛
settextstyle(28, 0, "Consolas");
settextcolor(WHITE);
char buf[32]; sprintf(buf, "score %d", score);
outtextxy(16, 14, buf);
if (dead) {
outtextxy(160, 300, "GAME OVER");
outtextxy(130, 340, "press R to restart");
}
FlushBatchDraw();
Sleep(16); // 约 60 帧/秒
}
EndBatchDraw();
closegraph();
return 0;
}
按 F11 编译运行:空格控制小鸟穿过管道,撞管道或掉地结束,按 R 重来。恭喜,你的第一个 C++ 图形游戏完成了!
不用打字——点按钮给机器人排指令,点「▶ 运行」看它一步步执行。帮它吃掉所有 ⭐ 再停在 🏁。指令格有限:点击已排的指令可以调重复次数(×2、×3…相当于循环),用最少的格子过关,这就是编程思维。
站内直接编写 Scratch 项目——拖积木、搭角色、做小游戏,全程不用安装(编辑器由 Scratch 官方提供)。写好的项目用编辑器「文件 → 保存到电脑」导出 .sb3;想用更强大的 TurboWarp 版编辑器可点右上角「↗ 新标签页打开」。也可以切到「玩项目」,粘贴别人分享的链接直接玩。
这里是配套 C++ 进阶课程(学习卡片第 60+ 课)的可视化参考手册:点开任何一张卡片,能看到它是干什么的、快不快、以及能直接抄进 Dev-C++ 的示例代码。标 🎬 的排序算法还有柱状条动画,亲眼看它们怎么把乱序变成有序。