pycharm小游戏贪吃蛇及pygame模块学习()

news2024/11/23 16:53:00

 由于代码量大,会逐渐发布

一.pycharm学习

在PyCharm中使用Pygame插入音乐和图片时,有以下这些注意事项:
 
插入音乐:
 
- 文件格式支持:Pygame常用的音乐格式如MP3、OGG等,但MP3可能需额外安装库(如pymedia等)才能更好支持,OGG格式兼容性相对较好,建议优先选用OGG格式音乐文件以减少潜在问题。
- 路径问题:要确保音乐文件的路径设置正确。在代码中指定音乐文件路径时,要么是绝对路径(完整的文件存储位置路径),但这样可能在项目移植时出现路径不对的情况;要么是相对路径,一般是相对于当前Python脚本文件的位置,比如音乐文件放在和脚本同一文件夹下,直接写文件名就行,若在子文件夹,要写清楚相对的子文件夹路径。
- 初始化 mixer:在播放音乐前,需要先初始化Pygame的mixer模块,例如  pygame.mixer.init() ,否则无法正常播放音乐。
- 音乐加载与播放:先使用  pygame.mixer.music.load("音乐文件名")  加载音乐文件,然后再用  pygame.mixer.music.play()  播放音乐。播放时可设置循环次数等参数,比如  pygame.mixer.music.play(-1)  表示无限循环播放。
 
插入图片:
 
- 图片格式支持:常见的如JPEG、PNG等格式一般都支持,但同样要注意不同格式在某些情况下可能有兼容性差异,PNG格式带透明通道等特性,使用较灵活,可优先考虑。
- 路径问题:和音乐文件一样,要保证图片文件路径正确,注意是绝对路径还是相对路径的设置。
- 初始化显示:要先初始化Pygame的显示模块,比如  pygame.init()  (通常在程序开头部分完成初始化操作),后续才能正常加载和显示图片。
- 加载与显示:使用  image = pygame.image.load("图片文件名")  加载图片,然后通过  screen.blit(image, (x坐标, y坐标))  将图片绘制到指定的显示屏幕( screen 是初始化显示后创建的屏幕对象,坐标指定图片显示的位置),最后别忘用  pygame.display.flip()  更新显示,让图片真正显示出来。

基础快速了解,直接去pycharm操作可实现

'''import pygame
pygame.display.set_mode()#初始化一个准备的界面
pygame.display.get_surface()#获取当前的surface对象
pygame.display.flip()#更新整个待显示的surface对象
pygame.display.update(rectangle=None)#更新部分内容显示到屏幕上,如果没有参数,则与flip()功能相同'''

# 1. 第一个窗口的实现
# import pygame

# pygame.init()  # 初始化pygame
# screen = pygame.display.set_mode()  # 初始化一个准备的界面
# 上例的缺点:窗口闪一下就,没有了,不能持久工作
# 窗口最大化工作,遮盖了任务栏,影响其他操作,进行优化


2.  # 窗口持久化

'''import pygame
import sys
pygame.init()  # 初始化pygame
size=width,height=960,640
screen = pygame.display.set_mode(size)

while True:
    for event in pygame.event.get(): #遍历所有事件
        if event.type==pygame.QUIT: #如果单击关闭窗口,则退出
            sys.exit()          # 执行退出操作'''

#  加continue
# 缺点一直进行

# 3.增加图片
'''import pygame
import sys
pygame.init()  # 初始化pygame
size=width,height=960,640
screen = pygame.display.set_mode(size)
color=(0,0,0)   # 设置背景颜色
plane_image = pygame.image.load("plane.png")#加载图片
plane_rect = plane_image.get_rect()#获取该图片显示的矩形区域

while True:
    for event in pygame.event.get(): #遍历所有事件
        if event.type==pygame.QUIT: #如果单击关闭窗口,则退出
            sys.exit()          # 执行退出操作

    screen.fill(color) #填充颜色
    screen.blit(plane_image, plane_rect) #将图片化到窗口上去
    pygame.display.flip() #更新显示


pygame.quit()
'''

# 4.移动图片

'''import pygame
import sys,time
pygame.init()  # 初始化pygame
size=width,height=960,640
screen = pygame.display.set_mode(size)
color=(0,0,0)   # 设置背景颜色
plane_image = pygame.image.load("plane.png")#加载图片
plane_rect = plane_image.get_rect()#获取该图片显示的矩形区域
speed=[5,5] #默认是偏移量


while True:
    for event in pygame.event.get(): #遍历所有事件
        if event.type==pygame.QUIT: #如果单击关闭窗口,则退出
            sys.exit()          # 执行退出操作
    plane_rect=plane_rect.move(speed) #控制飞机移动
    screen.fill(color) #填充颜色
    screen.blit(plane_image, plane_rect) #将图片化到窗口上去
    pygame.display.flip() #更新显示
    time.sleep(0.1)

pygame.quit()'''

# 5.触碰反弹
'''import pygame
import sys,time

pygame.init()  # 初始化pygame
size = width, height = 960, 640
screen = pygame.display.set_mode(size)
color = (0, 0, 0)  # 设置背景颜色
plane_image = pygame.image.load("plane.png")  # 加载图片
plane_rect = plane_image.get_rect()   # 获取该图片显示的矩形区域
speed = [5, 5]  # 默认是偏移量
i = -1

while True:
    for event in pygame.event.get():  # 遍历所有事件
        if event.type == pygame.QUIT:  # 如果单击关闭窗口,则退出
            sys.exit()  # 执行退出操作
    plane_rect = plane_rect.move(speed)  # 控制飞机移动
    # 默认矩形框左上角(0,0)
    if plane_rect.left < 0 or plane_rect.right > width:
        speed[0] = speed[0] * i  # x轴
    if plane_rect.top < 0 or plane_rect.bottom > height:
        speed[1] = speed[1] * i  # y轴
    screen.fill(color)  # 填充颜色
    screen.blit(plane_image, plane_rect)  # 将图片化到窗口上去
    pygame.display.flip()  # 更新显示
    time.sleep(0.1)

pygame.quit()
'''


#6.音乐模块   不支持num格式音乐,MP3,OGG,WAV支持
'''import pygame
import sys

pygame.init()  # 初始化pygame
pygame.mixer.init()
pygame.mixer.music.load(r"D:\41期\pygame模块\有何不可.MP3")
pygame.mixer.music.play(5) #播放6次
pygame.mixer.music.queue(r"D:\41期\pygame模块\有何不可.MP3")
#要持续化
while True:
    for event in pygame.event.get():  # 遍历所有事件
        if event.type == pygame.QUIT:  # 如果单击关闭窗口,则退出
            sys.exit()  # 执行退出操作'''

 

二.贪吃蛇实战

 

 可以终端看方块的坐标移动

 

 

移动

代码1

 #此串代码实现按键控制方块像贪吃蛇一样移动

import pygame
import sys

pygame.init()  # 初始化pygame
size = width, height = 960, 640  # 窗口大小
screen = pygame.display.set_mode(size)
color = (0, 66, 0)  # 设置背景颜色
square_color = 33, 255, 33  # 小方块颜色
square_x, square_y = 0, 0   # 小方块坐标
square_size = 20   # 小方块大小
game_speed=120
speed=0.05 # 方块速度
square_speed_x,square_speed_y=speed,0
clock = pygame.time.Clock()
while True:
    for event in pygame.event.get():  # 遍历所有事件
        if event.type == pygame.QUIT:  # 如果单击关闭窗口,则退出
            sys.exit()  # 执行退出操作
        # elif event.type == pygame.KEYDOWN:
        #     if event.key == pygame.K_UP:
        #         square_y += -5
        #     elif event.key == pygame.K_DOWN:
        #         square_y += 5
        #     elif event.key == pygame.K_LEFT:
        #         square_x += 5
        #     elif event.key == pygame.K_RIGHT:
        #         square_x += 5
        # 以上按键对应各方向移动,要实现x,y轴像贪吃蛇一样移动,下面代码
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                square_speed_x = 0
                square_speed_y = -speed
            elif event.key == pygame.K_DOWN:
                square_speed_x = 0
                square_speed_y = speed
            elif event.key == pygame.K_LEFT:
                square_speed_y = 0
                square_speed_x = -speed
            elif event.key == pygame.K_RIGHT:
                square_speed_y = 0
                square_speed_x = speed
    square_y+=square_speed_y
    square_x+=square_speed_x

    # 防止小方块移出左右边界
    if square_x<0:
        square_x=0
    elif square_x>width-square_size:
        square_x=width-square_size
    # 防止小方块移出上下边界
    if square_y < 0:
        square_y = 0
    elif square_y > height - square_size:
        square_y = height - square_size
    # 终端看坐标
    print(square_x,square_y,square_speed_x,square_speed_y)
    screen.fill(color)  # 填充颜色
    pygame.draw.rect(screen, square_color, (square_x, square_y, square_size, square_size))
    pygame.display.flip()  # 更新显示

