使用乌龟图形的剪刀石头布游戏-键不起作用

时间:2019-11-08 20:56:50

标签: python python-3.x turtle-graphics

我正在尝试在乌龟中创建剪刀石头布游戏。玩家在电脑前玩游戏,他需要通过按“ r”,“ p”或“ s”来捡石头或剪刀。在将键链接到返回选择的功能时,我发现了问题。

我正在使用一些形状和文本来向播放器提供信息。它是如何工作的,我创建了3个返回石头或剪刀的函数,它们应该通过.listen()和onkeypress()+一些if语句链接到键“ r”,“ p”,“ s”。 >

我得到了错误:

Exception in Tkinter callback
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/tkinter/__init__.py", line 1705, in __call__
    return self.func(*args)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/turtle.py", line 701, in eventfun
    fun()
TypeError: 'str' object is not callable
Exception in Tkinter callback
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/tkinter/__init__.py", line 1705, in __call__
    return self.func(*args)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/turtle.py", line 701, in eventfun
    fun()

我的代码:

import turtle
import random

#Creating the screen
wn = turtle.Screen()
wn.title('Rock Paper Scissors')
wn.bgcolor('black')
wn.setup(800, 600)
wn.tracer(0)


#Shape 1
rock = turtle.Turtle()
rock.shape('square')
rock.goto(170,100)
rock.speed(0)
rock.color('#964B00')
rock.shapesize(stretch_wid=5, stretch_len=5)
rock.penup()


#Shape 2
paper = turtle.Turtle()
paper.shape('square')
paper.goto(-170,100)
paper.speed(0)
paper.color('white')
paper.shapesize(stretch_wid=5, stretch_len=5)
paper.penup()


#Shape 3
scissors = turtle.Turtle()
scissors.shape('square')
scissors.goto(0,-170)
scissors.speed(0)
scissors.color('blue')
scissors.shapesize(stretch_wid=5, stretch_len=5)
scissors.penup()


#Top text, winner.
pen = turtle.Turtle()
pen.speed(0)
pen.color('white')
pen.penup()
pen.hideturtle()
pen.goto(0, 240)
pen.write("Who wins: ", align="center", font=("Courier", 24))


#Rock choice.
pen1 = turtle.Turtle()
pen1.speed(0)
pen1.color('white')
pen1.penup()
pen1.hideturtle()
pen1.goto(170, 152)
pen1.write('Rock[R]', align="center", font=("Courier", 16))

#Papper choice
pen2 = turtle.Turtle()
pen2.speed(0)
pen2.color('white')
pen2.penup()
pen2.hideturtle()
pen2.goto(-168, 152)
pen2.write('Paper[P]', align="center", font=("Courier", 16))

#Scissors choice
pen3 = turtle.Turtle()
pen3.speed(0)
pen3.color('white')
pen3.penup()
pen3.hideturtle()
pen3.goto(0, -118)
pen3.write('Scissors[S]', align="center", font=("Courier", 16))


#Player choosing the rock,paper,scissors by pressing specific keys.
def rockfn():
    player_pick = 'rock'
    return player_pick.title()

def paperfn():
    player_pick = 'paper'
    return player_pick.title()

def scissorsfn():
    player_pick = 'scissors'
    return player_pick.title()


#Computer random choice
r = 'Rock'
p = 'Paper'
s = 'Scissors'
choice = [r, p, s]
computer_choice = random.choice(choice)


#Keys for player choice.
wn.listen()
wn.onkeypress(rockfn, 'r')
wn.onkeypress(paperfn, 'p')
wn.onkeypress(scissorsfn, 's')


#Main Loop
while True:
    wn.update()

    if rockfn() or paperfn() or scissorsfn() == computer_choice:
        pen.clear()
        pen.write("It's a draw", align="center", font=("Courier", 24))

    if wn.onkeypress(rockfn(), 'r'):
        if computer_choice == 'paper'.title():
            pen.clear()
            pen.write("Computer picked {}, you lost.".format(p.title()), align="center", font=("Courier", 24))
        else:
            pen.clear()
            pen.write('Computer picked {}, you win.'.format(s.title()), align="center", font=("Courier", 24))

    if wn.onkeypress(paperfn(), 'p'):
        if computer_choice == 'scissors'.title():
            pen.clear()
            pen.write('Computer picked {}, you lost.'.format(s.title()), align="center", font=("Courier", 24))
        else:
            pen.clear()
            pen.write('Computer picked {}, you win.'.format(r.title()), align="center", font=("Courier", 24))

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

3 个答案:

答案 0 :(得分:0)

onkeypress中,您需要指定函数的名称。您已经包括了括号,所以您正在调用函数。

更改这样的行

    if wn.onkeypress(scissorsfn(), 's'):

对此

    if wn.onkeypress(scissorsfn, 's'):  ## scissorsfn() changed to scissorsfn

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我想说您不能在if语句中使用“ onkeypress()” wn.onkeypress(rock,“ r”)如果按下r则将调用函数rock。像这样写:

def rock():
   choice = "Rock"
turtle.listen()
turtle.onkeypress(rock, "r")
turtle.mainloop()

这将监听按键“ r”的按键,如果按下“ r”,它将调用摇滚。 Turtle.mainloop()将重新循环整个侦听过程,而True或while语句则不会。基本上,turtle.mainloop()是一个while循环,使turtle侦听命令起作用。