当前位置: 首页 > 知识库问答 >
问题:

自动化枯燥的东西-第5章-国际象棋字典验证器

魏冷勋
2023-03-14

第一个帖子,新的编程和乐趣!欢迎所有关于这个帖子的反馈和我的问题。

我正在通过自动化乏味的东西和攻击第一章问题国际象棋字典验证器。

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

一个有效的板将有一个黑王和一个白王。每个玩家最多只能拥有16枚棋子,最多8枚棋子,所有棋子必须在'1a'到'8H'的有效空间上;也就是说,一块不能在空间'9z'上。作品名称以“W”或“B”开头,代表白色或黑色,后面是“Pawn”、“Knight”、“Bishop”、“Rook”、“Queen”或“King”。当错误导致不正确的棋盘时,这个函数应该检测。

我的问题和代码:

  1. 通过这些for循环+多个if语句来评估字典键/值是“最佳实践”吗?好像有很多代码。如果在for循环中与另一个if语句后面进行更改以包含一些elif会导致问题。
  2. 第23行如果i[0]=='b':出错,因为空字符串值的象棋空格在i[0]处没有字符。表达/评估空值的最佳方法是什么?如果是“”,是否应该在计算值==“”的循环中添加前导条件,然后添加“continue”?
  3. 为什么我不能将第15行折叠为11,这样,如果board.values():中没有'bking'或'wking'就有一个语句:?如果我这样做,陈述结果是真的;然而,字典包含这两个值,所以它不应该计算为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

共有1个答案

金骞尧
2023-03-14

编辑:当你定义有效的计数时,它没有考虑到你可能会得到一个棋子到棋盘的另一端,最终得到两个皇后,尽管我不知道你如何修复这一点,而不导致程序接受不确定的答案(例如在游戏开始时得到两个皇后)。如果您能在此提供任何帮助,我们将不胜感激!

既然你问是否有其他选择,我提出以下几点。

步骤

    null
def isValidChessBoard(board):
      """Validate counts and location of pieces on board"""
    
      # Define pieces and colors
      pieces = ['king','queen','rook', 'knight','bishop', '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': (0, 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
 类似资料:
  • 我是编程的新手,我正在尝试实现一个小的象棋游戏。 我目前正在为每件作品的验证移动而挣扎。 字典是: 我在每个子类中都创建了一个函数(Pawn,Rook,Queen...)这应该能证明这次行动是正确的。语法类似于: 目前,我可以移动任何白色树懒或树懒上有一个黑色的部分(但我不能吃我自己),反之亦然。 我想我使用的是而不是列表列表这一事实使事情变得更加困难。我真的迷路了。这将是惊人的,如果你可以帮助我

  • 前面念念叨叨的搞轮子, 作者意识到马上就要开始大量的枯燥无趣的体力活儿了. 注册,登录,退出,I18n具体的文本….枯燥啊 当然偶尔调整下以前的代码, 增加些小玩意啥的也有. 大概就是下面这些东东. 调整 url.Values 相关操作到 global 包 数据库结构小修改, 如果您一起进行过 install, 请重新 install 吧 包装下自动 HandlerParseForm 包装下先检查

  • 我正在下国际象棋,除了一件事,我几乎得到了所有的东西:我需要使棋手不可能将棋子移动到棋盘上。我很难解决这个问题。 我现在用伪代码生成的有效移动是:类getMoveLocations(我定义了一个位置为国际象棋中的一个方块):如果这个位置在边界内,这个位置的棋子是敌人的棋子,并且模拟的移动不会导致棋盘被检查,然后将该位置添加到工件可以移动到的可能位置。 问题是我如何检查棋盘是否“在检查中”。在我的代

  • 我得到一个大小为16的字符串(棋子在微型棋盘上的位置)。此字符串只能包含符号: k(王) P(典当) n(骑士) R(rook) B(主教) Q(皇后) 和空白(自由字段)。 我如何验证这个字符串的正则表达式,以检查字符串大小是否真的是16,符号只有这些,而且它必须包含一个K符号(因为一个King应该是)

  • DreamChess 是一款开放源码、跨平台(可在 Windows、Mac OS X 及 Linux 上运行)的 3D 国际象棋游戏。该游戏包含自身的引擎 Dreamer,提供各种国际象棋棋盘,并具有背景音乐及声效等其他附属功能。

  • 我正在做一个项目,在那里我采取一个象棋棋盘位置(FEN字符串转换成二进制)&它的评估分数,并将它馈送给一个神经网络。我的目的是让神经网络区分好的和坏的仓位。 我是如何编码位置的:国际象棋中有12个独特的棋子,即棋子,棋子,骑士,主教,王后和国王,白棋和黑棋一样。我使用4位编码每一个片段,其中0000表示一个空的正方形。所以64个方块被编码成256位,我用另外6位来表示游戏状态,比如轮到谁移动,国王