Python小游戏 贪吃蛇(完整版) Pygame sys time

embedded/2024/9/24 4:14:53/

需要安装pip pygame 不会私 

python">import randomimport pygame, sys,time
# pygame.init()# 全局变量
SCREEN_WIDTH = 640  # 屏幕宽度
SCREEN_HEIGHT = 480  # 屏幕高度BLOCK_SIZE = 20  # 方格的宽、高长度COLOR_GRAY = (150, 150, 150)  # 灰色
COLOR_GREEN = (0, 150, 0)  # 绿色
COLOR_WHITE = (255, 255, 255)  # 白色
COLOR_RED = (255, 0, 0)  # 红色
# 控制方向
DIRECTION_MOVE = {pygame.K_DOWN: (0, 1),  # downpygame.K_RIGHT: (1, 0),  # rightpygame.K_UP: (0, -1),  # uppygame.K_LEFT: (-1, 0)  # left
}
# 头部图标旋转方向
DIRECTION_HEAD_ANGLE = {pygame.K_DOWN: 0,pygame.K_RIGHT: 90,pygame.K_UP: 180,pygame.K_LEFT: 270
}
# 封装蛇初始位置
class Snake():def __init__(self):self.direction = pygame.K_DOWN  # 初始方向self.score = 0self.icon_direction = DIRECTION_HEAD_ANGLE[pygame.K_DOWN]print(self.icon_direction)print(DIRECTION_HEAD_ANGLE)self.snake_body = [  # 蛇的位置  self.snake_body.insert(0, new_node) 在第一位新增  新增完蛇头改变到新增的位置 原本第二位改变到蛇头的位置pygame.Rect(3 * BLOCK_SIZE, 3 * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE),pygame.Rect(2 * BLOCK_SIZE, 3 * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE),pygame.Rect(1 * BLOCK_SIZE, 3 * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE)]self.sanke_img = pygame.image.load("res/head-red.png")  # 加载蛇头图片self.sanke_direction = pygame.transform.rotate(self.sanke_img,self.icon_direction) # 旋转蛇头self.snake_head = pygame.transform.scale(self.sanke_direction,(BLOCK_SIZE,BLOCK_SIZE))  # 设置蛇头大小def draw(self,screen):for x in self.snake_body[1:]:  # 遍历初始位置  给窗口画图 跳过第一个给蛇头留位置pygame.draw.rect(screen,COLOR_WHITE,x,border_radius=5)  # 给窗口画图 (窗口 , 颜色 ,(x左边距离,y上边距离 ,宽,高),边框圆角  )snake_pos = self.snake_body[0]  # 保存初始化第一个位置# print(snake_pos)screen.blit(self.snake_head,(snake_pos.x,snake_pos.y))  # 给窗口渲染蛇头图片 坐标是初始化第一个位置 <rect(60, 60, 20, 20)>  snake_pos.x第一个 60  snake_pos.y第二个 60def move(self):# pygame.Rect.copy()  —  拷贝Rect对象# pygame.Rect.move()  —  移动Rect对象# pygame.Rect.move_ip()  —  原地移动Rect对象# pygame.Rect.inflate()  —  放大和缩小Rect对象的尺寸# pygame.Rect.inflate_ip()  —  原地放大和缩小Rect对象的尺寸# pygame.Rect.clamp()  —  将一个Rect对象移动到另一个Rect对象的中心# pygame.Rect.clamp_ip()  —  原地将一个Rect对象移动到另一个Rect对象的中心new_node = self.snake_body[0].copy()  # 复制一份  <rect(60, 60, 20, 20)># print(new_node)# print(new_node.x)# print(new_node.y)pos = DIRECTION_MOVE[self.direction]    # (1, 0) 保存方向new_node.x += (pos[0] * BLOCK_SIZE)     # <rect(60, 60, 20, 20)>  new_node.x第一个 60  pos(1, 0) 1new_node.y += (pos[1] * BLOCK_SIZE)     # <rect(60, 60, 20, 20)>  new_node.y第二个 60  pos(1, 0) 0self.snake_body.insert(0, new_node)     # snake_body列表第一位 添加处理后的坐标 <rect(60+20, 60, 20, 20)> 列表第一位改变蛇头改变# print(self.snake_body)self.snake_body.pop()                   # 删除snake_body列表最后一项# 判断移动按键是否合法def is_direction_enable(self,event):if event not in DIRECTION_MOVE:   # 如果按键 没有在 上下左右范围内 则无效return FalseLR = (pygame.K_LEFT,pygame.K_RIGHT)  # ( 按键左 ,按键右)if event in LR and self.direction in LR:  # 如果按键在左右 且蛇默认方向在左右 则按键无效return FalseUD = (pygame.K_UP ,pygame.K_DOWN)  # ( 按键上 ,按键下)if event in UD and self.direction in UD:  # 如果按键在上下 且蛇默认方向在上下 则按键无效return Falsereturn True# 修改方向默认值def update_direction(self,event):self.direction = event  # 修改方向默认值self.icon_direction = DIRECTION_HEAD_ANGLE[event]  # 修改蛇头图标方向默认值self.sanke_direction = pygame.transform.rotate(self.sanke_img, self.icon_direction)  # 旋转蛇头self.snake_head = pygame.transform.scale(self.sanke_direction, (BLOCK_SIZE, BLOCK_SIZE))  # 设置蛇头大小def grow(self):  # 添加尾巴end = self.snake_body[-1].copy()  # 复制 蛇列表 最后一项self.snake_body.append(end)    # 追加蛇列表self.score += 1# 封装随机出现的食物
class Food():def __init__(self):self.x = random.randint(0,SCREEN_WIDTH//BLOCK_SIZE - 1)  # 食物随机出现的x坐标 0~ (640//20)-1 = 31 先求出有几个格子 再乘以20就是真实坐标self.y = random.randint(0,SCREEN_HEIGHT//BLOCK_SIZE - 1)  # 食物随机出现的x坐标 0~(480//20)-1 = 24self.f_rect = pygame.Rect(self.x * BLOCK_SIZE, self.y * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE)  # 保存食物位置def draw(self,screen):  # 随机生成食物方法pygame.draw.rect(screen,COLOR_RED,(self.x * BLOCK_SIZE, self.y * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE), border_radius = 5)   # 给窗口画图 (窗口 , 颜色 ,(x左边距离,y上边距离 ,宽,高),边框圆角  )class Game():def __init__(self):pygame.init()  # 初始化self.screen = pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT)) # 创建窗口 (640,480) 用一个screen变量保存 窗口对象pygame.display.set_caption("宝龙集团") # 给窗口添加标题img = pygame.image.load("res/snake_logo.png")  # 加载图标pygame.display.set_icon(img) # 窗口添加图标bg_img = pygame.image.load("res/bg.png")  # 加载背景图self.bg = pygame.transform.scale(bg_img,(SCREEN_WIDTH,SCREEN_HEIGHT))  # 背景图设置大小 (bg_img加载的背景图 ,(窗口宽640,窗口高480))def start(self): #启动方法s = Snake()  # 实例化 蛇初始位置类f = Food()  # 实例化 随机食物类# 获取clockclock = pygame.time.Clock()  # 帧率while True:events = pygame.event.get()  # 获取用户所有操作事件  (鼠标点击  键盘输入) 等for event in events:  # 遍历事件 进行判断 触发哪些事件if event.type == pygame.QUIT:  # 鼠标点击 ×号 pygame库 停止工作 关闭系统pygame.quit()  # Pygame库停止工作sys.exit()  # 退出系统elif event.type == pygame.KEYDOWN:  # 判断按键是否合法# print(event.key)if s.is_direction_enable(event.key):  # 判断移动按键是否合法# print(event.key)s.update_direction(event.key)  # 改变方向默认值self.screen.blit(self.bg, (0, 0))  # 给窗口渲染背景图 (背景图,(初始位置x = 0,y = 0)) 需要写在循环里,否则删除的数据不会消失#  显示帧率 和 得分fps = clock.get_fps()  # 获取 帧率font = pygame.font.SysFont("SimHei", 40)  # 字体类型 字体大小txt = font.render(f"帧率:%.2f"%fps, True, COLOR_RED)  # 帧率文字  (帧率 ture 颜色)self.screen.blit(txt, (0, 0))  # 窗口渲染颜色 (帧率文字 ,位置)txt = font.render(f"得分:{s.score}", True, COLOR_RED)  # 得分文字  (得分 ture 颜色)self.screen.blit(txt, (0, 60))  # 窗口渲染颜色 (得分文字 ,位置)for y in range(0,SCREEN_HEIGHT , BLOCK_SIZE):  # 画横线 x  range (0,480,20) = 0 20 40 ....# 给窗口画横线 (窗口,线的颜色(150, 150, 150 灰色),(起点位置x距离左边多远,高度位置y左上边距离多远),(终点位置x距离右边多远,高度位置y下边距离多远))pygame.draw.line(self.screen,COLOR_GRAY,(0,y),(SCREEN_WIDTH,y))for x in range(0, SCREEN_WIDTH, BLOCK_SIZE):  # 画纵线 y  range (0,640,20) = 0 20 40 ....# 给窗口画纵线 (窗口,线的颜色(150, 150, 150 灰色),(起点x距离左边多远,高度y左上边距离多远),(终点位置x距离右边多远,高度位置y下边距离多远))pygame.draw.line(self.screen, COLOR_GRAY, (x, 0), (x,SCREEN_HEIGHT ))s.draw(self.screen)  # 调用蛇初始位置方法 传个窗口f.draw(self.screen)  # 调用随机食物生成s.move()  # 默认向右走if s.snake_body[0] == f.f_rect:  # 判断头是否等于食物位置f = Food()  # 头等于食物位置 食物重新生成s.grow()  # 调用添加尾巴方法(用变量拷贝蛇列表最后一项 再使用append 追加上去)pygame.display.update()  # 刷新 (显示渲染的内容)# time.sleep(0.1)  # 游戏节奏 0.1秒触发一次clock.tick(10)  # 每秒10帧g = Game()   # 实例化 贪吃蛇类
g.start()    # 启动贪吃蛇


http://www.ppmy.cn/embedded/19298.html

相关文章

Wireshark安装教程

一、下载 地址&#xff1a;https://www.wireshark.org/download.html打开网址后&#xff0c;点击相应的版本下载&#xff1a; 二、安装 下载完成后双击文件开始安装 点击Next 点击Noted 点击Next 点击Next 点击Next 可以点击Browse更改安装路径&#xff0c;默认…

深度学习基础之《TensorFlow框架(14)—TFRecords》

一、什么是TFRecords文件 1、TFRecords其实是一种二进制文件&#xff0c;虽然它不如其他格式好理解&#xff0c;但是它能更好的利用内存&#xff0c;更方便复制和移动&#xff0c;并且不需要单独的标签文件 2、使用步骤 &#xff08;1&#xff09;获取数据 &#xff08;2&…

C语言数据结构之栈

目录 1.栈的概念及结构2.栈的实现3.栈的代码实现4.相关例题 •͈ᴗ•͈ 个人主页&#xff1a;御翮 •͈ᴗ•͈ 个人专栏&#xff1a;C语言数据结构 •͈ᴗ•͈ 欢迎大家关注和订阅!!! 1.栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插…

JAVA信息传送代码之下载图片

JAVA信息传送代码之下载图片 package xin.week1.day3; import org.junit.Test;import java.io.*; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.net.UnknownHostException;/*首先开启客户端服务 * 客户端下载服务端侧的图…

webpack和vite

webpack 是一个模块打包工具&#xff0c;使得工程中的各种资源能够被打包成一个整体的bundle.js文件。Webpack具有很高的可配置性和灵活性&#xff0c;使得开发者可以使用各种插件和配置文件来优化它们的工作流程。Webpack适用于大型、复杂的项目&#xff0c;它可以处理多种不…

前端开发攻略---在Vue3中对ElementPlus中的dialog组件进行二次封装

1、演示 2、子组件 在component文件夹下面新建一个文件夹&#xff0c;我这里是myDialog&#xff0c;在 myDialog文件夹创建index.vue文件。 <template><el-dialogv-model"visible":title"title":width"width":fullscreen"fullscre…

Cocos Creator 声音管理模块SoundMgr详解

前言 Cocos Creator 是一款用于开发2D和3D游戏的跨平台游戏引擎&#xff0c;它提供了丰富的功能和工具&#xff0c;使开发者能够快速开发出高质量的游戏。在游戏开发中&#xff0c;声音是一个非常重要的元素&#xff0c;可以增强游戏的氛围和互动性。为了更好地管理游戏中的声…

Transformer实战 单词预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f366; 参考文章&#xff1a;TensorFlow入门实战&#xff5c;第3周&#xff1a;天气识别&#x1f356; 原作者&#xff1a;K同学啊|接辅导、项目定制 一、定义模型 from tempfile import Tempor…