How can I enhance this hangman game?












0














I have recently finished a course on Python 3 and I really learned a lot, but every time I write a script, it is messy and I often feel like there must be shorter, more efficient ways to write and structure my scripts.



So my question is: How could I rewrite the below script to be shorter and more efficient, and what advice would you guys give me to improve my coding skills in general (maybe a way of thinking about the program that will make it easier to define the structure of what my script should look like...)



I am really enthused about the possibilities that coding bring and I would really like to improve, so don't hesitate to be harsh with your comments ;)



Here below is one of the scripts I wrote. This one a hangman game: (The word list for the game are being picked from a .txt file that lives in the same directory as my script)



import string
import random


class Main:

def __init__(self):
self.place_holder =
self.wrong_guesses = 10
self.guesses =
with open('./words.txt', mode='r') as f:
self.word = random.choice(f.readlines())
self.word = self.word.strip()
print(self.word, end='')
return self.place_holders()

def place_holders(self):
# creates the placeholders for the word
for char in self.word:
if char != " ":
self.place_holder.append(' _ ')
elif char == " ":
self.place_holder.append(' ')
print("".join(self.place_holder)) # prints initial placeholder
return self.is_letter()

@staticmethod
def guess():
# Prompts the user for a guess
while True:
guessed_letter = input(str('Give a guess: ')).lower()
if guessed_letter not in string.ascii_lowercase or len(guessed_letter) > 1:
print(
'You have inputted more than one character or the character entered was not recognized.nPlease try again.')
else:
break
return guessed_letter

def is_letter(self):
# finds out if the letter belongs to the word, and if so, places it on the right placeholder
guessed_letter = self.guess()
if guessed_letter in self.word and guessed_letter not in self.guesses:
for i in range(len(self.word)):
if guessed_letter == self.word[i]:
self.place_holder[i] = f' {self.word[i]} '
elif guessed_letter in self.guesses:
print('You already said that..n')
else:
self.wrong_guesses -= 1
print(f'Sorry, missed.nYou have {self.wrong_guesses} guesses left.n')

self.guesses.append(guessed_letter)
print("".join(self.place_holder)) # prints the updated placeholder
return self.is_over()

def is_over(self):
# Checks if the players has guessed the full word or if the player ran out of guesses
if ' _ ' in self.place_holder and self.wrong_guesses > 0:
self.is_letter()
elif ' _ ' in self.place_holder and self.wrong_guesses == 0:
print(f'Sorry, Game Over!nThe word to guess was: {self.word}')
self.play_again()
else:
self.play_again()

@staticmethod
def play_again():
# Prompts the player if he wants to play again or not
if input('Do you want to play again? (y/n): ').lower().startswith('y'):
Main()
else:
print('Fair enough.. Thanks for playing!')
quit()


Main()









share|improve this question









New contributor




