用python做个贪吃蛇
时间: 2023-09-02 17:08:59 浏览: 88
好的,接下来我会给你讲解如何用 Python 实现贪吃蛇游戏。
首先,我们需要导入 Pygame 库,这个库可以帮助我们创建游戏窗口、绘制图形等等。你可以通过 pip 安装这个库:
```
pip install pygame
```
然后,我们需要定义贪吃蛇的身体,以及它的初始位置和方向。这里我们可以使用一个列表来表示贪吃蛇的身体,其中列表的每个元素都是一个二元组,表示身体的一个部位的坐标。初始时,贪吃蛇的长度为 3,位置在屏幕的中央,方向向右:
```python
import pygame
import random
# 定义窗口大小和贪吃蛇初始长度和位置
WIN_WIDTH = 800
WIN_HEIGHT = 600
SNAKE_INIT_POS = [(300, 300), (280, 300), (260, 300)]
SNAKE_INIT_DIRECTION = "right"
SNAKE_BLOCK_SIZE = 20
```
接下来,我们可以定义一个函数来绘制贪吃蛇的身体:
```python
def draw_snake(win, snake_body):
for pos in snake_body:
pygame.draw.rect(win, (0, 255, 0), (pos[0], pos[1], SNAKE_BLOCK_SIZE, SNAKE_BLOCK_SIZE))
```
这个函数接受两个参数,第一个是窗口对象,第二个是贪吃蛇的身体列表。它会遍历身体列表中的每个元素,然后将其绘制成绿色的方块。
接下来,我们可以定义一个函数来更新贪吃蛇的位置。这个函数需要根据当前方向和身体列表的最后一个元素(即蛇尾)来计算蛇头的新位置。如果蛇头撞墙或者撞到自己的身体,游戏就结束了。如果蛇头吃到了食物,就需要将食物的位置变成一个新的随机位置,并且将贪吃蛇的长度加 1:
```python
def update_snake(snake_body, direction, food_pos):
# 计算蛇头的新位置
if direction == "right":
new_head = (snake_body[-1][0] + SNAKE_BLOCK_SIZE, snake_body[-1][1])
elif direction == "left":
new_head = (snake_body[-1][0] - SNAKE_BLOCK_SIZE, snake_body[-1][1])
elif direction == "up":
new_head = (snake_body[-1][0], snake_body[-1][1] - SNAKE_BLOCK_SIZE)
else:
new_head = (snake_body[-1][0], snake_body[-1][1] + SNAKE_BLOCK_SIZE)
# 判断是否撞墙或者撞到自己的身体
if new_head[0] < 0 or new_head[0] >= WIN_WIDTH or new_head[1] < 0 or new_head[1] >= WIN_HEIGHT:
return False
if new_head in snake_body[:-1]:
return False
# 判断是否吃到了食物
if new_head == food_pos:
snake_body.append(food_pos)
food_pos = (random.randint(0, WIN_WIDTH - SNAKE_BLOCK_SIZE) // SNAKE_BLOCK_SIZE * SNAKE_BLOCK_SIZE,
random.randint(0, WIN_HEIGHT - SNAKE_BLOCK_SIZE) // SNAKE_BLOCK_SIZE * SNAKE_BLOCK_SIZE)
else:
snake_body.pop(0)
snake_body.append(new_head)
return True, food_pos
```
这个函数接受三个参数,分别是身体列表、当前方向和食物的位置。它会根据当前方向计算蛇头的新位置,然后判断是否撞墙或者撞到自己的身体。如果蛇头吃到了食物,就需要将食物的位置变成一个新的随机位置,并且将贪吃蛇的长度加 1。最后,这个函数会返回一个元组,第一个元素表示游戏是否结束,第二个元素表示食物的位置。
最后,我们需要编写主程序,创建游戏窗口和食物,并且在游戏循环中不断更新贪吃蛇的位置和绘制游戏画面:
```python
def main():
# 初始化 Pygame
pygame.init()
# 创建游戏窗口
win = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT))
pygame.display.set_caption("贪吃蛇")
# 初始化贪吃蛇的位置和方向
snake_body = SNAKE_INIT_POS
direction = SNAKE_INIT_DIRECTION
# 创建食物的初始位置
food_pos = (random.randint(0, WIN_WIDTH - SNAKE_BLOCK_SIZE) // SNAKE_BLOCK_SIZE * SNAKE_BLOCK_SIZE,
random.randint(0, WIN_HEIGHT - SNAKE_BLOCK_SIZE) // SNAKE_BLOCK_SIZE * SNAKE_BLOCK_SIZE)
# 进入游戏循环
while True:
# 处理事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
return
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT and direction != "left":
direction = "right"
elif event.key == pygame.K_LEFT and direction != "right":
direction = "left"
elif event.key == pygame.K_UP and direction != "down":
direction = "up"
elif event.key == pygame.K_DOWN and direction != "up":
direction = "down"
# 更新贪吃蛇的位置
result = update_snake(snake_body, direction, food_pos)
if not result:
pygame.quit()
print("游戏结束!")
return
else:
game_over, food_pos = result
# 绘制游戏画面
win.fill((0, 0, 0))
draw_snake(win, snake_body)
pygame.draw.rect(win, (255, 0, 0), (food_pos[0], food_pos[1], SNAKE_BLOCK_SIZE, SNAKE_BLOCK_SIZE))
pygame.display.update()
# 控制游戏帧率
pygame.time.Clock().tick(10)
if __name__ == "__main__":
main()
```
运行这个程序,你就可以玩到自己写的贪吃蛇游戏了!
阅读全文