当前位置:   article > 正文

亲戚大学生暑假在家没事干?教他用Python写一个简单的贪吃蛇游戏,你想学吗?_pygame贪吃蛇设计思路

pygame贪吃蛇设计思路

亲戚大学生暑假在家没事干?教他用Python写一个简单的贪吃蛇游戏,你想学吗?

贪吃蛇游戏(Snake Game)是一种经典的益智游戏,玩家需要控制蛇的头部移动,吃掉食物,并不断增长蛇的身体。在游戏过程中,蛇不能碰到墙壁或自身,否则游戏结束。本教程将详细介绍如何使用 Python 语言和 Pygame 库编写一个贪吃蛇游戏。 本文分为以下几个部分:

  1. 游戏整体设计
  2. Pygame 库介绍
  3. 基础类和函数
  4. 游戏界面和控制
  5. 蛇和食物的实现
  6. 碰撞检测
  7. 游戏循环和得分系统
  8. 完整代码及运行

1. 游戏整体设计

贪吃蛇游戏的主要元素包括游戏区域、蛇、食物和得分。游戏区域的大小可以根据需要调整,蛇和食物的位置也是随机生成的。蛇初始化为一个头,随着游戏的进行,蛇的身体会不断增长。食物会被蛇吃掉,从而增加蛇的身体长度。当蛇碰到墙壁或自身时,游戏结束。游戏结束后,可以根据得分对玩家进行排名。

2. Pygame 库介绍

Pygame 是一个基于 Python 的游戏开发库,可以用于创建各种类型的游戏。它提供了丰富的功能,如图形、声音和用户界面等。要使用 Pygame 库,首先需要安装它。在命令行中输入以下命令:

pip install pygame  

  • 1
  • 2

安装完成后,可以在 Python 代码中导入 Pygame 库:

import pygame  

  • 1
  • 2

3. 基础类和函数

在编写贪吃蛇游戏时,我们需要定义一些基础类和函数来实现游戏的各种功能。

1. 初始化 Pygame
def init_pygame():  
   pygame.init()  
   screen = pygame.display.set_mode((width, height))  
   pygame.display.set_caption("贪吃蛇游戏")  
   return screen  

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
2. 生成随机位置
def generate_random_position():  
   x = random.randrange(0, width)  
   y = random.randrange(0, height)  
   return x, y  

  • 1
  • 2
  • 3
  • 4
  • 5
3. 绘制图形
def draw_square(x, y, size):  
   pygame.draw.rect(screen, (255, 255, 255), [x, y, size, size])  

  • 1
  • 2
  • 3
4. 绘制蛇
def draw_snake(snake_list):  
   for x, y in snake_list:  
       pygame.draw.rect(screen, (255, 255, 255), [x, y, head_size, head_size])  

  • 1
  • 2
  • 3
  • 4
5. 绘制食物
def draw_food(x, y):  
   pygame.draw.rect(screen, (255, 0, 0), [x, y, head_size, head_size])  

  • 1
  • 2
  • 3

4. 游戏界面和控制

游戏界面主要包括游戏区域和控制按钮。我们可以使用 Pygame 库提供的 pygame.display.set_mode() 函数来创建游戏窗口,然后使用 pygame.display.set_caption() 函数设置窗口标题。

