Как вызвать группу функций - PullRequest
0 голосов
/ 07 мая 2020

Я не знаю, как это сделать, чтобы метка результата отображала новый результат каждый раз при нажатии кнопки, следует ли мне копировать и вставлять 3 функции камня, бумаги и ножниц в функцию повтора или что?

его python 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()

пожалуйста, помогите мне сойти с ума, пытаясь решить эту проблему,

если вы можете ответить, пожалуйста, объясните мне, почему ... Я очень ценю

Ответы [ 3 ]

2 голосов
/ 07 мая 2020

Выберите новый случайный pc выбор тогда и только тогда, когда нажата кнопка.

...
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
...

Обратите внимание, что если вы просто собираетесь показать окончательный результат win / loss / t ie, сама игра вообще не нуждается в логах c. Просто подключите все три кнопки к одной и той же функции, которая показывает этот результат:

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()

Также обратите внимание, что Python 2 теперь официально не поддерживается и больше не получает никаких обновлений, включая исправления безопасности. Каждый, кто учится Python сегодня, должен учить Python 3.

0 голосов
/ 07 мая 2020

Здесь есть много возможных подходов. Тот, который больше всего напоминал бы ваш текущий подход, - это передача функции. У вас есть функция, например:

paper()

Функции могут иметь аргументы. Эти аргументы будут go в круглых скобках, и они станут переменными внутри этой функции. Например, у вас может быть одна функция play () и передать ей «камень», «бумага» или «ножницы» следующим образом:

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

Затем эту функцию можно вызвать как это:

>>> play('paper')

В этом примере я передаю строку 'paper' функции play (). Однако я также могу передать функцию play () функции, например:

def play(func):
  func()

С помощью этого метода я могу отправить функцию «камень», «бумага» или «ножницы» в функцию play, а затем вызовите переданную мной функцию. Вы можете - хотя это, вероятно, не лучший подход - передать функцию другой функции внутри себя:

def repeat(func):
  func()

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

Но ... этот подход является избыточным. Нет смысла создавать функцию только для вызова функции, когда вместо этого вы можете просто вызвать функцию:

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

Это рекурсивная функция. В конце функции он снова вызывает себя. Это будет go навсегда, если вы его не остановите, поэтому рекурсия обычно записывается условно:

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.

Другой вариант - al oop, например, 'while l oop' :

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

A while l oop похож на рекурсивный оператор if. Когда код переходит к оператору while, он определяет, является ли оператор истинным или ложным, выполняя код только в том случае, если он истинен. Однако в отличие от оператора if, когда он завершит выполнение кода, он go вернется и повторно вычислит оператор, и, если он все еще верен, запустит его снова. Время l oop закончится только в том случае, если вы измените переменные, которые он оценивает, так что в конечном итоге оператор будет иметь значение false, после чего программа продолжится.

0 голосов
/ 07 мая 2020

Узнайте, что такое локальная переменная. Самое простое (хотя и глупое) решение - использовать ключевое слово global, например:

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

Но никогда не используйте global, если код должен быть надежным или разрабатываемым. Вот решение без него, изучите OOP, чтобы понять:

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()

Надеюсь, что это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...