260 lines
5.7 KiB
Markdown
260 lines
5.7 KiB
Markdown
# 用 C++ 做命令行抽卡游戏 · 10 课时教程
|
||
|
||
面向 **8 岁左右** 学习者,只在 **命令行** 用输入输出完成抽卡游戏,并系统练习 C++ 基础。每课约 **20~40 分钟**,建议家长陪同。
|
||
|
||
---
|
||
|
||
## 总说明(给家长)
|
||
|
||
- **工具**:安装 C++ 编译器(例如 Mac 上 Xcode Command Line Tools 的 `clang++`)。
|
||
- **原则**:先能运行出字,再变好玩;报错很正常,改一行再编译。
|
||
- **抽卡**:用随机数模拟概率,不涉及真实金钱或充值。
|
||
|
||
---
|
||
|
||
## 第 1 课:程序和「打招呼」
|
||
|
||
**目标**:理解程序是一行行指令;能编译运行,屏幕出现一句话。
|
||
|
||
**要点**:`main`、花括号 `{}`、`std::cout`、分号 `;`、字符串用双引号。
|
||
|
||
详见:`第01课-欢迎来到抽卡世界.md`
|
||
|
||
---
|
||
|
||
## 第 2 课:数字和「小盒子」(变量)
|
||
|
||
**目标**:用 `int` 存数,例如「还剩几次抽奖机会」。
|
||
|
||
**要点**:变量名、赋值 `=`、`int`。
|
||
|
||
详见:`第02课-小盒子与数字.md`
|
||
|
||
```cpp
|
||
#include <iostream>
|
||
int main() {
|
||
int pulls = 3;
|
||
std::cout << "你还剩 " << pulls << " 次机会\n";
|
||
return 0;
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 第 3 课:听玩家的话(输入)
|
||
|
||
**目标**:用键盘输入数字,程序记住。
|
||
|
||
**要点**:`std::cin`、`>>`。
|
||
|
||
详见:`第03课-听玩家的话.md`
|
||
|
||
```cpp
|
||
#include <iostream>
|
||
int main() {
|
||
int pulls = 0;
|
||
std::cout << "你想抽几次?";
|
||
std::cin >> pulls;
|
||
std::cout << "好,我们准备抽 " << pulls << " 次\n";
|
||
return 0;
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 第 4 课:运气来了(随机数)
|
||
|
||
**目标**:每次运行可能得到不同结果,为「抽到什么」做准备。
|
||
|
||
**要点**:`rand()`、`srand()`、`time()`;随机种子在程序开始时设一次。
|
||
|
||
详见:`第04课-运气来了.md`
|
||
|
||
```cpp
|
||
#include <iostream>
|
||
#include <cstdlib>
|
||
#include <ctime>
|
||
|
||
int main() {
|
||
std::srand(std::time(nullptr));
|
||
int r = std::rand() % 100;
|
||
std::cout << "随机数:" << r << "\n";
|
||
return 0;
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 第 5 课:稀有度(条件判断)
|
||
|
||
**目标**:根据随机数决定普通 / 稀有 / 超稀有。
|
||
|
||
**要点**:`if`、`else if`、`else`、比较运算符。
|
||
|
||
详见:`第05课-稀有度与判断.md`
|
||
|
||
```cpp
|
||
#include <iostream>
|
||
#include <cstdlib>
|
||
#include <ctime>
|
||
|
||
int main() {
|
||
std::srand(std::time(nullptr));
|
||
int r = std::rand() % 100;
|
||
|
||
std::cout << "你抽到了:";
|
||
if (r < 70) {
|
||
std::cout << "普通卡\n";
|
||
} else if (r < 95) {
|
||
std::cout << "稀有卡\n";
|
||
} else {
|
||
std::cout << "超稀有卡!!\n";
|
||
}
|
||
return 0;
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 第 6 课:一口气抽很多次(循环)
|
||
|
||
**目标**:按玩家说的次数重复「抽一次」。
|
||
|
||
**要点**:`for` 或 `while`、循环变量。
|
||
|
||
详见:`第06课-循环与多抽.md`
|
||
|
||
```cpp
|
||
#include <iostream>
|
||
#include <cstdlib>
|
||
#include <ctime>
|
||
|
||
int main() {
|
||
std::srand(std::time(nullptr));
|
||
int n = 0;
|
||
std::cout << "抽几次?";
|
||
std::cin >> n;
|
||
|
||
for (int i = 1; i <= n; i++) {
|
||
int r = std::rand() % 100;
|
||
std::cout << "第" << i << "抽:";
|
||
if (r < 70) std::cout << "普通\n";
|
||
else if (r < 95) std::cout << "稀有\n";
|
||
else std::cout << "超稀有\n";
|
||
}
|
||
return 0;
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 第 7 课:给卡片起名字(数组)
|
||
|
||
**目标**:用编号对应卡名,抽中编号再打印名字。
|
||
|
||
**要点**:数组 `[]`、下标从 0 开始、`std::string`。
|
||
|
||
详见:`第07课-卡片与数组.md`
|
||
|
||
```cpp
|
||
#include <iostream>
|
||
#include <string>
|
||
|
||
int main() {
|
||
std::string cards[3];
|
||
cards[0] = "小火龙";
|
||
cards[1] = "皮卡丘";
|
||
cards[2] = "妙蛙种子";
|
||
|
||
int id = 1;
|
||
std::cout << cards[id] << "\n";
|
||
return 0;
|
||
}
|
||
```
|
||
|
||
进阶:把第 6 课的随机结果映射到 `cards[id]`。
|
||
|
||
---
|
||
|
||
## 第 8 课:把「抽一次」变成积木(函数)
|
||
|
||
**目标**:用函数让代码更短、更好读。
|
||
|
||
**要点**:`void`、自定义函数名。
|
||
|
||
详见:`第08课-函数与抽一次.md`
|
||
|
||
```cpp
|
||
#include <iostream>
|
||
#include <cstdlib>
|
||
#include <ctime>
|
||
#include <string>
|
||
|
||
void draw_once() {
|
||
int r = std::rand() % 100;
|
||
if (r < 70) std::cout << "普通卡\n";
|
||
else if (r < 95) std::cout << "稀有卡\n";
|
||
else std::cout << "超稀有卡\n";
|
||
}
|
||
|
||
int main() {
|
||
std::srand(std::time(nullptr));
|
||
draw_once();
|
||
draw_once();
|
||
return 0;
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 第 9 课:像游戏一样玩(简单菜单)
|
||
|
||
**目标**:循环显示菜单:抽卡 / 说明 / 退出。
|
||
|
||
**要点**:`while (true)`、`break`、用整数表示选项。
|
||
|
||
详见:`第09课-菜单与循环.md`
|
||
|
||
流程:显示菜单 → 读选项 → 选抽卡则调用抽卡函数 → 选退出则结束。
|
||
|
||
---
|
||
|
||
## 第 10 课:小项目整合(迷你抽卡游戏)
|
||
|
||
**目标**:把前面内容串成可玩的一版。
|
||
|
||
建议包含:欢迎语与菜单、抽奖次数或「金币」、随机与稀有度、可选统计稀有数量、退出。
|
||
|
||
不要求:图形界面、网络、文件存档(本教程以命令行为主)。
|
||
|
||
---
|
||
|
||
## 知识点对照表
|
||
|
||
| 课次 | 主要语法与概念 |
|
||
|------|----------------|
|
||
| 1 | 程序结构、`#include`、`main`、`cout`、字符串 |
|
||
| 2 | `int`、变量 |
|
||
| 3 | `cin`、输入 |
|
||
| 4 | `rand` / `srand`、`%`、`ctime` |
|
||
| 5 | `if` / `else`、比较 |
|
||
| 6 | `for` 循环 |
|
||
| 7 | `string`、数组、下标 |
|
||
| 8 | 自定义函数、`void` |
|
||
| 9 | `while`、菜单与流程 |
|
||
| 10 | 综合与小项目习惯 |
|
||
|
||
---
|
||
|
||
## 给小朋友的简单比喻
|
||
|
||
- 程序像 **乐高说明书**:一行一行,电脑照做。
|
||
- 变量像 **贴了名字的小盒子**。
|
||
- `if` 像 **岔路口**。
|
||
- 函数像 **拼好的积木块**,需要时拿来用。
|
||
- 抽卡是 **随机数假装运气**,和扭蛋类似,只是在电脑里。
|
||
|
||
---
|
||
|
||
*进度与每课作业完成情况请见:`学习进度与状态.md`*
|