Juego de Hangman Simple en Python -- python campo con python-3.x campo con hangman camp codereview Relacionados El problema

Simple Hangman game in Python


5
vote

problema

Español

Recientemente comencé a aprender Python, e hizo un juego de Hangman de texto simple. Quería saber si podría haber algo hecho para que el código sea más limpio o más eficiente.

  O(n)6  
Original en ingles

I recently started learning Python, and made a simple text based Hangman game. I wanted to know if there could be anything done to make the code cleaner or more efficient.

import random import os import sys  def main():     pickword()  def start(word, twoplayer):     wordarray = ''     userguess = []     guessright = 0     lettersright = 0     if len(word) < 5:         tries = 6     else:         tries = 10     usedletters = []      if twoplayer == False:         print(word)         print("Welcome to hangman")         print("I will think of a word and you will have to guess it, are you ready!")         input("Press enter to continue")     else:         print("Welcome to hangman")         print("Player 1 has already thought of a word, let's begin")         input("Press enter to continue")      lengthword = len(word)      if twoplayer == False:         for i in range(1, lengthword):                  #creates a new variable, all underscores             userguess.append("_ ")     else:          for i in range(1, lengthword):                  #creates a new variable, all underscores             userguess.append("_ ")        wordarray = (list(word))      if twoplayer == False:         for i in range(0, lengthword):                  #removes \n from end of word             if wordarray[i] == "\n":                 wordarray.remove(wordarray[i])                 break      usedletters = []     getuserguess(wordarray, userguess, tries, usedletters, word)  def pickword():     word = 0     twoplayer = input("Do you want to play 2 player[Y/N]")     if twoplayer.lower() == "y":         word = input("Player 1, enter the word you want player 2 to guess, don't let them see! ")          if len(word) < 3:             print("That word is too short")             pickword()          print("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n")         print("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n")         print("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n")          word = word.lower()         twoplayer = True         start(word, twoplayer)     else:         try:             word = random.choice(open('hangman.txt').readlines())             twoplayer = False             start(word, twoplayer)          except:             input("Error, no word list found, press enter to exit")             sys.exit()    def getuserguess(wordarray, userguess, tries, usedletters, word):      print(' '.join(userguess))     guess1 = input("Enter your guess: ")      if len(guess1) < 1 or len(guess1) > 1 or guess1.isdigit():         print("Invalid input")         getuserguess(wordarray, userguess, tries, usedletters, word)     else:         checkuserguess(wordarray, userguess, guess1, usedletters, tries, word)    def lose(word):     again = input("Sorry, you lost, the word was {}Would you like to play again[Y/N]".format(word))     if again.lower() ==  "y":         pickword()     else:         sys.exit()  def win():     again = input("Congrats, you won hangman, do you want to play again?[Y/N]")     if again == "Y" or "y":         pickword()     else:         sys.exit()  def checkuserguess(wordarray, userguess, guess1, usedletters, tries, word):      guess1list = (list(guess1))      if guess1list[0] in usedletters:         print("You already used that letter")         getuserguess(wordarray, userguess, tries, usedletters, word)      if guess1 in wordarray:         usedletters.append(guess1)         for i in range(0, len(wordarray)):             if wordarray[i] == guess1list[0]:                 userguess[i] = guess1list[0]                 usedletters.append(guess1list[0])          if "_ " not in userguess:             print(' '.join(userguess))             win()         else:             getuserguess(wordarray, userguess, tries, usedletters, word)      else:         if tries > 0:             print("Sorry, that letter is not in the word, you have ", tries, " remaining")             tries -= 1             getuserguess(wordarray, userguess, tries, usedletters, word)         else:             lose(word)      main() 
        

Lista de respuestas

8
 
vote
vote
La mejor respuesta
 

