【发布时间】:2020-10-08 23:22:26
【问题描述】:
这里是新的 Python 编码器,具有相当多的 c# 经验。我正在尝试从 Automate the Boring Stuff with Python 中完成这个练习:
Chess Dictionary Validator 在本章中,我们使用了字典 值 {'1h': 'bking', '6c': 'wqueen', '2g': 'bbishop', '5h': 'bqueen', '3e': 'wking'} 表示棋盘。写一个函数名为 isValidChessBoard() 接受字典参数并返回 True 或 False 取决于董事会是否有效。一个有效的董事会将有 正好一位黑王和一位白王。每个玩家都可以 最多只有 16 个棋子,最多 8 个棋子,并且所有棋子必须是 在从“1a”到“8h”的有效空间上;也就是说,一块不能在太空中 '9z'。作品名称以“w”或“b”开头表示 白色或黑色,后跟“pawn”、“knight”、“bishop”、“rook”, “女王”或“国王”。此功能应检测错误何时出现 导致棋盘不正确。
我目前的解决方案如下,
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)')
...我按预期得到了黑王的增量,但我也得到了白王的增量。我比较困惑。我在这里缺少某种全局变量,还是我只是在写乱码?
真的很感激能看到第二双眼睛。提前谢谢你,牧师。
【问题讨论】:
-
下面有一个很好的解决我的问题的方法,但请注意,我的测试板中也存在错误,如上所示(如果您想自己使用此代码!)
标签: python dictionary reference slice increment