对局规则
井字棋由两名玩家轮流落子,先手用 X,后手用 O。在 3 行 3 列的棋盘上形成三连的一方获胜。棋盘下满而没有三连就是平局。本章用一块可交互面板演示对局,确认落子与胜负规则。
落子规则
每一轮按顺序做四件事:
- 程序显示当前棋盘,提示轮到谁落子。
- 玩家给出两个 0 到 2 的行列号,要落的棋盘格子必须为空。
- 程序检查输入;行列越界、棋盘格子已被占用或格式错误时说明原因,棋盘保持不变,要求重新输入。
- 输入有效时写入棋盘格子,随后判定胜负。
注意术语:先手与后手
先落第一子的一方叫先手。另一方叫后手。
胜负判定
三连一共有八条线:三行、三列和两条对角线。任意一方先把三个自己的棋子连成一条线,就对局获胜;X 与 O 用同一条判定,先连成的一方直接结束对局。
九个棋盘格子全部下满、而双方都没有三连时,对局是平局。对局一旦结束,终端程序打印明确的对局结果,不再接受落子。
对局演示
面板模拟终端程序的画面。九个棋盘格子可以直接点,也可以在“输入坐标”里按行列落子。每一步都会按终端程序的格式打印到“终端输出”。
运行效果
可交互
轮到 X
第 1 手
终端输出
0 1 2 +---+---+---+ 0 | | | | +---+---+---+ 1 | | | | +---+---+---+ 2 | | | | +---+---+---+ 轮到 X。请输入行和列(0 到 2):
面板演示完整对局规则,画的是终端程序接回构建后的目标画面。当前构建的 app 只做最小动态库调用,不会打印棋盘或提示输入;终端对局要等终端程序接回构建后才会出现。
面板与终端输出描述同一件事,三处一一对应:
- 行列标记:终端画面的列号排在棋盘上方,行号写在左侧。面板上的九个棋盘格子与行列号一一对应。
- 棋盘格子:落子前棋盘格子里没有字母,落子后显示
X或O;终端画面同步显示相同的内容。 - 结果提示:对局结束时状态栏显示对局结果,终端画面的末行也打印
对局结果:X 获胜。平局与 O 获胜也打印在同一处。
常见错误
坐标从 0 开始
把 1 1 当成第一行第一列时,棋子落在第二行第二列,输入与棋盘上的位置对不上。
- 出错的原因:行号和列号从 0 计数,三行三列的编号是
0、1、2。 - 正确的做法:输入前按
0到2的范围想坐标,落子后对照棋盘上方的列号与左侧的行号。
落在已经有棋子的格子上
再次选择同一个格子时,程序拒绝这次落子,棋盘保持不变,随后要求重新输入。
- 出错的原因:占用检查在写入之前,已有棋子不会被覆盖。
- 正确的做法:落子前先看棋盘,确认那一格为空。
用逗号或其他符号分隔行列
输入 0,2 时,程序读不到两个数,会要求重新输入。
- 出错的原因:输入按空白分隔两个整数,逗号属于非法字符。
- 正确的做法:按“行 空格 列”的格式输入,例如
0 2。
自测问题
后续各章的自测都按同一种方式做:不要展开答案,试着自己把回答完整说出来,写完之后展开对照;说不出来的部分,回到对应小节对照正文。
什么情况下是平局?
查看答案
九个棋盘格子都已落子,并且任何一行、一列或一条对角线都没有三连。
同一个棋盘格子已经有 X,再输入它的行和列会怎样?
查看答案
程序拒绝这次落子,棋盘保持不变,随后要求重新输入。
本章回顾
你已经能说出这套落子与胜负规则,并在演示面板里核对程序的落子与判定。下一章是工程结构,看这些规则落在哪些目录和文件里。