教你用Python完成一个贪吃蛇的游戏

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()

 

你可能感兴趣的:(python,游戏,pycharm)