import turtle
import time
import random
# 游戏参数设置
DELAY = 0.1 # 游戏速度
SEGMENT_SIZE = 20 # 蛇身方块大小
# 初始化窗口
window = turtle.Screen()
window.title("贪吃蛇")
window.bgcolor("black")
window.setup(width=600, height=600)
window.tracer(0) # 关闭自动刷新
# 初始化蛇头
snake_head = turtle.Turtle()
snake_head.speed(0)
snake_head.shape("square")
snake_head.color("green")
snake_head.penup()
snake_head.goto(0, 0)
snake_head.direction = "stop"
# 食物
food = turtle.Turtle()
food.speed(0)
food.shape("circle")
food.color("red")
food.penup()
food.goto(0, 100)
# 计分板
score = 0
high_score = 0
score_board = turtle.Turtle()
score_board.speed(0)
score_board.color("white")
score_board.penup()
score_board.hideturtle()
score_board.goto(0, 260)
score_board.write("得分: 0 最高分: 0", align="center", font=("Arial", 14, "normal"))
# 蛇身列表(存储所有身体段)
snake_segments = []
# 方向控制函数
def go_up():
if snake_head.direction != "down":
snake_head.direction = "up"
def go_down():
if snake_head.direction != "up":
snake_head.direction = "down"
def go_left():
if snake_head.direction != "right":
snake_head.direction = "left"
def go_right():
if snake_head.direction != "left":
snake_head.direction = "right"
# 绑定键盘事件
window.listen()
window.onkeypress(go_up, "w")
window.onkeypress(go_down, "s")
window.onkeypress(go_left, "a")
window.onkeypress(go_right, "d")
# 移动函数
def move():
if snake_head.direction == "up":
y = snake_head.ycor()
snake_head.sety(y + SEGMENT_SIZE)
if snake_head.direction == "down":
y = snake_head.ycor()
snake_head.sety(y - SEGMENT_SIZE)
if snake_head.direction == "left":
x = snake_head.xcor()
snake_head.setx(x - SEGMENT_SIZE)
if snake_head.direction == "right":
x = snake_head.xcor()
snake_head.setx(x + SEGMENT_SIZE)
# 生成新食物
def spawn_food():
x = random.randint(-14, 14) * SEGMENT_SIZE
y = random.randint(-14, 14) * SEGMENT_SIZE
food.goto(x, y)
# 主游戏循环
while True:
window.update()
# 检测碰撞(边界)
if snake_head.xcor()>290 or snake_head.xcor()<-290 or snake_head.ycor()>290 or snake_head.ycor()<-290:
time.sleep(1)
snake_head.goto(0, 0)
snake_head.direction = "stop"
# 隐藏所有身体段
for segment in snake_segments:
segment.goto(1000, 1000)
snake_segments.clear()
score = 0
score_board.clear()
score_board.write("得分: {} 最高分: {}".format(score, high_score),
align="center", font=("Arial", 14, "normal"))
# 检测吃到食物
if snake_head.distance(food) < SEGMENT_SIZE:
spawn_food()
# 增加得分
score += 10
if score > high_score:
high_score = score
score_board.clear()
score_board.write("得分: {} 最高分: {}".format(score, high_score),
align="center", font=("Arial", 14, "normal"))
# 添加新身体段
new_segment = turtle.Turtle()
new_segment.speed(0)
new_segment.shape("square")
new_segment.color("green")
new_segment.penup()
snake_segments.append(new_segment)
# 移动身体段(从后往前移动)
for index in range(len(snake_segments)-1, 0, -1):
x = snake_segments[index-1].xcor()
y = snake_segments[index-1].ycor()
snake_segments[index].goto(x, y)
# 移动第一个身体段到头部位置
if len(snake_segments) > 0:
x = snake_head.xcor()
y = snake_head.ycor()
snake_segments[0].goto(x, y)
move()
# 检测自我碰撞
for segment in snake_segments:
if segment.distance(snake_head) < SEGMENT_SIZE/2:
time.sleep(1)
snake_head.goto(0, 0)
snake_head.direction = "stop"
# 隐藏所有身体段
for segment in snake_segments:
segment.goto(1000, 1000)
snake_segments.clear()
score = 0
score_board.clear()
score_board.write("得分: {} 最高分: {}".format(score, high_score),
align="center", font=("Arial", 14, "normal"))
time.sleep(DELAY)
window.mainloop()