C++ 学习

已学会 0 / 0 课

82 节课从环境安装一路讲到算法竞赛与游戏开发,页内还有 机器人闯关 与 Flappy 游戏教程;学完就回 题库评测 练真题,通过题目能赚 Kimi 币。

🐤 C++ 游戏开发实战:从零做出 Flappy Bird

6 个步骤 · EasyX 图形库 · Windows

跟着下面 6 步走,你将在自己的电脑上编译出一款真正能玩的 Flappy Bird:小鸟下落、按空格扇翅膀、躲管道、计分、Game Over 重开——图形游戏的一切核心概念(窗口、素材、游戏循环、碰撞检测)都会在过程中学会。所需环境:Windows 电脑 + Dev-C++(或 Visual Studio)+ EasyX 图形库,全部免费。

第 0 步 · 准备环境:10 分钟装好 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> 不报错就成功了。

graphics.h 是 EasyX 的主头文件,它已经帮你包含了 windows.h,所以后面不需要再写。
第 1 步 · 第一扇窗:initgraph,图形游戏的画布

所有 2D 游戏的第一步都是「开一扇窗」。EasyX 里就一个函数:

#include <graphics.h>

int main() {
    initgraph(480, 700);        // 开一扇 480 x 700 像素的窗口
    while (!getch());           // 等按任意键(先占住画面)
    closegraph();               // 关闭窗口
    return 0;
}

运行它,你会得到一个空黑的窗口——这就是游戏的画布,接下来所有东西都画在上面。

第 2 步 · 素材导入:把图片装进游戏

游戏画面=背景图+角色图。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);         // 黑色部分自动变透明
本教程为了让你专注逻辑,主代码里小鸟和管道先用图形函数画(solidellipse 画圆鸟、solidrectangle 画管道柱),跑通后把绘制那几行换成 putimage / transparentimage,就升级成完整素材版了。
第 3 步 · 会飞的小鸟:重力、跳跃与游戏循环

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()。

GetAsyncKeyState 是 windows.h 的键盘检测函数(返回值 & 0x8000 表示「这一刻正被按下」),不用等回车,适合游戏实时响应。
第 4 步 · 管道:数组 + 随机缺口

管道本质是三根「从右往左走、带随机缺口」的柱子。用数组存它们的状态,每帧左移,走出屏幕就回到右边并换随机高度:

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)。

第 5 步 · 碰撞与计分,然后完工

碰撞:把小鸟看成一个圆、管道看成矩形,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 循环 ↓

最终代码 · 复制进 Dev-C++ 直接编译运行
// 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 步的图片素材(transparentimage);② 加「最高分」——存进文件,下次启动读回来;③ 让管道速度随分数越来越快。做完这三件事,你就超过 90% 只看过教程没动手的人了。

🤖 编程一小时:机器人闯关

0 / 7 关通关

不用打字——点按钮给机器人排指令,点「▶ 运行」看它一步步执行。帮它吃掉所有 ⭐ 再停在 🏁。指令格有限:点击已排的指令可以调重复次数(×2、×3…相当于循环),用最少的格子过关,这就是编程思维。

选好指令后点「▶ 运行」
指令面板
我的程序(点指令块调次数,超过 ×6 再点一下删除)

🐱 Scratch 创作站(TurboWarp)

↗ 新标签页打开

站内直接编写 Scratch 项目——拖积木、搭角色、做小游戏,全程不用安装(编辑器由 Scratch 官方提供)。写好的项目用编辑器「文件 → 保存到电脑」导出 .sb3;想用更强大的 TurboWarp 版编辑器可点右上角「↗ 新标签页打开」。也可以切到「玩项目」,粘贴别人分享的链接直接玩。

🛠 编辑器加载中,稍等几秒…
左上角「文件」菜单可以保存 / 打开项目

📚 算法与数据结构

点卡片看讲解 · 带动画演示

这里是配套 C++ 进阶课程(学习卡片第 60+ 课)的可视化参考手册:点开任何一张卡片,能看到它是干什么的、快不快、以及能直接抄进 Dev-C++ 的示例代码。标 🎬 的排序算法还有柱状条动画,亲眼看它们怎么把乱序变成有序。