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

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

一.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操作可实现

python 复制代码
'''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

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

python 复制代码
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坐标实现方块移动,代码较为冗长,复杂,下面代码同样可以实现上述效果

python 复制代码
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)) # 可以放大或缩小图形 来实现

python 复制代码
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()

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

相关推荐
西岸行者3 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
QQ_19632884753 天前
Python-flask框架西山区家政服务评价系统网站设计与开发-Pycharm django
python·pycharm·flask
悠哉悠哉愿意3 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码3 天前
嵌入式学习路线
学习
毛小茛3 天前
计算机系统概论——校验码
学习
babe小鑫3 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms3 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下3 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。3 天前
2026.2.25监控学习
学习
im_AMBER3 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode