这是我的第一篇文章,我将尽量详细说明。
我正在重建游戏“Mastermind”,但是使用字母而不是颜色。 颜色“红色”为“R”,“黄色”为“Y”等......
我必须检查错误,当用户输入错误时,输出应为guess = input("Error, try again: ")
。
任何错误都不能算作尝试。总共有8次尝试。我也必须检查其他事情,但我已经完成了那部分。
以下是我遇到问题的代码:
if len(guess) == 4 and (guess.upper().count("R") + guess.upper().count("Y") + guess.upper().count("B") +\
guess.upper().count("G") + guess.upper().count("W") + guess.upper().count("O") == 4):
对于颜色RGYBWO
,如果用户输入例如:RYGW
,我可以将其总结为== 4吗?
简单来说,我可以检查每个字母是否存在并将它们加到= 4?
如果没有,我会发布完整的代码。
答案 0 :(得分:2)
使用内置的sum
:
uppercase_guess = guess.upper() #no need to call it every time.
if sum(uppercase_guess.count(i) for i in "RGYBWO") == 4:
...
虽然如果你想检查每个角色是否是其中一个角色,可能会更清楚:
if ( all((i in "RGYBWO") for i in guess.upper())
and len(guess) == 4):
...
答案 1 :(得分:2)
您的措辞不是100%明确,但我认为您在询问是否可以更有效地检查输入内容。有几种方法比现在更短,更灵活。
您要检查输入的长度是否为4,并且不包含任何非法字符。您的代码在功能上可以做到这一点但不是非常易于维护。检查len(guess) == 4
对于第一部分是完美的。第二个在this question中有大约六个解决方案。以下是三个最重要的摘要:
# Initialize this at module level
allowed = set('rgbyow')
# This is the check:
if len(guess) == 4 and set(guess.lower()) < allowed:
# OK
# Initialize this at module level
allowed = set('rgbyow')
# This is the check:
if len(guess) == 4 and all(c in allowed for c in guess.lower()):
# OK
# Initialize this at module level
import re
allowed_expr = re.compile('[rgbyowRGBYOW]{4}')
# This is the check:
if allowed_expr.match(guess):
# OK
答案 2 :(得分:0)
试试这个:
因为红色可能真的是两个“R”或“r”代码。
allowed = 'RrGgBbYyOoWw' # So, now you accept either case and drop `.upper()`
if len(guess) == 4 and sum([guess.count(i) for i in allowed]):