由于代码量大,会逐渐发布
一.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()