pygame
Pygame是跨平台Python模块,专为电子游戏设计,包含图像、声音。建立在SDL基础上,允许实时电子游戏研发而无需被低级语言(如机器语言和汇编语言)束缚。
首先需要导入pygame模块
import pygame
from pygame.locals import * #locals里有event.get方法,获取键盘操作
窗口标题
pygame.display.set_caption("窗口名称")
加载图片
pygame.image.load(文件路径)
音乐
pygame.mixer.init() #混音器初始化
pygame.mixer.music.load(文件路径) #加载背景音 mp3或wav格式
pygame.mixer.music.set_volume(0.2) #设置音量,区间为0-1
pygame.mixer.Sound(文件路径).play() #加载音乐并播放 wav或ogg格式
字体
pygame.font.SysFont("Arial",30) #加载系统字体Arial 无法加载中文字体
pygame.font.Font("") #加载字体 这个可以加载中文字体,
#但必须写系统的绝对路径,如下图
所示,字体名可以打开字体属性查看
页面刷新
pygame.display.update()
判断两个对象大小是否重叠
pygame.Rect.colliderect((pygame.Rect(x,y,x的数值,y的数值), #第一个对象的数值
pygame.Rect(x,y,x的数值,y的数值)))#第二个对象的数值
按键映射
pygame.event.get() #获取键值
event.type==QUIT #关闭
event.type==KEYDOWN #按下键的情况
pressed = pygame.key.get_pressed() # 轮询键盘接口,返回的是所有按下键值的元组
if pressed[pygame.K_a] or pressed[pygame.K_LEFT]: # 按下a或左键 向左移动
hero.move_left()
if pressed[pygame.K_w] or pressed[pygame.K_UP]:
hero.move_up()
if pressed[pygame.K_s] or pressed[pygame.K_DOWN]:
hero.move_down()
if pressed[pygame.K_d] or pressed[pygame.K_RIGHT]:
hero.move_right()
pygame.key.set_repeat(10,10) # pygame.key.set_repeat(10,10)多次按一个键时的处理方法
# 第一次按键事件等待10毫秒再发出,后续事件间隔10毫秒
自己写的飞机大战
import pygame
import sys
from pygame.locals import * #locals里有event.get方法,获取键盘操作
import random
class Hero(): #本机
def __init__(self,img,x,y,window):
self.img=pygame.image.load(img)
self.x=x
self.y=y
self.window=window
def display(self): #本机显示
self.window.blit(self.img,(self.x,self.y))
def move_left(self): #左移动
if self.x<-30:
pass
else:
self.x -= 3
def move_right(self): #右移动
if self.x>330:
pass
else:
self.x += 3
def move_up(self): #上移动
if self.y<50:
pass
else:
self.y -= 3
def move_down(self): #下移动
if self.y>550:
pass
else:
self.y += 3
def control(self,hero):
pressed = pygame.key.get_pressed() # 轮询键盘接口,返回的是所有按下键值的元组
if pressed[pygame.K_a] or pressed[pygame.K_LEFT]: # 按下a或左键 向左移动
hero.move_left()
if pressed[pygame.K_w] or pressed[pygame.K_UP]:
hero.move_up()
if pressed[pygame.K_s] or pressed[pygame.K_DOWN]:
hero.move_down()
if pressed[pygame.K_d] or pressed[pygame.K_RIGHT]:
hero.move_right()
def fire(self): #本机生产子弹
hero_bullet=Bullet(".\image\\bullet2.png",self.x+50,self.y-20,self.window)
# self.fire_list.append(hero_bullet)
biu_list.append(hero_bullet)
def fire_biu(self): #子弹发射并显示
for b in biu_list:
b.run()
b.display()
def if_boool(self,dj): #判断本机与敌机相撞
if pygame.Rect.colliderect(pygame.Rect(self.x,self.y,100,124),
pygame.Rect(dj.x,dj.y,51,39)):
return True
else:
return False
class Bullet(): #本机子弹
def __init__(self,img,x,y,window):
self.img=pygame.image.load(img)
self.x=x
self.y=y
self.window=window
def display(self): #子弹显示
self.window.blit(self.img,(self.x,self.y))
def run(self): #子弹运动
self.y-=1
def if_bool(self,dj): #判断子弹是否与敌机相撞
if pygame.Rect.colliderect(pygame.Rect(self.x,self.y,7,18), #判断子弹大小是否与敌机大小重合
pygame.Rect(dj.x,dj.y,51,39)):
return True
else:
return False
class Enemy(): #敌机
def __init__(self, img, x, y, window):
self.img = pygame.image.load(img)
self.x = x
self.y = y
self.window = window
self.is_bool = False
def run(self): #敌机运动
self.y+=1
if self.y>height:
self.x=random.randint(0,350)
self.y=random.randint(0,100)
def enemy_display(self): #敌机显示
if self.is_bool:
self.is_bool=False
self.x=random.randint(0,350)
self.y=random.randint(0,100)
self.window.blit(self.img,(self.x,self.y))
class Dj_Bullet(): #敌机子弹
def __init__(self,img,x,y,window):
self.img=pygame.image.load(img)
self.x=x
self.y=y
self.window=window
def display(self): #子弹显示
self.window.blit(self.img,(self.x+25,self.y+60))
def run(self,enemy): #子弹运动
self.y+=3
if self.y>=652:
self.y=enemy.y
self.x=enemy.x
def if_boom(self,hero): #判断子弹是否与本机相撞
if pygame.Rect.colliderect(pygame.Rect(self.x,self.y,7,18), #判断子弹大小是否与敌机大小重合
pygame.Rect(hero.x,hero.y,102,126)):
return True
else:
return False
width = 400 #游戏界面宽度
height = 652 #游戏界面高度
enemy_list=[] #敌机列表
biu_list=[] #本机子弹列表
dj_biu_list=[] #敌机子弹列表
score = 0 #得分
def main(): #主函数
global score
pygame.init() #游戏初始化
pygame.mixer.init() #混音器初始化
pygame.mixer.music.load(".\music\main.wav") #载入背景音,可用MP3,wav
pygame.mixer.music.set_volume(0.2) #设置音量
pygame.mixer.music.play(-1) #播放,-1代表循环
biu_sound=pygame.mixer.Sound(".\music\\biu.wav") #载入其他音乐,只能使用wav和ogg
biu_sound.set_volume(0.6)
boom_sound=pygame.mixer.Sound(".\music\\boom.wav")
boom_sound.set_volume(0.6)
font = pygame.font.Font("C:\Windows\Fonts\simyou.ttf", 30) # 载入字体
pygame.display.set_caption("飞机大战") #设置窗口名称
window=pygame.display.set_mode((width,height)) #display显示
bg_img=pygame.image.load(".\image\\background.png") #载入背景图
hero=Hero(".\image\me.png",150,528,window) #载入本机图片
enemy=Enemy(".\image\enemy1.png",random.randint(0,350),random.randint(0,100),window)
dj_bullet = Dj_Bullet(".\image\\bullet1.png", enemy.x,enemy.y,window)
dj_biu_list.append(dj_bullet)
enemy_list.append(enemy)
# pygame.key.set_repeat(10,10) # pygame.key.set_repeat(10,10)多次按一个键时的处理方法
# 第一次按键事件等待10毫秒再发出,后续事件间隔10毫秒
while True:
window
window.blit(bg_img,(0,0)) #blit显示
hero.display()
hero.fire_biu()
text1 = font.render(f"得分:{score}", 1, (0, 0, 0))
window.blit(text1, (0, 0))
for dj_b in dj_biu_list: #敌机子弹运行
dj_b.display()
dj_b.run(enemy)
for fire_i in biu_list: #判断子弹与敌机是否相撞
for dj_i in enemy_list:
if fire_i.if_bool(dj_i):
boom_sound.play()
biu_list.remove(fire_i)
window.blit(pygame.image.load(".\image\enemy1_down3.png"),(dj_i.x,dj_i.y))
score+=10
pygame.display.update()
pygame.time.delay(50)
enemy.x=random.randint(0,350)
enemy.y=0
for dj in enemy_list: #判断本机与敌机相撞
if hero.if_boool(dj):
boom_sound.play()
window.blit(pygame.image.load(".\image\me_destroy_3.png"), (hero.x, hero.y))
window.blit(pygame.image.load(".\image\enemy1_down3.png"), (dj.x, dj.y))
pygame.display.update()
pygame.time.delay(50)
enemy.x=random.randint(0,350)
enemy.y=0
hero.x=0
hero.y=528
for dj_i in dj_biu_list: #判断敌机子弹与本机是否相撞
if dj_i.if_boom(hero):
boom_sound.play()
window.blit(pygame.image.load(".\image\me_destroy_3.png"), (hero.x, hero.y))
pygame.display.update()
pygame.time.delay(50)
dj_i.x=enemy.x
dj_i.y=enemy.y
hero.x=0
hero.y=528
for e in enemy_list: #敌机启动
e.run()
e.enemy_display()
pygame.display.update()
for event in pygame.event.get():
if event.type==QUIT: #设置关闭
sys.exit()
pygame.quit()
elif event.type==KEYDOWN: #设置按下键的情况
if event.key==K_SPACE: #空格键开火
print("space")
hero.fire()
biu_sound.play()
hero.control(hero)
if __name__ == '__main__':
main()