切片和列表副本

时间:2017-10-13 23:36:30

标签: python list chess python-chess

我在国际象棋实施的最初阶段,我正在研究如何移动棋子。问题是,我无法弄清楚列表切片发生了什么!

这是我的变量board

board = [['R', 'N', 'B', 'Q', 'K', 'B', 'N', 'R'], 
['P', 'P', 'P', 'P', 'P', 'P', 'P', 'P'], 
['-', '-', '-', '-', '-', '-', '-', '-'], 
['-', '-', '-', '-', '-', '-', '-', '-'], 
['-', '-', '-', '-', '-', '-', '-', '-'], 
['-', '-', '-', '-', '-', '-', '-', '-'], 
['p', 'p', 'p', 'p', 'p', 'p', 'p', 'p'], 
['r', 'n', 'b', 'q', 'k', 'b', 'n', 'r']]

看起来像:

R  N  B  Q  K  B  N  R
P  P  P  P  P  P  P  P
-  -  -  -  -  -  -  -
-  -  -  -  -  -  -  -
-  -  -  -  -  -  -  -
-  -  -  -  -  -  -  -
p  p  p  p  p  p  p  p
r  n  b  q  k  b  n  r

所以,我开始通过执行以下操作来遍历各个部分以找到可接受的棋子移动:

for i in range(1):
    for j in range(1):
        if board[i][j].lower() == 'p':
            p_moves(board,i,j)

其中p_moves是:

def p_moves(board_state, row, col):

    valid_moves = []
    #copy the board to make modifications to the new one and store it
    new = board_state[:]

    #find if the space ahead of it is blank
    if board_state[row+1][col] == "-":

        #use a throwaway value just to test the function and we can see easily what changed
        new[row+1][col] = "Z"
        #clear where the piece was
        new[row][col] = "-" 

        #add the board to the list of possible moves
        valid_moves.append(new) 
    return valid_moves

最终发生的事情是new董事会似乎每次调用该函数时都不清楚,我不知道为什么因为我将它作为一个新的切片变量,它在内存中的ID与board_state不同,所以我不确定这里发生了什么。

澄清一下,在经过顶部循环之后(我甚至不考虑下半部分 - 最小的部分如何如此痛苦?!),下一个可能的董事会状态最终看起来像:

R  N  B  Q  K  B  N  R
-  -  -  -  -  -  -  -
Z  Z  Z  Z  Z  Z  Z  Z
-  -  -  -  -  -  -  -
-  -  -  -  -  -  -  -
-  -  -  -  -  -  -  -
p  p  p  p  p  p  p  p
r  n  b  q  k  b  n  r

感谢您的帮助。

0 个答案:

没有答案