space1
import pygame
from pygame.locals import *
'''
知识点:pygame.event.get():获取当前pygame窗口发生的事件列表
窗口显示图片三步走:
1、使用pygame.image.load()方法加载图片
2、使用"窗口变量.blit()"方法绘制图片
3、使用pygame.display.flip()方法刷新窗口
'''
# 初始化pygame库
pygame.init()
#
width = 480
height = 600
# 创建pygame窗口,设置窗口大小set_mode:设置样式,size = (宽,高)
screen = pygame.display.set_mode((width, height))
# 加载背景图片
bg_img = pygame.image.load('F:\\test\\Y9-12\\img_bg.jpg')
screen.blit(bg_img, (0, 0))
# 飞机
plane = pygame.image.load('F:\\test\\Y9-12\\img_plane.png')
# 把图片绘制到窗口某个位置
x = 100
y = 200
screen.blit(plane, (x, y))
# 把需要的图片显示在窗口上
# pygame.display.flip()
# 飞机移动速度
speedx = 1
speedy = 1
running = True
while running:
# 移动
x += speedx
y += speedy
if x <= 0 or x >= width - 49:
speedx = -speedx
if y <= 0 or y >= height - 71:
speedy = -speedy
screen.blit(bg_img, (0, 0))
screen.blit(plane, (x, y))
pygame.display.flip()
# 监控事件 如果点击了关闭按钮就退出循环
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# esc关闭窗口
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
running = False
# 关闭窗口
pygame.quit()
space2
import pygame
'''
通过Surface对象的get_rect()方法获取图像的矩形区域,通过改变矩形区域的位置来改变图像的位置
rect = image.get_rect()
1、改变x,y 左上角定位 rect.x,rect,y
2、中心点:rect.center:元组改变x,y rect.centerx:改变x,rect.centery:改变y
3、rect.left:左边距 rect.right:右边距 rect.top:上边距 rect.bottom:下边距
4、通过get_pressed方法获取被按下所有按键列表:keys = get_pressed()
5、clock = pygame.time.Clock():通过Clock方法创建游戏时钟
通过时钟对象的tick方法控制循环频率
clock.tick(60):表示每秒钟循环执行60次
注意:tick方法需要放在循环中去调用才有作用
'''
class Plane():
def __init__(self):
self.image = pygame.image.load('F:\\test\\Y9-12\\img_plane.png')
self.rect = self.image.get_rect()
# self.rect.left = 100
# self.rect.top = 100
self.rect.centerx = width / 2
self.rect.bottom = height - 10
def update(self):
self.speedx = 0
# self.speedy = 0
keys = pygame.key.get_pressed()
# 左移动
if keys[pygame.K_LEFT]:
self.speedx = -8
# 右移动
if keys[pygame.K_RIGHT]:
self.speedx = 8
self.rect.centerx += self.speedx
if self.rect.right > width:
self.rect.right = width
if self.rect.left < 0:
self.rect.left = 0
# 初始化pygame库
pygame.init()
#
width = 480
height = 600
# 创建pygame窗口,设置窗口大小set_mode:设置样式,size = (宽,高)
screen = pygame.display.set_mode((width, height))
# 加载背景图片
bg_img = pygame.image.load('F:\\test\\Y9-12\\img_bg.jpg')
# screen.blit(bg_img, (0, 0))
# 飞机
plane = Plane()
# 把图片绘制到窗口某个位置
# x = 100
# y = 100
# screen.blit(plane.image, (plane.rect.left, plane.rect.top))
# 把需要的图片显示在窗口上
# pygame.display.flip()
# 飞机移动速度
# speedx = 1
# speedy = 1
# 创建游戏时钟
clock = pygame.time.Clock()
FPS = 60
running = True
while running:
#循环频率(帧速率)可改变飞机移动速度,FPS越大,每秒循环次数越多,飞机移动越快
clock.tick(FPS)
plane.update()
screen.blit(bg_img, (0, 0))
screen.blit(plane.image,plane.rect)
pygame.display.flip()
# 监控事件 如果点击了关闭按钮就退出循环
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# esc关闭窗口
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
running = False
# 关闭窗口
pygame.quit()
space3
import pygame
import random
'''
角色组:
使用pygame提供的角色组类即可创建角色组对象
all_sprite = pygame.sprite.Group()
使用add()方法将角色添加在角色组中
all_sprite.add(plane)
将角色添加到角色组之后,即可统一管理角色
将所有角色绘制到屏幕中
all_sprite.draw(screen):角色组类自带draw()方法
'''
'''
pygame中提供了角色类:pygame.sprite.Sprite
此角色类中提供的属性及方法
image:记录图像数据
rect:记录角色在屏幕中位置
update():父类中的update()方法什么都没做,子类中可以重写此方法
kill():删除此对象
'''
# 初始化pygame库
pygame.init()
# 飞机类
class Plane(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load('F:\\test\\Y9-12\\img_plane.png')
self.rect = self.image.get_rect()
# self.rect.left = 100
# self.rect.top = 100
self.rect.centerx = WIDTH / 2
self.rect.bottom = HEIGHT - 10
def update(self):
self.speedx = 0
# self.speedy = 0
keys = pygame.key.get_pressed()
# 左移动
if keys[pygame.K_LEFT]:
self.speedx = -8
# 右移动
if keys[pygame.K_RIGHT]:
self.speedx = 8
self.rect.centerx += self.speedx
if self.rect.right > WIDTH:
self.rect.right = WIDTH
if self.rect.left < 0:
self.rect.left = 0
def shoot(self):
bullet = Bullet(self.rect.centerx, self.rect.top)
all_sprites.add(bullet)
'''
想要生成一批陨石让他们在窗口中动起来,需要一下三步:
1、定义陨石对象
2、调用陨石对象update方法
3、调用screen的blit方法,将陨石绘制到屏幕上
'''
# 陨石类
class Meteorite(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load('F:\\test\\Y9-12\\img_meteorite.png')
# 获取陨石矩形,设置出现随机位置
self.rect = self.image.get_rect()
self.rect.x = random.randrange(WIDTH - self.rect.width)
self.rect.y = random.randrange(-100, -40)
# 设置陨石竖直以及左右方向上的随机移动速度
self.speedy = random.randint(1, 8)
self.speedx = random.randint(-3, 3)
def update(self):
self.rect.x += self.speedx
self.rect.y += self.speedy
if self.rect.top > HEIGHT or self.rect.left < -30 or self.rect.right > WIDTH + 30:
self.rect.x = random.randrange(WIDTH - self.rect.width)
self.rect.y = random.randrange(-100, 40)
'''
按下空格键发射子弹需要两步:
1、在飞机类中定义shoot()方法,生成子弹并添加到角色组中
2、侦测是否按下空格键,若按下则调用shoot()方法
'''
# 子弹类
class Bullet(pygame.sprite.Sprite):
def __init__(self, x, y):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load('F:\\test\\Y9-12\\img_bullet.png')
self.rect = self.image.get_rect()
self.rect.y = y
self.rect.x = x
self.speedy = -10
def update(self):
self.rect.y += self.speedy
# 移出屏幕 删除子弹
if self.rect.bottom < 0:
self.kill()
#
WIDTH = 480
HEIGHT = 600
# 创建pygame窗口,设置窗口大小set_mode:设置样式,size = (宽,高)
screen = pygame.display.set_mode((WIDTH, HEIGHT))
# 加载背景图片
bg_img = pygame.image.load('F:\\test\\Y9-12\\img_bg.jpg')
# 飞机
plane = Plane()
# 创建角色组,将飞机角色添加到角色组中
all_sprites = pygame.sprite.Group()
all_sprites.add(plane)
# 创建8个陨石对象添加到角色组中
for i in range(8):
met = Meteorite()
all_sprites.add(met)
# 创建游戏时钟
clock = pygame.time.Clock()
FPS = 60
running = True
while running:
# 循环频率(帧速率)可改变飞机移动速度,FPS越大,每秒循环次数越多,飞机移动越快
clock.tick(FPS)
# plane.update()
screen.blit(bg_img, (0, 0))
# 使用角色统一执行update方法,将所有角色绘制到屏幕上
all_sprites.update()
all_sprites.draw(screen)
# screen.blit(plane.image, plane.rect)
pygame.display.flip()
# 监控事件 如果点击了关闭按钮就退出循环
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# esc关闭窗口
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
plane.shoot()
if event.key == pygame.K_ESCAPE:
running = False
# 关闭窗口
pygame.quit()
space4
import pygame
import random
# 初始化pygame库
pygame.init()
# 飞机类
class Plane(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load('F:\\test\\Y9-12\\img_plane.png')
self.rect = self.image.get_rect()
# self.rect.left = 100
# self.rect.top = 100
self.rect.centerx = WIDTH / 2
self.rect.bottom = HEIGHT - 10
def update(self):
self.speedx = 0
# self.speedy = 0
keys = pygame.key.get_pressed()
# 左移动
if keys[pygame.K_LEFT]:
self.speedx = -8
# 右移动
if keys[pygame.K_RIGHT]:
self.speedx = 8
self.rect.centerx += self.speedx
if self.rect.right > WIDTH:
self.rect.right = WIDTH
if self.rect.left < 0:
self.rect.left = 0
def shoot(self):
bullet = Bullet(self.rect.centerx, self.rect.top)
all_sprites.add(bullet)
all_bullets.add(bullet)
# 陨石类
class Meteorite(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load('F:\\test\\Y9-12\\img_meteorite.png')
# 获取陨石矩形,设置出现随机位置
self.rect = self.image.get_rect()
self.rect.x = random.randrange(WIDTH - self.rect.width)
self.rect.y = random.randrange(-100, -40)
# 设置陨石竖直以及左右方向上的随机移动速度
self.speedy = random.randint(1, 4)
self.speedx = random.randint(-3, 3)
def update(self):
self.rect.x += self.speedx
self.rect.y += self.speedy
if self.rect.top > HEIGHT or self.rect.left < -30 or self.rect.right > WIDTH + 30:
self.rect.x = random.randrange(WIDTH - self.rect.width)
self.rect.y = random.randrange(-100, 40)
'''
按下空格键发射子弹需要两步:
1、在飞机类中定义shoot()方法,生成子弹并添加到角色组中
2、侦测是否按下空格键,若按下则调用shoot()方法
'''
# 子弹类
class Bullet(pygame.sprite.Sprite):
def __init__(self, x, y):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load('F:\\test\\Y9-12\\img_bullet.png')
self.rect = self.image.get_rect()
self.rect.y = y
self.rect.x = x
self.speedy = -10
def update(self):
self.rect.y += self.speedy
# 移出屏幕 删除子弹
if self.rect.bottom < 0:
self.kill()
#
WIDTH = 480
HEIGHT = 600
# 创建pygame窗口,设置窗口大小set_mode:设置样式,size = (宽,高)
screen = pygame.display.set_mode((WIDTH, HEIGHT))
# 加载背景图片
bg_img = pygame.image.load('F:\\test\\Y9-12\\img_bg.jpg')
# 飞机
plane = Plane()
# 创建角色组,将飞机角色添加到角色组中
all_sprites = pygame.sprite.Group()
all_sprites.add(plane)
# 定义陨石角色,并在生成陨石时将其添加到组中
all_meteorite = pygame.sprite.Group()
all_bullets = pygame.sprite.Group()
# 创建8个陨石对象添加到角色组中
for i in range(8):
met = Meteorite()
all_sprites.add(met)
# 添加
all_meteorite.add(met)
# 创建游戏时钟
clock = pygame.time.Clock()
FPS = 60
'''
显示游戏得分
1、需要一支画笔来绘制分数,绘制的步骤:
<1、定义写字画笔,设置笔的字体,字体大小
<2、用写字笔绘制内容(分数)
<3、设置绘制内容位置
<4、将绘制的内容放到屏幕上:blit(...)
'''
# Font对象的render方法可以绘制特定的颜色文本字符串,返回结果为surface对象:
COLOR_WHITE = (255,0,0)
# 积分器
score = 0
def draw_text(surf,text,size,x,y):
# 通过match_fount方法可以在系统上找到特定的字体
font_name = pygame.font.match_font('华文楷体')
# 通过Font方法可以创建制定字体和大小的Font对象
font = pygame.font.Font(font_name,size)
# 返回一个surface对象(字体渲染成的图像)
text_surface = font.render(text,True,COLOR_WHITE)
'''
str(score),文本字符串
True,抗锯齿(光滑)
COLOR_WHITE 文本颜色
'''
text_rect = text_surface.get_rect()
text_rect.center = (x,y)
surf.blit(text_surface,text_rect)
running = True
while running:
# 循环频率(帧速率)可改变飞机移动速度,FPS越大,每秒循环次数越多,飞机移动越快
clock.tick(FPS)
# plane.update()
screen.blit(bg_img, (0, 0))
# 使用角色统一执行update方法,将所有角色绘制到屏幕上
all_sprites.update()
all_sprites.draw(screen)
'''
text_surface = font.render(str(score), True, COLOR_WHITE)
# 将绘制的内容放到屏幕上(分数)
'''
# 调用分数函数
draw_text(screen,str(score),26,20,10)
# 刷新屏幕
pygame.display.flip()
# 监控事件 如果点击了关闭按钮就退出循环
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# esc关闭窗口
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
plane.shoot()
if event.key == pygame.K_ESCAPE:
running = False
'''
通过spritecollide方法可以检测单个角色和一个角色组的碰撞,返回结果列表
'''
hist1 = pygame.sprite.spritecollide(plane, all_meteorite, True)
# 列表不为空则发生了碰撞
if hist1:
running = False
'''
通过groupcollide方法可以检测一个角色组和另一个角色组之间的碰撞,返回结果为字典
键是角色组一中碰撞的角色,值是角色组二中与该角色碰撞的角色列表
'''
hist2 = pygame.sprite.groupcollide(all_meteorite, all_bullets, True, True)
if hist2:
print(hist2)
# 遍历hist2(子弹与陨石碰撞字典,为游戏补充陨石)
for i in hist2.items():
score += 1
meteorite = Meteorite()
all_sprites.add(meteorite)
all_meteorite.add(meteorite)
# 关闭窗口
print(score)
pygame.quit()
space5完整版
import pygame
import random
import pygame.mixer as pm
'''
mixer(混音器):pygame中用于加载和播放声音模块,使用前需要初始化
'''
# 初始化pygame库
pygame.init()
# 初始化混音器
pm.init()
# 加载并播放背景音乐
pm.music.load('F:\\test\\Y9-12\\music\\雷霆战机.mp3')
# loops = -1 设置音乐播放多少次,-1为无限循环播放
pm.music.play(loops=-1)
'''
wav或者ogg类型的音乐文件需要使用sound()方法加载
shout_sound = pygame.mixer.Sound(filepath)
shout_sound.play()
'''
shout_sound = pm.Sound('F:\\test\\Y9-12\\mic\\shoot.ogg')
hit_sounds = pm.Sound('F:\\test\\Y9-12\\mic\\hit.wav')
# 创建颜色
COLOR_WHITE = (255, 255, 255)
# 飞机类
class Plane(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load('F:\\test\\Y9-12\\img_plane.png')
self.rect = self.image.get_rect()
self.radius = int(self.rect.width / 2)
# 查看半径范围
# pygame.draw.circle(self.image, COLOR_WHITE, self.rect.center, self.radius)
self.rect.centerx = WIDTH / 2
self.rect.bottom = HEIGHT - 10
def update(self):
self.speedx = 0
# self.speedy = 0
keys = pygame.key.get_pressed()
# 左移动
if keys[pygame.K_LEFT]:
self.speedx = -8
# 右移动
if keys[pygame.K_RIGHT]:
self.speedx = 8
self.rect.centerx += self.speedx
if self.rect.right > WIDTH:
self.rect.right = WIDTH
if self.rect.left < 0:
self.rect.left = 0
def shoot(self):
bullet = Bullet(self.rect.centerx, self.rect.top)
all_sprites.add(bullet)
all_bullets.add(bullet)
# 播放碰撞音效
shout_sound.play()
met_list = [
"F:\\test\\Y9-12\\img_meteorite.png",
"F:\\test\\Y9-12\\img_meteorite_01.png",
"F:\\test\\Y9-12\\img_meteorite_02.png",
"F:\\test\\Y9-12\\img_meteorite_03.png",
"F:\\test\\Y9-12\\img_meteorite_04.png",
"F:\\test\\Y9-12\\img_meteorite_05.png",
"F:\\test\\Y9-12\\img_meteorite_06.png",
"F:\\test\\Y9-12\\img_meteorite_07.png",
"F:\\test\\Y9-12\\img_meteorite_08.png",
]
met_images = []
for img in met_list:
# pygame导入图片,生成surface对象,可以直接当角色图使用
met_images.append(pygame.image.load(img))
# 陨石类
class Meteorite(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
# self.image = pygame.image.load('F:\\test\\Y9-12\\img_meteorite.png')
self.image = random.choice(met_images)
# 获取陨石矩形,设置出现随机位置
self.rect = self.image.get_rect()
#
self.radius = int(self.rect.width / 2)
# 查看半径范围
# pygame.draw.circle(self.image, COLOR_WHITE, self.rect.center, self.radius)
self.rect.x = random.randrange(WIDTH - self.rect.width)
self.rect.y = random.randrange(-100, -40)
# 设置陨石竖直以及左右方向上的随机移动速度
self.speedy = random.randint(1, 4)
self.speedx = random.randint(-3, 3)
def update(self):
self.rect.x += self.speedx
self.rect.y += self.speedy
if self.rect.top > HEIGHT or self.rect.left < -30 or self.rect.right > WIDTH + 30:
self.rect.x = random.randrange(WIDTH - self.rect.width)
self.rect.y = random.randrange(-100, 40)
'''
按下空格键发射子弹需要两步:
1、在飞机类中定义shoot()方法,生成子弹并添加到角色组中
2、侦测是否按下空格键,若按下则调用shoot()方法
'''
# 子弹类
class Bullet(pygame.sprite.Sprite):
def __init__(self, x, y):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load('F:\\test\\Y9-12\\img_bullet.png')
self.rect = self.image.get_rect()
self.rect.y = y
self.rect.x = x
self.speedy = -10
def update(self):
self.rect.y += self.speedy
# 移出屏幕 删除子弹
if self.rect.bottom < 0:
self.kill()
class BackGround(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load('F:\\test\\Y9-12\\img_bg.jpg')
self.rect = self.image.get_rect()
def update(self):
self.rect.y += 1
if self.rect.y > self.rect.height:
self.rect.y = -self.rect.height
#
WIDTH = 480
HEIGHT = 600
# 创建pygame窗口,设置窗口大小set_mode:设置样式,size = (宽,高)
screen = pygame.display.set_mode((WIDTH, HEIGHT))
# 加载背景图片
# bg_img = pygame.image.load('F:\\test\\Y9-12\\img_bg.jpg')
# 飞机
plane = Plane()
# 背景移动
bg = BackGround()
bg2 = BackGround()
bg2.rect.y = -bg2.rect.height
# 创建角色组,将飞机角色添加到角色组中
all_sprites = pygame.sprite.Group()
all_sprites.add(bg, bg2, plane)
# 定义陨石角色,并在生成陨石时将其添加到组中
all_meteorite = pygame.sprite.Group()
all_bullets = pygame.sprite.Group()
# 创建8个陨石对象添加到角色组中
for i in range(8):
met = Meteorite()
all_sprites.add(met)
# 添加
all_meteorite.add(met)
# 创建游戏时钟
clock = pygame.time.Clock()
FPS = 60
'''
显示游戏得分
1、需要一支画笔来绘制分数,绘制的步骤:
<1、定义写字画笔,设置笔的字体,字体大小
<2、用写字笔绘制内容(分数)
<3、设置绘制内容位置
<4、将绘制的内容放到屏幕上:blit(...)
'''
# Font对象的render方法可以绘制特定的颜色文本字符串,返回结果为surface对象:
COLOR_WHITE = (255, 0, 0)
# 积分器
score = 0
# 绘制分数函数
def draw_text(surf, text, size, x, y):
# 通过match_fount方法可以在系统上找到特定的字体
font_name = pygame.font.match_font('华文楷体')
# 通过Font方法可以创建制定字体和大小的Font对象
font = pygame.font.Font(font_name, size)
# 返回一个surface对象(字体渲染成的图像)
text_surface = font.render(text, True, COLOR_WHITE)
'''
str(score),文本字符串
True,抗锯齿(光滑)
COLOR_WHITE 文本颜色
'''
text_rect = text_surface.get_rect()
text_rect.center = (x, y)
surf.blit(text_surface, text_rect)
running = True
while running:
# 循环频率(帧速率)可改变飞机移动速度,FPS越大,每秒循环次数越多,飞机移动越快
clock.tick(FPS)
# plane.update()
# screen.blit(bg, (0, 0))
# 使用角色统一执行update方法,将所有角色绘制到屏幕上
all_sprites.update()
all_sprites.draw(screen)
'''
text_surface = font.render(str(score), True, COLOR_WHITE)
# 将绘制的内容放到屏幕上(分数)
'''
# 调用分数函数
draw_text(screen, str(score), 26, 20, 10)
# 刷新屏幕
pygame.display.flip()
# 监控事件 如果点击了关闭按钮就退出循环
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# esc关闭窗口
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
plane.shoot()
if event.key == pygame.K_ESCAPE:
running = False
'''
通过spritecollide方法可以检测单个角色和一个角色组的碰撞,返回结果列表
'''
hist1 = pygame.sprite.spritecollide(plane, all_meteorite, False, pygame.sprite.collide_circle)
#
for hit in hist1:
hit_sounds.play()
# 列表不为空则发生了碰撞
if hist1:
running = False
'''
通过groupcollide方法可以检测一个角色组和另一个角色组之间的碰撞,返回结果为字典
键是角色组一中碰撞的角色,值是角色组二中与该角色碰撞的角色列表
'''
hist2 = pygame.sprite.groupcollide(all_meteorite, all_bullets, True, True)
if hist2:
print(hist2)
# 遍历hist2(子弹与陨石碰撞字典,为游戏补充陨石)
for i in hist2.items():
score += 1
meteorite = Meteorite()
all_sprites.add(meteorite)
all_meteorite.add(meteorite)
# 关闭窗口
print(score)
pygame.quit()