python飞机大战游戏高级,Python学习 day10-2021.3.8(飞机大战游戏)

b9feadcbb734

1. Pygame

b9feadcbb734

Pygame介绍:Pygame是一个利用SDL库写的游戏库,SDL库全名Simple DirectMedia Layer,是用C写的,不过也可以用C++进行开发,Pygame就是Python中使用它的一个库

官网教程:http://www.pygame.org/docs/

官网安装指南:https://www.pygame.org/wiki/GettingStarted#Pygame%20Installation

Pygame模块一览表:

模块名

功能

模块名

功能

pygame.cdrom

访问光驱

pygame.movie

播放视频

pygame.cursors

加载光标

pygame.music

播放音频

pygame.display

访问显示设备

pygame.overlay

访问高级视频叠加

pygame.draw

绘制形状、线和点

pygame

就是我们在学的这个东西了……

pygame.event

管理事件

pygame.rect

管理矩形区域

pygame.font

使用字体

pygame.sndarray

操作声音数据

pygame.image

加载和存储图片

pygame.sprite

操作移动图像

pygame.joystick

使用游戏手柄或者类似的东西

pygame.surface

管理图像和屏幕

pygame.key

读取键盘按键

pygame.surfarray

管理点阵图像数据

pygame.mixer

声音

pygame.time

管理时间和帧信息

pygame.mouse

鼠标

pygame.transform

缩放和移动图像

在电脑安装好pygame后,打开pycharm安装pygame模块

b9feadcbb734

如果在pycharm中安装不成功,出现Command "python setup.py egg_info" failed with code 1 in xxx\xxx\xxx的报错,说明pycharm和pygame版本不同步,处理方法:1. 确保在系统层面的python环境里面已经安装了pygame(pip install pygame);2. 可以把已经安装好的pygame模块的文件夹拷贝到pycharm所创建项目中venv虚拟环境里面。

2. 思路

b9feadcbb734

需求的描述:

存在4个对象:

我方飞机、敌方飞机、我方子弹、敌方子弹。

功能:

背景音乐的添加

我方飞机可以移动【根据按键来控制的】

敌方飞机也可以移动【随机的自动移动】

双方飞机都可以发射子弹

步骤:

1.创建一个窗口

2.创建一个我方飞机 根据方向键左右的移动

3.给我方飞机添加发射子弹的功能【按下空格键发射】

4.创建一个敌机

5.敌机可以自由移动

6.敌机可以发射子弹

准备背景音乐和素材图片(战机、敌机、战机子弹、敌机子弹)

控制玩具飞机-面向对象⚠️

实现步骤与原理:

实现步骤原理跟面向过程是一样的,不同的是代码的组织方式不一样:

1)创建一个飞机类,实现左移、右移、显示三个功能

2)创建一个键盘控制函数,实现键盘的左、右、空格键的功能

3)创建主函数,实现创建窗口、背景图片、背景音乐、并实现所有的逻辑

玩家飞机发射子弹⚠️

实现原理

1)每次按回车键就会有一颗子弹射出,起始位置就是从飞机的停靠位置

2)子弹超出窗口就会消失,并且删除掉子弹(否则子弹越来越多,界面会越来越卡)

3)每一颗子弹就代表一张图片

4)子弹从发射开始 ,慢慢往上移动直到消失。

import pygame #引用第三方模块

import random

import time

from pygame.locals import * #*表示要导入这个包所有的内容

'''

1. 实现飞机的显示,并且可以控制飞机的移动【面向对象】

'''

class HeroPlane(object):

def __init__(self,screen):

'''

初始化函数

:param screen: 主窗体对象

'''

#设定飞机的默认位置

self.x=175

self.y=615

#设置要显示内容的窗口

self.screen=screen

#生成飞机的图片对象

self.imageName='./雷霆战机/images/hero/hero04.png'

self.image=pygame.image.load(self.imageName)

#用来存放子弹的列表

self.bulletList=[]

pass

def moveleft(self):

'''

左移

:return:

'''

if self.x>0:

self.x-=10

pass

def moveright(self,):

'''

右移

:return:

'''

if self.x<490:

self.x+=10

pass

def display(self):

'''

飞机在主窗口中的显示

:return:

'''

self.screen.blit(self.image,(self.x,self.y))

#完善子弹的显示逻辑

needDelItemList=[]

for item in self.bulletList:

if item.judge():

needDelItemList.append(item)

pass

pass

#重新遍历一下

for i in needDelItemList:

self.bulletList.remove(i)

pass

for bullet in self.bulletList:

bullet.display() #显示子弹的位置

bullet.move() #让这个子弹进行移动 下次再显示的时候就会看到子弹在修改后的位置

pass

#发射子弹

def sheBullet(self):

#创建一个新的子弹对象

newBullet=Bullet(self.x,self.y,self.screen)

self.bulletList.append(newBullet)

pass

pass

