轨道
/
Python
Python
/
练习
/
井字棋的状态
井字棋的状态

井字棋的状态

简单

说明

在这个练习中,你要实现一个程序,判断一局井字棋的状态。 (这个游戏也叫“noughts and crosses”或“Xs and Os”。)

游戏在一个 3×3 的网格上进行。 玩家轮流在网格上放置X和O。 当一方玩家在网格的一行、一列或一条对角线上连放三个标记而获胜时,或者整个网格被填满时,游戏结束。

在这个练习中,我们假设X先手。

你的任务是判断给定的棋局处于哪种状态。

游戏可能有 3 种状态:

  • 游戏处于ongoing状态。
  • 游戏以draw结束。
  • 游戏以win结束。

如果给定的棋盘无效,就抛出适当的错误。

如果棋盘满足以下条件,就是无效的:

  • 当双方按正确顺序轮流落子时,无法得到给定的棋盘(记住X先手)。
  • 游戏在结束后仍继续落子。

示例

进行中的游戏

   |   |
 X |   |
___|___|___
   |   |
   | X | O
___|___|___
   |   |
 O | X |
   |   |

平局

   |   |
 X | O | X
___|___|___
   |   |
 X | X | O
___|___|___
   |   |
 O | X | O
   |   |

获胜

   |   |
 X | X | X
___|___|___
   |   |
   | O | O
___|___|___
   |   |
   |   |
   |   |

无效

轮流顺序错误
   |   |
 O | O | X
___|___|___
   |   |
   |   |
___|___|___
   |   |
   |   |
   |   |
获胜后继续落子
   |   |
 X | X | X
___|___|___
   |   |
 O | O | O
___|___|___
   |   |
   |   |
   |   |

异常消息

有时需要抛出异常。 抛出异常时,一定要附上有意义的错误消息,说明错误的来源。 这样代码更易读,对调试也有很大帮助。 如果已知错误来源属于某种类型,可以选择抛出内置错误类型中的一种,但仍然要附上有意义的消息。

一局有效的Tic Tac Toe对局在一方获胜时结束。 如果双方都处于获胜状态,这道练习要求你在解答中使用 raise 语句,“抛出”一个ValueError。 如果某一方被判定连续走了两步,或者本该后手却先落子,你的代码也应该抛出一个ValueError。

要抛出带有消息的ValueError,把消息作为参数传给exception类型:

# Example when player O goes before player X.
raise ValueError("Wrong turn order: O started")

# Example when player X goes twice.
raise ValueError("Wrong turn order: X went twice")

# Example when player X wins AND player O wins.
raise ValueError("Impossible board: game should have ended after the game was won")

测试会精确比对错误消息,所以请仔细阅读预期结果。

通过 GitHub 编辑 链接将在新窗口或新标签页中打开
Python Exercism

准备好开始 井字棋的状态 了吗?

注册 Exercism,借助 17 个概念146 个练习 和真人导师指导,学习并掌握 Python,全部免费。