簡體   English   中英

為什么我的新手代碼會額外增加?

[英]Why am I getting an extra increment in my newbie code?

新的 Python 編碼器在這里,具有相當數量的 c# 經驗。 我正在嘗試從 Automate the Boring Stuff with Python 中完成這個練習:

Chess Dictionary Validator 在本章中,我們使用了字典值 {'1h': 'bking', '6c': 'wqueen', '2g': 'bbishop', '5h': 'bqueen', '3e': ' wking'} 代表一個棋盤。 編寫一個名為 isValidChessBoard() 的 function,它接受一個字典參數並根據棋盤是否有效返回 True 或 False。 一個有效的棋盤將恰好有一個黑王和一個白王。 每個玩家最多只能有16個棋子,最多8個棋子,所有棋子必須在'1a'到'8h'的有效空間上; 也就是說,一塊不能在空間'9z'上。 棋子名稱以“w”或“b”開頭,表示白色或黑色,然后是“pawn”、“knight”、“bishop”、“rook”、“queen”或“king”。 這個 function 應該檢測到錯誤何時導致棋盤不正確。

我目前的解決方案如下,

testBoard00 = {'1h': 'bking', '6c': 'wqueen', '2g': 'bbishop', '5h': 'bqueen', '3e': 'wking'}

testBoard01 = {'1a': 'brook', '1b': 'bknight', '1c': 'bbishop', '1d': 'bqueen', '1e': 'bking', '1f' : 'bbishop', '1g' : 'bknight', '1h' : 'brook',
               '2a': 'bpawn', '2b' : 'bpawn', '2c': 'bpawn', '2d' : 'bpawn', '2e': 'bpawn', '2f' : 'bpawn', '2g': 'bpawn', '2h' : 'bpawn',
               '8a': 'wrook', '8b': 'wknight', '8c': 'wbishop', '8d': 'wqueen', '8e': 'wking', '8f' : 'wbishop', '8g' : 'wknight', '8h' : 'wrook',
               '7a': 'bpawn', '7b' : 'bpawn', '7c': 'bpawn', '7d' : 'bpawn', '7e': 'bpawn', '7f' : 'bpawn', '7g': 'bpawn', '7h' : 'bpawn',}

testBoard02 = {'1a': 'brook', '1b': 'bknight', '1c': 'bbishop', '1d': 'bqueen', '1e': 'bking', '1f' : 'bbishop', '1g' : 'bknight', '1h' : 'brook',
               '2a': 'bpawn', '2b' : 'bpawn', '2c': 'bpawn', '2d' : 'bpawn', '2e': 'bpawn', '2f' : 'bpawn', '2g': 'bpawn', '2h' : 'bpawn',
               '8a': 'wrook', '8b': 'wknight', '8c': 'wbishop', '8d': 'wqueen', '8e': 'wking', '8f' : 'wbishop', '8g' : 'bpawn', '8h' : 'wrook', # Extra pawn instead of second Knight!
               '7a': 'wpawn', '7b' : 'wpawn', '7c': 'wpawn', '7d' : 'wpawn', '7e': 'wpawn', '7f' : 'wpawn', '7g': 'wpawn', '7h' : 'wpawn',}

testBoard03 = {'1a': 'brook', '1b': 'bknight', '1c': 'bbishop', '1d': 'bqueen', '1e': 'bking', '1f' : 'bbishop', '1g' : 'bknight', '1h' : 'brook',
               '2a': 'bpawn', '2b' : 'bpawn', '2c': 'bpawn', '2d' : 'bpawn', '2e': 'bpawn', '2f' : 'bpawn', '2g': 'bpawn', '2h' : 'bpawn',
               '8a': 'wrook', '8b': 'wknight', '8c': 'wbishop', '8d': 'wqueen', '8f' : 'wbishop', '8g' : 'wknight', '8h' : 'wrook', # Missing a king!
               '7a': 'wpawn', '7b' : 'wpawn', '7c': 'wpawn', '7d' : 'wpawn', '7e': 'wpawn', '7f' : 'wpawn', '7g': 'wpawn', '7h' : 'wpawn',}

letters = 'abcdefgh'
numbers = '12345678'

