你好,我是吴老师。这份是给你自己读的——不用等我讲,看不懂就整段复制给 AI,加一句"请一次只解释一个概念,讲完问我一个小问题"。
读完之后,你应该能:
- 说出"用二维数组表示棋盘"是什么意思;
- 明白"落一颗子 = 改一个格子";
- 说清"判断有没有连成 5 个"为什么要往 4 个方向数、为什么要减 1。
用时:约 60 分钟。 准备:烧录
demo01_gomoku的板子 + 一根 USB 线。
一、让板子陪你下棋
第 25 课板子会说话,这一课我们换种玩法——让板子当棋盘,陪你下五子棋。
规则你知道:两人轮流放子,谁先把五个横、竖或斜连成线,谁赢。可板子没有"棋盘"这个实体,它怎么记住哪一格有子、哪一格空、有没有连成五个?
答案:用一张"二维数组"。 这一课就把棋盘变成板子能懂的"格子表"。
先看现象:烧录后屏幕出现 15×15 棋盘,你和同桌轮流点交叉点,板子真的会判定谁赢了。
二、我观察到的现象
| 现象 | 勾选 |
|---|---|
| 屏幕出现 15×15 的棋盘 | |
| 点一下落一颗子(黑先白后) | |
| 顶部提示"轮到谁" | |
| 连成 5 子,板子显示"谁赢了" | |
| 点已有子的格子,被忽略 |
三、棋盘,就是一张二维数组
屏幕上的棋盘 15 行 15 列。我们在内存里造一张同样的 15×15 表格,每格记一个数:
| 数字 | 意思 |
|---|---|
| 0 | 这格空着 |
| 1 | 这格是黑子 |
| 2 | 这格是白子 |
这张"格子的格子"叫二维数组,像一张座位表:行号 r + 列号 c 决定坐哪个位置。
board[r][c]
↑行 ↑列
四、两个代码名,够了
1. board[r][c] = 1;——放到第 r 行第 c 列
board 是一张 15×15 表格。
board[3][5] = 1; = 让"第3行第5列"记上数字1(黑子)。
你点哪个交叉点,程序就把屏幕像素换算成"第几行第几列",写进 board。屏幕上的"点一下",本质就是改表格的一个格子。
2. 往 4 个方向数一数——判断有没有连成 5 个
从刚下的子出发,往某方向数连续同色,再往反方向数。
两边加起来,减掉自己那颗"数了两次"的,如果 ≥5,就赢了。
要检查 4 个方向:横、竖、两条斜线。每个方向都是正反两头数数。
⚠️ 为什么要减 1? 因为从这格出发往两边数,会把这颗子自己数两次(一边一次)。去掉重复那一次,才是真实连成数。这是最容易踩的坑。
最该记住的:落子 = 改表格一格;赢没赢 = 从这格往 4 个方向数到 5。
五、为什么用数组,而不是记住像素点?
| 做法 | 判"连成五个" | 问题 |
|---|---|---|
| 记每个棋子的像素坐标 | 看两个棋子"挨不挨" | 计算机难判断"斜向"算不算连 |
| 用数组记每格是谁 | board[r][c] 往前数几格 | 简单,一眼看出横竖斜 |
数据怎么存,决定规则好不好写。 把棋子"归到格子"里,规则就格外好写——这是本课最重要的想法。
六、改一个条件:棋盘变大
思想实验:把 15 路改成 19 路(围棋)或 9 路(新手),程序要改什么?
| 我改了什么 | 我预测 | 实际 |
|---|---|---|
| 15×15 → 19×19 | 改 BOARD_N 和落点换算,判胜逻辑不用动 |
用数组,改棋盘大小几乎不费事——"数格子"和"格子有多少"没关系。
七、一条完整的"下一颗子"链路
手指点交叉点 → 换算行/列 (r,c) → 这格空吗?
空 → 写数组 board[r][c]=黑/白
不空 → 忽略这次点击
写完后 → 沿 横/竖/两斜 4 个方向各数连子
够5 → 显示胜负
没到5 → 换手,改顶部提示
想重开 → 整张表格清零
真正要记住的只有一句:五子棋 = 一张 15×15 表格(数组)+ 落子改一格 + 往 4 个方向数到 5 就赢。
八、不对呀,它怎么知道"连起来了"?
假设你在第 7 行第 3 列落黑子,程序往四个方向各"看"一遍:
- 横向:往右数 + 往左数 − 1;
- 纵向:往下数 + 往上数 − 1;
- 主对角线(↘):往右下数 + 往左上数 − 1;
- 副对角线(↙):往左下数 + 往右上数 − 1。
某对方向加起来 ≥5 就赢。
九、过关检查
- 板子怎么记住"哪格有子"?"二维数组"是什么?
- "落一颗子"在程序里是哪一步?
- 判"连成 5 个"要往几个方向数?为什么减 1?
- 为什么"归到格子"比记像素点好判胜负?
- 怎么避免"点一下连下好几颗"?
留下三样东西:你那盘棋的结果、你点第一个交叉点换算的行列号、"五子棋在板子里是什么"的一句话。
十、还能玩什么
| 作品方向 | 描述给 AI 的效果 | 再想想 |
|---|---|---|
| 六子棋 | 连成 6 个才赢 | 改哪里?≥5 改 ≥6? |
| 新手 9 路 | 棋盘 9×9 | 改 BOARD_N,格子间距怎么变? |
| 悔棋 | 加"撤回上一步" | 用什么数据结构记住每步? |
| 落子计时 | 每人限 30 秒 | 计时器怎么和画屏共用时间? |
| 人机对战 | 板子陪你下 | 简单 AI 怎么让它"有点聪明"? |
下节课预告:学会"棋盘=数组"后,第 30 课让一条会动的贪吃蛇在网格里跑——"网格 + 方向"正是贪吃蛇的核心。
