No sé cómo hacerlo para que la etiqueta del resultado muestre el nuevo resultado cada vez que se presiona el botón, ¿debo copiar y pegar las 3 funciones de piedra, papel y tijera en la función de repetición o qué?

Su pitón 2.7


from Tkinter import*
import random
# variables
a = "rock"
b = "paper"
c = "scissors"
pc = random.choice([a, b, c])
windows = Tk()
windows.geometry("200x300")


# function that makes the

def repeat():
    pc = random.choice([a, b, c])
    print pc
    # im stuck here!





def tie():
    lbresult.configure(text="Tie!")



def win():
    lbresult.configure(text="you win!!")



def loose():
    lbresult.configure(text="you loose")



# functions for each election
def rock():
    if pc == "paper":
        loose()
    elif pc == "rock":
        tie()
    elif pc == "scissors":
        win()
    repeat()


def paper():
    if pc == "paper":
        tie()
    elif pc == "rock":
        win()
    elif pc == "scissors":
        loose()
    repeat()


def scissors():
    if pc == "paper":
        win()
    elif pc == "rock":
        loose()
    elif pc == "scissor":
        tie()
    repeat()


#buttons for choosing options
lbresult = Label(text="result will appear here")
btrock = Button(text="  rock    ", command=rock)
btpaper = Button(text="  paper  ", command=paper)
btscissors = Button(text="scissors", command=scissors)

btrock.pack()
btpaper.pack()
btscissors.pack()
lbresult.pack()
#result label


windows.mainloop()

Por favor ayuda estoy volviendo loco tratando de resolver esto,

Si puedes responder, por favor explícame por qué ... te lo agradeceré mucho

-1
Xaoo Huioñahdjne 7 may. 2020 a las 14:52

3 respuestas

Hay muchos enfoques posibles aquí. El que se asemejaría más a su enfoque actual sería pasar una función. Tienes una función como esta:

paper()

Las funciones pueden tener argumentos. Esos argumentos irían entre paréntesis y se convertirían en variables dentro de esa función. Solo como ejemplo, podría tener una función, play () y pasarle 'piedra', 'papel' o 'tijera' de esta manera:

def play(user_choice):
  if user_choice == 'paper':
    paper()
  if user_choice == 'rock':
    rock()
....

Entonces llamaría a esa función así:

>>> play('paper')

En ese ejemplo, estoy pasando la cadena 'paper' a la función play (). Sin embargo, también puedo pasar la función play () a una función, como esta:

def play(func):
  func()

Mediante este método, puedo enviar la función "piedra" "papel" o "tijera" a la función de reproducción, y luego llamar a cualquier función que haya pasado. Podría, aunque probablemente no sea el mejor enfoque, pasar una función a otra función dentro de sí misma:

def repeat(func):
  func()

def play():
  # do your things
  repeat(play)

Pero ... ese enfoque es redundante. No tiene sentido crear una función solo para llamar a una función, cuando puede simplemente llamar a la función:

def play():
  # do your things
  play()

Esta es una función recursiva. Al final de la función, se vuelve a llamar. Esto continuará para siempre si no lo detiene, por lo que la recursión generalmente se escribiría condicionalmente:

def play():
  # do your things
  continue = input("Would you like to continue [y/n]? ")
  if continue == 'y':
    play()
  else:
    pass    
    # This else statement is implicit. If you don't add it, it'll do it anyway.

Otra opción es un bucle, como un 'bucle while':

def play():
  keep_going = True
  while keep_going:
    #do your things
    continue = input("Would you like to continue [y/n]? ")
    if continue == "y":
      keep_going = True
    else:
      keep_going = False

Un ciclo while es como una declaración if recursiva. Cuando el código llega a la instrucción while, determina si la declaración es verdadera o falsa, solo ejecuta el código dentro si es verdadera. Sin embargo, a diferencia de una instrucción if, cuando termine de ejecutar el código, volverá y volverá a evaluar la instrucción nuevamente, y si aún es cierto, ejecútela nuevamente. Un ciclo while solo finalizará si está cambiando las variables que evalúa de tal manera que la declaración eventualmente se evaluará como falsa, en cuyo punto el programa continúa.

0
Kyle Alm 7 may. 2020 a las 12:28

Elija una nueva opción aleatoria pc cuando y solo cuando se presiona un botón.

...
c = "scissors"
pc = random.choice([a, b, c]) # remove this
windows = Tk()
...

...
def rock():
    pc = random.choice([a, b, c])
    if pc == "paper":
        loose()
    elif pc == "rock":
        tie()
    elif pc == "scissors":
        win()
    repeat() # remove this, and the whole repeat function itself
...

Tenga en cuenta que si solo va a mostrar el resultado final de ganar / perder / empatar, el juego en sí no necesita ninguna lógica. Simplemente haga que los tres botones se conecten a la misma función que muestra ese resultado:

from Tkinter import *
import random
windows = Tk()
windows.geometry("200x300")

def play():
    lbresult.configure(text=random.choice(['You win!', 'You lose!', 'Tie!']))

lbresult = Label(text="result will appear here")
btrock = Button(text="  rock    ", command=play)
btscissors = Button(text="scissors", command=play)
btpaper = Button(text="  paper  ", command=play)

btrock.pack()
btpaper.pack()
btscissors.pack()
lbresult.pack()
#result label

windows.mainloop()

También tenga en cuenta que Python 2 ahora no es oficialmente compatible y ya no recibe ninguna actualización, incluidos parches de seguridad. Cualquiera que esté aprendiendo Python hoy debería aprender Python 3.

2
TigerhawkT3 7 may. 2020 a las 12:08

Aprenda qué es una variable local. La solución más simple (aunque estúpida) es usar la palabra clave global, así:

def repeat():
    global pc
    pc = random.choice([a, b, c])
    print(pc)

Pero nunca use global si el código debe ser confiable o desarrollable. Aquí está la solución sin ella, aprende OOP a entender:

from tkinter import *
import random

class RPS:
    def __init__(self):
        self.windows = Tk()
        self.windows.geometry("200x300")

        self.a = "rock"
        self.b = "paper"
        self.c = "scissors"
        self.repeat()

        self.lbresult = Label(text="result will appear here")
        btrock = Button(text="  rock    ", command=self.rock)
        btpaper = Button(text="  paper  ", command=self.paper)
        btscissors = Button(text="scissors", command=self.scissors)

        btrock.pack()
        btpaper.pack()
        btscissors.pack()
        self.lbresult.pack()

        self.windows.mainloop()
    def repeat(self):
        self.pc = random.choice([self.a, self.b, self.c])
        print(self.pc)
    def tie(self):
        self.lbresult.configure(text="Tie!")
    def win(self):
        self.lbresult.configure(text="you win!!")
    def loose(self):
        self.lbresult.configure(text="you loose")
    def rock(self):
        if self.pc == "paper":
            self.loose()
        elif self.pc == "rock":
            self.tie()
        elif self.pc == "scissors":
            self.win()
        self.repeat()
    def paper(self):
        if self.pc == "paper":
            self.tie()
        elif self.pc == "rock":
            self.win()
        elif self.pc == "scissors":
            self.loose()
        self.repeat()
    def scissors(self):
        if self.pc == "paper":
            self.win()
        elif self.pc == "rock":
            self.loose()
        elif self.pc == "scissor":
            self.tie()
        self.repeat()
RPS()

Espero que sea útil!

0
Богдан Опир 7 may. 2020 a las 12:08