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

我的棋盘验证程序运行正常,但给出的结果不正确

梁丘缪文
2023-03-14

根据存储在变量中的任意字典是否符合棋盘的标准,程序应该打印True或False。标准如下:一个有效的董事会将有一个黑人国王和一个白人国王。每个玩家最多只能有16个棋子,最多8个棋子,并且所有棋子必须在“1a”到“8h”的有效空间内;也就是说,一块不能在空间“9z”上。作品名称以“w”或“b”开头,代表白色或黑色,然后是“兵”、“骑士”、“主教”、“车”、“女王”或“国王”。此函数应检测错误何时导致不正确的棋盘。

我的程序是这样的:

board = {'1h': 'bking', '6c': 'wqueen', '2g': 'bbishop',\
'5h': 'bqueen', '3e': 'wking'}
def isValidChessBoard(_board_):
    gen_num=0
    pawn_num=0
    wking_num=0
    bking_num=0
    letters=['a','b','c','d','e','f','g','h']
    pieces=['pawn','knight','bishop','rook','king','queen']
    for v in _board_.values():
        gen_num+=1
    if gen_num > 16:
        return False
    for v in _board_.values():
        if v.endswith('pawn'):
            pawn_num+=1
    if pawn_num > 8:
        return False
    for v in _board_.values():
        if v =='wking':
            wking_num+=1
        if v =='bking':
            bking_num+=1
    if wking_num!=1 or bking_num!=1:
        return False
    for k in _board_.keys():
        for i in range(1,9):
            if not k.startswith(str(i)):
                return False
    for k in _board_.keys():
        for i in letters:
            if not k.endswith(i):
                return False
    for v in _board_.values():
        if not v.startswith('b') or v.startswith('w'):
            return False
    for v in _board_.values():
        for i in pieces:
            if not v.endswith(i):
                return False
    return True

print(isValidChessBoard(board))

这本词典似乎符合既定的标准。然而,每当我试图运行它时,程序都会打印“假”。

我是不是错过了什么?

提前非常感谢,如果这是一个过于基本或宽泛的问题,我道歉。

共有2个答案

谢高峯
2023-03-14

问题在于循环,例如:

        for i in range(1,9):
            if not k.startswith(str(i)):
                return False

它坚持要从所有这些数字开始,而不是从任何数字开始。该回路可替换为:

        for i in range(1,9):
            if k.startswith(str(i)):
                break
        else:
            return False

请注意,条件是相反的。如果存在匹配,则它将从循环中中断。如果未找到匹配项,则将执行else块。注意此处的缩进:elsefor循环相关,而不是if块,如果for循环完成而没有中断,则将执行该块。

有几个地方也有类似的问题。

还有一个地方需要括号:

        if not (v.startswith('b') or v.startswith('w')):

因为没有括号的原文相当于:

        if (not v.startswith('b')) or v.startswith('w'):

因为not的运算符优先级高于二进制布尔运算符,例如

将这些修复组合在一起可以提供:

board = {'1h': 'bking', '6c': 'wqueen', '2g': 'bbishop',\
'5h': 'bqueen', '3e': 'wking'}
def isValidChessBoard(_board_):
    gen_num=0
    pawn_num=0
    wking_num=0
    bking_num=0
    letters=['a','b','c','d','e','f','g','h']
    pieces=['pawn','knight','bishop','rook','king','queen']
    for v in _board_.values():
        gen_num+=1
    if gen_num > 16:
        return False
    for v in _board_.values():
        if v.endswith('pawn'):
            pawn_num+=1
    if pawn_num > 8:
        return False
    for v in _board_.values():
        if v =='wking':
            wking_num+=1
        if v =='bking':
            bking_num+=1
    if wking_num!=1 or bking_num!=1:
        return False
    for k in _board_.keys():
        for i in range(1,9):
            if k.startswith(str(i)):
                break
        else:
            return False
    for k in _board_.keys():
        for i in letters:
            if k.endswith(i):
                break
        else:
            return False
    for v in _board_.values():
        if not (v.startswith('b') or v.startswith('w')):
            return False
    for v in _board_.values():
        for i in pieces:
            if v.endswith(i):
                break
        else:
            return False
    return True

print(isValidChessBoard(board))
乐正瑞
2023-03-14

如果临时将所有返回False替换为引发异常,则很容易看到哪个部分返回False。

这样做后,我们可以看到这一部分是问题:

for k in _board_.keys():
    for i in range(1,9):
        if not k.startswith(str(i)):
            return False

