用python实现简单的贪吃蛇游戏(详细讲解版附加源代码)
这段代码是一个简单的贪吃蛇游戏实现。它使用Python的turtle库来创建游戏窗口和绘制图形。游戏中的蛇由一系列方块组成,玩家通过控制蛇的移动方向来吃食物并不断增长身体长度。代码中定义了函数来处理蛇的移动逻辑、食物碰撞、重置游戏等。玩家可以通过键盘上的方向键来控制蛇的移动方向。整个游戏运行在一个循环中,每隔一段时间自动更新蛇的位置并在画布上绘制。当蛇头碰到边界或自己的身体时,游戏将重新开始。这段
一, 贪吃蛇代码的基本思路
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”,所以我的运行结果背景板是粉色的。
更多推荐
所有评论(0)