和上一期不同的目标追踪入门不同的是,这期是自动追踪科学游戏,话不多说,321上链接
一、项目背景
- Snake游戏是一款经典的游戏,玩家需要控制一条蛇在屏幕上移动,吃掉食物并避免撞到自己的身体或墙壁。传统的Snake游戏通常需要玩家手动控制蛇的移动方向,而在本篇文章中,我们将介绍如何使用Python的pygame库来创建一个自动追踪目标的Snake游戏。通过自动追踪目标,游戏变得更加具有挑战性和趣味性。
二、准备工作
你可以使用以下命令通过pip安装pygame:
pip install pygame
三、创建游戏窗口:
接下来,我们需要初始化pygame并设置游戏窗口的参数。
# 导入所需的库
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)) # 调整图片大小以适应贪吃蛇方块大小
效果显示:
四、设置游戏元素及蛇的移动与追踪:
接下来,我们将设置游戏中的元素,包括蛇方块、食物方块以及蛇的初始位置和方向:
# 定义贪吃蛇函数
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 # 初始化游戏结束标志为Falsegame_close = False # 初始化游戏关闭标志为False# 初始化贪吃蛇位置x1 = dis_width / 2 # 初始化贪吃蛇头部x坐标为屏幕宽度的一半y1 = dis_height / 2 # 初始化贪吃蛇头部y坐标为屏幕高度的一半x1_change = 0 # 初始化贪吃蛇x方向变化量为0y1_change = 0 # 初始化贪吃蛇y方向变化量为0snake_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方向变化量为0elif x1 > foodx: # 如果贪吃蛇头部x坐标大于食物x坐标x1_change = -snake_block # 设置x方向变化量为贪吃蛇方块大小的负值y1_change = 0 # 设置y方向变化量为0elif y1 < foody: # 如果贪吃蛇头部y坐标小于食物y坐标y1_change = snake_block # 设置y方向变化量为贪吃蛇方块大小x1_change = 0 # 设置x方向变化量为0elif 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 # 设置游戏关闭标志为Truesnake(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() # 退出pygamequit() # 退出游戏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() # 退出pygamequit() # 退出游戏
效果显示:
七、游戏结束与退出
为了使游戏更加完整,我们还需要添加游戏结束和退出的逻辑:
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 # 贪吃蛇长度加1time.sleep(snake_speed / 100000.0) # 控制游戏速度pygame.quit() # 退出pygamequit() # 退出游戏gameLoop()
效果显示:(点击红色按钮直接退出)
- 游戏将启动并显示窗口,运行文件你将看到自动追踪控制着蛇的移动,
- 你可以调整速度或者是自动