获取键盘绑定以在Python Turtle中工作

时间:2018-08-12 00:22:57

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

我正在尝试用Python和乌龟制作寻宝类游戏
目的是在屏幕上写入一个随机步骤,然后用户将使用箭头键遵循指示,完成后按Enter,然后将显示另一个步骤

我正在使用trinket.io
对其进行编码
我知道我必须有某种方法来停止该程序,但仍然允许用户在每个步骤之后用箭头移动乌龟,但是到目前为止我一直没有尝试。

这是到目前为止的程序:

################################################
##  This program simulates following a series ## 
##  of directions in a random order to see if ##
##  You will end up at the same place         ##
################################################

import turtle
import random

#############################
### Variable declareation ###
#############################

unit = 10 # this is the distance the turtle will move each time a key is pressed
hunt1 = turtle.Turtle() # turtle used in the first hunt
hunt2 = turtle.Turtle()# turtle used in the sedond hunt
hunt3 = turtle.Turtle()#turtle used in the third hunt

directions = turtle.Turtle()#used to print the steps
screen = turtle.Screen()# creates a Screen

koopa = [hunt1,hunt2,hunt3] # a collection of 'hunt' turtles
color = ['black','green','red']

map = ['Step 1', 'step 2', 'step3'] #this holds all the steps in the treasure hunt
x = random.randint(-50,0)
y = random.randint(-50,0)

next_step = False
#################
##  Functions  ##
#################
def set_koopa():
  c=0
  for i in koopa:
    i.penup()
    i.goto(x,y)
    i.color(color[c])
    i.pendown()
    c=c+1

def east():
  k.setheading(180)
  k.forward(unit)

def west():
  k.setheading(0)
  k.forward(unit)

def north():
  k.setheading(90)
  k.forward(unit)

def south():
  k.setheading(270)
  k.forward(unit)

def enter():
  next_step = True

##################
## key bindings ##
##################
screen.onkey(east, 'left')
screen.onkey(west, 'right')
screen.onkey(north, 'up')
screen.onkey(south, 'down')
screen.onkey(enter, 'enter')
screen.listen()# tells the compouter to listen for keystrokes

z=0 #debug
############
##  Main  ##
############
directions.goto(0,0)
directions.ht()
set_koopa()
for k in koopa:
  while len(map)!=0:   # checks if there are items left in the list
    l = len(map)       # returns the number if items
    directions.write(map.pop(random.randint(0,l-1))) #randomly takes an item and removes it and writes in on the screen
    while not next_step:  #gives time for user to move
      z=z+1#debug
      print z  #debug
      print next_step #debug

    directions.clear()

有问题的代码在底部。

我尝试的第一件事没有循环:

while not next_step:  #gives time for user to move
    z=z+1#debug
    print z  #debug
    print next_step #debug

相反,我有要求输入的代码,但这不允许用户移动乌龟。

1 个答案:

答案 0 :(得分:0)

我不认为您的代码将在标准Python随附的常规乌龟下运行。首先,您标记了[python-3.x],但使用的是Python 2样式的打印语句。

但更重要的是,您的事件逻辑是错误的。您不应该为等待乌龟事件而陷入僵局:

while not next_step:  #gives time for user to move
      z=z+1#debug
      print z  #debug
      print next_step #debug

,因为您可能通过不将控制权移交给事件处理程序来阻止事件。加上代码中的其他小错误(例如,缺少global语句。)下面是我的修改,该修改大致在标准Python 2或Python 3 turtle下运行:

################################################
##  This program simulates following a series ##
##  of directions in a random order to see if ##
##  you will end up at the same place         ##
################################################

from turtle import Turtle, Screen, mainloop
from random import randint, choice

#############################
### Variable declarations ###
#############################

unit = 10  # this is the distance the turtle will move each time a key is pressed

directions = Turtle(visible=False)  # used to print the steps
directions.penup()

screen = Screen()  # creates a Screen

koopa = {  # a collection of 'hunt' turtles
    'black': Turtle(visible=False),  # turtle used in the first hunt,
    'green': Turtle(visible=False),  # turtle used in the second hunt, 
    'red': Turtle(visible=False),  # turtle used in the third hunt,
}

steps = ['Step 1', 'Step 2', 'Step 3']  # this holds all the steps in the treasure hunt

x = randint(-50, 0)
y = randint(-50, 0)

next_step = True

active = None

#################
##  Functions  ##
#################

def set_koopa():
    for color, hunt in koopa.items():
        hunt.penup()
        hunt.goto(x, y)
        hunt.color(color)
        hunt.pendown()

def east():
    active.setheading(0)
    active.forward(unit)

def west():
    active.setheading(180)
    active.forward(unit)

def north():
    active.setheading(90)
    active.forward(unit)

def south():
    active.setheading(270)
    active.forward(unit)

def enter():
    global next_step

    next_step = True

##################
## key bindings ##
##################
screen.onkey(east, 'Right')
screen.onkey(west, 'Left')
screen.onkey(north, 'Up')
screen.onkey(south, 'Down')
screen.onkey(enter, 'Return')
screen.listen()  # tells the computer to listen for keystrokes

############
##  Main  ##
############

set_koopa()

def check_step():
    global active, next_step

    if next_step:
        next_step = False

        directions.clear()

        active = choice(list(koopa.values()))  # or somesuch

        active.showturtle()

        if steps:
            l = len(steps)  # returns the number if items

            directions.write(steps.pop(randint(0, l - 1)))  # randomly takes an item and removes it and writes in on the screen

        else:
            return

    screen.ontimer(check_step, 100)

check_step()

mainloop()