三默网为您带来有关“连棋游戏”的文章内容,供您阅读参考。
连棋游戏
2023-01-21 19:16:57
Design Tic-Tac-Toe
连棋游戏
问题描述
连棋游戏(两人轮流在 n x n 的方盘上划“X”或“O”字, 谁先把同一记号排成横线或竖线或斜线, 即为获胜。例如下面这个例子:
测试样例
假设 n = 3, 玩家 1 是 "X" ,玩家2是 "O"
board.move(0, 0, 1); -> 返回 0 (暂时无人获胜)
|X| | |
| | | | // 玩家1 在(0, 0)处落子.
| | | |
board.move(0, 2, 2); -> 返回 0 (暂时无人获胜)
|X| |O|
| | | | // 玩家2 在(0, 2)处落子.
| | | |
board.move(2, 2, 1); -> 返回 0 (暂时无人获胜)
|X| |O|
| | | | // 玩家1 在(2, 2)处落子.
| | |X|
board.move(1, 1, 2); -> 返回 0 (暂时无人获胜)
|X| |O|
| |O| | // 玩家2 在(1, 1)处落子.
| | |X|
board.move(2, 0, 1); -> 返回 0 (暂时无人获胜)
|X| |O|
| |O| | // 玩家1 在(2, 0)处落子.
|X| |X|
board.move(1, 0, 2); -> 返回 0 (暂时无人获胜)
|X| |O|
|O|O| | // 玩家2 在(1, 0)处落子.
|X| |X|
board.move(2, 1, 1); -> 返回 1 (玩家1 获胜)
|X| |O|
|O|O| | // 玩家1 在(2, 1)处落子.
|X|X|X|
内容首发于微信公众号IT信息教室,如果您想学习更多AI相关的技能,欢迎搜索关注或微信扫描下方二维码关注~~
参考代码
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# ---------------------
# # O(1) time|O(n) space
# ---------------------
# 记录每一步后每一行,每一列,正对角线和斜对角线上玩家的棋子。
# 初始时为 0,玩家1 每放一枚棋子则在这枚棋子所在的行列对应的列表位置的值减一
# 玩家2 每放一枚棋子则在这枚棋子所在的行列对应的列表位置的值加一
# 如果棋子的位置在对角线或者反对角线上,同样的方法减一或者加一
# 每一步落子后判断是否存在某个参数的值为 -n 或者 n.
# 若存在值为 -n,则表示玩家1获胜
# 若存在值为 n,则表示玩家2获胜
class ticTacToe:
def __init__(self, n):
self.row = [0] * n
self.col = [0] * n
self.diag = 0
self.antiDiag = 0
self.n = n
def move(self, row, col, player):
# 玩家1 减一, 玩家2 加1
offset = player*2 - 3
self.row[row] += offset
self.col[col] += offset
# 正对角线
if row == col:
self.diag += offset
# 反对角线
if row + col == self.n - 1:
self.antiDiag += offset
# 当 row[row], col[col], diag, antiDiag 其中之一等于 -n (n) 时
# 则表示 玩家1(玩家2)获胜
if offset*self.n in [self.row[row], self.col[col], self.diag, self.antiDiag]:
return player
return 0
# Test Program
board = ticTacToe(3)
board.move(0, 0, 1)
board.move(0, 2, 2)
board.move(2, 2, 1)
board.move(1, 1, 2)
board.move(2, 0, 1)
board.move(1, 0, 2)
print(board.move(2, 1, 1))
# 1 (玩家1获胜)