对局规则

井字棋由两名玩家轮流落子,先手用 X,后手用 O。在 3 行 3 列的棋盘上形成三连的一方获胜。棋盘下满而没有三连就是平局。本章用一块可交互面板演示对局,确认落子与胜负规则。

落子规则

每一轮按顺序做四件事:

  1. 程序显示当前棋盘,提示轮到谁落子。
  2. 玩家给出两个 0 到 2 的行列号,要落的棋盘格子必须为空。
  3. 程序检查输入;行列越界、棋盘格子已被占用或格式错误时说明原因,棋盘保持不变,要求重新输入。
  4. 输入有效时写入棋盘格子,随后判定胜负。
注意术语:先手与后手

先落第一子的一方叫先手。另一方叫后手。

胜负判定

三连一共有八条线:三行、三列和两条对角线。任意一方先把三个自己的棋子连成一条线,就对局获胜;X 与 O 用同一条判定,先连成的一方直接结束对局。

九个棋盘格子全部下满、而双方都没有三连时,对局是平局。对局一旦结束,终端程序打印明确的对局结果,不再接受落子。

对局演示

面板模拟终端程序的画面。九个棋盘格子可以直接点,也可以在“输入坐标”里按行列落子。每一步都会按终端程序的格式打印到“终端输出”。

运行效果 可交互
轮到 X 第 1 手

X 先手。点任意棋盘格子,或在下面按“行 列”落子。

终端输出
    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。

自测问题

后续各章的自测都按同一种方式做:不要展开答案,试着自己把回答完整说出来,写完之后展开对照;说不出来的部分,回到对应小节对照正文。

  1. 什么情况下是平局?

    查看答案

    九个棋盘格子都已落子,并且任何一行、一列或一条对角线都没有三连。

  2. 同一个棋盘格子已经有 X,再输入它的行和列会怎样?

    查看答案

    程序拒绝这次落子,棋盘保持不变,随后要求重新输入。

本章回顾

你已经能说出这套落子与胜负规则,并在演示面板里核对程序的落子与判定。下一章是工程结构,看这些规则落在哪些目录和文件里。