Hangman se convierte en el juego para dos jugadores Tkinter Python

CorePress2024-01-25  10

Actualmente estoy trabajando en un juego del ahorcado en Python usando tkinter. Mi código funciona pero me gustaría mejorarlo. Mi pregunta es ¿cómo cambio la lista de palabras existente a una entrada de otro jugador? Creo que tengo que crear un botón de reproducción para que comience el juego real, ¿cómo? ¡Gracias por tu tiempo!

from tkinter import messagebox
from tkinter import *
import random



#Setting up the window



window = Tk()
window.title("Välkommen till Rädda Gubbe")
window.geometry("350x250+525+200")
lblspel = Label(window, text="Rädda Gubbe", font=('Arial', '16', 'bold', 'italic'), justify='center', fg='Red'
                     ).pack(side=TOP, anchor=CENTER,pady=7)

Namnlbl = Label(window, text="Skriv in det hemliga ordet: ", font=('Arial', '11', 'bold', 'italic'), justify='center'
                     ).pack(side=TOP,pady=2)
e = Entry(window, font=('Arial', 12), justify='center')
e.pack(side=TOP)
startaspelet = Button(window, text="Starta Spelet", relief="solid", font=("arial", 12, "bold"), command=lambda: spelet).place(x=30, y=70)


def spelet():
  window2 = Tk()
  window2.title("Rädda Gubbe")
  window2.resizable(0, 0)
  #Words
  word_list = ['FLAMBOYANT','AMBIGUOUS','AMBIVALENT','CHARISMA']

  def newGame():
    global the_word_withSpaces
    global numberOfGuesses
    numberOfGuesses=0

    the_word=random.choice(word_list)
    the_word_withSpaces=" ".join(the_word)
    lblWord.set(" ".join("_"*len(the_word)))

  def guess(letter):
    global numberOfGuesses
    if numberOfGuesses<11:
      txt=list(the_word_withSpaces)
      guessed=list(lblWord.get())
      if the_word_withSpaces.count(letter)>0:
        for c in range(len(txt)):
          if txt[c]==letter:
            guessed[c]=letter
          lblWord.set("".join(guessed))
          if lblWord.get()==the_word_withSpaces:
            messagebox.showinfo("Hangman","You guessed it!")
            newGame()

      else:
          numberOfGuesses+=1
          if numberOfGuesses==11:
            messagebox.showwarning("Hangman","Game over")


  lblWord=StringVar()
  Label(window, textvariable=lblWord, font=("Consolas 24 bold")).grid(row=0, column=3, columnspan=6, padx=10)

  btn1 = Button(window2, text="A",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("A"))
  btn1.grid(column=1, row=1)
  btn2 = Button(window2, text="B",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("B"))
  btn2.grid(column=2, row=1)
  btn3 = Button(window2, text="C",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("C"))
  btn3.grid(column=3, row=1)
  btn4 = Button(window2, text="D",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("D"))
  btn4.grid(column=4, row=1)
  btn5 = Button(window2, text="E",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("E"))
  btn5.grid(column=5, row=1)
  btn6 = Button(window2, text="F",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("F"))
  btn6.grid(column=6, row=1)
  btn7 = Button(window2, text="G",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("G"))
  btn7.grid(column=7, row=1)

  btn9 = Button(window2, text="H",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("H"))
  btn9.grid(column=1, row=2)
  btn10 = Button(window2, text="I",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("I"))
  btn10.grid(column=2, row=2)
  btn11 = Button(window2, text="J",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("J"))
  btn11.grid(column=3, row=2)
  btn12 = Button(window2, text="K",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("K"))
  btn12.grid(column=4, row=2)
  btn13 = Button(window2, text="L",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("L"))
  btn13.grid(column=5, row=2)
  btn14 = Button(window2, text="M",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("M"))
  btn14.grid(column=6, row=2)
  btn15 = Button(window2, text="N",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("N"))
  btn15.grid(column=7, row=2)


  btn16 = Button(window2, text="O",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("O"))
  btn16.grid(column=1, row=3)
  btn17 = Button(window2, text="P",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("P"))
  btn17.grid(column=2, row=3)
  btn18 = Button(window2, text="Q",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("Q"))
  btn18.grid(column=3, row=3)
  btn19 = Button(window2, text="R",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("R"))
  btn19.grid(column=4, row=3)
  btn20 = Button(window2, text="S",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("S"))
  btn20.grid(column=5, row=3)
  btn21 = Button(window2, text="T",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("T"))
  btn21.grid(column=6, row=3)
  btn22 = Button(window2, text="U",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("U"))
  btn22.grid(column=7, row=3)


  btn23 = Button(window2, text="V",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("V"))
  btn23.grid(column=1, row=4)
  btn24 = Button(window2, text="W",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("W"))
  btn24.grid(column=2, row=4)
  btn25 = Button(window2, text="X",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("X"))
  btn25.grid(column=3, row=4)
  btn26 = Button(window2, text="Y",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("Z"))
  btn26.grid(column=4, row=4)
  btn27 = Button(window2, text="Å",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("Å"))
  btn27.grid(column=5, row=4)
  btn28 = Button(window2, text="Ä",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("Ä"))
  btn28.grid(column=6, row=4)
  btn29 = Button(window2, text="Ö",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("Ö"))
  btn29.grid(column=7, row=4)

  Button(window, text="New\nGame", command=lambda:newGame(), font=("Helvetica 10 bold")).grid(row=3, column=8, sticky="NSWE")

  newGame()