#创建子弹类对象

class Bullet(object):

def __init__(self,x,y,screen):

'''

:param x:

:param y:

:param screen:

'''

self.x=x+50

self.y=y-10

self.screen=screen

self.image=pygame.image.load('./雷霆战机/images/bullet/img_bullet.png')

pass

def display(self):

self.screen.blit(self.image,(self.x,self.y))

pass

def move(self):

self.y-=5

pass

def judge(self):

'''

判断子弹是否越界

:return:

'''

if self.y<0:

return True

else:

return False

pass

#创建敌机类

class EnemyPlane:

def __init__(self,screen):

#默认设置一个方向

self.direction='right'

# 设定飞机的默认位置

self.x = 0

self.y = 0

# 设置要显示内容的窗口

self.screen = screen

self.bulletList=[]

# 生成飞机的图片对象

self.imageName = './雷霆战机/images/enemy/boss.png'

self.image = pygame.image.load(self.imageName)

pass

def display(self):

'''

显示敌机以及子弹位置信息

:return:

'''

self.screen.blit(self.image,(self.x,self.y))

# 完善子弹的显示逻辑

needDelItemList = []

for item in self.bulletList:

if item.judge():

needDelItemList.append(item)

pass

pass

# 重新遍历一下

for i in needDelItemList:

self.bulletList.remove(i)

pass

for bullet in self.bulletList:

bullet.display() # 显示子弹的位置

bullet.move() # 让这个子弹进行移动 下次再显示的时候就会看到子弹在修改后的位置

pass

pass

def sheBullet(self):

'''

敌机随机发射子弹

:return:

'''

num=random.randint(1,100)

if num==3:

newBullet=EnemyBullet(self.x,self.y,self.screen)

self.bulletList.append(newBullet)

pass

def move(self):

'''

敌机移动,随机进行

:return:

'''

if self.direction=='right':

self.x+=1

pass

elif self.direction=='left':

self.x-=1

pass

if self.x>260:

self.direction='left'

pass

elif self.x<0:

self.direction='right'

pass

#敌机子弹类

class EnemyBullet(object):

def __init__(self,x,y,screen):

'''

:param x:

:param y:

:param screen:

'''

self.x=x+90

self.y=y+90

self.screen=screen

self.image=pygame.image.load('./雷霆战机/images/bullet/enemy_bullet.png')

pass

def display(self):

self.screen.blit(self.image,(self.x,self.y))

pass

def move(self):

self.y+=3

pass

def judge(self):

'''

判断子弹是否越界

:return:

'''

if self.y>700:

return True

else:

return False

pass

def key_control(HeroObj):

'''

定义普通函数 用来实现键盘的检测

:param HeroObj: 可控制检测的对象

:return:

'''

# 获取键盘事件

eventlist = pygame.event.get()

for event in eventlist:

if event.type == QUIT:

print('退出')

exit()

pass

elif event.type == KEYDOWN:

if event.type == K_a or event.key == K_LEFT:

print('left')

HeroObj.moveleft() #调用函数实现左移

elif event.type == K_d or event.key == K_RIGHT:

print('right')

HeroObj.moveright() #调用函数实现右移

elif event.key == K_SPACE:

print('K_SPACE')

HeroObj.sheBullet()

pass

def main():

# 首先创建窗口对象

screen=pygame.display.set_mode((450,700))

#创建一个背景图片对象

background=pygame.image.load('./雷霆战机/images/bg/bg1.jpg')

#设置一个title

pygame.display.set_caption('huihui飞机大战')

#添加背景音乐

pygame.mixer.init() #初始化这个函数

pygame.mixer.music.load('./PlaneWar/sound/game_music.ogg')

pygame.mixer.music.set_volume((0.2))

pygame.mixer.music.play(-1) #表示无限循环

#创建一个飞机对象

hero=HeroPlane(screen)

#创建一个敌机对象

enemyplane=EnemyPlane(screen)

#设定需要显示的内容

while True:

screen.blit(background,(0,0))

# 显示玩家飞机图片

hero.display()

enemyplane.display() #显示敌机

enemyplane.move() #敌机移动

enemyplane.sheBullet() #敌机随机发射子弹

#获取键盘事件

key_control((hero))

#更新显示内容

pygame.display.update()

# time.sleep(1) #休眠一秒钟

pygame.time.Clock().tick(20) #一秒钟运行20次

pass

if __name__=='__main__':

main()

抽象基类⚠️

import pygame #引用第三方模块

import random

import time

from pygame.locals import * #*表示要导入这个包所有的内容

'''

1. 实现飞机的显示,并且可以控制飞机的移动【面向对象】

'''

'''

1:实现飞机的显示 并且可以控制飞机的移动【面向对象】

'''

#抽象一个飞机的基类

class BasePlane(object):

def __init__(self,screen,imageName):

'''

初始化基类函数

:param screen:主窗体对象

:param imageName:加载的图片

'''

