我正在尝试用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
相反,我有要求输入的代码,但这不允许用户移动乌龟。
答案 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()