iAmWaldo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.

























    0














    I have recently finished a course on Python 3 and I really learned a lot, but every time I write a script, it is messy and I often feel like there must be shorter, more efficient ways to write and structure my scripts.



    So my question is: How could I rewrite the below script to be shorter and more efficient, and what advice would you guys give me to improve my coding skills in general (maybe a way of thinking about the program that will make it easier to define the structure of what my script should look like...)



    I am really enthused about the possibilities that coding bring and I would really like to improve, so don't hesitate to be harsh with your comments ;)



    Here below is one of the scripts I wrote. This one a hangman game: (The word list for the game are being picked from a .txt file that lives in the same directory as my script)



    import string
    import random


    class Main:

    def __init__(self):
    self.place_holder =
    self.wrong_guesses = 10
    self.guesses =
    with open('./words.txt', mode='r') as f:
    self.word = random.choice(f.readlines())
    self.word = self.word.strip()
    print(self.word, end='')
    return self.place_holders()

    def place_holders(self):
    # creates the placeholders for the word
    for char in self.word:
    if char != " ":
    self.place_holder.append(' _ ')
    elif char == " ":
    self.place_holder.append(' ')
    print("".join(self.place_holder)) # prints initial placeholder
    return self.is_letter()

    @staticmethod
    def guess():
    # Prompts the user for a guess
    while True:
    guessed_letter = input(str('Give a guess: ')).lower()
    if guessed_letter not in string.ascii_lowercase or len(guessed_letter) > 1:
    print(
    'You have inputted more than one character or the character entered was not recognized.nPlease try again.')
    else:
    break
    return guessed_letter

    def is_letter(self):
    # finds out if the letter belongs to the word, and if so, places it on the right placeholder
    guessed_letter = self.guess()
    if guessed_letter in self.word and guessed_letter not in self.guesses:
    for i in range(len(self.word)):
    if guessed_letter == self.word[i]:
    self.place_holder[i] = f' {self.word[i]} '
    elif guessed_letter in self.guesses:
    print('You already said that..n')
    else:
    self.wrong_guesses -= 1
    print(f'Sorry, missed.nYou have {self.wrong_guesses} guesses left.n')

    self.guesses.append(guessed_letter)
    print("".join(self.place_holder)) # prints the updated placeholder
    return self.is_over()

    def is_over(self):
    # Checks if the players has guessed the full word or if the player ran out of guesses
    if ' _ ' in self.place_holder and self.wrong_guesses > 0:
    self.is_letter()
    elif ' _ ' in self.place_holder and self.wrong_guesses == 0:
    print(f'Sorry, Game Over!nThe word to guess was: {self.word}')
    self.play_again()
    else:
    self.play_again()

    @staticmethod
    def play_again():
    # Prompts the player if he wants to play again or not
    if input('Do you want to play again? (y/n): ').lower().startswith('y'):
    Main()
    else:
    print('Fair enough.. Thanks for playing!')
    quit()


    Main()









    share|improve this question









    New contributor




    iAmWaldo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
    Check out our Code of Conduct.























      0












      0








      0







      I have recently finished a course on Python 3 and I really learned a lot, but every time I write a script, it is messy and I often feel like there must be shorter, more efficient ways to write and structure my scripts.



      So my question is: How could I rewrite the below script to be shorter and more efficient, and what advice would you guys give me to improve my coding skills in general (maybe a way of thinking about the program that will make it easier to define the structure of what my script should look like...)



      I am really enthused about the possibilities that coding bring and I would really like to improve, so don't hesitate to be harsh with your comments ;)



      Here below is one of the scripts I wrote. This one a hangman game: (The word list for the game are being picked from a .txt file that lives in the same directory as my script)



      import string
      import random


      class Main:

      def __init__(self):
      self.place_holder =
      self.wrong_guesses = 10
      self.guesses =
      with open('./words.txt', mode='r') as f:
      self.word = random.choice(f.readlines())
      self.word = self.word.strip()
      print(self.word, end='')
      return self.place_holders()

      def place_holders(self):
      # creates the placeholders for the word
      for char in self.word:
      if char != " ":
      self.place_holder.append(' _ ')
      elif char == " ":
      self.place_holder.append(' ')
      print("".join(self.place_holder)) # prints initial placeholder
      return self.is_letter()

      @staticmethod
      def guess():
      # Prompts the user for a guess
      while True:
      guessed_letter = input(str('Give a guess: ')).lower()
      if guessed_letter not in string.ascii_lowercase or len(guessed_letter) > 1:
      print(
      'You have inputted more than one character or the character entered was not recognized.nPlease try again.')
      else:
      break
      return guessed_letter

      def is_letter(self):
      # finds out if the letter belongs to the word, and if so, places it on the right placeholder
      guessed_letter = self.guess()
      if guessed_letter in self.word and guessed_letter not in self.guesses:
      for i in range(len(self.word)):
      if guessed_letter == self.word[i]:
      self.place_holder[i] = f' {self.word[i]} '
      elif guessed_letter in self.guesses:
      print('You already said that..n')
      else:
      self.wrong_guesses -= 1
      print(f'Sorry, missed.nYou have {self.wrong_guesses} guesses left.n')

      self.guesses.append(guessed_letter)
      print("".join(self.place_holder)) # prints the updated placeholder
      return self.is_over()

      def is_over(self):
      # Checks if the players has guessed the full word or if the player ran out of guesses
      if ' _ ' in self.place_holder and self.wrong_guesses > 0:
      self.is_letter()
      elif ' _ ' in self.place_holder and self.wrong_guesses == 0:
      print(f'Sorry, Game Over!nThe word to guess was: {self.word}')
      self.play_again()
      else:
      self.play_again()

      @staticmethod
      def play_again():
      # Prompts the player if he wants to play again or not
      if input('Do you want to play again? (y/n): ').lower().startswith('y'):
      Main()
      else:
      print('Fair enough.. Thanks for playing!')
      quit()


      Main()









      share|improve this question









      New contributor




      iAmWaldo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.











      I have recently finished a course on Python 3 and I really learned a lot, but every time I write a script, it is messy and I often feel like there must be shorter, more efficient ways to write and structure my scripts.



      So my question is: How could I rewrite the below script to be shorter and more efficient, and what advice would you guys give me to improve my coding skills in general (maybe a way of thinking about the program that will make it easier to define the structure of what my script should look like...)



      I am really enthused about the possibilities that coding bring and I would really like to improve, so don't hesitate to be harsh with your comments ;)



      Here below is one of the scripts I wrote. This one a hangman game: (The word list for the game are being picked from a .txt file that lives in the same directory as my script)



      import string
      import random


      class Main:

      def __init__(self):
      self.place_holder =
      self.wrong_guesses = 10
      self.guesses =
      with open('./words.txt', mode='r') as f:
      self.word = random.choice(f.readlines())
      self.word = self.word.strip()
      print(self.word, end='')
      return self.place_holders()

      def place_holders(self):
      # creates the placeholders for the word
      for char in self.word:
      if char != " ":
      self.place_holder.append(' _ ')
      elif char == " ":
      self.place_holder.append(' ')
      print("".join(self.place_holder)) # prints initial placeholder
      return self.is_letter()

      @staticmethod
      def guess():
      # Prompts the user for a guess
      while True:
      guessed_letter = input(str('Give a guess: ')).lower()
      if guessed_letter not in string.ascii_lowercase or len(guessed_letter) > 1:
      print(
      'You have inputted more than one character or the character entered was not recognized.nPlease try again.')
      else:
      break
      return guessed_letter

      def is_letter(self):
      # finds out if the letter belongs to the word, and if so, places it on the right placeholder
      guessed_letter = self.guess()
      if guessed_letter in self.word and guessed_letter not in self.guesses:
      for i in range(len(self.word)):
      if guessed_letter == self.word[i]:
      self.place_holder[i] = f' {self.word[i]} '
      elif guessed_letter in self.guesses:
      print('You already said that..n')
      else:
      self.wrong_guesses -= 1
      print(f'Sorry, missed.nYou have {self.wrong_guesses} guesses left.n')

      self.guesses.append(guessed_letter)
      print("".join(self.place_holder)) # prints the updated placeholder
      return self.is_over()

      def is_over(self):
      # Checks if the players has guessed the full word or if the player ran out of guesses
      if ' _ ' in self.place_holder and self.wrong_guesses > 0:
      self.is_letter()
      elif ' _ ' in self.place_holder and self.wrong_guesses == 0:
      print(f'Sorry, Game Over!nThe word to guess was: {self.word}')
      self.play_again()
      else:
      self.play_again()

      @staticmethod
      def play_again():
      # Prompts the player if he wants to play again or not
      if input('Do you want to play again? (y/n): ').lower().startswith('y'):
      Main()
      else:
      print('Fair enough.. Thanks for playing!')
      quit()


      Main()






      python-3.x hangman






      share|improve this question









      New contributor




      iAmWaldo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.











      share|improve this question









      New contributor




      iAmWaldo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.









      share|improve this question




      share|improve this question








      edited 24 mins ago









      Vogel612

      21.3k346128




      21.3k346128






      New contributor




      iAmWaldo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.









      asked 28 mins ago









      iAmWaldo

      1




      1




      New contributor




      iAmWaldo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.





      New contributor





      iAmWaldo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.






      iAmWaldo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.



























          active

          oldest

          votes











          Your Answer





          StackExchange.ifUsing("editor", function () {
          return StackExchange.using("mathjaxEditing", function () {
          StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
          StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
          });
          });
          }, "mathjax-editing");

          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "196"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: false,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: null,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });






          iAmWaldo is a new contributor. Be nice, and check out our Code of Conduct.










          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f210455%2fhow-can-i-enhance-this-hangman-game%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown






























          active

          oldest

          votes













          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes








          iAmWaldo is a new contributor. Be nice, and check out our Code of Conduct.










          draft saved

          draft discarded


















          iAmWaldo is a new contributor. Be nice, and check out our Code of Conduct.













          iAmWaldo is a new contributor. Be nice, and check out our Code of Conduct.












          iAmWaldo is a new contributor. Be nice, and check out our Code of Conduct.
















          Thanks for contributing an answer to Code Review Stack Exchange!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          Use MathJax to format equations. MathJax reference.


          To learn more, see our tips on writing great answers.





          Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


          Please pay close attention to the following guidance:


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f210455%2fhow-can-i-enhance-this-hangman-game%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Morgemoulin

          Scott Moir

          Souastre