window.mainloop()

No quiero escribir código, así que te daré una idea. Crea un marco (página de inicio) donde puedas colocar dos botones (Jugador 1 y Jugador2). Si se hace clic en el jugador 1, el segundo jugador es el que adivina y el primer jugadorTendrías que escribir una palabra. Cuando se hace clic en el botón, se muestra un nivel superior que tiene un widget de entrada y también pasa '*' para mostrar argumento. De esta manera, el otro jugador no puede ver la palabra cuando el jugador 1 está escribiendo. Una vez que el jugador presiona el botón de confirmación, debe pasar al segundo cuadro (el cuadro del juego) donde el otro jugador tendría que adivinar.

-JacksonPro

28/03/2021 a las 15:21

Podrías hacer esto más interesante limitando el número de movimientos que cada jugador puede hacer y acelerar.corregir la palabra cuando se alcanza el límite de palabras. Además, cuando alguien haga una pregunta relacionada con su pregunta o dé una respuesta en un comentario, reconózcalo.

-JacksonPro

28/03/2021 a las 15:21

@JacksonPro Gracias por su ayuda en esta y otras preguntas. Lo siento si no respondí, pero soy bastante nuevo en Stack Overflow. Intenté implementar tus sugerencias pero no pude hacerlo funcionar. ¿Sabes cuál es el problema?

- Erik Eckner

28/03/2021 a las 16:19

¿Puedes editar tu pregunta con el código que probaste? Será más fácil para mí trabajar en eso.

-JacksonPro

28/03/2021 a las 16:22

@JacksonPro Creo que deberías poder verlo ahora

- Erik Eckner

28/03/2021 a las 16:25



------------------------------------

La forma más sencilla es crear el archivo palabras.txt donde el segundo jugador pueda poner sus palabras:

Archivo palabras.txt:

Strength
Perception
Endurance
Charisma
Intelligence
Agility
Luck

Código:

from tkinter import messagebox
from tkinter import *
import random
from string import ascii_uppercase

# Setting up the window
window = Tk()
window.title("Hangman")
window.resizable(0, 0)


def newGame():
    global the_word_withSpaces
    global numberOfGuesses
    numberOfGuesses = 0

    with open('words.txt', 'r', encoding='utf-8') as f:
        words = [w.strip().upper() for w in f.readlines()]

    the_word = random.choice(words)
    the_word_withSpaces = " ".join(the_word)
    lblWord.set(" ".join("_" * len(the_word)))


def guess(letter):
    global numberOfGuesses
    if numberOfGuesses < 11:
        txt = list(the_word_withSpaces)
        guessed = list(lblWord.get())
        if the_word_withSpaces.count(letter) > 0:
            for c in range(len(txt)):
                if txt[c] == letter:
                    guessed[c] = letter
                lblWord.set("".join(guessed))
                if lblWord.get() == the_word_withSpaces:
                    messagebox.showinfo("Hangman", "You guessed it!")
                    newGame()

        else:
            numberOfGuesses += 1
            if numberOfGuesses == 11:
                messagebox.showwarning("Hangman", "Game over")


lblWord = StringVar()
Label(window, textvariable=lblWord, font=("Consolas 24 bold")).grid(row=0, column=3, columnspan=6, padx=10)

btn1 = Button(window, text="A", bg="skyBlue", fg="Black", width=3, height=1, font=('Helvetica', '20'),
              command=lambda: guess("A"))
