如何创建将对手牌圈包围起来的逆转功能?

时间:2019-04-05 07:58:16

标签: python

我有一个编程单元的作业,要求这样做:

根据以下规范,创建代表黑白棋规则的封闭函数(木板,玩家,位置,直接)。

电路板位置由一对(r,c)表示,其中r和c均为该范围内的整数 range(8)分别代表行索引和列索引。例如,位置\ b3“为 由(2,1)表示。 \ b3“样式的行和列顺序以及位置的指定 是相反的。这是因为以外部列表的方式构造列表列表是很自然的 对应于行,而内部列表位置对应于列位置,因此我们引用它们 先行,然后是列。此行,列约定在数学和计算机中非常常见 科学。

方向由一对(dr,dc)表示,其中dr和dc分别是集合f-1、0, 1克例如,“水平向左”用(0,-1)描述,“对角向右和向下”是 (由(1,1)等描述)。

封闭函数(board,player,pos,dir)表示是否在上面放一块石头 给定位置将沿给定方向包围对手的石头的直线:

输入:棋盘配置板,集合f1、2g中的整数播放器,棋盘位置pos和方向dir。

输出:如果板包含位置pos和所有位置的dir方向的玩家石头,则为true 在那个石头和pos之间的直线上包含另一个玩家的石头,并且在 直线上至少有一块属于另一名球员的石头;否则为假。

这就是我所拥有的:

def enclosing(board, player, pos, direct):
    if player == 1:
        a = direct[0]
        b = direct[1]
        i = 1
        while i < 8:
            newpos = (pos[0] + i*a , pos[1] + i*b)
            if board[newpos[0]][newpos[1]] == 1:
                return True
            elif board[newpos[0]][newpos[1]] == 2:    
                i = i + 1
            else:
                return False

还请记住,这是一门初学者课程,我在python上有大约一个月的经验。

1 个答案:

答案 0 :(得分:0)

您编辑中的代码看起来不错,这正是我的意思。祝项目其余部分一切顺利!

一些极端情况:

  1. board[newpos[0]][newpos[1]]将超出范围
  2. XOOOOX的情况下,您的函数将返回True,这不是Othello规则捕获的(不确定您的分配是否对它进行了不同的定义

我强烈建议编写一些简单的测试,以确保您的代码正常工作。他们不需要涵盖所有案件,也不必是全部案件。它通常不是必需的,但是使评估更容易:只需单击“运行”,而不是尝试通过代码推理。

这里是一个示例:

def test():
    assert enclosing([[0, 0, 0], [0,0,0],[0,1,2]], 1, (0,2), (1,1)) == True