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

时间:2024-11-02 19:08:34

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

一.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()

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