btn1.grid(column=1, row=1)
btn2 = Button(window, text="B", bg="skyBlue", fg="Black", width=3, height=1, font=('Helvetica', '20'),
              command=lambda: guess("B"))
btn2.grid(column=2, row=1)
btn3 = Button(window, text="C", bg="skyBlue", fg="Black", width=3, height=1, font=('Helvetica', '20'),
              command=lambda: guess("C"))
btn3.grid(column=3, row=1)
btn4 = Button(window, text="D", bg="skyBlue", fg="Black", width=3, height=1, font=('Helvetica', '20'),
              command=lambda: guess("D"))
btn4.grid(column=4, row=1)
btn5 = Button(window, text="E", bg="skyBlue", fg="Black", width=3, height=1, font=('Helvetica', '20'),
              command=lambda: guess("E"))
btn5.grid(column=5, row=1)
btn6 = Button(window, text="F", bg="skyBlue", fg="Black", width=3, height=1, font=('Helvetica', '20'),
              command=lambda: guess("F"))
btn6.grid(column=6, row=1)
btn7 = Button(window, text="G", bg="skyBlue", fg="Black", width=3, height=1, font=('Helvetica', '20'),
              command=lambda: guess("G"))
btn7.grid(column=7, row=1)

btn9 = Button(window, text="H", bg="skyBlue", fg="Black", width=3, height=1, font=('Helvetica', '20'),
              command=lambda: guess("H"))
btn9.grid(column=1, row=2)
btn10 = Button(window, text="I", bg="skyBlue", fg="Black", width=3, height=1, font=('Helvetica', '20'),
               command=lambda: guess("I"))
btn10.grid(column=2, row=2)
btn11 = Button(window, text="J", bg="skyBlue", fg="Black", width=3, height=1, font=('Helvetica', '20'),
               command=lambda: guess("J"))
btn11.grid(column=3, row=2)
btn12 = Button(window, text="K", bg="skyBlue", fg="Black", width=3, height=1, font=('Helvetica', '20'),
               command=lambda: guess("K"))
btn12.grid(column=4, row=2)
btn13 = Button(window, text="L", bg="skyBlue", fg="Black", width=3, height=1, font=('Helvetica', '20'),
               command=lambda: guess("L"))
btn13.grid(column=5, row=2)
btn14 = Button(window, text="M", bg="skyBlue", fg="Black", width=3, height=1, font=('Helvetica', '20'),
               command=lambda: guess("M"))
btn14.grid(column=6, row=2)
btn15 = Button(window, text="N", bg="skyBlue", fg="Black", width=3, height=1, font=('Helvetica', '20'),
               command=lambda: guess("N"))
btn15.grid(column=7, row=2)

btn16 = Button(window, text="O", bg="skyBlue", fg="Black", width=3, height=1, font=('Helvetica', '20'),
               command=lambda: guess("O"))
btn16.grid(column=1, row=3)
btn17 = Button(window, text="P", bg="skyBlue", fg="Black", width=3, height=1, font=('Helvetica', '20'),
               command=lambda: guess("P"))
btn17.grid(column=2, row=3)
btn18 = Button(window, text="Q", bg="skyBlue", fg="Black", width=3, height=1, font=('Helvetica', '20'),
               command=lambda: guess("Q"))
btn18.grid(column=3, row=3)
btn19 = Button(window, text="R", bg="skyBlue", fg="Black", width=3, height=1, font=('Helvetica', '20'),
               command=lambda: guess("R"))
btn19.grid(column=4, row=3)
btn20 = Button(window, text="S", bg="skyBlue", fg="Black", width=3, height=1, font=('Helvetica', '20'),
               command=lambda: guess("S"))
btn20.grid(column=5, row=3)
btn21 = Button(window, text="T", bg="skyBlue", fg="Black", width=3, height=1, font=('Helvetica', '20'),
               command=lambda: guess("T"))
btn21.grid(column=6, row=3)
btn22 = Button(window, text="U", bg="skyBlue", fg="Black", width=3, height=1, font=('Helvetica', '20'),
               command=lambda: guess("U"))
btn22.grid(column=7, row=3)

btn23 = Button(window, text="V", bg="skyBlue", fg="Black", width=3, height=1, font=('Helvetica', '20'),
               command=lambda: guess("V"))
btn23.grid(column=1, row=4)
btn24 = Button(window, text="W", bg="skyBlue", fg="Black", width=3, height=1, font=('Helvetica', '20'),
               command=lambda: guess("W"))
