3

所以我正在为一项任务制作游戏,我需要制作一个函数,该函数接受一个嵌套列表,表示游戏板和每行从 1 到 5 的数字(用于坐标,例如 F4、G3 等)。

例如,代表棋盘的列表如下所示:

board = [['S', 'S', 'X', 'S', 'S'],
         ['.', '.', '.', '.', '.'],
         ['.', '.', 'T', '.', '.'],
         ['.', '.', '.', '.', '.'],
         ['S', 'S', 'Y', 'S', 'S']]

我需要在每个列表的第一个位置添加一个数字,以便得到如下所示的内容:

board = [[1, 'S', 'S', 'X', 'S', 'S'],
         [2, '.', '.', '.', '.', '.'],
         [3, '.', '.', 'T', '.', '.'],
         [4, '.', '.', '.', '.', '.'],
         [5, 'S', 'S', 'Y', 'S', 'S']]

并像这样显示它:

1 S S X S S
2 . . . . .
3 . . T . .
4 . . . . .
5 S S Y S S

我目前这样做的方法是这样的:

def display_board(board):
     bottomLetters  = [" ", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K"]
     print board
     counter = int(0)
     for row in board:
         counter += int(1)
         row.insert(0, counter)
         for positon in row:
             print positon,
             print

这几乎可以工作,但我得到一个奇怪的输出:

1 S S X S S
2 . . . . .
3 . . T . .
4 2 . . . . .
5 S S Y S S

或者只是游戏板列表本身:

board = [[1, 'S', 'S', 'X', 'S', 'S'],
         [4, 2, '.', '.', '.', '.', '.'],
         [3, '.', '.', 'T', '.', '.'],
         [4, 2, '.', '.', '.', '.', '.'],
         [5, 'S', 'S', 'Y', 'S', 'S']]

有人知道为什么会这样吗?

4

4 回答 4

3

不是真正的答案 - 而是一些建议。

你不需要int(0)你可以使用0. 此外,Python 已经提供了一种内置方法来“编号”序列中的项目,称为enumerate. 另请查看str.join使格式化文本更易于打印的方法。

使用上述内容,您可以将代码减少为:

board = [['S', 'S', 'X', 'S', 'S'],
         ['.', '.', '.', '.', '.'],
         ['.', '.', 'T', '.', '.'],
         ['.', '.', '.', '.', '.'],
         ['S', 'S', 'Y', 'S', 'S']]

def display_board(board):
    for rowno, items in enumerate(board, start=1):
        print rowno, ' '.join(items)

display_board(board)

这不仅更 Pythonic,而且更清楚您的意图。

于 2012-09-28T09:41:47.117 回答
1

你得到这个错误的原因是你向我们展示的板实际上并不是你定义的......我正确吗?

注意第二行和第四行看起来是一样的。在您的数据结构中,它们最终成为完全相同的对象,这就是为什么修改第二行也会影响第四行。

您是否以任何方式单独初始化行,然后将它们分配给电路板,重复第二行?在这种情况下,请注意您不是在复制它们,而是实际上存储了对同一对象的引用。

于 2012-09-28T09:47:50.157 回答
1

我似乎无法复制您的结果,但这里突出的问题是您每次运行时都在修改板(在计数器之前)display_board()。一旦您显示它,任何期望您的板为原始格式的代码都会中断。

这是我将如何处理它:

def display_board(board):
  for counter, row in enumerate(board, start=1):
    print counter, " ".join(row)
  print " ".join(" ABCDEFGHIJK"[:len(board[0])+1])

样本输出:

>>> display_board(board)
1 S S X S S
2 . . . . .
3 . . T . .
4 . . . . .
5 S S Y S S
  A B C D E
于 2012-09-28T09:46:17.613 回答
0

我不会更改数据结构只是为了节省一些显示它的工作量并同时破坏逻辑。数字不是棋盘的一部分,不应与游戏数字混合。我会做类似的事情:

In [1]: %paste
board = [['S', 'S', 'X', 'S', 'S'],
         ['.', '.', '.', '.', '.'],
         ['.', '.', 'T', '.', '.'],
         ['.', '.', '.', '.', '.'],
         ['S', 'S', 'Y', 'S', 'S']]
## -- End pasted text --

In [2]: from string import ascii_uppercase

In [3]: def display(b):
    for i, row in enumerate(b, 1):
        print i, ' '.join(row)
    print ' ', ' '.join(x for _, x in zip(row, ascii_uppercase))

In [4]: display(board)
1 S S X S S
2 . . . . .
3 . . T . .
4 . . . . .
5 S S Y S S
  A B C D E
于 2012-09-28T09:45:18.543 回答