为什么我的蛇的尾巴从它的body上脱落了



编译完这段代码后,一切都能正常工作,直到我尝试扩展我的snake;然而,当我这样做时,蛇从身体上分离,扩展功能失败,如下图所示。我如何将新的分段附加到身体上,以便它更新分数,蛇的身体也会增加它的分段蛇的身体分离与身体

from turtle import Screen
from food import Food
from snakee import Snake
from score import Score

screen=Screen()
screen.setup(600,600)
screen.bgcolor("black")
screen.title("Snake game")
screen.tracer(0)

snake=Snake()
food=Food()
score=Score()

screen.listen()
screen.onkey(snake.up,"Up")
screen.onkey(snake.down,"Down")
screen.onkey(snake.right,"Right")
screen.onkey(snake.left,"Left")

game_is_on = True
while game_is_on:
screen.update()
time.sleep(0.1)
snake.move()

if snake.head.distance(food) < 15:
food.refresh()
snake.extend()
score.increse_score()
if snake.head.xcor()>280 or snake.head.xcor() < -280 or snake.head.ycor()>280 or snake.head.ycor()<-280:
game_is_on=False
score.over()





screen.exitonclick()

得分.py

from turtle import Turtle
class Score(Turtle):
def __init__(self):
super().__init__()
self.score = 0
self.hideturtle()
self.color("white")
self.penup()
self.goto(0,250)
self.update()
def update(self):
self.write(f"score:{self.score}", align="center",font=("Ariel",24,"normal"))
def over(self):
self.goto(0,0)
self.write(f"GAME OVER", align="center",font=("Ariel",24,"normal"))
def increse_score(self):
self.score+=1
self.clear()
self.update()

Snake.py

from turtle import Turtle,Screen
screen=Screen()
START_POSI = [(0, 0), (-20, 0), (-40, 0)]
MOVE_DIS=20
UP=90
DOWN=270
LEFT=180
RIGHT=0
class Snake:
def __init__(self):
self.segment=[]
self.create_snake()
self.head=self.segment[0]

def create_snake(self):
for position in START_POSI:
self.add_segment(position)
def add_segment(self, position):
new_segment = Turtle("square")
new_segment.color("white")
new_segment.penup()
new_segment.goto(position)
self.segment.append(new_segment)
def extend(self):
self.add_segment(self.segment[-1].position())

def move(self):
for seg in range(len(START_POSI) - 1, 0, -1):
new_x = self.segment[seg - 1].xcor()
new_y = self.segment[seg - 1].ycor()
self.segment[seg].goto(new_x, new_y)
self.segment[0].forward(MOVE_DIS)
def up(self):
if self.head.heading()!=DOWN:
self.head.setheading(UP)
def down(self):
if self.head.heading()!=UP:
self.head.setheading(DOWN)
def left(self):
if self.head.heading()!=RIGHT:
self.head.setheading(LEFT)
def right(self):
if self.head.heading()!=LEFT:
self.head.setheading(RIGHT)

食物.py

from turtle import Turtle
import random
class Food(Turtle):
def __init__(self):
super().__init__()
self.penup()
self.shape("circle")
self.shapesize(0.5,0.5)
self.color("red")
self.refresh()
def refresh(self):
xcord = random.randint(-280,280)
ycord = random.randint(-280, 280)
self.goto(xcord,ycord)

您只循环到len(START_POSI),但这并不是扩展后的整个尾部。尝试len(self.segment):

def move(self):
#                    v----------- here's the fix
for seg in range(len(self.segment) - 1, 0, -1):
new_x = self.segment[seg - 1].xcor()

顺便说一句,我会在更新循环的最底部调用turtle.update()time.sleep()(按顺序(,而不是在顶部。每帧流量为update state/positions -> redraw -> register a tick/repaint/update with the turtle API -> sleep for the next frame。我通常使用ontimer而不是whilesleep,但我不确定它是否一定更可靠(这是一个悬而未决的研究项目(。

此外,我不喜欢将Turtle子类化。虽然这个程序看起来还可以,但这种做法可能会导致一些问题,所以我会改用组合而不是继承。只对自己的接口或API进行子类化,这些接口或API是专门为它设计的

最新更新