使用Python的pygame库实现自动追踪目标的Snake游戏

和上一期不同的目标追踪入门不同的是,这期是自动追踪科学游戏hhh,话不多说,321上链接

一、项目背景

Snake游戏是一款经典的游戏,玩家需要控制一条蛇在屏幕上移动,吃掉食物并避免撞到自己的身体或墙壁。传统的Snake游戏通常需要玩家手动控制蛇的移动方向,而在本篇文章中,我们将介绍如何使用Python的pygame库来创建一个自动追踪目标的Snake游戏。通过自动追踪目标,游戏变得更加具有挑战性和趣味性。

二、准备工作

在开始之前,确保你已经安装了Python和pygame库。你可以使用以下命令通过pip安装pygame:

pip install pygame

三、创建游戏窗口:

接下来,我们需要初始化pygame并设置游戏窗口的参数。在Python脚本中,自定义一个python的文件,下面是窗口设置代码(头部可以调整为适应方块尺寸的自定义图片):

# 导入所需的库
import pygame  # 导入pygame库
import time  # 导入time库
import random  # 导入random库

# 初始化pygame
pygame.init()  # 初始化pygame

# 设置屏幕宽度和高度
dis_width = 800  # 设置屏幕宽度为800
dis_height = 600  # 设置屏幕高度为600

# 创建屏幕对象
dis = pygame.display.set_mode((dis_width, dis_height))  # 创建屏幕对象,设置宽度和高度
pygame.display.set_caption('Snake Game')  # 设置窗口标题为'Snake Game'

# 设置游戏参数
snake_block = 10  # 设置贪吃蛇方块大小为10
snake_speed = 30  # 设置贪吃蛇移动速度为30
# 加载自定义图片
head_img = pygame.image.load('ball.PNG')  # 加载自定义图片
head_img = pygame.transform.scale(head_img, (snake_block, snake_block))  # 调整图片大小以适应贪吃蛇方块大小

四、设置游戏元素及蛇的移动与追踪:

接下来,我们将设置游戏中的元素,包括蛇方块、食物方块以及蛇的初始位置和方向。在snake_game.py文件中继续添加以下代码:

# 定义贪吃蛇函数
def snake(snake_block, snake_list):  # 定义贪吃蛇函数,接受贪吃蛇方块大小和贪吃蛇列表作为参数
    for x in snake_list:  # 遍历贪吃蛇列表
        pygame.draw.rect(dis, (0, 255, 0), [x[0], x[1], snake_block, snake_block])  # 在屏幕上绘制贪吃蛇方块


# 定义游戏循环
def gameLoop(x1=1, y1=1):  # 定义游戏循环函数
    game_over = False  # 初始化游戏结束标志为False
    game_close = False  # 初始化游戏关闭标志为False
    # 初始化贪吃蛇位置
    x1 = dis_width / 2  # 初始化贪吃蛇头部x坐标为屏幕宽度的一半
    y1 = dis_height / 2  # 初始化贪吃蛇头部y坐标为屏幕高度的一半

    x1_change = 0  # 初始化贪吃蛇x方向变化量为0
    y1_change = 0  # 初始化贪吃蛇y方向变化量为0

    snake_List = []  # 初始化贪吃蛇列表为空
    Length_of_snake = 1  # 初始化贪吃蛇长度为1

    # 随机生成食物位置
    foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0  # 随机生成食物x坐标
    foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0  # 随机生成食物y坐标

    while not game_over:  # 游戏未结束时循环

        # 自动追踪食物
        if x1 < foodx:  # 如果贪吃蛇头部x坐标小于食物x坐标
            x1_change = snake_block  # 设置x方向变化量为贪吃蛇方块大小
            y1_change = 0  # 设置y方向变化量为0
        elif x1 > foodx:  # 如果贪吃蛇头部x坐标大于食物x坐标
            x1_change = -snake_block  # 设置x方向变化量为贪吃蛇方块大小的负值
            y1_change = 0  # 设置y方向变化量为0
        elif y1 < foody:  # 如果贪吃蛇头部y坐标小于食物y坐标
            y1_change = snake_block  # 设置y方向变化量为贪吃蛇方块大小
            x1_change = 0  # 设置x方向变化量为0
        elif y1 > foody:  # 如果贪吃蛇头部y坐标大于食物y坐标
            y1_change = -snake_block  # 设置y方向变化量为贪吃蛇方块大小的负值
            x1_change = 0  # 设置x方向变化量为0

        # 更新贪吃蛇位置
        x1 += x1_change  # 更新贪吃蛇头部x坐标
        y1 += y1_change  # 更新贪吃蛇头部y坐标

        # 绘制贪吃蛇和食物
        dis.fill((50, 153, 213))  # 填充屏幕颜色
        pygame.draw.rect(dis, (213, 50, 80), [foodx, foody, snake_block, snake_block])  # 绘制食物
        snake_Head = [x1, y1]  # 初始化贪吃蛇头部坐标列表
        snake_List.append(snake_Head)  # 将贪吃蛇头部坐标列表添加到贪吃蛇列表
        if len(snake_List) > Length_of_snake:  # 如果贪吃蛇列表长度大于贪吃蛇长度
            del snake_List[0]  # 删除贪吃蛇列表中的第一个元素

        for x in snake_List[:-1]:  # 遍历贪吃蛇列表中除最后一个元素外的所有元素
            if x == snake_Head:  # 如果当前元素等于贪吃蛇头部坐标
                game_close = True  # 设置游戏关闭标志为True

        snake(snake_block, snake_List)  # 调用贪吃蛇函数绘制贪吃蛇
        pygame.display.update()  # 更新屏幕显示
        # 绘制统计吃了多少球的小标志
        font = pygame.font.Font(None, 25)  # 设置字体和大小
        text = font.render("Score: " + str(Length_of_snake - 1), True, (255, 255, 255))  # 渲染分数文本
        dis.blit(text, (10, 10))  # 绘制分数文本到屏幕左上角

