Python 滑动二维列表中的列和行

Python 滑动二维列表中的列和行,python,Python,我正在尝试实现一个简单的纸牌游戏,其中的目标是移动不同颜色的行和列,直到它们形成特定的图案。我试图使用2d列表表示我的游戏板配置: board = [['W', 'W', 'W', 'W'], ['W', 'W', 'W', 'W'], ['B', 'B', 'B', 'B'], ['B', 'B', 'B', 'B']] 假设我们有以下目标板: goal = [['W', 'B', 'B', 'W'], ['W', 'W'

我正在尝试实现一个简单的纸牌游戏,其中的目标是移动不同颜色的行和列,直到它们形成特定的图案。我试图使用2d列表表示我的游戏板配置:

board = [['W', 'W', 'W', 'W'],
         ['W', 'W', 'W', 'W'],
         ['B', 'B', 'B', 'B'],
         ['B', 'B', 'B', 'B']]
假设我们有以下目标板:

goal = [['W', 'B', 'B', 'W'],
        ['W', 'W', 'W', 'W'],
        ['W', 'W', 'B', 'B'],
        ['B', 'B', 'B', 'B']]
对于给定的移动,只能向上或向下移动一列的元素,或向右或向左移动一行的元素。从线路板末端脱落的元素将循环回要移位的列或行的另一侧。如何实现功能以实现此功能?对我来说,沿一行移动元素的实现似乎相当简单,例如:

def shift_left(board, row_num, num_tiles):
    for i in range(0, num_tiles):
        elem = board.pop(0)
        board.append(elem)

我走对了吗?如何实现沿列移动元素的功能

您可以转换电路板,然后重用先前定义的例程。下面是您在
向下移动时的操作方法

def transpose(lst):
    return list(map(list, zip(*lst)))

def shift_down(board, row_num, num_tiles):
    board = transpose(board)
    shift_left(board)
    board = transpose(board)

对于
shift\u right
shift\u up

也有类似的过程,这里有一种方法可以实现这一点

from copy import deepcopy

def shift(board, ix, direction):
    if direction is 'up':
        return shift_col(board, ix, direction)
    if direction is 'down':
        return shift_col(board, ix, direction)
    if direction is 'left':
        return shift_row(board, ix, direction)
    if direction is 'right':
        return shift_row(board, ix, direction)

def shift_col(board, col_ix, direction):
    temp = [row[col_ix] for row in board]

    if direction is 'up':
        temp = temp[1:len(temp)] + [temp[0]]
    if direction is 'down': 
        temp = [temp[-1]] + temp[0:-1]

    for ix, i in enumerate(board):
        i[col_ix] = temp[ix]
    return board

def shift_row(board, row_ix, direction):
    if direction is 'right':
        temp = [board[row_ix][-1]] + board[row_ix][0:-1]
    if direction is 'left':
        temp = board[row_ix][1:len(board[row_ix])] + [board[row_ix][0]]
    board[row_ix] = temp
    return board
然后我们可以用下面的方法使用它

board = [['W', 'W', 'W', 'W'],
         ['W', 'W', 'W', 'W'],
         ['B', 'B', 'B', 'B'],
         ['B', 'B', 'B', 'B']]

# Shifts the board for a row or column index
# in the specified direction.
# up/down: ix is for columns
# left/right: ix is for rows
board = shift(deepcopy(board), 2, 'down')
for i in board:
    print(i)

哦,太好了,这是一个填鸭式输入代码而不让OP自己思考的答案。不再需要开发自己的代码,他们可以复制粘贴你的代码,一切都很好。你的代码实际上并没有解释它的功能。一个小例子可以帮助人们开始或了解做事情的新方法,否则他们将不会接触到这些新方法。两种不同的教学方法。从长远来看,你的方法可以说更好,但从短期来看,通过示例学习可以更快地向学习曲线上爬。两者的良好平衡可能是最好的。此外,根据OP对最佳答案(对他最有帮助的东西)的感知,将获得分数。因此,对于OP和我来说,这是一场双赢的游戏。不要恨玩家,要恨游戏。