【问题标题】:Rock paper scissors game using turtle graphics - keys not working使用乌龟图形的石头剪刀布游戏 - 键不起作用
【发布时间】:2019-11-08 20:56:50
【问题描述】:

我正在尝试在海龟中创建一个石头剪刀布游戏。玩家与电脑对战,他需要通过按“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))

【问题讨论】:

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


    【解决方案1】:

    在onkeypress 中需要指定函数的名称。您已包含括号,因此您正在调用该函数。

    这样换行

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

    到这里

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

    【讨论】:

    • 仍然不起作用 --onkeypress() 不返回任何内容(即None),因此包装if 永远不会触发。
    【解决方案2】:

    与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() 的调用者是海龟事件处理程序,它不期望返回值,所以它被扔掉了。此代码正确且足够:

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

    【讨论】:

      【解决方案3】:

      我想说你不能使用带有“onkeypress()”的 if 语句 wn.onkeypress(rock, "r") 如果按下 r 就会调用函数 rock。就这样写吧:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-16
        • 2022-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多