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++)。 - Linux:
sudo 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;}
- if-else:
练习:
- 写程序计算两个数的和、差。
- 用循环打印 1-100 的偶数。
- 输入成绩,输出等级 (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; // 7return 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 指向 xstd::cout << *ptr; // 解引用: 10*ptr = 20; // 修改 x 为 20return 0;} - 引用:别名。
int& ref = x; ref = 30;(x 变 30)。 - 动态内存:
int* arr = new int[5];用完delete[] arr;(避免内存泄漏)。
练习:
- 写函数交换两个数(用指针)。
- 用数组计算平均分。
- 动态分配字符串数组,存储用户输入。
阶段 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); }};
练习:
- 创建
Shape基类,派生Circle、Rectangle,计算面积(多态)。 - 继承
Vehicle,实现Car的加速方法。 - 用类管理银行账户(存款、取款)。
阶段 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); // 查找
练习:
- 用 vector 存储学生成绩,排序输出。
- 用 map 实现单词计数器。
- 用 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;}
练习:
- 写程序从文件读成绩,计算平均(异常处理)。
- 用多线程模拟两个任务并行(打印数字)。
- 实现日志系统,线程安全写文件。
阶段 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/ 最后更新于 2025-11-14,距今已过 21 天
部分内容可能已过时
WindHolm