btn24.grid(column=2, row=4)
btn25 = Button(window, text="X", bg="skyBlue", fg="Black", width=3, height=1, font=('Helvetica', '20'),
               command=lambda: guess("X"))
btn25.grid(column=3, row=4)
btn26 = Button(window, text="Y", bg="skyBlue", fg="Black", width=3, height=1, font=('Helvetica', '20'),
               command=lambda: guess("Z"))
btn26.grid(column=4, row=4)
btn27 = Button(window, text="Å", bg="skyBlue", fg="Black", width=3, height=1, font=('Helvetica', '20'),
               command=lambda: guess("Å"))
btn27.grid(column=5, row=4)
btn28 = Button(window, text="Ä", bg="skyBlue", fg="Black", width=3, height=1, font=('Helvetica', '20'),
               command=lambda: guess("Ä"))
btn28.grid(column=6, row=4)
btn29 = Button(window, text="Ö", bg="skyBlue", fg="Black", width=3, height=1, font=('Helvetica', '20'),
               command=lambda: guess("Ö"))
btn29.grid(column=7, row=4)

Button(window, text="New\nGame", command=lambda: newGame(), font=("Helvetica 10 bold")).grid(row=3, column=8,
                                                                                             sticky="NSWE")

newGame()
window.mainloop()

Salida:

1

@Aldervern Gracias, pero no es exactamente lo que estoy buscando. Quiero algo activo en el juego.

- Erik Eckner

28/03/2021 a las 16:22



------------------------------------

He codificado la idea básica. Agrega 2 fotogramas, uno como game_frame y el otro como home_frame. Ahora solo usa .pack y .pack_forget para cambiar entre cuadros

Aquí está el código de muestra (modifíquelo según sus necesidades)

from tkinter import messagebox
from tkinter import *
from tkinter import ttk
import random
    

def assignWord(word):
    global guess_word, the_word_withSpaces
    guess_word = word.upper()

    home_frame.pack_forget()
    game_frame.pack()

    print(guess_word)
    guess_var.set(" ".join("_"*len(guess_word)))
    the_word_withSpaces = " ".join(word.upper())
    
def createWord():
    global currentPlayer
    
    currentPlayer = playerChoose.get()
    
    top = Toplevel(window)
    ent = Entry(top, show='*')
    ent.pack()

    Button(top, text='Submit', command= lambda : [assignWord(ent.get()), top.destroy()]).pack()

def newGame():
    global numberOfGuesses
    
    numberOfGuesses = 0
    game_frame.pack_forget()
    home_frame.pack()
    

def guess(btn):
  global numberOfGuesses

  letter = btn['text']
  
  if numberOfGuesses<11:
    txt=list(the_word_withSpaces)
    guessed=list(guess_var.get())

    if the_word_withSpaces.count(letter)>0:
        
      for c in range(len(txt)):
        if txt[c]==letter:
            
          guessed[c]=letter

        guess_var.set("".join(guessed))

        if guess_var.get()==the_word_withSpaces:
          messagebox.showinfo("Hangman",f"{currentPlayer} guessed it!")
          newGame()
          return

    else:
        numberOfGuesses+=1
        if numberOfGuesses==11:
          messagebox.showwarning("Hangman","Game over")
          newGame()

window = Tk()
window.title("Välkommen till Rädda Gubbe")
window.geometry("350x250+525+200")

numberOfGuesses = 0
players = ['Player1', 'Player2']
guess_word = "HELLO"
the_word_withSpaces = ''
currentPlayer = players[0]
alpha = [chr(x) for x in range(65,89)]

home_frame = Frame(window)
home_frame.pack()

Label(home_frame, text="Choose the player to enter a word: ").pack()


playerChoose = ttk.Combobox(home_frame, values=players, state='readonly')
playerChoose.set(players[0])
playerChoose.pack()

Button(home_frame, text='Enter word', command=createWord).pack()

game_frame = Frame(window)

guess_var = StringVar()
Label(game_frame, textvariable = guess_var).pack(side=TOP, anchor=CENTER,pady=7)

btn_frame = Frame(game_frame)
btn_frame.pack()

row, column = 0, 0
for x in alpha:

    if column%7 == 0:
        row += 1
        column = 0
        
    btn = Button(btn_frame, text=x)
    btn.config(command = lambda b=btn: guess(b))
    btn.grid(row=row, column=column)
    column += 1


window.mainloop()

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare