连棋游戏

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获胜)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值