Независимо от проблемы с scissorsfn()
против scissorsfn
первого аргумента wn.onkeypress()
, этот код не будет работать. wn.onkeypress()
всегда возвращает None
, поэтому этот код никогда не выполняется:
if wn.onkeypress(scissorsfn(), 's'):
if computer_choice == 'rock'.title():
pen.clear()
pen.write('Computer picked {}, you lost.'.format(r.title()), align="center", font=("Courier", 24))
else:
pen.clear()
pen.write('Computer picked {}, you win.'.format(p.title()), align="center", font=("Courier", 24))
Если scissorsfn
правильно установлен в качестве обработчика, возвращаемое значение в этой функции:
def scissorsfn():
player_pick = 'scissors'
return player_pick.title()
никуда не денется, так как вызывающий scissorsfn()
является обработчиком события turtle, и он не ожидает возвращаемого значения, поэтому его отбрасывают. Этот код был верным и достаточным:
wn.listen()
wn.onkeypress(rockfn, 'r')
wn.onkeypress(paperfn, 'p')
wn.onkeypress(scissorsfn, 's')
То, что вы сделали с wn.onkeypress()
за пределами этого, - просто желаемое за действительное.
Вот доработка вашего кода, который пытается правильно обрабатывать события:
from turtle import Screen, Turtle
from random import choice
MESSAGE_FONT = ('Courier', 24)
CHOICE_FONT = ('Courier', 16)
# Player choosing the rock, paper, scissors by pressing specific keys.
def rockfn():
player_picked('Rock')
def paperfn():
player_picked('Paper')
def scissorsfn():
player_picked('Scissors')
def player_picked(player_pick):
global computer_choice
pen.clear()
if player_pick == computer_choice:
pen.write("It's a draw", align='center', font=MESSAGE_FONT)
elif player_pick == 'Rock':
if computer_choice == 'Paper':
pen.write("Computer picked Paper, you lost.", align='center', font=MESSAGE_FONT)
else:
pen.write("Computer picked Scissors, you win.", align='center', font=MESSAGE_FONT)
elif player_pick == 'Paper':
if computer_choice == 'Scissors':
pen.write("Computer picked Scissors, you lost.", align='center', font=MESSAGE_FONT)
else:
pen.write("Computer picked Rock, you win.", align='center', font=MESSAGE_FONT)
elif player_pick == 'Scissors':
if computer_choice == 'Rock':
pen.write("Computer picked Rock, you lost.", align='center', font=MESSAGE_FONT)
else:
pen.write("Computer picked Paper, you win.", align='center', font=MESSAGE_FONT)
computer_choice = choice(choices)
# Create the screen
wn = Screen()
wn.title("Rock Paper Scissors")
wn.bgcolor('black')
wn.setup(800, 600)
# Shape 1
rock = Turtle()
rock.shape('square')
rock.goto(170, 100)
rock.speed('fastest')
rock.color('brown')
rock.shapesize(5)
rock.penup()
# Shape 2
paper = Turtle()
paper.shape('square')
paper.goto(-170, 100)
paper.speed('fastest')
paper.color('white')
paper.shapesize(5)
paper.penup()
# Shape 3
scissors = Turtle()
scissors.shape('square')
scissors.goto(0, -170)
scissors.speed('fastest')
scissors.color('blue')
scissors.shapesize(5)
scissors.penup()
# Top text, winner.
pen = Turtle()
pen.hideturtle()
pen.color('white')
pen.penup()
pen.goto(0, 240)
pen.write("Who wins: ", align='center', font=MESSAGE_FONT)
# Rock choice.
rock = Turtle()
rock.hideturtle()
rock.color('white')
rock.penup()
rock.goto(170, 152)
rock.write("Rock[R]", align='center', font=CHOICE_FONT)
# Paper choice
paper = Turtle()
paper.hideturtle()
paper.color('white')
paper.penup()
paper.goto(-168, 152)
paper.write("Paper[P]", align='center', font=CHOICE_FONT)
# Scissors choice
scissors = Turtle()
scissors.hideturtle()
scissors.color('white')
scissors.penup()
scissors.goto(0, -118)
scissors.write("Scissors[S]", align='center', font=CHOICE_FONT)
# Computer random choice
choices = ['Rock', 'Paper', 'Scissors']
computer_choice = choice(choices)
# Keys for player choice.
wn.onkeypress(rockfn, 'r')
wn.onkeypress(paperfn, 'p')
wn.onkeypress(scissorsfn, 's')
wn.listen()
wn.mainloop()