pygame.quit()

代码2 

上述代码用x,y坐标实现方块移动,代码较为冗长,复杂,下面代码同样可以实现上述效果

import pygame
import sys
import random

pygame.init()  # 初始化pygame
clock = pygame.time.Clock()
size = width, height = 960, 640  # 窗口大小
screen = pygame.display.set_mode(size)
game_speed=120
color = (33,66,33)  # 设置背景颜色
square_color = 33, 255, 33  # 小方块颜色



# square_x, square_y = 0, 0   # 小方块坐标
# speed=0.05 # 方块速度
# square_speed_x,square_speed_y=speed,0
# square_size = 20   # 小方块大小
CELL_SIZE=20
square_rect=pygame.Rect(0,0,CELL_SIZE,CELL_SIZE)
UP,DOWN,LEFT,RIGHT=(0,-1),(0,1),(-1,0),(1,0)
square_direction=RIGHT # 定义一个初始方向
while True:
    for event in pygame.event.get():  # 遍历所有事件
        if event.type == pygame.QUIT:  # 如果单击关闭窗口,则退出
            sys.exit()  # 执行退出操作
        # elif event.type == pygame.KEYDOWN:
        #     if event.key == pygame.K_UP:
        #         square_y += -5
        #     elif event.key == pygame.K_DOWN:
        #         square_y += 5
        #     elif event.key == pygame.K_LEFT:
        #         square_x += 5
        #     elif event.key == pygame.K_RIGHT:
        #         square_x += 5
        # 以上按键对应各方向移动,要实现x,y轴像贪吃蛇一样移动,下面代码
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                square_direction=UP
            elif event.key == pygame.K_DOWN:
                square_direction = DOWN
            elif event.key == pygame.K_LEFT:
                square_direction = LEFT
            elif event.key == pygame.K_RIGHT:
                square_direction = RIGHT
    square_rect=square_rect.move(square_direction)
    # 防止小方块移出左右边界
    if square_rect.left<0:
        square_rect.left=0
    elif square_rect.right>width:
        square_rect.right=width
    if square_rect.top<0:
        square_rect.top=0
    elif square_rect.bottom>height:
        square_rect.bottom=height


    # 终端看坐标
    print(square_rect.x, square_rect.y, square_direction[0],square_direction[1])
    screen.fill(color)  # 填充颜色
    pygame.draw.rect(screen, square_color,square_rect)
    pygame.display.flip()  # 更新显示
    clock.tick(game_speed)
pygame.quit()

 代码3

在上述代码基础上,增加方块的丰富性及背景的网格线,并修改代码提高效率