Para esto, voy a pasar por su programa en el orden en que está escrito:

  • No use cond4 . Simplemente puede decir cond5 Ni siquiera necesita eso, aunque la primera vez, ya que hace lo mismo en el cond6 y cond7 bloques `.

  • Puede usar cond8 en lugar de cond9 . Además de hacerlo más limpio, no estabas agregando suficientes subrayos. El segundo argumento a if0 es exclusivo. Imagina si la longitud de la palabra es dos. En ese caso, if1 devuelve if2 porque el segundo argumento es exclusivo. Que tiene longitud 1 en lugar de la misma longitud que la palabra: 2.

  • No use if3 . En su lugar, use if4 . Si usa if5 , la primera aparición de la palabra se eliminará, no necesariamente la que desea eliminar.

  • Cuando le pregunta if6 , usted cuenta de 99887766555443327 y cualquier otra cosa. ¿Qué pasa si el usuario dice if8 ? Todavía contaría como no. En su lugar, debe usar un Loop:

    99887766655443329
      case0  
  • En lugar de configurar case1 dentro del y case33 bloques, puede hacer 99887766555443334

  • Si la palabra es demasiado corta, no desea volver a llamar case5 nuevamente porque case6 Pregunta case7 Si la palabra Es demasiado corto, eso no significa que el usuario quiera cambiar su mente en esa pregunta. En su lugar, use un bucle:

      case38  
  • ¿Cómo sabes cuántas líneas para imprimir? En lugar de imprimir un número de líneas arbitrarias, 99887766555443339 borrará el terminal.

  • Usted llama x < 10 ->0 Tanto en el bloque x < 10 ->1 y x < 10 ->2 Block. Esa es una señal de que no debería estar en uno en uno. Póngalo después de ambos bloques para que no se realice un código de duplicación.

  • Mientras estamos en ese momento en el programa, solo desea una línea en su bloque : x < 10 ->4 . x < 10 ->5 Debe definirse como se describe anteriormente, por lo que no necesitamos que aquí en absoluto y 998877765555443346 estará fuera del 99887766655443347 y < Código> x < 10 ->8 bloques, por lo que no necesitamos eso. Además, la única razón por la que desea el bloque 99887766655443349655443349 es porque está tratando con un archivo. Si algo más está lanzando un error, usted quiere el rastreo porque no debería ser.

  • No use un 99887766655443350 Tiene ciertos errores que cree que podría obtener; Listarlos aquí. En este caso, es true ->1

  • true ->2 , cuando se le da un argumento, usa ese argumento como el código de salida. En este caso, es el fracaso, por lo que debe usar true ->3 .

  • Su cheque por true ->4 's La validez no es la mejor. Para asegurarse de que sea un carácter, use true ->5 como el cheque. Además, true ->6 es probablemente no lo único que no es válido. Por ejemplo, true ->7 no debería estar en la palabra, ¿verdad? En su lugar, use true ->8 para asegurarse de que sea un carácter alfabético.

  • En lugar de usar la recursión y escribir todos esos nombres de variables, use un bucle:

      true ->9  

  • Tiene un código duplicado en cond0 y cond1 : cond2 . En su lugar, defina una función que haga esa pregunta y utilícela en cond3 y cond4 . Asegúrese de que en esa función use cond5 como lo hizo en cond6 . cond7 no funciona cómo esperaría que lo haga. Consulte este cuadro StackOverflow para por qué.

  • Usted verifica si cond8 está en cond9 , pero debe estar revisando solo el subrayado, no el subrayado con un espacio. Si el subrayado está al final de la palabra, no debería haber un espacio. Si el E es, lo estás haciendo mal y no deberías depender de ello.

Esta es mi primera revisión completa, por lo que si alguien tiene sugerencias, estaría feliz de modificarlo.

 

For this, I am going to go through your program in the order it is written:

  • Don't use if twoplayer == False:. You can simply say if not twoplayer: You don't even need that, though the first time because you do the same thing in the if and elseblocks`.

  • You can use " ".join("_" * lengthword) instead of for i in range(1, lengthword): userguess.append("_ "). Besides making it cleaner, you weren't adding enough underscores. The second argument to range() is exclusive. Imagine if the length of the word is two. In that case, range(1, 2) returns [1] because the second argument is exclusive. That has length 1 instead of the same length as the word: 2.

  • Don't use wordarray.remove(wordarray[i]). Instead, use wordarray.pop(i). If you use .remove(), the first occurrence of the word will be removed, not necessarily the one you want to be removed.

  • When you ask "Do you want to play 2 player?", you account for "y" and anything else. What if the user says "yes"? It would still count as no. Instead, you should use a while loop:

    twoplayer = input("Do you want to play 2 player? [Y/N] ") while twoplayer.lower() not in ("y", "n"):     twoplayer = input("[Y/N] ") 
  • Instead of setting twoplayer inside of the if and else blocks, you can just do twoplayer = ("n", "y").index(twoplayer.lower())

  • If the word is too short, you don't want to call pickword() again because pickword() asks "Do you want to play 2 player?" If the word is too short, that doesn't mean the user wants to change his mind on that question. Instead, use a loop:

    while len(word) < 3:     print("That word is too short")     word = input("Player 1, enter the word you want player 2 to guess, don't let them see! ") 
  • How do you know how many lines to print? Instead of printing an arbitrary number of lines, print("\033c") will clear the terminal.

  • You call start(word, twoplayer) in both the if and the else block. That is a sign that it shouldn't be in either one. Put it after both blocks so that you aren't duplicating code.

  • While we're at that point in the program, you want only one line in your try: block: word = random.choice(...). twoplayer should be defined as I outlined above, so we don't need that here at all and start(word, twoplayer) will be outside of the if and else blocks, so we don't need that. Besides, the only reason you want the try block is because you are dealing with a file. If anything else is throwing an error, you want the traceback because it shouldn't be.

  • Don't use a bare except: You have certain errors that you think you might get; list them here. In this case, it's except IOError:

  • sys.exit(), when given an argument, uses that argument as the exit code. In this case it is failure, so you should use sys.exit(1).

  • Your check for guess1's validity is not the best. To make sure that it is one character, use len(guess1) != 1 as the check. Also, guess1.isdigit() is probably not the only thing that is invalid. For example, $ shouldn't be in the word, right? Instead, use not guess1.isalpha() to make sure it is an alphabetic character.

  • Instead of using recursion and typing out all of those variable names, use a loop:

    print(' '.join(userguess)) guess = input("Enter your guess: ") while len(guess) != 1 or not guess.isalpha():     print("Invalid input")     guess = input("Try again: ")  checkuserguess(wordarray, userguess, guess, usedletters, tries, word) 
  • You have duplicate code in lose() and win(): Would you like to play again. Instead, define a function that asks that question, and use it in lose() and win(). Make sure that in that function you use if again.lower() == "y": as you did in lose(). if again == "Y" or "y": does not work how you would expect it to. See this StackOverflow post for why.

  • You check if "_ " is in userguess, but you should be checking for just the underscore, not the underscore with a space. If the underscore is at the end of the word, there shouldn't be a space. If there is, you're doing it wrong and you shouldn't depend on it.

