2206 字
11 分钟

从C语言入门到c++快速实战:初学者实用指南

C++ 学习教程:从零基础到游戏开发深度指南#

欢迎学习 C++!C++ 是一种高效、灵活的编程语言,特别适合游戏开发,因为它能直接访问硬件资源(如内存和 CPU),支持高性能渲染和实时计算。许多知名游戏引擎(如 Unreal Engine、Unity 的底层)都基于 C++。这个教程将从基础开始,逐步深入,到能独立开发简单 2D/3D 游戏的程度。总深度:约 20-30 小时学习 + 练习,目标是让你能用 SFML 库实现一个完整的小游戏(如 Pong 或平台跳跃)。

学习路径概述

阶段内容预计时间目标
1. 基础设置与语法环境、变量、控制流2-3 小时写简单程序
2. 核心概念指针、数组、函数4-5 小时处理数据结构
3. 面向对象编程 (OOP)类、继承、多态5-6 小时构建模块化代码
4. 标准模板库 (STL)容器、算法3-4 小时高效数据管理
5. 高级主题异常、文件 I/O、多线程4-5 小时鲁棒程序
6. 游戏开发入门SFML 库、图形/输入/物理6-8 小时开发完整游戏

Tips

  • 练习环境:用 Visual Studio Code + MinGW (Windows) 或 g++ (Linux/macOS)。在线测试:Compiler Explorer
  • 资源:书籍《C++ Primer》;视频:Bilibili “黑马程序员 C++ 教程”;刷题:LeetCode C++ 标签。
  • 代码示例:每个节末有完整代码,可复制运行。编译命令:g++ main.cpp -o main -std=c++17(用 C++17 标准)。
  • 练习建议:每节后做 3-5 个小练习,逐步构建一个项目(如从计算器到游戏)。

阶段 1: 基础设置与语法#

先设置环境,确保能运行代码。

1.1 环境安装#
  • Windows:下载 MinGW-w64,添加 bin 到 PATH。安装 VS Code + C/C++ 扩展。
  • macOS:终端运行 xcode-select --install(安装 g++)。
  • Linuxsudo apt update && sudo apt install g++ build-essential
  • 测试:新建 hello.cpp
    #include <iostream> // 标准输入输出库
    int main() {
    std::cout << "Hello, C++!" << std::endl; // 输出
    return 0; // 程序结束
    }
    编译运行:g++ hello.cpp -o hello && ./hello。看到 “Hello, C++!” 即成功。
1.2 基本语法#
  • 变量与类型:C++ 是静态类型语言。常见类型:int (整数)、double (浮点)、char (字符)、bool (真假)、std::string (字符串)。
    #include <iostream>
    #include <string> // 字符串库
    int main() {
    int age = 25; // 声明并初始化
    double pi = 3.14159;
    std::string name = "Alice";
    bool is_student = true;
    std::cout << "Name: " << name << ", Age: " << age << std::endl;
    return 0;
    }
  • 输入输出:用 std::cin 输入。
    int main() {
    int num;
    std::cout << "Enter a number: ";
    std::cin >> num;
    std::cout << "You entered: " << num << std::endl;
    return 0;
    }
  • 控制流
    • if-else
      if (age >= 18) {
      std::cout << "Adult" << std::endl;
      } else {
      std::cout << "Minor" << std::endl;
      }
    • 循环:for、while。
      for (int i = 0; i < 5; ++i) { // ++i 是自增
      std::cout << i << " ";
      } // 输出: 0 1 2 3 4
    • switch:多分支。
      switch (day) {
      case 1: std::cout << "Monday"; break;
      default: std::cout << "Other"; break;
      }

练习

  1. 写程序计算两个数的和、差。
  2. 用循环打印 1-100 的偶数。
  3. 输入成绩,输出等级 (A:90+ 等)。

阶段 2: 核心概念#

掌握内存和函数,为 OOP 铺路。

2.1 数组与字符串#
  • 数组:固定大小集合。int arr[5] = {1,2,3,4,5};。访问:arr[0]
    #include <iostream>
    int main() {
    int scores[3] = {85, 92, 78};
    for (int i = 0; i < 3; ++i) {
    std::cout << scores[i] << " ";
    }
    return 0;
    }
  • 动态数组:用 new 分配(稍后详解指针)。
  • 字符串std::string 支持操作如 +=length()
    std::string text = "Hello";
    text += " World!";
    std::cout << text.length(); // 11
