python——飞机大战小游戏_python小游戏代码飞机大战-程序员宅基地

技术标签: python  pygame  pycharm  # 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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_52479948/article/details/129833497

智能推荐

hive使用适用场景_大数据入门:Hive应用场景-程序员宅基地

文章浏览阅读5.8k次。在大数据的发展当中,大数据技术生态的组件,也在不断地拓展开来,而其中的Hive组件,作为Hadoop的数据仓库工具,可以实现对Hadoop集群当中的大规模数据进行相应的数据处理。今天我们的大数据入门分享,就主要来讲讲,Hive应用场景。关于Hive,首先需要明确的一点就是,Hive并非数据库,Hive所提供的数据存储、查询和分析功能,本质上来说,并非传统数据库所提供的存储、查询、分析功能。Hive..._hive应用场景

zblog采集-织梦全自动采集插件-织梦免费采集插件_zblog 网页采集插件-程序员宅基地

文章浏览阅读496次。Zblog是由Zblog开发团队开发的一款小巧而强大的基于Asp和PHP平台的开源程序,但是插件市场上的Zblog采集插件,没有一款能打的,要么就是没有SEO文章内容处理,要么就是功能单一。很少有适合SEO站长的Zblog采集。人们都知道Zblog采集接口都是对Zblog采集不熟悉的人做的,很多人采取模拟登陆的方法进行发布文章,也有很多人直接操作数据库发布文章,然而这些都或多或少的产生各种问题,发布速度慢、文章内容未经严格过滤,导致安全性问题、不能发Tag、不能自动创建分类等。但是使用Zblog采._zblog 网页采集插件

Flink学习四:提交Flink运行job_flink定时运行job-程序员宅基地

文章浏览阅读2.4k次,点赞2次,收藏2次。restUI页面提交1.1 添加上传jar包1.2 提交任务job1.3 查看提交的任务2. 命令行提交./flink-1.9.3/bin/flink run -c com.qu.wc.StreamWordCount -p 2 FlinkTutorial-1.0-SNAPSHOT.jar3. 命令行查看正在运行的job./flink-1.9.3/bin/flink list4. 命令行查看所有job./flink-1.9.3/bin/flink list --all._flink定时运行job

STM32-LED闪烁项目总结_嵌入式stm32闪烁led实验总结-程序员宅基地

文章浏览阅读1k次,点赞2次,收藏6次。这个项目是基于STM32的LED闪烁项目,主要目的是让学习者熟悉STM32的基本操作和编程方法。在这个项目中,我们将使用STM32作为控制器,通过对GPIO口的控制实现LED灯的闪烁。这个STM32 LED闪烁的项目是一个非常简单的入门项目,但它可以帮助学习者熟悉STM32的编程方法和GPIO口的使用。在这个项目中,我们通过对GPIO口的控制实现了LED灯的闪烁。LED闪烁是STM32入门课程的基础操作之一,它旨在教学生如何使用STM32开发板控制LED灯的闪烁。_嵌入式stm32闪烁led实验总结

Debezium安装部署和将服务托管到systemctl-程序员宅基地

文章浏览阅读63次。本文介绍了安装和部署Debezium的详细步骤,并演示了如何将Debezium服务托管到systemctl以进行方便的管理。本文将详细介绍如何安装和部署Debezium,并将其服务托管到systemctl。解压缩后,将得到一个名为"debezium"的目录,其中包含Debezium的二进制文件和其他必要的资源。注意替换"ExecStart"中的"/path/to/debezium"为实际的Debezium目录路径。接下来,需要下载Debezium的压缩包,并将其解压到所需的目录。

Android 控制屏幕唤醒常亮或熄灭_android实现拿起手机亮屏-程序员宅基地

文章浏览阅读4.4k次。需求:在诗词曲文项目中,诗词整篇朗读的时候,文章没有读完会因为屏幕熄灭停止朗读。要求:在文章没有朗读完毕之前屏幕常亮,读完以后屏幕常亮关闭;1.权限配置:设置电源管理的权限。

随便推点

目标检测简介-程序员宅基地

文章浏览阅读2.3k次。目标检测简介、评估标准、经典算法_目标检测

记SQL server安装后无法连接127.0.0.1解决方法_sqlserver 127 0 01 无法连接-程序员宅基地

文章浏览阅读6.3k次,点赞4次,收藏9次。实训时需要安装SQL server2008 R所以我上网上找了一个.exe 的安装包链接:https://pan.baidu.com/s/1_FkhB8XJy3Js_rFADhdtmA提取码:ztki注:解压后1.04G安装时Microsoft需下载.NET,更新安装后会自动安装如下:点击第一个傻瓜式安装,唯一注意的是在修改路径的时候如下不可修改:到安装实例的时候就可以修改啦数据..._sqlserver 127 0 01 无法连接

js 获取对象的所有key值,用来遍历_js 遍历对象的key-程序员宅基地

文章浏览阅读7.4k次。1. Object.keys(item); 获取到了key之后就可以遍历的时候直接使用这个进行遍历所有的key跟valuevar infoItem={ name:'xiaowu', age:'18',}//的出来的keys就是[name,age]var keys=Object.keys(infoItem);2. 通常用于以下实力中 <div *ngFor="let item of keys"> <div>{{item}}.._js 遍历对象的key

粒子群算法(PSO)求解路径规划_粒子群算法路径规划-程序员宅基地

文章浏览阅读2.2w次,点赞51次,收藏310次。粒子群算法求解路径规划路径规划问题描述    给定环境信息,如果该环境内有障碍物,寻求起始点到目标点的最短路径, 并且路径不能与障碍物相交,如图 1.1.1 所示。1.2 粒子群算法求解1.2.1 求解思路    粒子群优化算法(PSO),粒子群中的每一个粒子都代表一个问题的可能解, 通过粒子个体的简单行为,群体内的信息交互实现问题求解的智能性。    在路径规划中,我们将每一条路径规划为一个粒子,每个粒子群群有 n 个粒 子,即有 n 条路径,同时,每个粒子又有 m 个染色体,即中间过渡点的_粒子群算法路径规划

量化评价:稳健的业绩评价指标_rar 海龟-程序员宅基地

文章浏览阅读353次。所谓稳健的评估指标,是指在评估的过程中数据的轻微变化并不会显著的影响一个统计指标。而不稳健的评估指标则相反,在对交易系统进行回测时,参数值的轻微变化会带来不稳健指标的大幅变化。对于不稳健的评估指标,任何对数据有影响的因素都会对测试结果产生过大的影响,这很容易导致数据过拟合。_rar 海龟

IAP在ARM Cortex-M3微控制器实现原理_value line devices connectivity line devices-程序员宅基地

文章浏览阅读607次,点赞2次,收藏7次。–基于STM32F103ZET6的UART通讯实现一、什么是IAP,为什么要IAPIAP即为In Application Programming(在应用中编程),一般情况下,以STM32F10x系列芯片为主控制器的设备在出厂时就已经使用J-Link仿真器将应用代码烧录了,如果在设备使用过程中需要进行应用代码的更换、升级等操作的话,则可能需要将设备返回原厂并拆解出来再使用J-Link重新烧录代码,这就增加了很多不必要的麻烦。站在用户的角度来说,就是能让用户自己来更换设备里边的代码程序而厂家这边只需要提供给_value line devices connectivity line devices