一, 贪吃蛇代码的基本思路

  1. 代码实现效果

         这个贪吃蛇游戏的 Python 代码,使用了 Turtle 库实现。游戏窗口大小为 500x500 像素,蛇和食物的大小都为 10 像素,初始速度为每秒移动 5 格。玩家通过键盘上下左右键控制蛇的移动方向,吃到食物后蛇身长度增加,每次移动时蛇头按照当前方向前进一格,蛇身跟随移动。当蛇头碰到边界或撞到自己的身体时,游戏结束并重新开始。

  2. 主要函数

        ① reset():初始化游戏,包括重置蛇的位置和方向,生成初始食物位置,并调用 move_snake() 函数开始游戏循环。

        ② move_snake():处理蛇的移动逻辑,首先计算出蛇头的新位置,如果撞到自己的身体则调用 reset() 函数重新开始游戏,否则将新位置添加到蛇身列表中,如果没有吃到食物则弹出蛇尾,然后更新蛇的位置,并在画布上绘制蛇的每个部分。

        ③ food_collision():判断蛇是否碰到了食物,如果是则更新食物位置。

        ④ get_random_food_position():生成随机的食物位置。

        ⑤ get_distance():计算两个点之间的距离。

        ⑥ go_up()、go_right()、go_down() 和 go_left() 分别对应键盘上的上、右、下、左四个方向键

二, 贪吃蛇游戏的具体代码实现

        1. 导入需要用到的库 


import turtle
import random

        2. 定义游戏窗口的宽度、高度、食物和蛇的大小,以及初始速度。定义一个字典 offsets,存储每个方向对应的坐标偏移量。

w = 500
h = 500
food_size = 10
delay = 100
offsets = {
    "up": (0, 20),
    "down": (0, -20),
    "left": (-20, 0),
    "right": (20, 0)
}

        3. 定义全局变量:蛇的位置、移动方向、食物的位置和画笔。

snake = [[0, 0], [0, 20], [0, 40], [0, 60], [0, 80]]
snake_dir = "up"
food_position = get_random_food_position()
pen = turtle.Turtle("square")

        4. 定义函数 reset(),用于初始化游戏,包括重置蛇的位置和方向,生成初始食物位置,并调用 move_snake() 函数开始游戏循环。

def reset():
    global snake, snake_dir, food_position, pen

    snake = [[0, 0], [0, 20], [0, 40], [0, 60], [0, 80]]
    snake_dir = "up"
    food_position = get_random_food_position()
    food.goto(food_position)
    move_snake()

        5. 定义函数 get_random_food_position(),生成随机的食物位置。

def get_random_food_position():
    x = random.randint(- w / 2 + food_size, w / 2 - food_size)
    y = random.randint(- h / 2 + food_size, h / 2 - food_size)
    return (x, y)

        6. 定义函数 get_distance(),用于计算两个点之间的距离。

def get_distance(pos1, pos2):
    x1, y1 = pos1
    x2, y2 = pos2
    distance = ((y2 - y1) ** 2 + (x2 - x1) ** 2) ** 0.5
    return distance

        7. 定义函数 food_collision(),判断蛇是否碰到了食物,如果是则更新食物位置。

def food_collision():
    global food_position
    if get_distance(snake[-1], food_position) < 20:
        food_position = get_random_food_position()
        food.goto(food_position)
        return True
    return False

        8. 定义函数 move_snake(),处理蛇的移动逻辑,首先计算出蛇头的新位置,如果撞到自己的身体则调用 reset() 函数重新开始游戏,否则将新位置添加到蛇身列表中,如果没有吃到食物则弹出蛇尾,然后更新蛇的位置,并在画布上绘制蛇的每个部分。

def move_snake():
    global snake_dir
    new_head = snake[-1].copy()
    new_head[0] = snake[-1][0] + offsets[snake_dir][0]
    new_head[1] = snake[-1][1] + offsets[snake_dir][1]
    if new_head in snake[:-1]:
        reset()
    else:
        snake.append(new_head)
        if not food_collision():
            snake.pop(0)
        if snake[-1][0] > w / 2:
            snake[-1][0] -= w
        elif snake[-1][0] < - w / 2:
            snake[-1][0] += w
        elif snake[-1][1] > h / 2:
            snake[-1][1] -= h
        elif snake[-1][1] < -h / 2:
            snake[-1][1] += h
        pen.clearstamps()
        for segment in snake:
            pen.goto(segment[0], segment[1])
            pen.stamp()
        screen.update()
        turtle.ontimer(move_snake, delay)

        9. 定义控制蛇移动方向的四个函数,分别对应键盘上的上、右、下、左四个方向键。

def go_up():
    global snake_dir
    if snake_dir != "down":
        snake_dir = "up"

def go_right():
    global snake_dir
    if snake_dir != "left":
        snake_dir = "right"

def go_down():
    global snake_dir
    if snake_dir != "up":
        snake_dir = "down"

def go_left():
    global snake_dir
    if snake_dir != "right":
        snake_dir = "left"

        10. 初始化游戏窗口、画笔和食物,设置背景颜色和画笔形状。监听键盘事件,调用控制移动方向的函数。最后调用 reset() 函数开始游戏。

screen = turtle.Screen()
screen.setup(w, h)
screen.title("Snake")
screen.bgcolor("blue")
screen.setup(500, 500)
screen.tracer(0)

food = turtle.Turtle()
food.shape("square")
food.color("yellow")
food.shapesize(food_size / 20)
food.penup()

screen.listen()
screen.onkey(go_up, "Up")
screen.onkey(go_right, "Right")
screen.onkey(go_down, "Down")
screen.onkey(go_left, "Left")

reset()

turtle.done()

到此我们的整个游戏便已经实现了,大部分知识是二维数组的应用。

三, 源代码

import turtle

import random

w = 500

h = 500

food_size = 10

delay = 100

offsets = {

    "up": (0, 20),

    "down": (0, -20),

    "left": (-20, 0),

    "right": (20, 0)

}


def reset():
    global snake, snake_dir, food_position, pen

    snake = [[0, 0], [0, 20], [0, 40], [0, 60], [0, 80]]

    snake_dir = "up"

    food_position = get_random_food_position()

    food.goto(food_position)

    move_snake()


def move_snake():
    global snake_dir

    new_head = snake[-1].copy()

    new_head[0] = snake[-1][0] + offsets[snake_dir][0]

    new_head[1] = snake[-1][1] + offsets[snake_dir][1]

    if new_head in snake[:-1]:

        reset()

    else:

        snake.append(new_head)

        if not food_collision():
            snake.pop(0)

        if snake[-1][0] > w / 2:

            snake[-1][0] -= w

        elif snake[-1][0] < - w / 2:

            snake[-1][0] += w

        elif snake[-1][1] > h / 2:

            snake[-1][1] -= h

        elif snake[-1][1] < -h / 2:

            snake[-1][1] += h

        pen.clearstamps()

        for segment in snake:
            pen.goto(segment[0], segment[1])

            pen.stamp()

        screen.update()

        turtle.ontimer(move_snake, delay)


def food_collision():
    global food_position

    if get_distance(snake[-1], food_position) < 20:
        food_position = get_random_food_position()

        food.goto(food_position)

        return True

    return False


def get_random_food_position():
    x = random.randint(- w / 2 + food_size, w / 2 - food_size)

    y = random.randint(- h / 2 + food_size, h / 2 - food_size)

    return (x, y)


def get_distance(pos1, pos2):
    x1, y1 = pos1

    x2, y2 = pos2

    distance = ((y2 - y1) ** 2 + (x2 - x1) ** 2) ** 0.5

    return distance


def go_up():
    global snake_dir

    if snake_dir != "down":
        snake_dir = "up"


def go_right():
    global snake_dir

    if snake_dir != "left":
        snake_dir = "right"


def go_down():
    global snake_dir

    if snake_dir != "up":
        snake_dir = "down"


def go_left():
    global snake_dir

    if snake_dir != "right":
        snake_dir = "left"


screen = turtle.Screen()

screen.setup(w, h)

screen.title("Snake")

screen.bgcolor("blue")

screen.setup(500, 500)

screen.tracer(0)

pen = turtle.Turtle("square")

pen.penup()

food = turtle.Turtle()

food.shape("square")

food.color("yellow")

food.shapesize(food_size / 20)

food.penup()

screen.listen()

screen.onkey(go_up, "Up")

screen.onkey(go_right, "Right")

screen.onkey(go_down, "Down")

screen.onkey(go_left, "Left")

reset()

turtle.done()

 四, 运行截图

因为我把背景改成了“pink”,所以我的运行结果背景板是粉色的。 

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