根据存储在变量中的任意字典是否符合棋盘的标准,程序应该打印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))
这本词典似乎符合既定的标准。然而,每当我试图运行它时,程序都会打印“假”。
我是不是错过了什么?
提前非常感谢,如果这是一个过于基本或宽泛的问题,我道歉。
问题在于循环,例如:
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
块。注意此处的缩进:else
与for
循环相关,而不是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))
如果临时将所有返回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
。
我在尝试导出独立应用程序时遇到问题。 当我使用eclise执行它时,它运行正常,但当我试图导出到可运行的jar时,它会给我一些错误。 我的坚持。xml看起来像 它位于src/META-INF/persistence。xml 从终端运行时得到的堆栈跟踪是: 在爪哇。朗,反思一下。方法在组织中调用(未知源)。日食jdt。内部的jarinjarloader。罐式装载机。main(jarsrcloader
问题内容: 情况一: 输出: 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版规范中,添加了该要
无法调试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文件