3 回答
TA贡献1826条经验 获得超6个赞
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
...
请注意,如果您只是要显示赢/输/平的最终结果,则游戏本身实际上不需要任何逻辑。只需将所有三个按钮都连接到显示结果的相同功能:
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。
TA贡献1811条经验 获得超4个赞
了解什么是局部变量。最简单(尽管很愚蠢)的解决方案是使用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()
希望这会有所帮助!
TA贡献1820条经验 获得超2个赞
这里有很多可能的方法。与您当前的方法最相似的方法是传递一个函数。你有一个函数,像这样:
paper()
函数可以有参数。这些参数将进入括号,它们成为该函数中的变量。举个例子,你可以有一个函数 play(),然后像这样向它传递 'rock'、'paper' 或 'scissors':
def play(user_choice):
if user_choice == 'paper':
paper()
if user_choice == 'rock':
rock()
....
然后,您将像这样调用该函数:
>>> play('paper')
在该示例中,我将字符串“paper”传递给函数 play()。但是,我也可以将函数 play() 传递给函数,如下所示:
def play(func):
func()
通过这种方法,我可以将函数“rock”“paper”或“scissors”发送到函数 play,然后调用我传递的任何函数。你可以 - 虽然它可能不是最好的方法 - 将一个函数传递给它自身的另一个函数:
def repeat(func):
func()
def play():
# do your things
repeat(play)
但是..这种方法是多余的。当您可以简单地调用函数时,创建函数只是为了调用函数是没有意义的:
def play():
# do your things
play()
这是一个递归函数。在函数结束时,它再次调用自身。如果你不停止它,这将永远持续下去,所以递归通常是有条件的:
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.
另一种选择是循环,例如“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
while 循环类似于递归 if 语句。当代码到达 while 语句时,它会确定该语句是真还是假,只有在它为真时才运行其中的代码。但是,与 if 语句不同的是,当它运行完代码后,它会返回并再次重新评估该语句,如果它仍然为真,则再次运行它。仅当您更改其评估的变量以使语句最终评估为 false 时,while 循环才会结束,此时程序将继续。
添加回答
举报