gpt4 book ai didi

python - 自动化无聊的东西-第5章-国际象棋字典验证器

转载 作者:太空宇宙 更新时间:2023-11-03 19:47:30 24 4
gpt4 key购买 nike

第一篇帖子,是编程新手,很开心!欢迎对此职位的所有反馈以及我的问题。

我正在通过自动完成无聊的工作并攻击第5章第一个问题Chess Dictionary Validator

在本章中,我们使用了字典值{'1h':'bking','6c':'wqueen','2g':'bbishop','5h':'bqueen','3e':'wking'}代表棋盘。编写一个名为isValidChessBoard()的函数,该函数带有一个字典参数,并根据板是否有效而返回True或False。

一个有效的董事会将只有一位黑人国王和一位白人国王。每个玩家最多只能有16个棋子,最多8个棋子,并且所有棋子必须位于从“ 1a”到“ 8h”的有效空间内;也就是说,一块不能在空间“ 9z”上。作品名称以“ w”或“ b”开头,代表白色或黑色,然后是“典当”,“骑士”,“主教”,“骗子”,“女王”或“国王”。此功能应检测错误何时导致棋盘不正确。

我的问题和代码:


通过这些for循环+多个if语句评估字典键/值是否是“最佳实践”?似乎很多代码。如果在for循环中紧随其他if语句,则更改为包含一些elif会导致问题。
第23行if i[0] == 'b':出错,因为为空字符串值的象棋空格在i [0]处没有字符。表达/评估空值的最佳方法是什么?如果是'',我是否应该在循环中添加前导条件来评估value ==”,然后“继续”?
为什么不能将第15行折叠为11,这样我只有一个语句:if 'bking' or 'wking' not in board.values():?如果我尝试这样做,则语句结果为True;否则,结果为True。但是字典同时包含两个值,因此它不应该求值为False并保持代码运行吗?


def isValidChessBoard(board):
while True:
blackPieces = 0
whitePieces = 0
wpawn = 0
bpawn = 0
letterAxis = ('a','b','c','d','e','f','g','h')
pieceColour = ('b','w')
pieceType = ('pawn','knight','bishop','rook','queen','king')

#one black king and one white king
if 'bking' not in board.values():
print('KingError')
return False
break
if 'wking' not in board.values():
print('KingError')
return False
break

#each player has <= 16 pieces
for i in board.values():
if i[0] == 'b':
blackPieces+=1
if i[0] == 'w':
whitePieces+=1
if whitePieces >= 17:
print('TotalPieceError')
return False
break
if blackPieces >= 17:
print('TotalPieceError')
return False
break

#each player has <= 8 pawns
for i in board.values():
if i == 'wpawn':
wpawn+=1
elif i == 'bpawn':
bpawn+=1
if wpawn or bpawn >= 9:
print('PawnError')
return False
break

#all pieces must be on valid space from '1a' to '8h'
for i in board.keys():
if int(i[0]) >= 9:
print('SpacesError')
return False
break
if i[1] not in letterAxis:
print('yAxisError')
return False
break

#piece names begin with 'w' or 'b'
for i in board.values():
if i[0] not in pieceColour:
print('WhiteOrBlackError')
return False
break

#piece names must follow with 'pawn', 'knight', 'bishop', 'rook', 'queen', 'king'
for i in board.values():
if i[1:] not in pieceType:
print('PieceTypeError')
return False
return 'This board checks out'

board = {'1a': 'bking','2a': 'bqueen','3a': 'brook','4a': 'brook',
'5a': 'bknight','6a': 'bknight','7a':'bbishop','8a': 'bbishop',
'1b': 'bpawn','2b': 'bpawn','3b': 'bpawn','4b':'bpawn',
'5b': 'bpawn','6b': 'bpawn','7b': 'bpawn','8b': 'bpawn',
'1c': 'wking','2c': 'wqueen','3c': 'wrook','4c': 'wrook',
'5c': 'wbishop','6c': 'wbishop','7c': 'wknight','8c':'wknight',
'1e': 'wpawn','2e': 'wpawn','3e': 'wpawn','4e': 'wpawn',
'5e': 'wpawn','6e': 'wpawn','7e': 'wpawn','8e': 'wpawn',
'1f': '','2f': '','3f': '','4f': '','5f': '','6f': '','7f': '','8f': '',
'1g': '','2g': '','3g': '','4g': '','5g': '','6g': '','7g': '','8g': '',
'1h': '','2h': '','3h': '','4h': '','5h': '','6h': '','7h': '','8h': '',}

print(isValidChessBoard(board))

Error:
Traceback (most recent call last):
line 23, in isValidChessBoard
if i[0] == 'b':
IndexError: string index out of range

最佳答案

由于您询问是否有其他选择,因此我提出以下内容。

脚步


定义所有棋子的集合
按类型定义有效的计件范围
数数木板上的碎片
检查件数在有效范围内
检查职位是否有效
检查件名是否有效




def isValidChessBoard(board):
"""Validate counts and location of pieces on board"""

# Define pieces and colors
pieces = ['king','queen','rook', 'knight','bishop','knight', 'pawn']
colors = ['b', 'w']
# Set of all chess pieces
all_pieces = set(color+piece for piece in pieces for color in colors)

# Define valid range for count of chess pieces by type (low, high) tuples
valid_counts = {'king': (1, 1),
'queen': (1, 1),
'rook': (0, 2),
'bishop': (0, 2),
'knight': (0, 2),
'pawn': (0, 8)}

# Get count of pieces on the board
piece_cnt = {}
for v in board.values():
if v in all_pieces:
piece_cnt.setdefault(v, 0)
piece_cnt[v] += 1

# Check if there are a valid number of pieces
for piece in all_pieces:
cnt = piece_cnt.get(piece, 0)
lo, hi = valid_counts[piece[1:]]
if not lo <= cnt <= hi: # Count needs to be between lo and hi
if lo != hi:
print(f"There should between {lo} and {hi} {piece} but there are {cnt}")
else:
print(f"There should be {lo} {piece} but there are {cnt})")
return False

# Check if locations are valid
for location in board.keys():
row = int(location[:1])
column = location[1:]
if not ((1 <= row <= 8) and ('a' <= column <= "h")):
print(f"Invaid to have {board[location]} at postion {location}")
return False

# Check if all pieces have valid names
for loc, piece in board.items():
if piece:
if not piece in all_pieces:
print(f"{piece} is not a valid chess piece at postion {loc}")
return False

return True

关于python - 自动化无聊的东西-第5章-国际象棋字典验证器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60028942/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com