我制作了一个毛毛虫游戏,现在我试图将其转换为双人游戏。我做了第二个毛毛虫并给它控制。当我跑的时候,树叶自动落到了毛毛虫身上。
这是我的代码:
import random
import turtle as t
t.bgcolor('yellow')
caterpillar = t.Turtle()
caterpillar.shape('square')
caterpillar.color('red')
caterpillar.speed(0)
caterpillar.penup()
caterpillar.hideturtle()
caterpillar2 = t.Turtle()
caterpillar2.color('blue')
caterpillar2.shape('square')
caterpillar2.penup()
caterpillar2.speed(0)
caterpillar2.hideturtle()
leaf = t.Turtle()
leaf_shape = ((0, 0), (14, 2), (18, 6), (20, 20), (6, 18), (2, 14))
t.register_shape('leaf', leaf_shape)
leaf.shape('leaf')
leaf.color('green')
leaf.penup()
leaf.hideturtle()
leaf.speed(0)
game_started = False
text_turtle = t.Turtle()
text_turtle.write('Press SPACE to start' , align='center', font=('Arial', 50, 'bold' ))
text_turtle.hideturtle()
score_turtle = t.Turtle()
score_turtle.hideturtle()
score_turtle.speed(0)
def outside_window(caterpillar):
left_wall = -t.window_width() / 2
right_wall = t.window_width() / 2
top_wall = t.window_height() / 2
bottom_wall = -t.window_height() / 2
(x, y) = caterpillar.pos()
outside = \
x<left_wall or \
x>right_wall or \
y<bottom_wall or \
y>top_wall
return outside
def game_over():
caterpillar.color('yellow')
caterpillar2.color('yellow')
leaf.color('yellow')
t.penup()
t.hideturtle()
t.write('GAME OVER!', align='center', font=('Arial', 30, 'normal'))
def display_score(current_score):
score_turtle.clear()
score_turtle.penup()
x = (t.window_width() / 2) - 50
y=(t.window_height() / 2) - 50
score_turtle.setpos(x, y)
score_turtle.write(str(current_score), align='right', font=('Arial', 40, 'bold'))
def place_leaf():
leaf.ht()
leaf.setx(random.randint(-200, 200))
leaf.sety(random.randint(-200, 200))
leaf.st()
def start_game():
global game_started
if game_started:
return
game_started=True
score = 0
text_turtle.clear()
caterpillar_speed = 2
caterpillar_length = 3
caterpillar.shapesize(1, caterpillar_length, 1)
caterpillar.showturtle()
caterpillar2.shapesize(1, caterpillar_length, 1)
caterpillar2.setheading(180)
caterpillar2.showturtle()
display_score(score)
place_leaf()
while True:
caterpillar.forward(caterpillar_speed)
caterpillar2.forward(caterpillar_speed)
if caterpillar.distance(leaf) or leaf.distance(caterpillar2) < 20:
place_leaf()
caterpillar_length=caterpillar_length + 1
caterpillar.shapesize(1, caterpillar_length, 1)
caterpillar2.shapesize(1, caterpillar_length, 1)
score = score + 10
display_score(score)
if outside_window(caterpillar) or outside_window(caterpillar2):
game_over()
break
def move_up():
if caterpillar.heading() == 0 or caterpillar.heading() == 180 or caterpillar.heading() == 270:
caterpillar.setheading(90)
def move_down():
if caterpillar.heading() == 0 or caterpillar.heading() == 180 or caterpillar.heading() == 90:
caterpillar.setheading(270)
def move_left():
if caterpillar.heading() == 90 or caterpillar.heading() == 270 or caterpillar.heading() == 0:
caterpillar.setheading(180)
def move_right():
if caterpillar.heading() == 90 or caterpillar.heading() == 270 or caterpillar.heading() == 180:
caterpillar.setheading(0)
def caterpillar2_move_up():
if caterpillar2.heading() == 0 or caterpillar2.heading() == 180 or caterpillar2.heading() == 270:
caterpillar2.setheading(90)
def caterpillar2_move_down():
if caterpillar2.heading() == 0 or caterpillar2.heading() == 180 or caterpillar2.heading() == 90:
caterpillar2.setheading(270)
def caterpillar2_move_left():
if caterpillar2.heading() == 90 or caterpillar2.heading() == 270 or caterpillar2.heading() == 0:
caterpillar2.setheading(180)
def caterpillar2_move_right():
if caterpillar2.heading() == 90 or caterpillar2.heading() == 270 or caterpillar2.heading() == 180:
caterpillar2.setheading(0)
t.onkey(start_game, 'space')
t.onkey(move_up, 'Up')
t.onkey(move_right, 'Right')
t.onkey(move_down, 'Down')
t.onkey(move_left, 'Left')
t.onkey(caterpillar2_move_up, 'w')
t.onkey(caterpillar2_move_right, 'd')
t.onkey(caterpillar2_move_down, 's')
t.onkey(caterpillar2_move_left, 'a')
t.listen()
t. mainloop()
它给了我这些错误:
"/Users/arkumar/user python/bin/python" /Users/arkumar/PycharmProjects/caterpillar/.idea/caterpillar.py
Exception in Tkinter callback
Traceback (most recent call last):
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py", line 1536, in __call__
return self.func(*args)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/turtle.py", line 710, in eventfun
fun()
File "/Users/arkumar/PycharmProjects/caterpillar/.idea/caterpillar.py", line 98, in start_game
place_leaf()
File "/Users/arkumar/PycharmProjects/caterpillar/.idea/caterpillar.py", line 70, in place_leaf
leaf.ht()
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/turtle.py", line 2236, in hideturtle
self.pen(shown=False)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/turtle.py", line 2363, in pen
self._update()
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/turtle.py", line 2564, in _update
self._update_data()
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/turtle.py", line 2550, in _update_data
self.screen._incrementudc()
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/turtle.py", line 1239, in _incrementudc
raise Terminator
Terminator
然而它给了我一个退出代码0:
Process finished with exit code 0
你能帮我解释一下这段代码吗?
谢谢你, Aditya
答案 0 :(得分:1)
我已将您的代码重新编写为下面的可玩游戏。我不能说是什么导致了你的具体错误,它可能与PyCharm有关,但从逻辑上看,我看到的最大问题是这一行:
if caterpillar.distance(leaf) or leaf.distance(caterpillar2) < 20:
我见过其他初学者尝试这样做但它不起作用,你需要说的是:
if caterpillar.distance(leaf) < 20 or leaf.distance(caterpillar2) < 20:
由于or
不分发条件。
import random
from turtle import Turtle, Screen, mainloop
TEXT_FONT = ('Arial', 50, 'bold')
SCORE_FONT = ('Arial', 40, 'bold')
def outside_window(caterpillar):
left_wall, right_wall = -window_width / 2, window_width / 2
top_wall, bottom_wall = window_height / 2, -window_height / 2
x, y = caterpillar.pos()
inside = left_wall < x < right_wall and bottom_wall < y < top_wall
return not inside
def game_over():
caterpillar1.hideturtle()
caterpillar2. hideturtle()
leaf.hideturtle()
text_turtle.write('GAME OVER!', align='center', font=TEXT_FONT)
def display_score(current_score):
score_turtle.undo()
score_turtle.write(current_score, align='right', font=SCORE_FONT)
def place_leaf():
leaf.hideturtle()
leaf.setposition(random.randint(-200, 200), random.randint(-200, 200))
leaf.showturtle()
def start_game():
screen.onkey(None, 'space') # can't restart currently
text_turtle.clear()
score = 0
caterpillar_speed = 2
caterpillar_length = 3
caterpillar1.shapesize(1, caterpillar_length, 1)
caterpillar1.showturtle()
caterpillar2.shapesize(1, caterpillar_length, 1)
caterpillar2.setheading(180)
caterpillar2.showturtle()
display_score(score)
place_leaf()
while True:
caterpillar1.forward(caterpillar_speed)
caterpillar2.forward(caterpillar_speed)
if caterpillar1.distance(leaf) < 20 or caterpillar2.distance(leaf) < 20:
place_leaf()
caterpillar_length += 1
caterpillar1.shapesize(1, caterpillar_length, 1)
caterpillar2.shapesize(1, caterpillar_length, 1)
score = score + 10
display_score(score)
if outside_window(caterpillar1) or outside_window(caterpillar2):
game_over()
break
def caterpillar1_move_up():
caterpillar1.setheading(90)
def caterpillar1_move_down():
caterpillar1.setheading(270)
def caterpillar1_move_left():
caterpillar1.setheading(180)
def caterpillar1_move_right():
caterpillar1.setheading(0)
def caterpillar2_move_up():
caterpillar2.setheading(90)
def caterpillar2_move_down():
caterpillar2.setheading(270)
def caterpillar2_move_left():
caterpillar2.setheading(180)
def caterpillar2_move_right():
caterpillar2.setheading(0)
screen = Screen()
screen.bgcolor('yellow')
window_width, window_height = screen.window_width(), screen.window_height()
caterpillar1 = Turtle('square')
caterpillar1.color('red')
caterpillar1.speed('fastest')
caterpillar1.penup()
caterpillar1.hideturtle()
caterpillar2 = Turtle('square')
caterpillar2.color('blue')
caterpillar2.speed('fastest')
caterpillar2.penup()
caterpillar2.hideturtle()
leaf_shape = ((0, 0), (14, 2), (18, 6), (20, 20), (6, 18), (2, 14))
screen.register_shape('leaf', leaf_shape)
leaf = Turtle('leaf', visible=False)
leaf.speed('fastest')
leaf.color('green')
leaf.penup()
text_turtle = Turtle(visible=False)
text_turtle.write('Press SPACE to start', align='center', font=TEXT_FONT)
score_turtle = Turtle(visible=False)
score_turtle.speed('fastest')
score_turtle.penup()
score_turtle.setpos(window_width / 2 - 50, window_height / 2 - 50)
score_turtle.write(0, align='right', font=SCORE_FONT)
screen.onkey(start_game, 'space')
screen.onkey(caterpillar1_move_up, 'Up')
screen.onkey(caterpillar1_move_right, 'Right')
screen.onkey(caterpillar1_move_down, 'Down')
screen.onkey(caterpillar1_move_left, 'Left')
screen.onkey(caterpillar2_move_up, 'w')
screen.onkey(caterpillar2_move_right, 'd')
screen.onkey(caterpillar2_move_down, 's')
screen.onkey(caterpillar2_move_left, 'a')
screen.listen()
mainloop()
我的返工代码的一个问题是它保留了while True:
循环,这在turtle的事件驱动环境中确实不应该发生。它应该替换为screen.ontimer()
个事件。