python——飞机大战小游戏

目录

1、导入模块

2、窗口操作

3、事件操作

4、长按事件

5、添加游戏背景

6、添加英雄飞机

7、获取飞机的图片矩形

8、基本游戏窗口

9、添加游戏窗口图片

10、英雄飞机登场

11、英雄飞机装备子弹并发射

1、enemy_plane

2、game_main

3、game_map

4、game_score

5、hero_plane

6、plane_bullet


先安装一下pygame这个库

然后将素材烤入,一些飞机图片和背景

 

需要修改一下编辑器不然会找不到

草率了,貌似得再pycharm里下载

pip下载的它找不到

 我又重新下载了一下

再右面加号新建一个解释器

选择本地python.exe,把公开它的库选上终于好了

 

1、导入模块

#导入模块
import pygame
#对pygame 进行实例化, 叫做硬件准备
pygame.init()

2、窗口操作

#导入模块
import pygame

#对pygame 进行实例化, 叫做硬件准备
pygame.init()


#创立窗口  set_mode([400,400])

pygame.display.set_mode([400,400])

#设置游戏窗口的标题
pygame.display.set_caption("飞机大战")


#加载本地资源图片
logo_image = pygame.image.load("res/app.ico")

#设置游戏窗口logo
pygame.display.set_icon(logo_image)

3、事件操作

#导入模块
import pygame
import sys

#对pygame 进行实例化, 叫做硬件准备
pygame.init()

#创立窗口  set_mode([400,400])

pygame.display.set_mode([400,400])

#设置游戏窗口的标题
pygame.display.set_caption("飞机大战")

#加载本地资源图片
logo_image = pygame.image.load("res/app.ico")

#设置游戏窗口logo
pygame.display.set_icon(logo_image)
#死循环 在死循环中监听鼠标事件 与键盘事件

while True:
    #获取所有游戏窗口内的事件监听 -> 列表
    event_list = pygame.event.get()
    #循环遍历所有事件
    for event in event_list:
        #判断鼠标点击了的操作
        if event.type == pygame.QUIT:
            #退出游戏
            pygame.quit()
            #退出程序
            sys.exit()


        #监听键盘上的操作
        if event.type == pygame.KEYDOWN:

            if event.key == pygame.K_ESCAPE:
                #退出游戏
                pygame.quit()
                # 退出程序
                sys.exit()


4、长按事件

#导入模块
import pygame
import sys

#对pygame 进行实例化, 叫做硬件准备
pygame.init()

#创立窗口  set_mode([400,400])

pygame.display.set_mode([400,400])

#设置游戏窗口的标题
pygame.display.set_caption("飞机大战")

#加载本地资源图片
logo_image = pygame.image.load("res/app.ico")

#设置游戏窗口logo
pygame.display.set_icon(logo_image)
#死循环 在死循环中监听鼠标事件 与键盘事件

while True:
    #获取所有游戏窗口内的事件监听 -> 列表
    event_list = pygame.event.get()
    #循环遍历所有事件
    for event in event_list:
        #判断鼠标点击了的操作
        if event.type == pygame.QUIT:
            #退出游戏
            pygame.quit()
            #退出程序
            sys.exit()


        #监听键盘上的操作
        if event.type == pygame.KEYDOWN:

            if event.key == pygame.K_ESCAPE:
                #退出游戏
                pygame.quit()
                # 退出程序
                sys.exit()



5、添加游戏背景

#导入模块
import pygame
import sys

#对pygame 进行实例化, 叫做硬件准备
pygame.init()

#创立窗口  set_mode([400,400])

window = pygame.display.set_mode([512,768])

#设置游戏窗口的标题
pygame.display.set_caption("飞机大战")

#加载本地资源图片
logo_image = pygame.image.load("res/app.ico")

#设置游戏窗口logo
pygame.display.set_icon(logo_image)

#游戏背景图
bg_image = pygame.image.load("res/img_bg_level_2.jpg")


#添加到游戏里面
window.blit(bg_image,(0,0))
#刷新窗口

pygame.display.update()


#死循环 在死循环中监听鼠标事件 与键盘事件

while True:
    #获取所有游戏窗口内的事件监听 -> 列表
    event_list = pygame.event.get()
    #循环遍历所有事件
    for event in event_list:
        #判断鼠标点击了的操作
        if event.type == pygame.QUIT:
            #退出游戏
            pygame.quit()
            #退出程序
            sys.exit()


        #监听键盘上的操作
        if event.type == pygame.KEYDOWN:

            if event.key == pygame.K_ESCAPE:
                #退出游戏
                pygame.quit()
                # 退出程序
                sys.exit()


    #监听键盘中的长按事件-> 元组(只有两种情况 0 或者 1)
    pressed_keys = pygame.key.get_pressed()

    #判断向上的按键是否在长按(1)
    if pressed_keys[pygame.K_UP] or pressed_keys[pygame.K_w]:
        print("向上")

    #判断向下按键是否在长按(1)

    if pressed_keys[pygame.K_DOWN] or pressed_keys[pygame.K_s]:
        print("向下")

    # 判断向左按键是否在长按(1)

    if pressed_keys[pygame.K_LEFT] or pressed_keys[pygame.K_a]:
        print("向左")

    # 判断向右按键是否在长按(1)

    if pressed_keys[pygame.K_RIGHT] or pressed_keys[pygame.K_d]:
        print("向右")

6、添加英雄飞机

#导入模块
import pygame
import sys

#对pygame 进行实例化, 叫做硬件准备
pygame.init()

#创立窗口  set_mode([400,400])

window = pygame.display.set_mode([512,768])

#设置游戏窗口的标题
pygame.display.set_caption("飞机大战")

#加载本地资源图片
logo_image = pygame.image.load("res/app.ico")

#设置游戏窗口logo
pygame.display.set_icon(logo_image)

#游戏背景图
bg_image = pygame.image.load("res/img_bg_level_2.jpg")

#添加飞机背景
hero_image = pygame.image.load("res/hero2.png")


#添加到游戏里面
window.blit(bg_image,(0,0))
window.blit(hero_image,(0,0))

#刷新窗口

pygame.display.update()


#死循环 在死循环中监听鼠标事件 与键盘事件

while True:
    #获取所有游戏窗口内的事件监听 -> 列表
    event_list = pygame.event.get()
    #循环遍历所有事件
    for event in event_list:
        #判断鼠标点击了的操作
        if event.type == pygame.QUIT:
            #退出游戏
            pygame.quit()
            #退出程序
            sys.exit()


        #监听键盘上的操作
        if event.type == pygame.KEYDOWN:

            if event.key == pygame.K_ESCAPE:
                #退出游戏
                pygame.quit()
                # 退出程序
                sys.exit()


    #监听键盘中的长按事件-> 元组(只有两种情况 0 或者 1)
    pressed_keys = pygame.key.get_pressed()

    #判断向上的按键是否在长按(1)
    if pressed_keys[pygame.K_UP] or pressed_keys[pygame.K_w]:
        print("向上")

    #判断向下按键是否在长按(1)

    if pressed_keys[pygame.K_DOWN] or pressed_keys[pygame.K_s]:
        print("向下")

    # 判断向左按键是否在长按(1)

    if pressed_keys[pygame.K_LEFT] or pressed_keys[pygame.K_a]:
        print("向左")

    # 判断向右按键是否在长按(1)

    if pressed_keys[pygame.K_RIGHT] or pressed_keys[pygame.K_d]:
        print("向右")

7、获取飞机的图片矩形

#导入模块
import pygame
import sys

#对pygame 进行实例化, 叫做硬件准备
pygame.init()

#创立窗口  set_mode([400,400])

window = pygame.display.set_mode([512,768])

#设置游戏窗口的标题
pygame.display.set_caption("飞机大战")

#加载本地资源图片
logo_image = pygame.image.load("res/app.ico")

#设置游戏窗口logo
pygame.display.set_icon(logo_image)

#游戏背景图
bg_image = pygame.image.load("res/img_bg_level_2.jpg")

#添加飞机背景
hero_image = pygame.image.load("res/hero2.png")


#添加到游戏里面
window.blit(bg_image,(0,0))
window.blit(hero_image,(0,0))

#刷新窗口

pygame.display.update()


#死循环 在死循环中监听鼠标事件 与键盘事件

while True:
    #获取所有游戏窗口内的事件监听 -> 列表
    event_list = pygame.event.get()
    #循环遍历所有事件
    for event in event_list:
        #判断鼠标点击了的操作
        if event.type == pygame.QUIT:
            #退出游戏
            pygame.quit()
            #退出程序
            sys.exit()


        #监听键盘上的操作
        if event.type == pygame.KEYDOWN:

            if event.key == pygame.K_ESCAPE:
                #退出游戏
                pygame.quit()
                # 退出程序
                sys.exit()


    #监听键盘中的长按事件-> 元组(只有两种情况 0 或者 1)
    pressed_keys = pygame.key.get_pressed()

    #判断向上的按键是否在长按(1)
    if pressed_keys[pygame.K_UP] or pressed_keys[pygame.K_w]:
        print("向上")

    #判断向下按键是否在长按(1)

    if pressed_keys[pygame.K_DOWN] or pressed_keys[pygame.K_s]:
        print("向下")

    # 判断向左按键是否在长按(1)

    if pressed_keys[pygame.K_LEFT] or pressed_keys[pygame.K_a]:
        print("向左")

    # 判断向右按键是否在长按(1)

    if pressed_keys[pygame.K_RIGHT] or pressed_keys[pygame.K_d]:
        print("向右")

8、基本游戏窗口

import pygame, sys

#自定义游戏窗口的管理类
class GameWindow(object):

    def __init__(self):
        # 对pygame 进行实例化, 叫做硬件准备
        pygame.init()

        # 创立窗口  set_mode([400,400])

        window = pygame.display.set_mode([512, 768])

        # 设置游戏窗口的标题
        pygame.display.set_caption("飞机大战")

        # 加载本地资源图片
        logo_image = pygame.image.load("res/app.ico")

        # 设置游戏窗口logo
        pygame.display.set_icon(logo_image)

    #定义各种矩形的坐标移动
    def __action(self):
        pass


    #根据矩形的坐标, 重新对元素进行描绘
    def __draw(self):
        pass


    #处理窗口中的监听事件
    def __event(self):
        # 获取所有游戏窗口内的事件监听 -> 列表
        event_list = pygame.event.get()
        # 循环遍历所有事件
        for event in event_list:
            # 判断鼠标点击了的操作
            if event.type == pygame.QUIT:
                self.game_over()

            # 监听键盘上的操作
            if event.type == pygame.KEYDOWN:

                if event.key == pygame.K_ESCAPE:
                   self.game_over()

                if event.key == pygame.K_SPACE:
                    print("发射子弹")


        # 监听键盘中的长按事件-> 元组(只有两种情况 0 或者 1)
        pressed_keys = pygame.key.get_pressed()

        # 判断向上的按键是否在长按(1)
        if pressed_keys[pygame.K_UP] or pressed_keys[pygame.K_w]:
            print("向上")

        # 判断向下按键是否在长按(1)

        if pressed_keys[pygame.K_DOWN] or pressed_keys[pygame.K_s]:
            print("向下")

        # 判断向左按键是否在长按(1)

        if pressed_keys[pygame.K_LEFT] or pressed_keys[pygame.K_a]:
            print("向左")

        # 判断向右按键是否在长按(1)

        if pressed_keys[pygame.K_RIGHT] or pressed_keys[pygame.K_d]:
            print("向右")

    def __update(self):
        pass

    def game_over(self):
        # 退出游戏
        pygame.quit()
        # 退出程序
        sys.exit()

    def run(self):

        while True:
            self.__action()
            self.__draw()
            self.__event()
            self.__update()


#主函数
def main():
    game_window = GameWindow()
    game_window.run()


if __name__ == '__main__':
    main()

9、添加游戏窗口图片

import pygame, sys ,random

# 定义常量

WINDOW_WIDTH, WINDOW_HEIGHT = 512, 768
#自定义地图类
class GameMap(object):

    #定义地图初始化
    def __init__(self):
        # 定义1到5的随机数
        self.num = str(random.randint(1,5))
        #图片
        self.img_1 = pygame.image.load("res/img_bg_level_"+ self.num +".jpg")
        self.img_2 = pygame.image.load("res/img_bg_level_" + self.num + ".jpg")

        #设置和记录图片的Y轴
        self.img_1_y = -WINDOW_HEIGHT
        self.img_2_y = 0

        #速度
        self.speed = 2

    #向下移动
    def move_down(self):
        #重置地图Y轴
        if self.img_1_y >= 0:
            self.img_1_y = - WINDOW_HEIGHT
            self.img_2_y = 0

        self.img_1_y += self.speed
        self.img_2_y += self.speed




#自定义游戏窗口的管理类
class GameWindow(object):

    def __init__(self):
        # 对pygame 进行实例化, 叫做硬件准备
        pygame.init()

        # 创立窗口  set_mode([400,400])

        self.window = pygame.display.set_mode([WINDOW_WIDTH,WINDOW_HEIGHT ])

        # 设置游戏窗口的标题
        pygame.display.set_caption("飞机大战")

        # 加载本地资源图片
        logo_image = pygame.image.load("res/app.ico")

        # 设置游戏窗口logo
        pygame.display.set_icon(logo_image)

        #地图对象
        self.map = GameMap()

    #定义各种矩形的坐标移动
    def __action(self):
        self.map.move_down()


    #根据矩形的坐标, 重新对元素进行描绘
    def __draw(self):
        self.window.blit(self.map.img_1,(0,self.map.img_1_y))
        self.window.blit(self.map.img_2,(0,self.map.img_2_y))


    #处理窗口中的监听事件
    def __event(self):
        # 获取所有游戏窗口内的事件监听 -> 列表
        event_list = pygame.event.get()
        # 循环遍历所有事件
        for event in event_list:
            # 判断鼠标点击了的操作
            if event.type == pygame.QUIT:
                self.game_over()

            # 监听键盘上的操作
            if event.type == pygame.KEYDOWN:

                if event.key == pygame.K_ESCAPE:
                   self.game_over()

                if event.key == pygame.K_SPACE:
                    print("发射子弹")


        # 监听键盘中的长按事件-> 元组(只有两种情况 0 或者 1)
        pressed_keys = pygame.key.get_pressed()

        # 判断向上的按键是否在长按(1)
        if pressed_keys[pygame.K_UP] or pressed_keys[pygame.K_w]:
            print("向上")

        # 判断向下按键是否在长按(1)

        if pressed_keys[pygame.K_DOWN] or pressed_keys[pygame.K_s]:
            print("向下")

        # 判断向左按键是否在长按(1)

        if pressed_keys[pygame.K_LEFT] or pressed_keys[pygame.K_a]:
            print("向左")

        # 判断向右按键是否在长按(1)

        if pressed_keys[pygame.K_RIGHT] or pressed_keys[pygame.K_d]:
            print("向右")

    def __update(self):
        pygame.display.update()

    def game_over(self):
        # 退出游戏
        pygame.quit()
        # 退出程序
        sys.exit()

    def run(self):

        while True:
            self.__action()
            self.__draw()
            self.__event()
            self.__update()


#主函数
def main():
    game_window = GameWindow()
    game_window.run()


if __name__ == '__main__':
    main()

10、英雄飞机登场

import pygame, sys ,random

# 定义常量

WINDOW_WIDTH, WINDOW_HEIGHT = 512, 768

#自定义飞机类
class HeroPlane(object):

    #初始化飞机类
    def __init__(self):
        #加载主飞机图片
        self.img = pygame.image.load("res/hero2.png")
        # 获取飞机矩阵
        self.img_rect = self.img.get_rect()
        #设置飞机的初始位置
        self.img_rect.move_ip((WINDOW_WIDTH - self.img_rect[2])/2,WINDOW_HEIGHT - self.img_rect[3]- 50)

        #设置飞机的速度
        self.speed = 3



    # 向上
    def move_up(self):
        #边缘检测
        if self.img_rect[1] >= 0:
            self.img_rect.move_ip(0, -self.speed)

    # 向下
    def move_domw(self):
        # 边缘检测
        if self.img_rect[1] <= WINDOW_HEIGHT -self.img_rect[3]:
            self.img_rect.move_ip(0, self.speed)

    #向左
    def move_left(self):
        # 边缘检测
        if self.img_rect[0] >=0:

            self.img_rect.move_ip(-self.speed, 0 )

    #向右
    def move_right(self):

        if self.img_rect[0] <= WINDOW_WIDTH - self.img_rect[2]:
            self.img_rect.move_ip(self.speed, 0)

    def shot(self):
        print("发射子弹")



#自定义地图类
class GameMap(object):

    #定义地图初始化
    def __init__(self):
        # 定义1到5的随机数
        self.num = str(random.randint(1,5))
        #图片
        self.img_1 = pygame.image.load("res/img_bg_level_"+ self.num +".jpg")
        self.img_2 = pygame.image.load("res/img_bg_level_" + self.num + ".jpg")

        #设置和记录图片的Y轴
        self.img_1_y = -WINDOW_HEIGHT
        self.img_2_y = 0

        #速度
        self.speed = 2

    #向下移动
    def move_down(self):
        #重置地图Y轴
        if self.img_1_y >= 0:
            self.img_1_y = - WINDOW_HEIGHT
            self.img_2_y = 0

        self.img_1_y += self.speed
        self.img_2_y += self.speed




#自定义游戏窗口的管理类
class GameWindow(object):

    def __init__(self):
        # 对pygame 进行实例化, 叫做硬件准备
        pygame.init()

        # 创立窗口  set_mode([400,400])

        self.window = pygame.display.set_mode([WINDOW_WIDTH,WINDOW_HEIGHT ])

        # 设置游戏窗口的标题
        pygame.display.set_caption("飞机大战")

        # 加载本地资源图片
        logo_image = pygame.image.load("res/app.ico")

        # 设置游戏窗口logo
        pygame.display.set_icon(logo_image)

        #地图对象
        self.map = GameMap()

        #英雄飞机的对象
        self.hero_plane = HeroPlane()




    #定义各种矩形的坐标移动
    def __action(self):
        self.map.move_down()


    #根据矩形的坐标, 重新对元素进行描绘
    def __draw(self):
        #添加背景图片
        self.window.blit(self.map.img_1,(0,self.map.img_1_y))
        self.window.blit(self.map.img_2,(0,self.map.img_2_y))
        #添加飞机图片
        self.window.blit(self.hero_plane.img,(self.hero_plane.img_rect[0],self.hero_plane.img_rect[1]))


    #处理窗口中的监听事件
    def __event(self):
        # 获取所有游戏窗口内的事件监听 -> 列表
        event_list = pygame.event.get()
        # 循环遍历所有事件
        for event in event_list:
            # 判断鼠标点击了的操作
            if event.type == pygame.QUIT:
                self.game_over()

            # 监听键盘上的操作
            if event.type == pygame.KEYDOWN:

                if event.key == pygame.K_ESCAPE:
                   self.game_over()

                if event.key == pygame.K_SPACE:
                    print("发射子弹")


        # 监听键盘中的长按事件-> 元组(只有两种情况 0 或者 1)
        pressed_keys = pygame.key.get_pressed()

        # 判断向上的按键是否在长按(1)
        if pressed_keys[pygame.K_UP] or pressed_keys[pygame.K_w]:
            print("向上")

        # 判断向下按键是否在长按(1)

        if pressed_keys[pygame.K_DOWN] or pressed_keys[pygame.K_s]:
            print("向下")

        # 判断向左按键是否在长按(1)

        if pressed_keys[pygame.K_LEFT] or pressed_keys[pygame.K_a]:
            print("向左")

        # 判断向右按键是否在长按(1)

        if pressed_keys[pygame.K_RIGHT] or pressed_keys[pygame.K_d]:
            print("向右")

    def __update(self):
        pygame.display.update()

    def game_over(self):
        # 退出游戏
        pygame.quit()
        # 退出程序
        sys.exit()

    def run(self):

        while True:
            self.__action()
            self.__draw()
            self.__event()
            self.__update()


#主函数
def main():
    game_window = GameWindow()
    game_window.run()


if __name__ == '__main__':
    main()

11、英雄飞机装备子弹并发射

import pygame, sys, random

# 定义一个常量(赋值后不能修改)常量一般使用大写字母
WINDOW_WIDTH, WINDOW_HEIGHT = 512, 768
# python中 崇尚的是一切靠自觉

# 自定义一个英雄飞机子弹类
class PlaneBullet(object):

    def __init__(self):
        # 图片
        self.img = pygame.image.load("res/bullet_10.png")
        # 获取子弹的图片矩形
        self.img_rect = self.img.get_rect()
        # 子弹的状态
        self.is_shot = False
        # 速度
        self.speed = 4

    # 向上移动
    def move_up(self):
        self.img_rect.move_ip(0, -self.speed)
        # 注意改变子弹的状态
        if self.img_rect[1] <= -self.img_rect[3]:
            # 设置为未发射状态
            self.is_shot = False


# 自定义一个英雄飞机类
class HeroPlane(object):

    def __init__(self):
        # 赋值
        self.img = pygame.image.load("res/hero2.png")
        # 获取图片矩形
        self.img_rect = self.img.get_rect()
        # 设置飞机的初始位置
        self.img_rect.move_ip((WINDOW_WIDTH - self.img_rect[2])/2, WINDOW_HEIGHT - self.img_rect[3] - 50)
        # 飞机速度
        self.speed = 3
        # 子弹弹夹
        self.bullet_list = [PlaneBullet() for i in range(6)]


    # 向上
    def move_up(self):
        # 边缘检测
        if self.img_rect[1] >= 0:
            self.img_rect.move_ip(0, -self.speed)

    # 向下
    def move_down(self):
        # 边缘检测
        if self.img_rect[1] <= WINDOW_HEIGHT - self.img_rect[3]:
            self.img_rect.move_ip(0, self.speed)

    # 向左
    def move_left(self):
        # 边缘检测
        if self.img_rect[0] >= 0:
            self.img_rect.move_ip(-self.speed, 0)

    # 向右
    def move_right(self):
        # 边缘检测
        if self.img_rect[0] <= WINDOW_WIDTH - self.img_rect[2]:
            self.img_rect.move_ip(self.speed, 0)

    # 发射子弹
    def shot(self):
        # 遍历所有的子弹
        for bullet in self.bullet_list:
            # 判断未发射的
            if not bullet.is_shot:
                # 设置子弹的位置
                bullet.img_rect[0] = self.img_rect[0] + (self.img_rect[2] - bullet.img_rect[2])/2
                bullet.img_rect[1] = self.img_rect[1] - bullet.img_rect[3]

                # 设置为发射状态
                bullet.is_shot = True
                # 一次只能发射一颗子弹
                break


# 自定义一个地图类
class GameMap(object):

    def __init__(self):
        self.num = str(random.randint(1, 5))
        # 图片
        self.img_1 = pygame.image.load("res/img_bg_level_" + self.num + ".jpg")
        self.img_2 = pygame.image.load("res/img_bg_level_" + self.num + ".jpg")
        # 设置和记录图片的y轴
        self.img1_y = -WINDOW_HEIGHT
        self.img2_y = 0
        # 速度
        self.speed = 2

    # 向下移动
    def move_down(self):

        # 地图的y轴重置
        if self.img1_y >= 0:
            self.img1_y = -WINDOW_HEIGHT
            self.img2_y = 0

        self.img1_y += self.speed
        self.img2_y += self.speed


# 自定义一个游戏窗口管理类
class GameWindow(object):

    # 构造方法
    def __init__(self):
        # pygame进行实例化
        pygame.init()
        # 创建游戏窗口-> 返回一个游戏窗口对象
        self.window = pygame.display.set_mode([WINDOW_WIDTH, WINDOW_HEIGHT])
        # 设置游戏窗口的标题
        pygame.display.set_caption("飞机大战")
        # 加载本地资源图片 返回一个图片对象
        logo_image = pygame.image.load("res/app.ico")
        # 设置游戏窗口的logo
        pygame.display.set_icon(logo_image)

        # 地图对象
        self.map = GameMap()
        # 英雄飞机对象
        self.hero_plane = HeroPlane()


    # 运行游戏程序
    def run(self):
        while True:
            self.__action()
            self.__draw()
            self.__event()
            self.__update()

    # 1.处理各种矩形坐标移动
    def __action(self):
        # 地图动画
        self.map.move_down()

        # 遍历子弹 叫子弹飞一会
        for bullet in self.hero_plane.bullet_list:
            # 判断如果已经发射
            if bullet.is_shot:
                bullet.move_up()

    # 2.根据矩形坐标,重新对元素进行绘制
    def __draw(self):
        # 添加地图图片
        self.window.blit(self.map.img_1, (0, self.map.img1_y))
        self.window.blit(self.map.img_2, (0, self.map.img2_y))
        # 飞机图片
        self.window.blit(self.hero_plane.img, (self.hero_plane.img_rect[0], self.hero_plane.img_rect[1]))
        # 添加子弹
        for bullet in self.hero_plane.bullet_list:
            # 判断如果已经发射的子弹
            if bullet.is_shot:
                self.window.blit(bullet.img, (bullet.img_rect[0], bullet.img_rect[1]))



    # 3.处理窗口中的监听事件
    def __event(self):
        # 获取所有游戏窗口的中的事件监听-> 列表
        event_list = pygame.event.get()
        # 遍历所有的事件
        for event in event_list:
            # 判断如果是鼠标点击了
            if event.type == pygame.QUIT:
                self.game_over()

            # 监听esc键按下
            if event.type == pygame.KEYDOWN:
                # 判断是否按得是esc
                if event.key == pygame.K_ESCAPE:
                    self.game_over()

                # 判断是否按得是空格
                if event.key == pygame.K_SPACE:
                    self.hero_plane.shot()

        # 监听键盘中的按键长按-> 元组(只有两种情况 0 或者 1) -> ASCII
        pressed_keys = pygame.key.get_pressed()
        # 判断向上的按键是否在长按(1)
        if pressed_keys[pygame.K_UP] or pressed_keys[pygame.K_w]:
            self.hero_plane.move_up()

        # 判断向下的按键是否在长按(1)
        if pressed_keys[pygame.K_DOWN] or pressed_keys[pygame.K_s]:
            self.hero_plane.move_down()

        # 判断向左的按键是否在长按(1)
        if pressed_keys[pygame.K_LEFT] or pressed_keys[pygame.K_a]:
            self.hero_plane.move_left()

        # 判断向右的按键是否在长按(1)
        if pressed_keys[pygame.K_RIGHT] or pressed_keys[pygame.K_d]:
            self.hero_plane.move_right()

    # 4.刷新窗口
    def __update(self):
        pygame.display.update()

    # 结束游戏
    def game_over(self):
        # 退出游戏
        # 停止pygame 游戏引擎
        pygame.quit()
        # 退出程序
        sys.exit()


# 主函数
def main():
    # 创建一个游戏窗口对象
    game_window = GameWindow()
    # 执行游戏
    game_window.run()



if __name__ == '__main__':
    main()



所有的东西都在一起太多了,模块化一下

1、enemy_plane

import pygame, random

# 定义一个常量(赋值后不能修改)常量一般使用大写字母
WINDOW_WIDTH, WINDOW_HEIGHT = 512, 768
# python中 崇尚的是一切靠自觉
# 自定义敌机类
class EnemyPlane(object):

    def __init__(self):
        self.num = str(random.randint(1, 7))
        # 图片
        self.img = pygame.image.load("res/img-plane_" + self.num + ".png")
        # 获取敌机的图片矩形
        self.img_rect = self.img.get_rect()
        self.reset()

    # 设置敌机的位置和速度
    def reset(self):
        # 设置敌机的位置和速度
        self.img_rect[0] = random.randint(0, WINDOW_WIDTH - self.img_rect[2])
        self.img_rect[1] = -self.img_rect[3]
        # 速度
        self.speed = random.randint(3, 5)

    # 向下移动
    def move_down(self):
        self.img_rect.move_ip(0, self.speed)
        # 判断如果在屏幕消失后 位置重置
        if self.img_rect[1] >= WINDOW_HEIGHT:
            self.reset()



2、game_main

# coding=utf-8
import pygame, sys, game_map, hero_plane, enemy_plane, game_score

# 定义一个常量(赋值后不能修改)常量一般使用大写字母
WINDOW_WIDTH, WINDOW_HEIGHT = 512, 768
# python中 崇尚的是一切靠自觉


# 自定义一个游戏窗口管理类
class GameWindow(object):

    # 构造方法
    def __init__(self):
        # pygame进行实例化
        pygame.init()
        # 加载背景音乐
        # pygame.mixer.music.load("./res/bg2.ogg")
        # # 循环播放背景音乐
        # pygame.mixer.music.play(-1)

        # 加载音效
        self.boom_sound = pygame.mixer.Sound("./res/baozha.ogg")

        # 创建游戏窗口-> 返回一个游戏窗口对象
        self.window = pygame.display.set_mode([WINDOW_WIDTH, WINDOW_HEIGHT])
        # 设置游戏窗口的标题
        pygame.display.set_caption("飞机大战")
        # 加载本地资源图片 返回一个图片对象
        logo_image = pygame.image.load("res/app.ico")
        # 设置游戏窗口的logo
        pygame.display.set_icon(logo_image)

        # 地图对象
        self.map = game_map.GameMap()
        # 英雄飞机对象
        self.hero_plane = hero_plane.HeroPlane()
        # 多架敌机
        self.enemy_list = [enemy_plane.EnemyPlane() for i in range(6)]
        # 游戏分数
        self.game_score = game_score.GameScore(35)



    # 运行游戏程序
    def run(self):
        while True:
            self.__action()
            self.__draw()
            self.__event()
            self.__update()
            self.__bullet_hit_enemy()

    # 1.处理各种矩形坐标移动
    def __action(self):
        # 地图动画
        self.map.move_down()

        # 遍历子弹 叫子弹飞一会
        for bullet in self.hero_plane.bullet_list:
            # 判断如果已经发射
            if bullet.is_shot:
                bullet.move_up()

        # 敌机自由落体
        for enemy in self.enemy_list:
            enemy.move_down()

    # 2.根据矩形坐标,重新对元素进行绘制
    def __draw(self):
        # 添加地图图片
        self.window.blit(self.map.img_1, (0, self.map.img1_y))
        self.window.blit(self.map.img_2, (0, self.map.img2_y))
        # 飞机图片
        self.window.blit(self.hero_plane.img, (self.hero_plane.img_rect[0], self.hero_plane.img_rect[1]))
        # 添加子弹
        for bullet in self.hero_plane.bullet_list:
            # 判断如果已经发射的子弹
            if bullet.is_shot:
                self.window.blit(bullet.img, (bullet.img_rect[0], bullet.img_rect[1]))

        # 添加敌机
        for enemy in self.enemy_list:
            self.window.blit(enemy.img, (enemy.img_rect[0], enemy.img_rect[1]))

        # 添加文字
        self.window.blit(self.game_score.text_obj, (10, 10))


    # 3.处理窗口中的监听事件
    def __event(self):
        # 获取所有游戏窗口的中的事件监听-> 列表
        event_list = pygame.event.get()
        # 遍历所有的事件
        for event in event_list:
            # 判断如果是鼠标点击了
            if event.type == pygame.QUIT:
                self.game_over()

            # 监听esc键按下
            if event.type == pygame.KEYDOWN:
                # 判断是否按得是esc
                if event.key == pygame.K_ESCAPE:
                    self.game_over()

                # 判断是否按得是空格
                if event.key == pygame.K_SPACE:
                    self.hero_plane.shot()

        # 监听键盘中的按键长按-> 元组(只有两种情况 0 或者 1) -> ASCII
        pressed_keys = pygame.key.get_pressed()
        # 判断向上的按键是否在长按(1)
        if pressed_keys[pygame.K_UP] or pressed_keys[pygame.K_w]:
            self.hero_plane.move_up()

        # 判断向下的按键是否在长按(1)
        if pressed_keys[pygame.K_DOWN] or pressed_keys[pygame.K_s]:
            self.hero_plane.move_down()

        # 判断向左的按键是否在长按(1)
        if pressed_keys[pygame.K_LEFT] or pressed_keys[pygame.K_a]:
            self.hero_plane.move_left()

        # 判断向右的按键是否在长按(1)
        if pressed_keys[pygame.K_RIGHT] or pressed_keys[pygame.K_d]:
            self.hero_plane.move_right()

    # 4.刷新窗口
    def __update(self):
        pygame.display.update()

    # 5.结束游戏
    def game_over(self):
        # 停止音效
        self.boom_sound.stop()
        # 停止背景音乐
        # pygame.mixer.music.stop()
        # 退出游戏
        # 停止pygame 游戏引擎
        pygame.quit()
        # 退出程序
        sys.exit()

    # 6.碰撞检测(子弹和敌机碰撞)
    def __bullet_hit_enemy(self):
        # 判断
        # 遍历子弹
        for bullet in self.hero_plane.bullet_list:
            # 判断子弹发射
            if bullet.is_shot:
                # 遍历敌机
                for enemy in self.enemy_list:
                    # 判断两个矩形是否相交,相交返回True,否则返回False
                    flag = pygame.Rect.colliderect(bullet.img_rect, enemy.img_rect)
                    if flag:
                         # 子弹
                        bullet.is_shot = False
                        # 敌机
                        enemy.reset()
                        # 播放音效
                        self.boom_sound.play()

                        # 设置分数
                        self.game_score.set_text_obj()






# 主函数
def main():
    # 创建一个游戏窗口对象
    game_window = GameWindow()
    # 执行游戏
    game_window.run()



if __name__ == '__main__':
    main()

3、game_map

import pygame, random

# 定义一个常量(赋值后不能修改)常量一般使用大写字母
WINDOW_WIDTH, WINDOW_HEIGHT = 512, 768
# python中 崇尚的是一切靠自觉

# 自定义一个地图类
class GameMap(object):

    def __init__(self):
        self.num = str(random.randint(1, 5))
        # 图片
        self.img_1 = pygame.image.load("res/img_bg_level_" + self.num + ".jpg")
        self.img_2 = pygame.image.load("res/img_bg_level_" + self.num + ".jpg")
        # 设置和记录图片的y轴
        self.img1_y = -WINDOW_HEIGHT
        self.img2_y = 0
        # 速度
        self.speed = 2

    # 向下移动
    def move_down(self):

        # 地图的y轴重置
        if self.img1_y >= 0:
            self.img1_y = -WINDOW_HEIGHT
            self.img2_y = 0

        self.img1_y += self.speed
        self.img2_y += self.speed

4、game_score


import pygame, random

# 自定义文字管理类
class GameScore(object):

    # 记录分数
    __cls_score = 0

    def __init__(self, font_size):
        # 设置字体和大小
        self.font = pygame.font.SysFont("SimHei", font_size)
        # render(text(文本内容), antialias(抗锯齿), color(RGB)),返回文字对象
        self.text_obj = self.font.render("分数:0", 1, (255, 255, 255))

    # 设置显示的文字和字体颜色
    def set_text_obj(self):
        # 加5分
        GameScore.__cls_score += 5
        # 随机颜色值
        r = random.randint(0, 255)
        g = random.randint(0, 255)
        b = random.randint(0, 255)

        # 重新赋值
        self.text_obj = self.font.render("分数:%d" % GameScore.__cls_score, 1, (r, g, b))

5、hero_plane

import pygame, plane_bullet

# 定义一个常量(赋值后不能修改)常量一般使用大写字母
WINDOW_WIDTH, WINDOW_HEIGHT = 512, 768
# python中 崇尚的是一切靠自觉

# 自定义一个英雄飞机类
class HeroPlane(object):

    def __init__(self):
        # 赋值
        self.img = pygame.image.load("res/hero2.png")
        # 获取图片矩形
        self.img_rect = self.img.get_rect()
        # 设置飞机的初始位置
        self.img_rect.move_ip((WINDOW_WIDTH - self.img_rect[2])/2, WINDOW_HEIGHT - self.img_rect[3] - 50)
        # 飞机速度
        self.speed = 3
        # 子弹弹夹
        self.bullet_list = [plane_bullet.PlaneBullet() for i in range(6)]


    # 向上
    def move_up(self):
        # 边缘检测
        if self.img_rect[1] >= 0:
            self.img_rect.move_ip(0, -self.speed)

    # 向下
    def move_down(self):
        # 边缘检测
        if self.img_rect[1] <= WINDOW_HEIGHT - self.img_rect[3]:
            self.img_rect.move_ip(0, self.speed)

    # 向左
    def move_left(self):
        # 边缘检测
        if self.img_rect[0] >= 0:
            self.img_rect.move_ip(-self.speed, 0)

    # 向右
    def move_right(self):
        # 边缘检测
        if self.img_rect[0] <= WINDOW_WIDTH - self.img_rect[2]:
            self.img_rect.move_ip(self.speed, 0)

    # 发射子弹
    def shot(self):
        # 遍历所有的子弹
        for bullet in self.bullet_list:
            # 判断未发射的
            if not bullet.is_shot:
                # 设置子弹的位置
                bullet.img_rect[0] = self.img_rect[0] + (self.img_rect[2] - bullet.img_rect[2])/2
                bullet.img_rect[1] = self.img_rect[1] - bullet.img_rect[3]

                # 设置为发射状态
                bullet.is_shot = True
                # 一次只能发射一颗子弹
                break

6、plane_bullet

import pygame

# 自定义一个英雄飞机子弹类
class PlaneBullet(object):

    def __init__(self):
        # 图片
        self.img = pygame.image.load("res/bullet_10.png")
        # 获取子弹的图片矩形
        self.img_rect = self.img.get_rect()
        # 子弹的状态
        self.is_shot = False
        # 速度
        self.speed = 4

    # 向上移动
    def move_up(self):
        self.img_rect.move_ip(0, -self.speed)
        # 注意改变子弹的状态
        if self.img_rect[1] <= -self.img_rect[3]:
            # 设置为未发射状态
            self.is_shot = False

猜你喜欢

转载自blog.csdn.net/qq_52479948/article/details/129833497