在 python 3 中改进我的刽子手游戏代码的建议
Suggestion to improve my code of hangman game in python 3
我正在编写使用 python 3 构建的刽子手游戏的代码。
一旦您的 words.txt
文件与脚本位于同一文件夹中,代码就可以完美运行,但我需要改进它的建议。
有很多代码重复和我可以编码得更好的地方,我正在努力进行代码重构。有什么意见和建议吗?
class Hangman(object):
def __init__(self):
self.secret_word = self.get_secret_word()
self.correct_letters = []
self.missed_letters = []
self.error = 0
def get_secret_word(self):
from random import choice
with open("words.txt") as f:
wordsList = f.read().splitlines()
secretWord = choice(wordsList).lower()
return secretWord
def read_player_input(self):
self.inputChar = input("\nType a letter: ")
def guess_letter(self):
if (
self.inputChar in self.secret_word
and self.inputChar not in self.correct_letters
):
self.correct_letters.append(self.inputChar)
return True
elif (
self.inputChar not in self.secret_word
and self.inputChar not in self.missed_letters
):
self.missed_letters.append(self.inputChar)
self.error += 1
print(f"\nError {self.error}.")
return False
else:
print("\nYou've already tried this letter.")
return False
def print_encoded_word(self):
self.encoded_word = ""
for letter in self.secret_word:
if letter not in self.correct_letters:
self.encoded_word += "_"
else:
self.encoded_word += letter
print()
print(self.encoded_word)
print("\nCorrect letters: ", end="")
for letter in self.correct_letters:
print(letter + " ", end="")
print("\nWrong letters: ", end="")
for letter in self.missed_letters:
print(letter + " ", end="")
def game_continue(self):
return set(self.correct_letters) != set(self.secret_word) and (self.error <= 3)
def won_game(self):
if set(self.correct_letters) == set(self.secret_word):
print(self.secret_word)
print("You win!")
else:
print(f"You lose. Secret word is {self.secret_word}")
def main():
hangman = Hangman()
hangman.print_encoded_word()
hangman.read_player_input()
hangman.guess_letter()
while hangman.game_continue():
hangman.print_encoded_word()
hangman.read_player_input()
hangman.guess_letter()
hangman.won_game()
if __name__ == "__main__":
main()
我建议使用 main(),就好像您要扩展代码并希望在程序 运行 时调用更多函数一样。另外,我会在您完成后关闭该文件(您可以看到为什么 )。
我在下面要更改的功能上添加了注释“#”:
class Hangman(object):
def get_secret_word(self):
from random import choice
with open("words.txt") as f:
wordsList = f.read().splitlines()
secretWord = choice(wordsList).lower()
f.close() #close the file
return secretWord
def print_encoded_word(self):
self.encoded_word = ""
for letter in self.secret_word:
if letter not in self.correct_letters:
self.encoded_word += "_"
else:
self.encoded_word += letter
print() #what is this print doing here?
print(self.encoded_word)
print("\nCorrect letters: ", end="")
for letter in self.correct_letters:
print(letter + " ", end="")
print("\nWrong letters: ", end="")
for letter in self.missed_letters:
print(letter + " ", end="")
def play(): #add this function
hangman.print_encoded_word()
hangman.read_player_input()
hangman.guess_letter()
while hangman.game_continue():
hangman.print_encoded_word()
hangman.read_player_input()
hangman.guess_letter()
hangman.won_game()
def main(): #remove stuff that is now in play()
hangman = Hangman()
hangman.play() #add this
我需要知道每个功能到底做了什么才能给出更多建议,但似乎其余的都很好。
类似这样的事情(下面的解释):
class Hangman(object):
def __init__(self):
self.secret_word = self.get_secret_word()
self.correct_letters = []
self.missed_letters = []
self.error = 0
self.inputChar = None
def get_secret_word(self):
from random import choice
with open("words.txt") as f:
wordsList = f.read().splitlines()
secretWord = choice(wordsList).lower()
return secretWord
def read_player_input(self):
letter = input("\nType a letter: ").lower()
if letter == self.secret_word:
self.correct_letters += list(self.secret_word)
self.inputChar = None
elif len(letter) >1:
print("You can add only 1 letter!")
self.inputChar = None
elif len(letter) == 0:
print("Please input soemthing!")
self.inputChar = None
else:
self.inputChar = letter
def guess_letter(self):
if self.inputChar is None:
print("Try again")
elif (
self.inputChar in self.correct_letters + self.missed_letters
):
print("\nYou've already tried this letter.")
return False
elif self.inputChar in self.secret_word:
self.correct_letters.append(self.inputChar)
return True
else:
self.missed_letters.append(self.inputChar)
self.error += 1
print(f"\nError {self.error}.")
return False
def print_encoded_word(self):
self.encoded_word = ""
for letter in self.secret_word:
if letter not in self.correct_letters:
self.encoded_word += "_"
else:
self.encoded_word += letter
print(f"\n{self.encoded_word}")
print(f"\nCorrect letters: {' '.join(self.correct_letters)}", end="")
print(f"\nWrong letters: {' '.join(self.missed_letters)}", end="")
def game(self):
print(self.correct_letters)
if set(self.correct_letters) == set(self.secret_word):
print(self.secret_word)
print("You win!")
return False
elif self.error <= 3:
return True
else:
print(f"You lose. Secret word is {self.secret_word}")
return False
def main():
hangman = Hangman()
while hangman.game():
hangman.print_encoded_word()
hangman.read_player_input()
hangman.guess_letter()
if __name__ == "__main__":
main()
首先,你必须检查用户是否真的在 read_player_input 中添加了一个字母,或者他是否猜到了这个词。
那么,你在game_continue和won_game中的逻辑是一样的,所以在游戏中合并它们就可以了。
在 guess_letter 中多次执行相同的逻辑检查,稍微改变了树。
此外,您可以使用带连接函数的字符串格式化,而不是用于打印的 for 循环,以减少代码和提高性能。
最后,hangman.game() returns 开始时为真,所以 main 中的 3 行是多余的。
希望对您有所帮助。
我正在编写使用 python 3 构建的刽子手游戏的代码。
一旦您的 words.txt
文件与脚本位于同一文件夹中,代码就可以完美运行,但我需要改进它的建议。
有很多代码重复和我可以编码得更好的地方,我正在努力进行代码重构。有什么意见和建议吗?
class Hangman(object):
def __init__(self):
self.secret_word = self.get_secret_word()
self.correct_letters = []
self.missed_letters = []
self.error = 0
def get_secret_word(self):
from random import choice
with open("words.txt") as f:
wordsList = f.read().splitlines()
secretWord = choice(wordsList).lower()
return secretWord
def read_player_input(self):
self.inputChar = input("\nType a letter: ")
def guess_letter(self):
if (
self.inputChar in self.secret_word
and self.inputChar not in self.correct_letters
):
self.correct_letters.append(self.inputChar)
return True
elif (
self.inputChar not in self.secret_word
and self.inputChar not in self.missed_letters
):
self.missed_letters.append(self.inputChar)
self.error += 1
print(f"\nError {self.error}.")
return False
else:
print("\nYou've already tried this letter.")
return False
def print_encoded_word(self):
self.encoded_word = ""
for letter in self.secret_word:
if letter not in self.correct_letters:
self.encoded_word += "_"
else:
self.encoded_word += letter
print()
print(self.encoded_word)
print("\nCorrect letters: ", end="")
for letter in self.correct_letters:
print(letter + " ", end="")
print("\nWrong letters: ", end="")
for letter in self.missed_letters:
print(letter + " ", end="")
def game_continue(self):
return set(self.correct_letters) != set(self.secret_word) and (self.error <= 3)
def won_game(self):
if set(self.correct_letters) == set(self.secret_word):
print(self.secret_word)
print("You win!")
else:
print(f"You lose. Secret word is {self.secret_word}")
def main():
hangman = Hangman()
hangman.print_encoded_word()
hangman.read_player_input()
hangman.guess_letter()
while hangman.game_continue():
hangman.print_encoded_word()
hangman.read_player_input()
hangman.guess_letter()
hangman.won_game()
if __name__ == "__main__":
main()
我建议使用 main(),就好像您要扩展代码并希望在程序 运行 时调用更多函数一样。另外,我会在您完成后关闭该文件(您可以看到为什么
我在下面要更改的功能上添加了注释“#”:
class Hangman(object):
def get_secret_word(self):
from random import choice
with open("words.txt") as f:
wordsList = f.read().splitlines()
secretWord = choice(wordsList).lower()
f.close() #close the file
return secretWord
def print_encoded_word(self):
self.encoded_word = ""
for letter in self.secret_word:
if letter not in self.correct_letters:
self.encoded_word += "_"
else:
self.encoded_word += letter
print() #what is this print doing here?
print(self.encoded_word)
print("\nCorrect letters: ", end="")
for letter in self.correct_letters:
print(letter + " ", end="")
print("\nWrong letters: ", end="")
for letter in self.missed_letters:
print(letter + " ", end="")
def play(): #add this function
hangman.print_encoded_word()
hangman.read_player_input()
hangman.guess_letter()
while hangman.game_continue():
hangman.print_encoded_word()
hangman.read_player_input()
hangman.guess_letter()
hangman.won_game()
def main(): #remove stuff that is now in play()
hangman = Hangman()
hangman.play() #add this
我需要知道每个功能到底做了什么才能给出更多建议,但似乎其余的都很好。
类似这样的事情(下面的解释):
class Hangman(object):
def __init__(self):
self.secret_word = self.get_secret_word()
self.correct_letters = []
self.missed_letters = []
self.error = 0
self.inputChar = None
def get_secret_word(self):
from random import choice
with open("words.txt") as f:
wordsList = f.read().splitlines()
secretWord = choice(wordsList).lower()
return secretWord
def read_player_input(self):
letter = input("\nType a letter: ").lower()
if letter == self.secret_word:
self.correct_letters += list(self.secret_word)
self.inputChar = None
elif len(letter) >1:
print("You can add only 1 letter!")
self.inputChar = None
elif len(letter) == 0:
print("Please input soemthing!")
self.inputChar = None
else:
self.inputChar = letter
def guess_letter(self):
if self.inputChar is None:
print("Try again")
elif (
self.inputChar in self.correct_letters + self.missed_letters
):
print("\nYou've already tried this letter.")
return False
elif self.inputChar in self.secret_word:
self.correct_letters.append(self.inputChar)
return True
else:
self.missed_letters.append(self.inputChar)
self.error += 1
print(f"\nError {self.error}.")
return False
def print_encoded_word(self):
self.encoded_word = ""
for letter in self.secret_word:
if letter not in self.correct_letters:
self.encoded_word += "_"
else:
self.encoded_word += letter
print(f"\n{self.encoded_word}")
print(f"\nCorrect letters: {' '.join(self.correct_letters)}", end="")
print(f"\nWrong letters: {' '.join(self.missed_letters)}", end="")
def game(self):
print(self.correct_letters)
if set(self.correct_letters) == set(self.secret_word):
print(self.secret_word)
print("You win!")
return False
elif self.error <= 3:
return True
else:
print(f"You lose. Secret word is {self.secret_word}")
return False
def main():
hangman = Hangman()
while hangman.game():
hangman.print_encoded_word()
hangman.read_player_input()
hangman.guess_letter()
if __name__ == "__main__":
main()
首先,你必须检查用户是否真的在 read_player_input 中添加了一个字母,或者他是否猜到了这个词。
那么,你在game_continue和won_game中的逻辑是一样的,所以在游戏中合并它们就可以了。
在 guess_letter 中多次执行相同的逻辑检查,稍微改变了树。
此外,您可以使用带连接函数的字符串格式化,而不是用于打印的 for 循环,以减少代码和提高性能。
最后,hangman.game() returns 开始时为真,所以 main 中的 3 行是多余的。
希望对您有所帮助。