AI脑洞板
完整教案
自学课件
第 29 课 · 共 29/51 课

五子棋 把棋盘装进一个二维数组

课时
待定
器材
ESP32-S3 触摸屏板 + USB 线
前置知识
无
配套代码
见项目 demo 目录

你好,我是吴老师。这份是给你自己读的——不用等我讲,看不懂就整段复制给 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]
  ↑行  ↑列

棋盘 = 一张二维数组(座位表):0空/1黑/2白,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;
  2. 纵向:往下数 + 往上数 − 1;
  3. 主对角线(↘):往右下数 + 往左上数 − 1;
  4. 副对角线(↙):往左下数 + 往右上数 − 1。

某对方向加起来 ≥5 就赢。

落子 = 改表格一格;判连成 5 个 = 从这格往 4 个方向(横/竖/两斜)数,两边加起来减 1

九、过关检查

  1. 板子怎么记住"哪格有子"?"二维数组"是什么?
  2. "落一颗子"在程序里是哪一步?
  3. 判"连成 5 个"要往几个方向数?为什么减 1?
  4. 为什么"归到格子"比记像素点好判胜负?
  5. 怎么避免"点一下连下好几颗"?

留下三样东西:你那盘棋的结果、你点第一个交叉点换算的行列号、"五子棋在板子里是什么"的一句话。

十、还能玩什么

作品方向描述给 AI 的效果再想想
六子棋连成 6 个才赢改哪里?≥5 改 ≥6?
新手 9 路棋盘 9×9改 BOARD_N,格子间距怎么变?
悔棋加"撤回上一步"用什么数据结构记住每步?
落子计时每人限 30 秒计时器怎么和画屏共用时间?
人机对战板子陪你下简单 AI 怎么让它"有点聪明"?

下节课预告:学会"棋盘=数组"后,第 30 课让一条会动的贪吃蛇在网格里跑——"网格 + 方向"正是贪吃蛇的核心。

第 29 课 · 五子棋

第 29 课 · 五子棋

15×15 棋盘上双人轮流落子,谁先在横、竖或斜线上连成 5 颗子,谁就赢。

29游戏数组棋盘