python——飞机大战小游戏

这篇具有很好参考价值的文章主要介绍了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


python——飞机大战小游戏

先安装一下pygame这个库

python——飞机大战小游戏然后将素材烤入,一些飞机图片和背景

python——飞机大战小游戏 

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

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

pip下载的它找不到

python——飞机大战小游戏 我又重新下载了一下

python——飞机大战小游戏

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

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

python——飞机大战小游戏 

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()



所有的东西都在一起太多了,模块化一下文章来源地址https://www.toymoban.com/news/detail-436594.html

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

到了这里,关于python——飞机大战小游戏的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用Python制作的小游戏---飞机大战

    1.pygame模块 1. 熟悉Python面向对象编程的方法和套路 1.敌机模块 2. 地图模块 3. 得分模块 4 .英雄飞机模块 5. 子弹模块 6. 主模块

    2024年02月03日
    浏览(48)
  • pygame飞机大战小游戏(python大作业)

      python大作业,在查看了老师给的链接发现教学视频不完整,所以借用了同学的《Python编程 从入门到实践》中的一个项目,学习模仿。 二、游戏具体介绍 这是一款由辉辉亲自打造的太空对战小游戏。 游戏背景:在广袤无垠的太空里有一群蓝精灵(不是)有一群邪恶的坏人,

    2024年02月11日
    浏览(59)
  • 【python】 pygame学习示例 --飞机大战小游戏制作

    python版本:3.8.5 所需模块:pygame random os pygame版本:20.1 开发环境:pycharm专业版 硬件环境:win11 8G内存以上 使用python的第三方库–pygame 制作飞机大战小游戏 小游戏的内容包括: 玩家player的移动 子弹的发射 陨石的随机掉落(包括旋转 大小 下落角度) 玩家 子弹 陨石的碰撞交互

    2024年02月04日
    浏览(55)
  • python小游戏毕设 飞机大战设计与实现

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 飞机大战小游戏设计与实现 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:3分 利用Python制作的一个简易版类\\\"飞机大

    2024年02月10日
    浏览(58)
  • Python开发小游戏:写一个飞机大战只需要500行代码!

    ‘’’ :param background_image_path: 背景图片的路径地址 :param size: 游戏窗口的大小 :param title: 游戏窗口的标题 :param font_name: 指定字体 :param font_size: 指定字体大小 :param speed: 背景图滚动整个窗口一次所用时间,单位为ms ‘’’ self.size = size self.screen = pygame.display.set_mode(size) self.tit

    2024年04月11日
    浏览(49)
  • 前端技术搭建飞机大战小游戏(内含源码)

    上周我们实通过前端基础实现了弹珠游戏,当然很多伙伴再评论区提出了想法,后续我们会考虑实现的,今天还是继续按照我们原定的节奏来带领大家完成一个飞机大战游戏,功能也比较简单简单,也是想借助这样一个简单的功能,然后来帮助大家了解我们JavaScript在前端中的

    2024年02月04日
    浏览(52)
  • python人机大战小游戏代码

    2024年02月14日
    浏览(50)
  • python项目分享 - python坦克大战小游戏

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 python小游戏毕设 坦克大战小游戏设计与实现 (源码) 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:4分 项目获取:

    2024年02月03日
    浏览(47)
  • python小游戏毕设 坦克大战游戏设计与实现

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 python小游戏毕设 坦克大战小游戏设计与实现 (源码) 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:4分 《坦克大战》

    2024年02月05日
    浏览(65)
  • 毕业设计 python坦克大战小游戏

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 python小游戏毕设 坦克大战小游戏设计与实现 (源码) 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:4分 项目获取:

    2024年02月21日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包