背景颜色改为黑色,方块内有一个小黑方块(screen.fill(square_color2, square_rect.inflate(-4,-4)) # 可以放大或缩小图形  来实现

import pygame
import sys
import random

pygame.init()  # 初始化pygame
clock = pygame.time.Clock()
size = width, height = 960, 640  # 窗口大小
screen = pygame.display.set_mode(size)
game_speed=120
color = 0,0,0 # 设置背景颜色
color2=33,33,33
square_color = 33, 255, 33  # 小方块颜色
square_color2 = 0,0,0


# square_x, square_y = 0, 0   # 小方块坐标
# speed=0.05 # 方块速度
# square_speed_x,square_speed_y=speed,0
# square_size = 20   # 小方块大小
CELL_SIZE=20
square_rect=pygame.Rect(0,0,CELL_SIZE,CELL_SIZE)
UP,DOWN,LEFT,RIGHT=(0,-1),(0,1),(-1,0),(1,0)
square_direction=RIGHT # 定义一个初始方向
while True:
    for event in pygame.event.get():  # 遍历所有事件
        if event.type == pygame.QUIT:  # 如果单击关闭窗口,则退出
            sys.exit()  # 执行退出操作
        # elif event.type == pygame.KEYDOWN:
        #     if event.key == pygame.K_UP:
        #         square_y += -5
        #     elif event.key == pygame.K_DOWN:
        #         square_y += 5
        #     elif event.key == pygame.K_LEFT:
        #         square_x += 5
        #     elif event.key == pygame.K_RIGHT:
        #         square_x += 5
        # 以上按键对应各方向移动,要实现x,y轴像贪吃蛇一样移动,下面代码
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                square_direction=UP
            elif event.key == pygame.K_DOWN:
                square_direction = DOWN
            elif event.key == pygame.K_LEFT:
                square_direction = LEFT
            elif event.key == pygame.K_RIGHT:
                square_direction = RIGHT
    square_rect=square_rect.move(square_direction)
    # 防止小方块移出左右边界
    if square_rect.left<0:
        square_rect.left=0
    elif square_rect.right>width:
        square_rect.right=width
    if square_rect.top<0:
        square_rect.top=0
    elif square_rect.bottom>height:
        square_rect.bottom=height


    # 终端看坐标
    print(square_rect.x, square_rect.y, square_direction[0],square_direction[1])
    screen.fill(color)  # 填充颜色
    # pygame.draw.rect(screen, square_color,square_rect)
    for i in range(CELL_SIZE,width,CELL_SIZE):
        pygame.draw.line(screen,color2,(i,0),(i,height))
    for i in range(CELL_SIZE,height,CELL_SIZE):
        pygame.draw.line(screen,color2,(0,i),(width,i))
    screen.fill(square_color,square_rect)
    screen.fill(square_color2, square_rect.inflate(-4,-4)) # 可以放大或缩小图形
    pygame.display.flip()  # 更新显示
    clock.tick(game_speed)
pygame.quit()

 后续发布贪吃蛇吃食物计分完整代码,内容量多

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2234850.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

A018基于Spring Boot的民宿租赁系统

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…

​基于学习的地铁客流动态预测智能调度方法

1 文章信息 文章题为“A Learning Based Intelligent Train RegulationMethod With Dynamic Prediction forthe Metro Passenger Flow”&#xff0c;该文于2023年发表至“IEEE TRANSACTIONS ON INTELLIGENT TRANSPORTATION SYSTEMS”。文章的核心观点是提出了一种基于学习的智…

SpringBoot+FileBeat+ELK8.x版本收集日志

一、准备环境 1、ElasticSearch&#xff1a;8.1.0 2、FileBeat&#xff1a;8.1.0 3、Kibana&#xff1a;8.1.0 4、logstach&#xff1a;8.1.0 本次统一版本&#xff1a;8.1.0,4个组件&#xff0c;划分目录&#xff0c;保持版本一致。 说明&#xff1a;elasticsearch和kib…

【大数据学习 | HBASE】habse的表结构

在使用的时候hbase就是一个普通的表&#xff0c;但是hbase是一个列式存储的表结构&#xff0c;与我们常用的mysql等关系型数据库的存储方式不同&#xff0c;mysql中的所有列的数据是按照行级别进行存储的&#xff0c;查询数据要整个一行查询出来&#xff0c;不想要的字段也需要…

论文速读:动态再训练-更新用于无源目标检测的Mean Teacher(ECCV2024)

原文标题&#xff1a;Dynamic Retraining-Updating Mean Teacher for Source-Free Object Detection 中文标题&#xff1a;动态再训练-更新用于无源目标检测的Mean Teacher 本篇文章为论文速读&#xff0c;以帮助大家快速了解大意&#xff0c;具体详解可以看这篇分享。ECCV2024…

科研绘图系列:R语言带有面积区域的折线图(linechart)

文章目录 介绍加载R包数据画图准备图1图2图3图4图5图6图7图8图9图10合并所有图形系统信息介绍 带有面积区域的折线图通常被称为面积图(Area Chart)。面积图结合了折线图和条形图的特点,通过在折线下方的区域填充颜色或纹理,来展示一个或多个组的数值如何随第二个变量(通常…

Golang--文件操作

1、文件 文件&#xff1a;文件用于保存数据&#xff0c;是数据源的一种 os包下的File结构体封装了对文件的操作&#xff08;记得包os包&#xff09; 2、File结构体--打开文件和关闭文件 2.1 打开文件 打开文件&#xff0c;用于读取&#xff08;函数&#xff09;&#xff1a; 传…

Ubuntu学习笔记 - Day3

文章目录 学习目标&#xff1a;学习内容&#xff1a;学习笔记&#xff1a;vim简介vim键盘图工作模式 vim移动光标操作上下左右移动翻页 vim替换和删除操作替换删除 vim插入模式详解进入模式搜索 vim底行模式操作保存退出行号 学习目标&#xff1a; 一周掌握 Linux基本使用技巧 …

Java中的JDBC的详解

数据库驱动包 Java提出的一套关于数据库操作的接口 各个数据库厂商要把自己的api对接到/适配到jdbc上 程序员只需要掌握一套api就可以操作不同的数据库了 数据库厂商提供的这个原生api适配到jdbc转换程序&#xff0c;称为“数据库驱动包” 1&#xff09;创建数据源 //1,创…

Apache-Hive数据库使用学习

前期准备 Hadoop-分布式部署&#xff08;服务全部在线&#xff09; Mysql-node1节点部署&#xff08;确认安装正常&#xff09; apache-hive -node1节点部署&#xff08;需要与MySQL元数据联动存储&#xff09; 参考博客&#xff1a; Hadoop Hadoop集群搭建-完全分布式_hadoop完…

【极客兔兔-Web框架Gee详解】Day2 上下文Context

文章目录 一、框架结构二、设计上下文(Context):day2-context/gee/context.go1. 设计Context必要性1.1 接口粒度过细:1.2 缺乏扩展性:2. 代码3. 优势三、路由(Router): day2-context/gee/router.go四、框架入口:day2-context/gee/gee.go1. 代码五、框架使用: day2-context/m…

LeetCode17. 电话号码的字母组合(2024秋季每日一题 59)

给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 1&#xff1a; 输入&#xff1a;digits “23” 输出&#xff1a;[“…

DApp开发定制:合约设计与源码搭建支持快速上线

随着区块链技术的飞速发展&#xff0c;去中心化应用&#xff08;DApp&#xff09;已经成为区块链生态中不可或缺的一部分。DApp不仅改变了传统互联网应用的运作方式&#xff0c;还通过去中心化的理念和智能合约的支持&#xff0c;赋能了用户和开发者。无论是金融、游戏、社交、…

【C++】手动实现C++ vector容器:深入理解动态数组的工作原理

&#x1f4af;个人主页: 起名字真南 &#x1f4af;个人专栏:【数据结构初阶】 【C语言】 【C】 【OJ题解】 目录 1. 引言2. 实现思路3. vector 容器的代码实现4. 代码详解4.1 构造与析构函数4.2 容量管理4.3 迭代器与访问操作4.4 增删操作 5.测试代码6. 时间和空间复杂度分析7.…

深入探讨钉钉与金蝶云星空的数据集成技术

钉钉报销数据集成到金蝶云星空的技术案例分享 在企业日常运营中&#xff0c;行政报销流程的高效管理至关重要。为了实现这一目标&#xff0c;我们采用了轻易云数据集成平台&#xff0c;将钉钉的行政报销数据无缝对接到金蝶云星空的付款单系统。本次案例将重点介绍如何通过API接…

Appium环境搭建/使用教程(图文超详细)

一&#xff0c;环境依赖JDK和Android SDK搭建 (1) JDK: 下载安装&#xff08;推荐java8版本,其他版本不兼容&#xff0c;会导致appiumServer启动不了) 下载地址&#xff1a;http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html根据自己的系…

大数据-209 数据挖掘 机器学习理论 - 梯度下降 梯度下降算法调优

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

模拟实现strcat函数

1.strcat的作用 char * strcat ( char * destination, const char * source ); 作用&#xff1a;将源字符串的附加到目标字符串中。目标字符串中的终止空字符将被源字符串的第一个字符替换&#xff0c;并且在将两个字符串连接形成的新字符串的末尾将包含一个空字符。 destina…

c++多线程QThreadpool调用Python脚本时崩溃报错的解决方案二

问题 还是c Qt多线程调用Python脚本时的问题。使用QthreadPool的方式调用&#xff0c;按照上次的解决方案也可以实现&#xff0c;虽然可能不出现崩溃问题。但是仍然有很大可能会出现死锁。即调入函数后&#xff0c;再无输出&#xff0c;变成一个黑洞… 解决方案 因为我使用的…

知从科技受邀出席ARM日产技术日

10月29日&#xff0c;上海知从科技有限公司受 ARM 之邀&#xff0c;参与了由其主办的日产技术日活动。此次活动在日本神奈川县厚木市的日产技术中心盛大举行&#xff0c;这一活动汇聚了行业内的前沿技术与精英人才&#xff0c;成为科技创新技术交流的重要平台。 知从科技积极参…