BOARDUNITS = { 'pawn' : 0, 'rook' : 0, 'knight' : 0, 'bishop' : 0, 'queen' : 0, 'king' : 0 }
TOTALUNITS = { 'pawn' : 16, 'rook' : 4, 'knight' : 4, 'bishop' : 4, 'queen' : 2, 'king' : 2 }

def isValidChessBoard(board):

    boardIsValid = True

    for k in board:
        let = str(k[1:]).lower()
        num = str(k[:1]).lower()

        if let not in letters:
            print('INVALID: Letter is not in acceptable range!')
            boardIsValid = false
            return boardIsValid

        if num not in numbers:
            print('INVALID: Numbers are not in acceptable range!')
            boardIsValid = false
            return boardIsValid

        # print('Number is ' + num + ' and Letter is ' + let + '.')

    wPieces = bPieces = BOARDUNITS

    for k in board:
        # print('K is now: ' + str(k) + ' which is equal to ' + board[k])
        #piece = board[k]

        print(str(wPieces['king']) + ' white King(s), ' + str(bPieces['king']) + ' black King(s)')

        if board[k][0] == 'b':
            #print('First character of piece is ' + piece[0])

            if(board[k][1:] in bPieces):
                if(board[k][1:] == 'king'):
                    print('Black king here!')
                #print('[][] Black ' + piece[1:] + ' is in bPieces!')
                print('Before Increment: ' + str(wPieces['king']) + ' white King(s), ' + str(bPieces['king']) + ' black King(s)')
                bPieces[board[k][1:]] += 1
                print('After Increment: ' + str(wPieces['king']) + ' white King(s), ' + str(bPieces['king']) + ' black King(s)')
            #else:
            #   print('#### ' + piece[1] + ' is not found in bPieces.')

        elif board[k][0] == 'w':
            #print('First character of piece is ' + piece[0])

            if(board[k][1:] in wPieces):
                if(board[k][1:] == 'king'):
                    print('White king here!')
                print('[][] White '+ board[k][1:] + ' is in wPieces!')
                wPieces[board[k][1:]] += 1
            else:
                print('#### ' + board[k][1] + ' is not found in wPieces.')
        else:
            print('Playing piece is missing "black" or "white" characteristic.')
            return False


        for k in bPieces:
            #print('We have ' + str(bPieces[k]) + ' Black ' + str(k) + '(s)')
            #print('We have ' + str(wPieces[k]) + ' White ' + str(k) + '(s)')
            if bPieces[k] > TOTALUNITS[k] or wPieces[k] > TOTALUNITS[k]:

                print('INVALID: Too many pieces!')

                boardIsValid = False
    print(str(wPieces['king']) + ' white King(s), ' + str(bPieces['king']) + ' black King(s)')
    if bPieces['king'] <= 0 or wPieces['king'] <= 0:
        print('INVALID: One of our kings is missing.')
        #print('Black kings number: ' + str(bPieces['king']))
        #print('White kings number: ' + str(wPieces['king']))
        boardIsValid = False    

    return boardIsValid

if isValidChessBoard(testBoard03):
    print("Board is valid!")
else:
    print("Board is invalid.")

在第 60 行之后,在下面的代碼中間看到...

print('Before Increment: ' + str(wPieces['king']) + ' white King(s), ' + str(bPieces['king']) + ' black King(s)')
                bPieces[board[k][1:]] += 1
                print('After Increment: ' + str(wPieces['king']) + ' white King(s), ' + str(bPieces['king']) + ' black King(s)')

...正如預期的那樣,我得到了黑國王的增量,但我也得到了白國王的增量。 我比較困惑。 我在這里缺少某種全局變量,還是我只是在寫亂碼?

真的很感激第二雙眼睛。 提前謝謝你,牧師。

錯誤在以下行中:

wPieces = bPieces = BOARDUNITS

此語句的目的是創建 BOARDUNITS 字典的兩個副本。 相反,此行將wPiecesbPieces變量分配給對同一字典 object 的引用。 因此,修改wPieces的條目也會修改bPieces ,也會修改BOARDUNITS ,因為所有三個標識符都指向同一個 object。

您可以改為創建BOARDUNITS object 的副本,如下所示:

wPieces = BOARDUNITS.copy()
bPieces = BOARDUNITS.copy()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM