栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

Python阶段总结 飞机案例—Python Day10

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python阶段总结 飞机案例—Python Day10

目录

1.搭建界面和键盘检测 

2.添加背景音乐 

3.运行优化

4.控制玩具飞机-面向过程

5.控制玩具飞机-面向对象

6.玩家飞机发射子弹

7.显示敌机

8.敌机发射子弹

9.抽象基类


 飞机大战-要实现的效果

控制玩具飞机-面向过程

控制玩具飞机-面向对象

玩家飞机发射子弹

显示敌机

敌机发射子弹

控制玩具飞机

显示敌机

敌机发送子弹

1.搭建界面和键盘检测 

街机游戏相信很多人玩过,比如图中的恐龙快打、飞机游戏,但是之前我们一直玩别人做的游戏,不知道大家有没有想过,这种游戏是怎么做出来的,使用什么样语言做出来的,Python能做游戏开发吗?答案是肯定的,接下来我就带领大家来一起使用python开发一个飞机大战的游戏

import pygame
from pygame.locals import *
'''
1.搭建界面,主要完成窗口和背景图的显示
'''
def main():
    #1.创建一个窗口,用来显示内容
    screen=pygame.display.set_mode((350,500),0,32)
    #2.加载一张和窗口大小一样的图片,用来充当背景
    background=pygame.image.load("./feiji/background.png")
    #3.把背景图片放到窗口中显示
    #设置一个title
    pygame.display.set_caption('阶段总结-飞机小游戏')
    while True:
        #设定需要显示的背景图
            screen.blit(background,(0,0))
        #更新需要显示的内容
            pygame.display.update()
if __name__=='__main__':
    main()

 运行结果

键盘检测

            #获取事件,比如按键等
            for event in pygame.event.get():
                #判断是否点击了退出按钮
                if event.type==QUIT:
                    print('exit')
                    exit()
                #判断是否按下了键
                elif event.type == KEYDOWN:
                    # 检测按键是否是a或者left,左键
                    if event.key == K_a or event.key == K_LEFT:
                        print('left')
                    # 检测按键是否是d或者right 右键
                    elif event.key == K_d or event.key == K_RIGHT:
                        print('right')
                    # 检测按键是否是空格键
                    elif event.key == K_SPACE:
                        print('space')

 输出结果

 pygame介绍 

Pygame是一个利用SDL库的写的游戏库,SDL呢,全名Simple DirectMedia Layer,是一位叫做Sam Lantinga的大牛写的 

SDL是用C写的,不过它也可以使用C++进行开发,当然还有很多其它的语言,Pygame就是Python中使用它的一个库 

pygame安装

安装命令:pip install pygame 

pygame 使用

Pygame有很多的模块,下面是一张一览表: 

 

具体教程可参考官网:https://www.pygame.org/docs/ 

2.添加背景音乐 
import pygame
from pygame.locals import *
'''
1.搭建界面,主要完成窗口和背景图的显示
'''
def main():
    #1.创建一个窗口,用来显示内容
    screen=pygame.display.set_mode((350,500),0,32)
    #2.加载一张和窗口大小一样的图片,用来充当背景
    background=pygame.image.load("./feiji/background.png")
    #3.把背景图片放到窗口中显示
    #4.设置一个title
    pygame.display.set_caption('阶段总结-飞机小游戏')
    #5.添加背景音乐
    pygame.mixer.init()
    pygame.mixer.music.load("./feiji/background.mp3")
    pygame.mixer.music.set_volume(0.2)
    pygame.mixer.music.play(-1) #循环次数,-1表示无限循环
    #6.载入玩家的飞机图片
    hero=pygame.image.load("./feiji/hero.png")
    #6.1初始化玩家图标的位置
    x,y=0,0
    while True:
        #设定需要显示的背景图/显示玩家图片
            screen.blit(background,(0,0))
            #显示玩家飞机的图片
            screen.blit(hero, (x, y))
        #更新需要显示的内容
            pygame.display.update()
            #获取事件,比如按键等
            for event in pygame.event.get():
                #判断是否点击了退出按钮
                if event.type==QUIT:
                    print('exit')
                    exit()
                #判断是否按下了键
                elif event.type == KEYDOWN:
                    # 检测按键是否是a或者left,左键
                    if event.key == K_a or event.key == K_LEFT:
                        print('left')
                        if x>0:
                            x-=5
                    # 检测按键是否是d或者right 右键
                    elif event.key == K_d or event.key == K_RIGHT:
                        print('right')
                        if x<310:
                            x+=5
                    # 检测按键是否是空格键
                    elif event.key == K_SPACE:
                        print('space')

if __name__=='__main__':
    main()
 3.运行优化,玩家飞机--面向对象
import pygame
from pygame.locals import *
'''
1.实现飞机的显示,并且可以控制飞机的移动【面向对象】
'''
class HeroPlane(object):
    def __init__(self,screen):
        #设定飞机的默认位置
        self.x=150
        self.y=450
        #设置要显示内容的窗口
        self.screen=screen
        self.imageName="./feiji/hero.png"
        self.image=pygame.image.load(self.imageName)
        pass
    def moveLeft(self): #左移动
        if self.x>0:
            self.x-=10
        pass
    def moveRight(self):  #右移动
        if self.x<<310:
            self.x+=10
        pass
    def display(self):  #飞机在主窗口的显示
        self.screen.blit(self.image,(self.x,self.y))
        pass
'''
2.键盘控制
'''
def key_control(HeroObj):
    for event in pygame.event.get():
        # 判断是否点击了退出按钮
        if event.type == QUIT:
            print('exit')
            exit()
        # 判断是否按下了键
        elif event.type == KEYDOWN:
            # 检测按键是否是a或者left,左键
            if event.key == K_a or event.key == K_LEFT:
                print('left')
                HeroObj.moveLeft()  #调用函数实现左移动
            elif event.key == K_d or event.key == K_RIGHT:
                print('right')
                HeroObj.moveRight()  #调用函数实现左移动
            # 检测按键是否是空格键
            elif event.key == K_SPACE:
                print('space')
'''
3.搭建界面,主要完成窗口和背景图的显示
'''
def main():
    #1.创建一个窗口,用来显示内容
    screen=pygame.display.set_mode((350,500),0,32)
    #2.加载一张和窗口大小一样的图片,用来充当背景
    background=pygame.image.load("./feiji/background.png")
    #3.把背景图片放到窗口中显示
    #4.设置一个title
    pygame.display.set_caption('阶段总结-飞机小游戏')
    #5.添加背景音乐
    pygame.mixer.init()
    pygame.mixer.music.load("./feiji/background.mp3")
    pygame.mixer.music.set_volume(0.2)
    pygame.mixer.music.play(-1) #循环次数,-1表示无限循环
    #创建一个飞机对象
    hero=HeroPlane(screen)
    while True:
        #设定需要显示的背景图/显示玩家图片
            screen.blit(background,(0,0))
            #显示玩家飞机的图片
            hero.display()
            key_control(hero)
        #更新需要显示的内容
            pygame.display.update()

if __name__=='__main__':
    main()

4.效果完成
import time

import pygame
import random
from pygame.locals import *
'''
1.实现飞机的显示,并且可以控制飞机的移动【面向对象】
'''
class HeroPlane(object):
    def __init__(self,screen):
        #设定飞机的默认位置
        self.x=150
        self.y=450
        #设置要显示内容的窗口
        self.screen=screen
        self.imageName="./feiji/hero.png"
        self.image=pygame.image.load(self.imageName)
        #用于存放子弹的列表
        self.bulletList=[]
        pass
    def moveLeft(self): #左移动
        if self.x>0:
            self.x-=10
        pass
    def moveRight(self):  #右移动
        if self.x<<310:
            self.x+=10
        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
        #重新遍历
        for i in needDelItemList:
            self.bulletList.remove(i)
        for bullet in self.bulletList:
            bullet.display()  #显示子弹的位置
            bullet.move()  #让子弹移动
    def sheBullet(self):
        #创建一个新的子弹对象
        newbullet=Bullet(self.x,self.y,self.screen)
        self.bulletList.append(newbullet)
'''
2.创建敌人飞机
'''
class EnemyPlane():
    def __init__(self,screen):
        #默认设定一个子弹的方向
        self.direction='right'
        # 设定飞机的默认位置
        self.x = 0
        self.y = 0
        # 设置要显示内容的窗口
        self.screen = screen
        self.imageName = "./feiji/enemy0.png"
        self.image = pygame.image.load(self.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
        # 重新遍历
        for i in needDelItemList:
            self.bulletList.remove(i)
        for bullet in self.bulletList:
            bullet.display()  # 显示子弹的位置
            bullet.move()  # 让子弹移动

    def sheBullet(self):
        num=random.randint(1,100)
        if num==3:
            newBullet=EnemyBullet(self.x,self.y,self.screen)
            self.bulletList.append(newBullet)
        pass
    def move(self):
        if self.direction=='right':
            self.x+=0.1
        elif self.direction=='left':
            self.x-=0.1
        if self.x>350-20:
            self.direction='left'
        elif self.x<0:
            self.direction='right'

'''
3.创建玩家子弹类
'''
class Bullet(object):
    def __init__(self,x,y,screen):
        self.x=x+13
        self.y=y-20
        self.screen=screen
        self.image=pygame.image.load("./feiji/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):
        if self.y<0:
            return True
        else:
            return False
    pass
'''
4.创建敌人飞机子弹
'''
class EnemyBullet(object):
    def __init__(self,x,y,screen):
        self.x=x
        self.y=y+10
        self.screen=screen
        self.image=pygame.image.load("./feiji/bullet1.png")
        pass
    def display(self):
        self.screen.blit(self.image,(self.x,self.y))
        pass
    def move(self):
        self.y+=1
        pass
    #判断子弹是否越界
    def judge(self):
        if self.y>500:
            return True
        else:
            return False
    pass
'''
4..键盘控制
'''
def key_control(HeroObj):
    for event in pygame.event.get():
        # 判断是否点击了退出按钮
        if event.type == QUIT:
            print('exit')
            exit()
        # 判断是否按下了键
        elif event.type == KEYDOWN:
            # 检测按键是否是a或者left,左键
            if event.key == K_a or event.key == K_LEFT:
                print('left')
                HeroObj.moveLeft()  #调用函数实现左移动
            elif event.key == K_d or event.key == K_RIGHT:
                print('right')
                HeroObj.moveRight()  #调用函数实现左移动
            # 检测按键是否是空格键
            elif event.key == K_SPACE:
                print('按下空格键,发射子弹')
                HeroObj.sheBullet()
'''
5.搭建界面,主要完成窗口和背景图的显示
'''
def main():
    #1.创建一个窗口,用来显示内容
    screen=pygame.display.set_mode((350,500),0,32)
    #2.加载一张和窗口大小一样的图片,用来充当背景
    background=pygame.image.load("./feiji/background.png")
    #3.把背景图片放到窗口中显示
    #4.设置一个title
    pygame.display.set_caption('阶段总结-飞机小游戏')
    #5.添加背景音乐
    pygame.mixer.init()
    pygame.mixer.music.load("./feiji/background.mp3")
    pygame.mixer.music.set_volume(0.2)
    pygame.mixer.music.play(-1) #循环次数,-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()
if __name__=='__main__':
    main()

5.结构优化
import time
import pygame
import random
from pygame.locals import *
class basePlane():
    def __init__(self,screen,imageName):
        self.screen=screen
        self.image=pygame.image.load(imageName)
        self.bulletList=[]
    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
        # 重新遍历
        for i in needDelItemList:
            self.bulletList.remove(i)
        for bullet in self.bulletList:
            bullet.display()  # 显示子弹的位置
            bullet.move()  # 让子弹移动
    pass
'''
1.实现飞机的显示,并且可以控制飞机的移动【面向对象】
'''
class HeroPlane(basePlane):
    def __init__(self,screen):
        #设定飞机的默认位置
        self.x=150
        self.y=450
        #设置要显示内容的窗口
        super().__init__(screen,"./feiji/hero.png") #调用父类的构造方法
    def moveLeft(self): #左移动
        if self.x>0:
            self.x-=10
        pass
    def moveRight(self):  #右移动
        if self.x<310:
            self.x+=10
        pass
    def sheBullet(self):
        #创建一个新的子弹对象
        newbullet=CommonBullet(self.x,self.y,self.screen,'hero')
        self.bulletList.append(newbullet)
'''
2.创建敌人飞机
'''
class EnemyPlane(basePlane):
    def __init__(self,screen):
        super().__init__(screen,"./feiji/enemy0.png")
        #默认设定一个子弹的方向
        self.direction='right'
        # 设定飞机的默认位置
        self.x = 0
        self.y = 0
        pass
    def sheBullet(self):
        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):
        if self.direction=='right':
            self.x+=0.1
        elif self.direction=='left':
            self.x-=0.1
        if self.x>350-20:
            self.direction='left'
        elif self.x<0:
            self.direction='right'
class CommonBullet():
    def __init__(self,x,y,screen,bulletType):
        self.type=bulletType
        self.screen=screen
        if self.type=='hero':
            self.x = x + 13
            self.y = y - 20
            self.imagePath="./feiji/bullet.png"
        elif self.type=='enemy':
            self.x = x
            self.y = y + 10
            self.imagePath="./feiji/bullet1.png"
        self.image=pygame.image.load(self.imagePath)
    def move(self):
        if self.type=='hero':
            self.y-=1
        elif self.type=='enemy':
            self.y+=1
    def display(self):
        self.screen.blit(self.image,(self.x,self.y))
        pass
    def judge(self):
        if self.y>500 or self.y<0:
            return True
        else:
            return False
'''
5..键盘控制
'''
def key_control(HeroObj):
    for event in pygame.event.get():
        # 判断是否点击了退出按钮
        if event.type == QUIT:
            print('exit')
            exit()
        # 判断是否按下了键
        elif event.type == KEYDOWN:
            # 检测按键是否是a或者left,左键
            if event.key == K_a or event.key == K_LEFT:
                print('left')
                HeroObj.moveLeft()  #调用函数实现左移动
            elif event.key == K_d or event.key == K_RIGHT:
                print('right')
                HeroObj.moveRight()  #调用函数实现左移动
            # 检测按键是否是空格键
            elif event.key == K_SPACE:
                print('按下空格键,发射子弹')
                HeroObj.sheBullet()
'''
5.搭建界面,主要完成窗口和背景图的显示
'''
def main():
    #1.创建一个窗口,用来显示内容
    screen=pygame.display.set_mode((350,500),0,32)
    #2.加载一张和窗口大小一样的图片,用来充当背景
    background=pygame.image.load("./feiji/background.png")
    #3.把背景图片放到窗口中显示
    #4.设置一个title
    pygame.display.set_caption('阶段总结-飞机小游戏')
    #5.添加背景音乐
    pygame.mixer.init()
    pygame.mixer.music.load("./feiji/background.mp3")
    pygame.mixer.music.set_volume(0.2)
    pygame.mixer.music.play(-1) #循环次数,-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()
if __name__=='__main__':
    main()

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/433510.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号