2.2 函数#
  • 定义:返回类型 函数名(参数) { 代码; return 值; }
    #include <iostream>
    int add(int a, int b) { // 参数
    return a + b;
    }
    int main() {
    int sum = add(3, 4);
    std::cout << sum; // 7
    return 0;
    }
  • 默认参数int multiply(int x, int y = 1) { return x * y; }
  • 重载:同名不同参数。
    void print(int x) { std::cout << x; }
    void print(double x) { std::cout << x * 2; } // 调用时自动匹配
2.3 指针与引用#
  • 指针:存储地址。int* p = &var;(& 取地址)。
    int main() {
    int x = 10;
    int* ptr = &x; // ptr 指向 x
    std::cout << *ptr; // 解引用: 10
    *ptr = 20; // 修改 x 为 20
    return 0;
    }
  • 引用:别名。int& ref = x; ref = 30;(x 变 30)。
  • 动态内存int* arr = new int[5]; 用完 delete[] arr;(避免内存泄漏)。

练习

  1. 写函数交换两个数(用指针)。
  2. 用数组计算平均分。
  3. 动态分配字符串数组,存储用户输入。

阶段 3: 面向对象编程 (OOP)#

C++ 的核心:类和对象。游戏中用于角色、场景等。

3.1 类与对象#
  • 类定义:封装数据和方法。
    #include <iostream>
    #include <string>
    class Person { // 类
    private: // 私有:只能类内访问
    std::string name;
    int age;
    public: // 公有:外部访问
    Person(std::string n, int a) : name(n), age(a) {} // 构造函数
    void display() { std::cout << name << " is " << age << std::endl; }
    ~Person() {} // 析构函数(清理资源)
    };
    int main() {
    Person p("Bob", 30); // 对象
    p.display();
    return 0;
    }
  • 访问控制:private(数据隐藏)、protected(继承可见)、public。
3.2 继承与多态#
  • 继承:子类扩展父类。class Student : public Person { ... };
    class Student : public Person {
    private:
    std::string major;
    public:
    Student(std::string n, int a, std::string m) : Person(n, a), major(m) {}
    void study() { std::cout << "Studying " << major << std::endl; }
    };
  • 多态:虚函数实现动态绑定。
    class Animal {
    public:
    virtual void sound() { std::cout << "Generic sound" << std::endl; } // 虚函数
    virtual ~Animal() {} // 虚析构
    };
    class Dog : public Animal {
    public:
    void sound() override { std::cout << "Woof!" << std::endl; } // 重写
    };
    int main() {
    Animal* pet = new Dog(); // 基类指针指向子类
    pet->sound(); // 多态: Woof!
    delete pet;
    return 0;
    }
3.3 其他 OOP 特性#
  • 友元:允许外部访问私有。
  • 运算符重载:如 + for 自定义类型。
    class Vector {
    public:
    int x, y;
    Vector(int a=0, int b=0) : x(a), y(b) {}
    Vector operator+(const Vector& other) { return Vector(x + other.x, y + other.y); }
    };

练习

  1. 创建 Shape 基类,派生 CircleRectangle,计算面积(多态)。
  2. 继承 Vehicle,实现 Car 的加速方法。
  3. 用类管理银行账户(存款、取款)。

阶段 4: 标准模板库 (STL)#

STL 提供现成容器和算法,游戏中用于管理敌人列表、路径查找。

4.1 容器#
  • vector:动态数组。
    #include <vector>
    std::vector<int> nums = {1,2,3};
    nums.push_back(4); // 添加
    for (int n : nums) { std::cout << n << " "; } // 范围 for
  • map:键值对(字典)。std::map<std::string, int> scores; scores["Alice"] = 90;
  • set:有序唯一集合。std::set<int> unique{1,2,2};(自动去重)。
4.2 算法#
  • #include <algorithm>
    std::sort(nums.begin(), nums.end()); // 排序
    auto it = std::find(nums.begin(), nums.end(), 3); // 查找

练习

  1. 用 vector 存储学生成绩,排序输出。
  2. 用 map 实现单词计数器。
  3. 用 set 去除数组重复元素。

阶段 5: 高级主题#

为游戏添加鲁棒性和并发。

5.1 异常处理#
  • try { ... } catch (const std::exception& e) { std::cout << e.what(); }
    try {
    int x = std::stoi("abc"); // 转换失败抛异常
    } catch (const std::invalid_argument& e) {
    std::cout << "Invalid input: " << e.what() << std::endl;
    }
5.2 文件 I/O#
  • #include <fstream>
    std::ofstream file("data.txt");
    file << "Score: 100" << std::endl;
    file.close();
    std::ifstream infile("data.txt");
    std::string line;
    while (std::getline(infile, line)) {
    std::cout << line << std::endl;
    }