This is my first complete review, so if anyone has suggestions, I would be happy to modify it.

 
 
       
       

Relacionados problema

4  Hangman en Java  ( Hangman in java ) 
Tengo el siguiente código en Java: HangmanFunctions Clase: import java.util.ArrayList; import java.util.Random; public class HangmanFunctions { pr...

5  La forma correcta de colgar un hombre: parte final  ( The right way to hang a man final part ) 
El problema: Haciendo un juego de Hangman simple. Esta es una continuación de la siguiente pregunta: la forma correcta de colgar un hombre . Allí acababa d...

2  Juego Hangman completado  ( Completed hangman game ) 
Esto funciona en su mayor parte. Soy muy nuevo en la programación, así que sé consciente. import java.util.*; public class HangManP5 { private static Scan...

43  La forma correcta de colgar a un hombre  ( The right way to hang a man ) 
Problema: He visto algunas preguntas sobre Hangman. Por lo general, esto se hace de una manera muy hackeable, que generalmente no se puede generalizar más. ...

3  Hangman en bash  ( Hangman in bash ) 
reglas 7 errores permitidos. Reglas de la Hangman. descargo de responsabilidad No tengo una figura (dibujo) del Hangman, ya que este proyecto se...

5  Revisión de código para Hangman en C ++  ( Code review for hangman in c ) 
Tengo el siguiente programa C ++: autoConnect.py1 que se supone que replica visualmente el juego clásico de Hangman. ¿El código está totalmente optimiza...

8  Juego de Hangman simple en C ++  ( Simple hangman game in c ) 
Estoy tratando de crear un juego de Hangman simple. El juego tiene un modo de edición para la primera ejecución en la que el usuario tiene que suministrar 6 p...

8  My Hangman Game creó usando Pyqt5 y Python 3.5  ( My hangman game created using pyqt5 and python 3 5 ) 
Este es mi juego de Hangman que creé con Pyqt5 y Python 3.5 en mi máquina Windows 7. ¿Qué piensas? ¿Hay algo en lo que pueda cambiar / mejorar en términos de ...

12  Juego Simple de Hangman  ( Simple game of hangman ) 
En mi búsqueda para convertirse en un programador maestro, he creado un juego simple de Hangman, por lo que pensé que lo subiría aquí y vería cómo podría ser ...

3  Juego de Hangman escrito en Python 3.5  ( Hangman game written in python 3 5 ) 
Esto recopila las conjeturas del usuario para la palabra. El usuario tiene 8 conjeturas, una conjetura correcta y una suposición repetida no afecta al conteo ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos