python——飞机大战小游戏

2023-11-03

目录

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python——飞机大战小游戏 的相关文章

  • Python 中的字节数组

    如何在 Python 中表示字节数组 如 Java 中的 byte 我需要用 gevent 通过网络发送它 byte key 0x13 0x00 0x00 0x00 0x08 0x00 在Python 3中 我们使用bytes对象 也称为s
  • PyQt:如何通过匿名代理使用网页

    这真让我抓狂 我想在 QWebPage 中显示一个 url 但我想通过匿名代理来实现 Code setting up the proxy proxy QNetworkProxy proxy setHostName 189 75 98 199
  • JavaScript 相当于 Python 的参数化 string.format() 函数

    这是 Python 示例 gt gt gt Coordinates latitude longitude format latitude 37 24N longitude 115 81W Coordinates 37 24N 115 81W
  • Python有条件求解时滞微分方程

    我在用dde23 of pydelay包来求解延迟微分方程 我的问题 如何有条件地编写方程 例如目标方程有两个选项 when x gt 1 dx dt 0 25 x t tau 1 0 pow x t tau 10 0 0 1 x othe
  • boto3 资源(例如 DynamoDB.Table)的类型注释

    The boto3库提供了几种返回资源的工厂方法 例如 dynamo boto3 resource dynamodb Table os environ DYNAMODB TABLE 我想注释这些资源 以便我可以获得更好的类型检查和完成 但我
  • for 循环如何评估其参数

    我的问题很简单 Does a for循环评估它每次使用的参数 Such as for i in range 300 python 是否会为此循环的每次迭代创建一个包含 300 个项目的列表 如果是的话 这是避免这种情况的方法吗 lst ra
  • Python在postgresql表中查找带有单引号符号的字符串

    我需要从 psql 表中查找包含多个单引号的字符串 我当前的解决方案是将单引号替换为双单引号 如下所示 sql query f SELECT exists SELECT 1 FROM table name WHERE my column m
  • 为什么我的代码不能根据字典解码加密字符串?

    我有一本字典 其中包含代表字母的键和值 例如一个简单的 DICT CODE b g n a p o x d t y 我收到了一个加密代码 并将该字符串转换为一个列表 其中每个项目都是一个单词 我需要根据字典中的项目来解决它 代码示例是 wo
  • 登录网站并使用 python 请求下载文件

    我有一个带有 HTML 表单的网站 登录后 它会将我带到 start php 站点 然后将我重定向到overview php 我想从该服务器下载文件 当我单击 ZIP 文件的下载链接时 链接后面的地址是 getimage php path
  • 如何将 self 传递给装饰器?

    我该如何通过self key下面进入装饰器 class CacheMix object def init self args kwargs super CacheMix self init args kwargs key func Cons
  • Python Pandas 根据另一列的总计从另一个数据帧中选择值

    我下面有一个 DataFrame 但我需要根据取消和订单列从每个代码中选择行 假设代码 xxx 的阶数为 6 1 5 1 阶数为 11 我需要一种算法 可以选择满足总共 11 行的行 阶数为 6 5 如果没有行匹配 则选择最接近的 id 并
  • 使用 scipy curve_fit 拟合噪声指数的建议?

    我正在尝试拟合通常按以下方式建模的数据 def fit eq x a b c d e return a 1 np exp x b c np exp x d e x np arange 0 100 0 001 y fit eq x 1 1 1
  • 与 while 循环一样,如何跳过 for 循环中的步骤?

    我尝试像 while 循环一样跳过 for 循环中的几个步骤 在 while 循环中 步骤根据特定条件进行调整 如下面的代码所示 i 0 while i lt 10 if i 3 i 5 else print i i i 1 result
  • 在Python中计算内存碎片

    我有一个长时间运行的进程 不断分配和释放对象 尽管正在释放对象 但 RSS 内存使用量会随着时间的推移而增加 如何计算发生了多少碎片 一种可能性是计算 RSS sum of allocations 并将其作为指标 即便如此 我该如何计算分母
  • Python 惰性迭代器

    我试图了解迭代器表达式如何以及何时被求值 以下似乎是一个懒惰的表达 g i for i in range 1000 if i 3 i 2 然而 这个在构造上失败了 g line strip for line in open xxx r if
  • 具有屏蔽无效值的 pcolormesh

    我试图将一维数组绘制为 pcolormesh 因此颜色沿 x 轴变化 但每个 x 的 y 轴保持不变 但我的数据有一些错误值 因此我使用屏蔽数组和自定义颜色图 其中屏蔽值设置为蓝色 import numpy as np import mat
  • Python 类型安全吗?

    根据维基百科 https en wikipedia org wiki Type system Type safety and memory safety 如果一种语言不允许违反类型系统规则的操作或转换 计算机科学家就认为该语言是 类型安全的
  • Python 声音(“铃声”)

    我想让一个 python 程序在完成任务时通过发出嘟嘟声来提醒我 目前 我使用import os然后使用命令行语音程序说 进程完成 我更愿意它是一个简单的 铃 我知道有一个函数可以用于Cocoa apps NSBeep 但我认为这与此没有太
  • 检测 IDLE 的存在/如何判断 __file__ 是否未设置

    我有一个脚本需要使用 file 所以我了解到 IDLE 没有设置这个 有没有办法从我的脚本中检测到 IDLE 的存在 if file not in globals file is not set 如果你想做一些特别的事情 file 未设置
  • 使用 urllib 编码时保持 url 参数有序

    我正在尝试用 python 模拟 get 请求 我有一个参数字典 并使用 urllib urlencode 对它们进行 urlencode 我注意到虽然字典的形式是 k1 v1 k2 v2 k3 v3 urlencoding 后参数的顺序切