我不知道你想做什么,我猜你是想检查作品的数量是否在1到8之间?实现这一目标的一个小变化是:

for k in _board_.keys():
    for i in range(1,9):
        if k.startswith(str(i)):
            break
    else:
        return False

如果找到匹配,我们会中断,但如果没有中断,我们会返回false。继续,我们发现你在另外两个地方犯了这个错误。

我们还可以看到,这里的逻辑不是很好:

if not v.startswith('b') or v.startswith('w'):

可能是这样的:

if not v.startswith('b') and not v.startswith('w'):

把所有这些放在一起,你会得到:

board = {'1h': 'bking', '6c': 'wqueen', '2g': 'bbishop',\
'5h': 'bqueen', '3e': 'wking'}
def isValidChessBoard(_board_):
    gen_num=0
    pawn_num=0
    wking_num=0
    bking_num=0
    letters=['a','b','c','d','e','f','g','h']
    pieces=['pawn','knight','bishop','rook','king','queen']
    for v in _board_.values():
        gen_num+=1
    if gen_num > 16:
        raise Exception
    for v in _board_.values():
        if v.endswith('pawn'):
            pawn_num+=1
    if pawn_num > 8:
        raise Exception
    for v in _board_.values():
        if v =='wking':
            wking_num+=1
        if v =='bking':
            bking_num+=1
    if wking_num!=1 or bking_num!=1:
        raise Exception
    for k in _board_.keys():
        for i in range(1,9):
            if k.startswith(str(i)):
                break
        else:
            raise Exception
    for k in _board_.keys():
        for i in letters:
            if k.endswith(i):
                break
        else:
            raise Exception

    for v in _board_.values():
        if not v.startswith('b') and not v.startswith('w'):
            raise Exception

    for v in _board_.values():
        for i in pieces:
            if v.endswith(i):
                break
        else:
            raise Exception
    return True

print(isValidChessBoard(board))

我建议将提出异常,直到它完成,此时您只需将它们替换为返回False

 类似资料:
  • 问题内容: 情况一: 输出: 2005年7月8日星期五00:00:00 GMT-0700(PST) 案例二: 输出: Thu Jul 07 2005 17:00:00 GMT-0700(PST) 为什么第二次解析不正确? 问题答案: 在第5版规范发布之前,该Date.parse方法完全依赖于实现(除后者返回数字而不是a之外,其他方法new Date(string)等效)。在第5版规范中,添加了该要

  • 我在尝试导出独立应用程序时遇到问题。 当我使用eclise执行它时,它运行正常,但当我试图导出到可运行的jar时,它会给我一些错误。 我的坚持。xml看起来像 它位于src/META-INF/persistence。xml 从终端运行时得到的堆栈跟踪是: 在爪哇。朗,反思一下。方法在组织中调用(未知源)。日食jdt。内部的jarinjarloader。罐式装载机。main(jarsrcloader

  • 无法调试Android应用程序。当我单击调试按钮时,应用程序会启动,但在第一个屏幕上会冻结。只有当我调试应用程序时才会发生这种情况,如果我只是运行应用程序,一切都正常。我尝试先运行应用程序,然后将调试器附加到Android进程,但没有帮助。 我不知道问题出在哪里。什么会减慢调试速度?尝试了所有这些解决方案堆栈溢出1,堆栈溢出2,intellij支持 该应用程序有相当大的代码库。如果需要,我可以提供

  • 问题内容: 当我使用math.cos()和math.sin()函数时,我的python解释器表现得很时髦。例如,如果我在计算器上执行此操作: 但是当我在python(3.2和2.7)上执行此操作时 为什么会这样? 编辑:为了以防万一,您如何将Python中的弧度更改为度数? 问题答案: 这是由于您正在使用 度数 ,并且三角函数期望 弧度 作为输入而引起的: 的描述是: 在Python中,您可以使用

  • 问题内容: 我正在尝试使用JavaMail API发送电子邮件。我从自解压二进制文件在我的主目录中安装了jdk 1.5。我正在使用Ubintu 9.10 我使用下一条命令编译程序: 〜/ jdk1.5.0_22 / bin / javac -classpath〜/ jdk1.5.0_22 / jre / lib / javamail-1.4.3 / mail.jar:〜/ jdk1.5.0_22

  • 问题内容: 我想转换成 我用了 但是我明白了 问题答案: 每月使用CAPITAL M, 另外,您首先要设置日期,然后再重置日历,我想这不是您想要的,可能是因为您需要将其更改为以下内容 看到 API文件