5.3 多线程#
  • #include <thread>#include <mutex>
    void task() { std::cout << "Thread running" << std::endl; }
    int main() {
    std::thread t(task); // 新线程
    t.join(); // 等待结束
    return 0;
    }
    游戏中用于后台加载资源。

练习

  1. 写程序从文件读成绩,计算平均(异常处理)。
  2. 用多线程模拟两个任务并行(打印数字)。
  3. 实现日志系统,线程安全写文件。

阶段 6: 游戏开发入门#

现在用 SFML 库开发游戏。SFML 是简单快速的多媒体库,支持 2D 图形、音频、输入。

6.1 安装 SFML#
  • 下载 SFML(匹配你的系统)。
  • Windows:链接库到项目(VS Code: tasks.json 添加 -lsfml-graphics -lsfml-window -lsfml-system)。
  • 编译:g++ main.cpp -o game -lsfml-graphics -lsfml-window -lsfml-system
6.2 基本窗口与事件#
#include <SFML/Graphics.hpp>
int main() {
sf::RenderWindow window(sf::VideoMode(800, 600), "My Game"); // 创建窗口
while (window.isOpen()) {
sf::Event event;
while (window.pollEvent(event)) {
if (event.type == sf::Event::Closed) window.close(); // 关闭事件
}
window.clear(sf::Color::Black); // 清屏
window.display(); // 刷新
}
return 0;
}

运行:黑窗口,可关闭。

6.3 图形与精灵#
  • 加载图片:sf::Texture texture; texture.loadFromFile("sprite.png"); sf::Sprite sprite(texture);
// 在循环中
sf::CircleShape shape(50); // 圆形
shape.setFillColor(sf::Color::Red);
window.draw(shape); // 绘制
6.4 输入与物理#
  • 键盘:if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) { sprite.move(-5, 0); }
  • 简单物理:用时间步(sf::Clock)更新位置、碰撞(getGlobalBounds().intersects)。
6.5 完整示例:Pong 游戏#

实现简单 Pong(球、两个拍子、得分)。完整代码:

#include <SFML/Graphics.hpp>
#include <iostream>
int main() {
sf::RenderWindow window(sf::VideoMode(800, 600), "Pong");
sf::RectangleShape paddle1({10, 100}), paddle2({10, 100}); // 拍子
paddle1.setPosition(10, 250); paddle2.setPosition(780, 250);
sf::CircleShape ball(10); ball.setPosition(400, 300); // 球
sf::Vector2f ballVel(-5, 3); // 速度
int score1 = 0, score2 = 0;
sf::Font font; font.loadFromFile("arial.ttf"); // 需要字体文件,或用系统字体
sf::Text scoreText; scoreText.setFont(font); scoreText.setCharacterSize(24);
sf::Clock clock;
while (window.isOpen()) {
sf::Time dt = clock.restart(); // 时间步
float deltaTime = dt.asSeconds();
sf::Event event;
while (window.pollEvent(event)) {
if (event.type == sf::Event::Closed) window.close();
}
// 输入
if (sf::Keyboard::isKeyPressed(sf::Keyboard::W)) paddle1.move(0, -300 * deltaTime);
if (sf::Keyboard::isKeyPressed(sf::Keyboard::S)) paddle1.move(0, 300 * deltaTime);
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up)) paddle2.move(0, -300 * deltaTime);
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down)) paddle2.move(0, 300 * deltaTime);
// 更新球
ball.move(ballVel * deltaTime * 60); // 假设 60 FPS
// 墙壁反弹
if (ball.getPosition().y < 0 || ball.getPosition().y > 590) ballVel.y = -ballVel.y;
// 拍子碰撞
if (ball.getGlobalBounds().intersects(paddle1.getGlobalBounds()) ||
ball.getGlobalBounds().intersects(paddle2.getGlobalBounds())) {
ballVel.x = -ballVel.x;
}
// 得分
if (ball.getPosition().x < 0) { score2++; ball.setPosition(400, 300); ballVel.x = 5; }
if (ball.getPosition().x > 790) { score1++; ball.setPosition(400, 300); ballVel.x = -5; }
// 绘制
window.clear();
window.draw(paddle1); window.draw(paddle2); window.draw(ball);
scoreText.setString("Score: " + std::to_string(score1) + " - " + std::to_string(score2));
window.draw(scoreText);
window.display();
}
return 0;
}
---
从C语言入门到c++快速实战:初学者实用指南
https://windholm.dpdns.org/posts/itplace-cpp/
作者
Grok,Pars
发布于
2025-11-14
许可协议
CC BY-NC-SA 4.0
最后更新于 2025-11-14,距今已过 21 天

部分内容可能已过时

评论区

目录

封面
Loading ...
Loading ...
0:00 / 0:00