self.screen=screen

self.image=pygame.image.load(imageName)

self.bulletList=[] #存储所有的子弹

pass

def display(self):

self.screen.blit(self.image, (self.x, self.y))

# 完善子弹的显示逻辑

needDelItemList = []

for item in self.bulletList:

if item.judge():

needDelItemList.append(item)

pass

pass

# 重新遍历一下

for i in needDelItemList:

self.bulletList.remove(i)

pass

for bullet in self.bulletList:

bullet.display() # 显示子弹的位置

bullet.move() # 让这个子弹进行移动 下次再显示的时候就会看到子弹在修改后的位置

pass

pass

class CommonBullet(object):

'''

公共的子弹类

'''

def __init__(self,x,y,screen,bulletTYpe):

self.type=bulletTYpe

self.screen=screen

if self.type=='hero':

self.x=x+50

self.y=y-10

self.imagePath='./雷霆战机/images/bullet/img_bullet.png'

elif self.type=='enemy':

self.x=x+90

self.y=y+90

self.imagePath='./雷霆战机/images/bullet/enemy_bullet.png'

pass

self.image=pygame.image.load(self.imagePath)

pass

def move(self):

'''

子弹的移动

:return:

'''

if self.type=='hero':

self.y-=5

elif self.type=='enemy':

self.y+=3

pass

pass

def display(self):

self.screen.blit(self.image,(self.x,self.y))

pass

def judge(self):

'''

判断子弹是否越界

:return:

'''

if self.y>700 or self.x<0:

return True

else:

return False

pass

pass

class HeroPlane(BasePlane):

def __init__(self,screen):

'''

初始化函数

:param screen: 主窗体对象

'''

super().__init__(screen,'./雷霆战机/images/hero/hero04.png')

#设定飞机的默认位置

self.x=175

self.y=615

pass

def moveleft(self):

'''

左移

:return:

'''

if self.x>0:

self.x-=10

pass

def moveright(self,):

'''

右移

:return:

'''

if self.x<490:

self.x+=10

pass

#发射子弹

def sheBullet(self):

#创建一个新的子弹对象

newBullet=CommonBullet(self.x,self.y,self.screen,'hero')

self.bulletList.append(newBullet)

pass

pass

#创建敌机类

class EnemyPlane(BasePlane):

def __init__(self,screen):

super.__init__(screen,'./雷霆战机/images/enemy/boss.png')

#默认设置一个方向

self.direction='right'

# 设定飞机的默认位置

self.x = 0

self.y = 0

pass

def sheBullet(self):

'''

敌机随机发射子弹

:return:

'''

num=random.randint(1,100)

if num==3:

newBullet=CommonBullet(self.x,self.y,self.screen,'enemy')

self.bulletList.append(newBullet)

pass

def move(self):

'''

敌机移动,随机进行

:return:

'''

if self.direction=='right':

self.x+=1

pass

elif self.direction=='left':

self.x-=1

pass

if self.x>260:

self.direction='left'

pass

elif self.x<0:

self.direction='right'

pass

def key_control(HeroObj):

'''

定义普通函数 用来实现键盘的检测

:param HeroObj: 可控制检测的对象

:return:

'''

# 获取键盘事件

eventlist = pygame.event.get()

for event in eventlist:

if event.type == QUIT:

print('退出')

exit()

pass

elif event.type == KEYDOWN:

if event.type == K_a or event.key == K_LEFT:

print('left')

HeroObj.moveleft() #调用函数实现左移

elif event.type == K_d or event.key == K_RIGHT:

print('right')

HeroObj.moveright() #调用函数实现右移

elif event.key == K_SPACE:

print('K_SPACE')

HeroObj.sheBullet()

pass

def main():

# 首先创建窗口对象

screen=pygame.display.set_mode((450,700))

#创建一个背景图片对象

background=pygame.image.load('./雷霆战机/images/bg/bg1.jpg')

#设置一个title

pygame.display.set_caption('huihui飞机大战')

#添加背景音乐

pygame.mixer.init() #初始化这个函数

pygame.mixer.music.load('./PlaneWar/sound/game_music.ogg')

pygame.mixer.music.set_volume((0.2))

pygame.mixer.music.play(-1) #表示无限循环

#创建一个飞机对象

hero=HeroPlane(screen)

#创建一个敌机对象

enemyplane=EnemyPlane(screen)

#设定需要显示的内容

while True:

screen.blit(background,(0,0))

# 显示玩家飞机图片

hero.display()

enemyplane.display() #显示敌机

enemyplane.move() #敌机移动

enemyplane.sheBullet() #敌机随机发射子弹

#获取键盘事件

key_control((hero))

#更新显示内容

pygame.display.update()

# time.sleep(1) #休眠一秒钟

pygame.time.Clock().tick(20) #一秒钟运行20次

pass

if __name__=='__main__':

main()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值