随机推荐

  • linux下wifi的sta和ap操作

    前言 在linux开发中wifi是很常见的一个工作 wifi有STA模式和AP模式 今天分享下如何使用工具在Linux中控制wifi 作者 良知犹存 转载授权以及围观 欢迎关注微信公众号 羽林君 或者添加作者个人微信 become me 介
  • [网络安全]xss-labs level-4 解题详析

    读者可参考 订阅专栏 Xss Labs靶场攻防实战 姿势 逻辑后端代码 使用 str replace 分别将 gt 和 lt 替换为空字符串 该题使用onblur onfocus事件绕过 onblur onfocus事件 onblur 事件
  • 本地化部署大语言模型 ChatGLM

    本地化部署大语言模型 ChatGLM 本地化部署大语言模型 ChatGLM 前期筹备 GitHub 基础包 语言模型文件 基础配置 显存查看方法 Anaconda 模块 ChatGLM 6B 网页部署 Anaconda 环境创建 根目录操作
  • HTML编程之js跨域抓取问题

    对于网站建设来说 通常会需要遇到js跨域抓取的问题 那么对于初学者来说 都不知道该怎么来解决 对此 郑州网站建设公司燚轩科技就来跟大家好好的分析解答一下吧 源代码如下
  • Unix and perl primer for Biologists - Part1 :Unix - Learning the Essentials - Reading Notes(U13-U24)

    U13 Time to tidy up use the rmdir command this will only remove empty directories U14 The art of typing less to do more
  • 分页乱码问题(解决)

    上一个blog中 粗略的使用了下分页标签使用 pg使用问题还是有很多 如 分页中乱码 多java代码块下面用一个
  • CUDA Samples: Streams' usage

    以下CUDA sample是分别用C 和CUDA实现的流的使用code 并对其中使用到的CUDA函数进行了解说 code参考了 GPU高性能编程CUDA实战 一书的第十章 各个文件内容如下 funset cpp include funset
  • 关于示波器地线的问题!

    用信号发生器给板子输入信号 则示波器一般只能用于测试电路上某个节点和地之间的波形 如果测两个节点之间的波形 则探头上的地线可能会将地线后面其余的电路短路掉 所以 要想测两个节点间的波形 要合理的变换一下电路形式 或者做一些用于测试的附加电路
  • 以太坊的私钥、公钥、地址、账户之间的关系总结

    在以太坊中 账户 地址 私钥 Private Key 和公钥 Public Key 是非常重要的概念 账户扮演着以太坊的中心角色 地址是我们与以太坊系统进行交互的标识 它是以太坊账户与外界进行交互的名字 而私钥与公钥是保护我们账户安全的重要
  • 微搭低代码学习之数据展示

    低代码平台是一个快速发展的领域 未来有着广阔的发展前景 以下是一些低代码平台未来的发展方向 1 人工智能和机器学习 随着人工智能和机器学习技术的不断发展 低代码平台将能够更好地利用这些技术来提高应用程序的智能化和自动化水平 例如 低代码平台
  • 如何动态生成antd vue的menu组件

    目录 1 需求背景 2 解决方案 3 代码示例 1 需求背景 需要根据动态生成垂直菜单组件 数据来源的一级菜单可能包含二级子菜单 也可能不包含二级子菜单 难度在于是否包含二级子菜单决定着生成
  • 开源自动化测试平台介绍一览

    以下为小编整理的 各类自动化测试平台 供大家工作中自己参考 一 autotestplat 作者 fin 功能 接口自动化测试 性能测试 appui自动化测试 webui自动化测试 源码 https github com testdevhom
  • TensorRT Samples: MNIST API

    关于TensorRT的介绍可以参考 http blog csdn net fengbingchun article details 78469551 以下是参考TensorRT 2 1 2中的sampleMNISTAPI cpp文件改写的实
  • douyin【商品抢购js脚本】

    文章目录 前言 订阅须知 知识点 源码 前言 脚本主要用来实现抢购douyin商城 直播间秒杀商品等一系列商品 订阅须知 订阅后 只提供js源代码 不提供教学 请根据源码自行抓包 知识点 1 在查询串插入一个固定的键rstr 2 对查询串进
  • Java本地缓存技术选型

    常用的本地缓存 Guava Cache Guava Cache 是 Google 开发的一个 Java 本地缓存库 它提供了一些缓存特性 比如大小限制 自动过期 移除通知等等 Guava Cache 使用的是 LRU Least Recen
  • 如何和AI聊天

    AI产品工具目录 AI产品目录 Prompt 在和AI聊天时 你得表明你需要啥 并且描述的越精确 AI回答的就越贴近你的预期 简单的对话 可以自己尝试 但是如果想做应用级别的就得学习这种聊天技术 如何构建Prompt Prompt 是指用户
  • MySQL生产环境高可用架构实战

    分布式技术MongoDB 1 MySQL高可用集群介绍 1 1 数据库主从架构与分库分表 1 2 MySQL主从同步原理 2 动手搭建MySQL主从集群 2 1 基础环境搭建 2 2 安装MySQL服务 2 2 1 初始化MySQL 2 2
  • Linux Kjournald 进程高IO

    iotop查看各进程占用IO的情况 图片如下 发现 Kjournald IO占用过高 图片未保存 问题原因 由于 Kjournald 进程是ext3系统的日志进程 当ext3系统存在重大变更时 此进程会占高IO df h 查看设备 根据设备
  • 【数据结构】线段树笔记2

    数据结构 零基础线段树笔记1 参考和引用 线段树讲解 本博客主要是这个的笔记 线段树相关知识 线段树的结构 N的原数组 要4N的大小去存储线段树 原因 看线段树讲解吧 代码相关 更新当前节点 push up 是更新当前节点的操作 有两种写法
  • python——飞机大战小游戏

    目录 1 导入模块 2 窗口操作 3 事件操作 4 长按事件 5 添加游戏背景 6 添加英雄飞机 7 获取飞机的图片矩形 8 基本游戏窗口 9 添加游戏窗口图片 10 英雄飞机登场 11 英雄飞机装备子弹并发射 1 enemy plane