赞
踩
亲戚大学生暑假在家没事干?教他用Python写一个简单的贪吃蛇游戏,你想学吗?
贪吃蛇游戏(Snake Game)是一种经典的益智游戏,玩家需要控制蛇的头部移动,吃掉食物,并不断增长蛇的身体。在游戏过程中,蛇不能碰到墙壁或自身,否则游戏结束。本教程将详细介绍如何使用 Python 语言和 Pygame 库编写一个贪吃蛇游戏。 本文分为以下几个部分:
贪吃蛇游戏的主要元素包括游戏区域、蛇、食物和得分。游戏区域的大小可以根据需要调整,蛇和食物的位置也是随机生成的。蛇初始化为一个头,随着游戏的进行,蛇的身体会不断增长。食物会被蛇吃掉,从而增加蛇的身体长度。当蛇碰到墙壁或自身时,游戏结束。游戏结束后,可以根据得分对玩家进行排名。
Pygame 是一个基于 Python 的游戏开发库,可以用于创建各种类型的游戏。它提供了丰富的功能,如图形、声音和用户界面等。要使用 Pygame 库,首先需要安装它。在命令行中输入以下命令:
pip install pygame
安装完成后,可以在 Python 代码中导入 Pygame 库:
import pygame
在编写贪吃蛇游戏时,我们需要定义一些基础类和函数来实现游戏的各种功能。
def init_pygame():
pygame.init()
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption("贪吃蛇游戏")
return screen
def generate_random_position():
x = random.randrange(0, width)
y = random.randrange(0, height)
return x, y
def draw_square(x, y, size):
pygame.draw.rect(screen, (255, 255, 255), [x, y, size, size])
def draw_snake(snake_list):
for x, y in snake_list:
pygame.draw.rect(screen, (255, 255, 255), [x, y, head_size, head_size])
def draw_food(x, y):
pygame.draw.rect(screen, (255, 0, 0), [x, y, head_size, head_size])
游戏界面主要包括游戏区域和控制按钮。我们可以使用 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("贪吃蛇游戏")
贪吃蛇游戏的主要控制按钮有两个:向上移动和向下移动。我们可以使用 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
要实现游戏界面和控制,还需要编写一个主循环函数,该函数负责初始化游戏、生成食物、更新蛇的位置和检测碰撞等。以下是一个简单的主循环函数示例:
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()
在游戏循环中,我们还需要不断检测蛇是否吃到了食物,并更新蛇的长度。此外,还要检测蛇是否碰到了墙壁或自身,以确保游戏不会出现错误。完成这些功能后,一个简单的贪吃蛇游戏就可以运行了。
贪吃蛇游戏中的蛇和食物都是非常重要的元素。在本节中,我们将详细介绍如何实现蛇和食物。
蛇由多个方块组成,通常使用一个列表来存储蛇的身体。初始时,蛇只有一个头。当蛇吃到食物时,身体的长度会增加。我们可以使用 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
食物在游戏中随机生成,玩家需要控制蛇吃掉食物来增长身体。我们可以使用一个变量 food_x
和 food_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
要实现蛇和食物,还需要编写一个主函数,该函数负责初始化游戏、生成食物、更新蛇的位置和检测碰撞等。以下是一个简单的主函数示例:
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()
在游戏循环中,我们还需要不断检测蛇是否吃到了食物,并更新蛇的长度。此外,还要检测蛇是否碰到了墙壁或自身,以确保游戏不会出现错误。完成这些功能后,一个简单的贪吃蛇游戏就可以运行了。
碰撞检测在游戏开发中非常重要。在贪吃蛇游戏中,我们需要检测蛇和食物之间的碰撞,以及蛇和游戏边界(墙壁)之间的碰撞。
要检测蛇和食物之间的碰撞,我们需要比较蛇的头部坐标和食物坐标是否一致。一致表示蛇已经吃到了食物。
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 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
在游戏循环中,我们需要不断进行碰撞检测,以便在蛇吃到食物或碰到边界时做出相应的反应。以下是一个简单的游戏循环示例,包括碰撞检测:
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()
通过实现碰撞检测,我们可以确保游戏正常运行,蛇只能吃掉食物并增长身体,而不会穿过边界或食物。
游戏循环是指游戏程序的迭代过程,包括初始化游戏界面、生成游戏元素、更新游戏状态、渲染游戏画面等。得分系统则是根据玩家在游戏中的表现来计算得分,并在游戏界面中显示。 在这里,我们将介绍一个简单的游戏循环和得分系统,应用于贪吃蛇游戏。
游戏循环是一个无限迭代的过程,直到游戏结束。在贪吃蛇游戏中,游戏循环包括以下步骤:
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()
在贪吃蛇游戏中,得分是根据玩家吃掉的食物数量计算的。每当蛇吃到一个食物时,得分增加一个食物分数(例如,每个食物分数为 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()
在游戏结束时,可以计算总得分并显示在游戏界面上。
def game_over():
total_score = sum(score_board)
print("游戏结束,你的总得分是:", total_score)
pygame.quit()
quit()
通过将游戏循环和得分系统集成到贪吃蛇游戏中,玩家可以欣赏到游戏的完整功能,包括初始化游戏界面、生成游戏元素、更新游戏状态、检测碰撞、绘制游戏画面、处理用户输入事件和计算得分。
下面是完整的 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()
要运行这个程序,你需要先安装 Pygame 库。使用以下命令安装 Pygame:
pip install pygame
然后,将上述代码保存为一个 Python 文件(例如:snake_game.py)
感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。