六、游戏循环及按钮设置

接下来,我们需要实现游戏的主循环,包括渲染游戏界面、处理事件、更新游戏状态和调用自动追踪函数及其按钮设置。在文件中继续添加以下代码:

 # 在分数达到后暂停游戏并显示按钮的如下:
        if Length_of_snake - 1 >= 88:  # 如果分数达到88

            # 显示通关提示
            font = pygame.font.Font(None, 50)  # 设置字体和大小
            text = font.render("success!!!", True, (255, 255, 255))  # 渲染通关提示文本
            dis.blit(text, (dis_width // 2 - 200, dis_height // 2 - 50))  # 绘制通关提示文本到屏幕中间

            # 绘制重开和暂停按钮
            continue_button = pygame.draw.rect(dis, (0, 255, 0),
                                               (dis_width // 2 - 100, dis_height // 2 + 50, 100, 50))  # 绘制重开按钮
            pause_button = pygame.draw.rect(dis, (255, 0, 0), (dis_width // 2, dis_height // 2 + 50, 100, 50))  # 绘制暂停按钮

            # 绘制按钮文本
            font = pygame.font.Font(None, 30)  # 设置字体和大小
            text = font.render("Reopen", True, (255, 255, 255))  # 渲染重开按钮文本
            dis.blit(text, (dis_width // 2 - 80, dis_height // 2 + 65))  # 绘制重开按钮文本到屏幕中间

            text = font.render("stop", True, (255, 255, 255))  # 渲染暂停按钮文本
            dis.blit(text, (dis_width // 2 + 20, dis_height // 2 + 65))  # 绘制暂停按钮文本到屏幕中间

            pygame.display.update()  # 更新屏幕显示

            while True:  # 无限循环等待用户操作
                for event in pygame.event.get():  # 遍历所有事件
                    if event.type == pygame.QUIT:  # 如果事件类型为退出
                        pygame.quit()  # 退出pygame
                        quit()  # 退出游戏
                    if event.type == pygame.MOUSEBUTTONDOWN:  # 如果事件类型为鼠标按下
                        mouse_pos = pygame.mouse.get_pos()  # 获取鼠标位置
                        if continue_button.collidepoint(mouse_pos):  # 如果鼠标点击了重开按钮
                            gameLoop(x1, y1)  # 调用游戏循环函数,传入当前贪吃蛇头部坐标
                            break  # 退出循环,重新开始游戏
                        elif pause_button.collidepoint(mouse_pos):  # 如果鼠标点击了暂停按钮
                            pygame.quit()  # 退出pygame
                            quit()  # 退出游戏

七、游戏结束与退出

为了使游戏更加完整,我们还需要添加游戏结束和退出的逻辑。在文件中继续添加以下代码:

   pygame.display.update()  # 更新屏幕显示
        # 更新食物位置
        if x1 == foodx and y1 == foody:  # 如果贪吃蛇头部坐标等于食物坐标
            foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0  # 随机生成新的食物x坐标
            foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0  # 随机生成新的食物y坐标
            Length_of_snake += 1  # 贪吃蛇长度加1

        time.sleep(snake_speed / 100000.0)  # 控制游戏速度

    pygame.quit()  # 退出pygame
    quit()  # 退出游戏


gameLoop()

游戏将启动并显示窗口,运行文件你将看到自动追踪控制着蛇的移动,你可以调整速度或者是自动