def create_game_interface():  
   screen.fill((0, 0, 0))  
   draw_square(width // 2 - head_size // 2, height - head_size - 10, head_size * 2)  
   draw_square(width // 2 - head_size // 2, height - head_size - 30, head_size * 2)  
   draw_square(width // 2, height - head_size - 30, head_size * 2)  
   pygame.display.set_caption("贪吃蛇游戏")  

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

贪吃蛇游戏的主要控制按钮有两个:向上移动和向下移动。我们可以使用 pygame.key.get_pressed() 函数来检测按键状态,然后根据按键状态移动蛇的头部。

def move_snake(direction):  
   if direction == "up":  
       snake_y -= head_speed  
   elif direction == "down":  
       snake_y += head_speed  
   elif direction == "left":  
       snake_x -= head_speed  
   elif direction == "right":  
       snake_x += head_speed  

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

要实现游戏界面和控制,还需要编写一个主循环函数,该函数负责初始化游戏、生成食物、更新蛇的位置和检测碰撞等。以下是一个简单的主循环函数示例:

def game_loop():  
   init_pygame()  
   create_game_interface()  
   generate_random_position()  
   draw_snake(snake_list)  
   draw_food(food_x, food_y)  
   clock.tick(30)  
   for event in pygame.event.get():  
       if event.type == pygame.QUIT:  
           pygame.quit()  
           quit()  
       elif event.type == pygame.KEYDOWN:  
           key = event.key  
           if key == pygame.K_UP:  
               move_snake("up")  
           elif key == pygame.K_DOWN:  
               move_snake("down")  
           elif key == pygame.K_LEFT:  
               move_snake("left")  
           elif key == pygame.K_RIGHT:  
               move_snake("right")
   while True:  
       game_loop()  

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

在游戏循环中,我们还需要不断检测蛇是否吃到了食物,并更新蛇的长度。此外,还要检测蛇是否碰到了墙壁或自身,以确保游戏不会出现错误。完成这些功能后,一个简单的贪吃蛇游戏就可以运行了。

5. 蛇和食物的实现

贪吃蛇游戏中的蛇和食物都是非常重要的元素。在本节中,我们将详细介绍如何实现蛇和食物。

1. 蛇的实现

蛇由多个方块组成,通常使用一个列表来存储蛇的身体。初始时,蛇只有一个头。当蛇吃到食物时,身体的长度会增加。我们可以使用 snake_list 列表来存储蛇的身体,其中每个元素表示蛇的一个方块。

def init_snake():    
   snake_list = []    
   snake_head = (width // 2, height // 2)    
   snake_speed = 5    
   return snake_list, snake_head, snake_speed
def add_snake_body(snake_list, snake_head, snake_speed):    
   new_head = (snake_head[0] + snake_speed, snake_head[1])    
   snake_list.append(new_head)    
   return new_head    

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
2. 食物的实现

食物在游戏中随机生成,玩家需要控制蛇吃掉食物来增长身体。我们可以使用一个变量 food_xfood_y 来存储食物的位置。当蛇吃到食物时,食物消失,并更新蛇的身体长度。

def generate_random_position():    
   x = random.randrange(0, width)    
   y = random.randrange(0, height)    
   return x, y
def draw_food(x, y):    
   pygame.draw.rect(screen, (255, 0, 0), (x, y, head_size, head_size))  
def check_collision(snake_head, food_x, food_y):    
   if snake_head[0] == food_x and snake_head[1] == food_y:    
       return True    
   return False
def eat_food(snake_list, food_x, food_y):    
   snake_head = snake_list[-1]    
   if check_collision(snake_head, food_x, food_y):    
       snake_list.pop()    
       food_x, food_y = generate_random_position()    
       return True    
   return False  

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

要实现蛇和食物,还需要编写一个主函数,该函数负责初始化游戏、生成食物、更新蛇的位置和检测碰撞等。以下是一个简单的主函数示例:

def game_loop():    
   init_pygame()    
   create_game_interface()    
   generate_random_position()    
   draw_snake(snake_list)    
   draw_food(food_x, food_y)    
   clock.tick(30)    
   for event in pygame.event.get():    
       if event.type == pygame.QUIT:    
           pygame.quit()    
           quit()    
       elif event.type == pygame.KEYDOWN:    
           key = event.key    
           if key == pygame.K_UP:    
               move_snake("up")    
           elif key == pygame.K_DOWN:    
               move_snake("down")    
           elif key == pygame.K_LEFT:    
               move_snake("left")    
           elif key == pygame.K_RIGHT:    
               move_snake("right")
   while True:    
       game_loop()    

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

在游戏循环中,我们还需要不断检测蛇是否吃到了食物,并更新蛇的长度。此外,还要检测蛇是否碰到了墙壁或自身,以确保游戏不会出现错误。完成这些功能后,一个简单的贪吃蛇游戏就可以运行了。

6. 碰撞检测

碰撞检测在游戏开发中非常重要。在贪吃蛇游戏中,我们需要检测蛇和食物之间的碰撞,以及蛇和游戏边界(墙壁)之间的碰撞。

1. 蛇和食物之间的碰撞检测

要检测蛇和食物之间的碰撞,我们需要比较蛇的头部坐标和食物坐标是否一致。一致表示蛇已经吃到了食物。

def check_collision(snake_head, food_x, food_y):  
   if snake_head[0] == food_x and snake_head[1] == food_y:  
       return True  
   return False  

  • 1
  • 2
  • 3
  • 4
  • 5
2. 蛇和边界之间的碰撞检测

要检测蛇和边界之间的碰撞,我们需要比较蛇的身体坐标和游戏边界坐标是否相交。如果相交,说明蛇已经碰到了边界。

def check_boundary_collision(snake_head, width, height):  
   if snake_head[0] < 0 or snake_head[0] > width:  
       return True  
   if snake_head[1] < 0 or snake_head[1] > height:  
       return True  
   return False  

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在游戏循环中,我们需要不断进行碰撞检测,以便在蛇吃到食物或碰到边界时做出相应的反应。以下是一个简单的游戏循环示例,包括碰撞检测:

def game_loop():  
   init_pygame()  
   create_game_interface()  
   generate_random_position()  
   draw_snake(snake_list)  
   draw_food(food_x, food_y)  
   clock.tick(30)  
   for event in pygame.event.get():  
       if event.type == pygame.QUIT:  
           pygame.quit()  
           quit()  
       elif event.type == pygame.KEYDOWN:  
           key = event.key  
           if key == pygame.K_UP:  
               move_snake("up")  
           elif key == pygame.K_DOWN:  
               move_snake("down")  
           elif key == pygame.K_LEFT:  
               move_snake("left")  
           elif key == pygame.K_RIGHT:  
               move_snake("right")
   while True:  
       check_collision(snake_head, food_x, food_y)  
       if check_collision(snake_head, food_x, food_y):  
           eat_food(snake_list, food_x, food_y)  
       check_boundary_collision(snake_head, width, height)  
       if check_boundary_collision(snake_head, width, height):  
           break
       game_loop()  

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

通过实现碰撞检测,我们可以确保游戏正常运行,蛇只能吃掉食物并增长身体,而不会穿过边界或食物。

7. 游戏循环和得分系统

游戏循环是指游戏程序的迭代过程,包括初始化游戏界面、生成游戏元素、更新游戏状态、渲染游戏画面等。得分系统则是根据玩家在游戏中的表现来计算得分,并在游戏界面中显示。 在这里,我们将介绍一个简单的游戏循环和得分系统,应用于贪吃蛇游戏。

1. 游戏循环

游戏循环是一个无限迭代的过程,直到游戏结束。在贪吃蛇游戏中,游戏循环包括以下步骤:

  1. 初始化游戏界面和资源。
  2. 生成游戏元素(蛇和食物)。
  3. 更新游戏状态(如蛇的身体位置、方向和长度)。
  4. 检测碰撞(蛇和食物、蛇和边界)。
  5. 绘制游戏画面。
  6. 处理用户输入事件。
  7. 循环迭代,直到游戏结束。 下面是一个简化的游戏循环示例:
def game_loop():  
   init_pygame()  
   create_game_interface()  
   generate_random_position()  
   draw_snake(snake_list)  
   draw_food(food_x, food_y)  
   clock.tick(30)  
   while True:  
       for event in pygame.event.get():  
           if event.type == pygame.QUIT:  
               pygame.quit()  
               quit()  
           elif event.type == pygame.KEYDOWN:  
               key = event.key  
               if key == pygame.K_UP:  
                   move_snake("up")  
               elif key == pygame.K_DOWN:  
                   move_snake("down")  
               elif key == pygame.K_LEFT:  
                   move_snake("left")  
               elif key == pygame.K_RIGHT:  
                   move_snake("right")
       check_collision(snake_head, food_x, food_y)  
       if check_collision(snake_head, food_x, food_y):  
           eat_food(snake_list, food_x, food_y)  
       check_boundary_collision(snake_head, width, height)  
       if check_boundary_collision(snake_head, width, height):  
           break
       game_loop()  

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
2. 得分系统

在贪吃蛇游戏中,得分是根据玩家吃掉的食物数量计算的。每当蛇吃到一个食物时,得分增加一个食物分数(例如,每个食物分数为 10)。游戏结束后,显示总得分。 下面是一个简单的得分系统实现:

def eat_food(snake_list, food_x, food_y):  
   food_score = 10  
   snake_len = len(snake_list)  
   snake_score = 0  
   for segment in snake_list:  
       if segment[0] == food_x and segment[1] == food_y:  
           snake_score += food_score  
           food_score *= 2  
           snake_len += 1  
           generate_new_position(snake_len)  
           food_x, food_y = generate_random_position()  
   score_board.append(snake_score)  
   food_x, food_y = generate_random_position()  

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

在游戏结束时,可以计算总得分并显示在游戏界面上。

def game_over():  
   total_score = sum(score_board)  
   print("游戏结束,你的总得分是:", total_score)  
   pygame.quit()  
   quit()  

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

通过将游戏循环和得分系统集成到贪吃蛇游戏中,玩家可以欣赏到游戏的完整功能,包括初始化游戏界面、生成游戏元素、更新游戏状态、检测碰撞、绘制游戏画面、处理用户输入事件和计算得分。

8. 完整代码及运行

下面是完整的 Python 代码,你可以将这段代码复制到 Python 文件中,然后运行该文件来玩贪吃蛇游戏。

import pygame  
import random
# 初始化 Pygame  
pygame.init()
# 设置屏幕  
screen = pygame.display.set_mode((640, 480))
# 设置标题  
pygame.display.set_caption("贪吃蛇游戏")
# 颜色设置  
white = (255, 255, 255)  
red = (200, 0, 0)  
green = (0, 200, 0)  
blue = (0, 0, 200)
# 声明变量  
snake = []  
snake_pos = [200, 200]  
food = []  
score = 0  
direction = "RIGHT"
# 定义函数  
def move_snake(snake, direction):  
   # 移除尾部  
   snake.pop()
   # 判断头部位置  
   if direction == "UP":  
       snake_pos[1] -= 10  
   elif direction == "DOWN":  
       snake_pos[1] += 10  
   elif direction == "LEFT":  
       snake_pos[0] -= 10  
   elif direction == "RIGHT":  
       snake_pos[0] += 10
   # 添加头部  
   snake.append(snake_pos)
def grow_snake(snake):  
   snake.append([])
def change_direction(direction):  
   if direction == "UP" and snake_pos[1] > 0:  
       direction = "DOWN"  
   elif direction == "DOWN" and snake_pos[1] < 470:  
       direction = "UP"  
   elif direction == "LEFT" and snake_pos[0] > 0:  
       direction = "RIGHT"  
   elif direction == "RIGHT" and snake_pos[0] < 639:  
       direction = "LEFT"
   return direction
def check_collision(snake, food):  
   # 检查蛇头是否撞墙  
   if snake[0][0] < 0 or snake[0][0] > 639 or snake[0][1] < 0 or snake[0][1] > 479:  
       return True
   # 检查蛇头是否撞食物  
   if snake[0] == food:  
       return True
   # 检查蛇头是否撞到蛇身  
   for part in snake[1:]:  
       if part == snake[0]:  
           return True
   return False
def score_system(score):  
   score_board = font.render("得分:{}".format(score), True, red)  
   screen.blit(score_board, (20, 30))
# 主循环  
while True:  
   screen.fill(white)
   # 处理事件  
   for event in pygame.event.get():  
       if event.type == pygame.QUIT:  
           pygame.quit()  
           quit()
       elif event.type == pygame.KEYDOWN:  
           if event.key == pygame.K_UP:  
               direction = "UP"  
           elif event.key == pygame.K_DOWN:  
               direction = "DOWN"  
           elif event.key == pygame.K_LEFT:  
               direction = "LEFT"  
           elif event.key == pygame.K_RIGHT:  
               direction = "RIGHT"
   # 移动蛇  
   move_snake(snake, direction)
   # 检测碰撞  
   if check_collision(snake, food):  
       food = []  
       grow_snake(snake)
   # 更新界面  
   score_system(score)  
   draw_snake(snake)  
   draw_food(food)
   pygame.display.flip()  

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90

要运行这个程序,你需要先安装 Pygame 库。使用以下命令安装 Pygame:

pip install pygame  

  • 1
  • 2

然后,将上述代码保存为一个 Python 文件(例如:snake_game.py)

---------------------------END---------------------------

感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/677625
推荐阅读
相关标签