这是我一直试图解决的代码挑战:
点和盒是通常由两个玩家玩的游戏。它以等距点的空方格开始。两个玩家轮流在两个未连接的相邻点之间添加一条水平或垂直线。一位完成1 x 1盒子第四边的玩家将获得一个积分,并转一圈。当无法放置更多行时,游戏结束。
您的任务是返回完成游戏的两名玩家的得分。
输入 您的函数将接收一个整数对的数组/元组,每个对代表两个点之间的链接。点由整数序列表示,该整数从左到右,从上到下递增,如下所示。
3 x 3正方形
0 1 2
3 4 5
6 7 8
您的函数应返回一个数组/元组,该数组/元组由两个表示两个玩家得分的非负整数组成。
测试示例
moves = ((0,1),(7,8),(1,2),(6,7),(0,3),(8,5),(3,4),(4,1),(4,5),(2,5),(3,6),(7,4))
dots_and_boxes(moves) # should return (3,1)
这是我的尝试:
def dots_and_boxes(ar):
n = int((max(x for turn in ar for x in turn) + 1) ** 0.5)
# n is the length of each edge of the given game board
goals = [[[i, i+1], [i, i + n], [i + 1, i + 1 + n], [i + n, i + n + 1]] for i in range(n ** 2 - n - 1) if (i + 1) % n != 0]
# goals are all the possible 1x1 squares to get points
p1_points, p2_points = 0, 0
turn = True
board = []
for move in ar:
board.append(sorted(list(move)))
has_goal = False
for goal in goals:
if all(x in board for x in goal):
if turn:
p1_points += 1
else:
p2_points += 1
has_goal = True
goals.remove(goal)
turn = turn if has_goal else not turn
return (p1_points, p2_points)
如果我用描述中的动作来运行我的dots_and_boxes,我会得到(1,2)而不是(3,1)。有人可以解释为什么我的代码失败吗?