我正在为学校项目制作骰子游戏。当您开始游戏时,输入您的名字,它需要从文件“ Player_Names.txt”中读取以前玩过的球员的名字列表,如果该名字不在列表中,那么他们会得到“欢迎”,但如果他们得到了“欢迎回来”。
使用我当前的代码,发生的事情是它只读取文件的第一行,因此,如果名称不在第一行,它将返回一条消息,欢迎新玩家。 另外,如果它是名称的一部分,那么如果您首先输入“ Matthew”,然后再次输入“ Matt”,则会给您一个“ welcome back”消息,但是“ Matt”是另一个人,因此应该是“ welcome”消息。 同样,如果您输入的名称在列表中,但在文件的第二行,您什么也没得到,则程序将继续到下一行代码。
Names = open("Player_Names.txt", "r+")
player1 = input("Enter your name: ")
if player1 in Names.readline():
print("Welcome back you are player 1")
elif player1 not in Names.readline():
print("Welcome you are player 1")
Names.write(player1)
Names.write("\n")
我如何让程序读取所有行并将输入的单词视为整个单词而不是像“马修”示例中的字母?
答案 0 :(得分:2)
这里有几个问题:
if player1 in Names.readline():
print("Welcome back you are player 1")
elif player1 not in Names.readline():
此构造通常是多余的,因为第一个条件是第二个条件的取反,因此您可以编写:
if player1 in Names.readline():
print("Welcome back you are player 1")
else:
,但在这种情况下,Names.readline()
具有消耗第一行的副作用。因此它们并不等效。
此外,如果文件中有几行,则算法无效。
我将用行创建一个list
并使用any
:
lines = Names.readlines()
if any(player1 in line for line in lines):
# known player
else:
# new player
请注意,您可以使用set
和完全匹配来创建性能更高的查询:
lines = {x.strip() for x in Names}
player1 = player1.strip()
if player1 in lines:
....
else:
答案 1 :(得分:1)
您需要读取整个文件并将其按换行符分隔,这样您将获得行列表,并将匹配项与全名进行比较。所以第二行应该是
if player1 in Names.read().split('\n'):