当前位置: 首页 > news >正文

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")# 设置游戏窗口logopygame.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):passdef 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_HEIGHTself.img_2_y = 0#速度self.speed = 2#向下移动def move_down(self):#重置地图Y轴if self.img_1_y >= 0:self.img_1_y = - WINDOW_HEIGHTself.img_2_y = 0self.img_1_y += self.speedself.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")# 设置游戏窗口logopygame.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_HEIGHTself.img_2_y = 0#速度self.speed = 2#向下移动def move_down(self):#重置地图Y轴if self.img_1_y >= 0:self.img_1_y = - WINDOW_HEIGHTself.img_2_y = 0self.img_1_y += self.speedself.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")# 设置游戏窗口logopygame.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])/2bullet.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_HEIGHTself.img2_y = 0# 速度self.speed = 2# 向下移动def move_down(self):# 地图的y轴重置if self.img1_y >= 0:self.img1_y = -WINDOW_HEIGHTself.img2_y = 0self.img1_y += self.speedself.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")# 设置游戏窗口的logopygame.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:# 判断是否按得是escif event.key == pygame.K_ESCAPE:self.game_over()# 判断是否按得是空格if event.key == pygame.K_SPACE:self.hero_plane.shot()# 监听键盘中的按键长按-> 元组(只有两种情况 0 或者 1) -> ASCIIpressed_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")# 设置游戏窗口的logopygame.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:# 判断是否按得是escif event.key == pygame.K_ESCAPE:self.game_over()# 判断是否按得是空格if event.key == pygame.K_SPACE:self.hero_plane.shot()# 监听键盘中的按键长按-> 元组(只有两种情况 0 或者 1) -> ASCIIpressed_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,否则返回Falseflag = 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_HEIGHTself.img2_y = 0# 速度self.speed = 2# 向下移动def move_down(self):# 地图的y轴重置if self.img1_y >= 0:self.img1_y = -WINDOW_HEIGHTself.img2_y = 0self.img1_y += self.speedself.img2_y += self.speed

4、game_score


import pygame, random# 自定义文字管理类
class GameScore(object):# 记录分数__cls_score = 0def __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])/2bullet.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——飞机大战小游戏

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

数组(完全二叉树)向下建堆法与堆排序O(N*logN)

TIPS AdjustUp & AdjustDown向上调整AdjustUp与向下调整AdjustDown的参数是一个数组&#xff08;完全二叉树&#xff09;需要进行调整操作的数值的下标/一个数组&#xff08;完全二叉树&#xff09;堆元素个数需要调整操作的数值的下标。实际上就是对完全二叉树当中的某一点…...

Lua require 函数使用

从 Lua 的用户文档中我们知道 require("modName") 函数是用来加载模块的&#xff0c;而如果这个modName已经用require 加载过的&#xff0c;再调用require时&#xff0c;将直接返回模块的值。因为函数首先查找 package.loaded 表&#xff0c; 检测 modName 是否被加载…...

【面试】如何定位线上问题?

这个面试题我在两年社招的时候遇到过&#xff0c;前几天面试也遇到了。我觉得我每一次都答得中规中矩&#xff0c;今天来梳理复盘下&#xff0c;下次又被问到的时候希望可以答得更好。 下一次我应该会按照这个思路去答&#xff1a; 1、如果线上出现了问题&#xff0c;我们更多…...

字节二面,原来我对自动化测试的理解太浅了

如果你入职一家新的公司&#xff0c;领导让你开展自动化测试&#xff0c;作为一个新人&#xff0c;你肯定会手忙脚乱&#xff0c;你会如何落地自动化测试呢&#xff1f; 01 什么是自动化 有很多人做了很长时间的自动化但却连自动化的概念都不清楚&#xff0c;这样的人也是很悲…...

Android11.0 应用升级成功后立即断电重启,版本恢复

问题&#xff1a;客户反馈内置的应用升级成功后立刻断电重启&#xff0c;应用的版本被恢复。 使用adb命令升级客户应用&#xff0c;查看版本显示已更新&#xff0c;/data/system目录下packages.xml和packages.xml中应用版本信息均已更新 C:\Users\dell>adb shell dumpsys …...

关于python常用软件用法:Pycharm 常用功能

人生苦短&#xff0c;我用python 一.Pycharm的基本使用 1.在Pycharm下为你的Python项目配置Python解释器 &#xff08;1&#xff09;.Setting>Project Interpreter>源码资料电子书:点击此处跳转文末名片获取 二.在Pycharm下创建Python文件、Python模块 1.File>New&g…...

SOLIDWORKS你不知道的小技巧

◉ SOLIDWORKS圆弧长度标注点智能标注&#xff0c;再选中该圆弧&#xff0c;然后分别点圆弧的两个端点&#xff0c;点击左键可以标注圆弧长度。◉ SOLIDWORKS强力裁剪剪裁实体中的强劲剪裁&#xff0c;除了可以裁剪实体外&#xff0c;还可以任意延伸实体。◉ SOLIDWORKS转折线转…...

有了HTTP,为啥还要用RPC

既然有 HTTP 请求&#xff0c;为什么还要用 RPC 调用&#xff1f; 一直以来都没有深究过RPC和HTTP的区别&#xff0c;不都是写一个服务然后在客户端调用么&#xff1f; HTTP和RPC最本质的区别&#xff0c;就是 RPC 主要是基于 TCP/IP 协议的&#xff0c;而 HTTP 服务主要是基…...

[leetcode] 动态规划

背包 先啃懂 背包九讲 01背包&#xff0c;即物品有限。 for 物品for 容量&#xff08;倒序&#xff09;P1048 [NOIP2005 普及组] 采药 [ 原题 | 题解 ] P1049 [NOIP2001 普及组] 装箱问题 [ 原题 | 题解 ] P1507 NASA的食物计划 [ 原题 | 题解 ] P1510 精卫填海 [ 原题 | 题…...

科大奥瑞物理实验——热电偶特性及其应用研究

实验名称&#xff1a;热电偶特性及其应用研究 1. 实验目的&#xff1a; 掌握电位差计的工作原理和结构特点&#xff1b;了解温差电偶测温的原理和方法&#xff1b;学会电位差计的使用及注意事项。 2. 实验器材&#xff1a; 电位差计 标准电池 光电检流计 稳压电源 温差电偶…...

Eclips快捷键大全(超详细)

Eclips快捷键大全&#xff08;超详细&#xff09;前言一、常用快捷键二、编辑快捷键三、导航快捷键四、运行和调试快捷键五、重构快捷键六、代码生成快捷键七、项目导航快捷键八、帮助快捷键九、搜索快捷键十、标记快捷键十一、版本控制快捷键十二、其它快捷键前言 本博主将用C…...

整懵了,蚂蚁金服4面成功拿下测开offer,涨薪10k,突然觉得跳槽也不是那么难

蚂蚁的面试挺独特的&#xff0c;每轮面试都没有HR约时间&#xff0c;一般是晚上8点左右面试官来一个电话&#xff0c;问是否能面试&#xff0c;能的话开始面&#xff0c;不能就约一个其他时间。 全程4面&#xff0c;前四面技术面&#xff0c;电话面试&#xff0c;最后一面是HR面…...

C++内存分布malloc-free-new-delete的区别和联系

目录 一、内存分布 1.1内存分布图&#xff1a; 1.2 为什么要将bss和data区分开呢&#xff1f; 1.3 堆和栈有什么区别 二、malloc、free&#xff1b;new、delete 2.1 new和delete是如何实现的&#xff0c;new与malloc的异同处 2.2既然有了malloc/free&#xff0c;C为什么还…...

【华为OD机试 2023最新 】 最多颜色的车辆(C++ 100%)

文章目录 题目描述输入描述输出描述用例题目解析C++题目描述 在一个狭小的路口,每秒只能通过一辆车,假设车辆的颜色只有 3 种,找出 N 秒内经过的最多颜色的车辆数量。 三种颜色编号为0 ,1 ,2 输入描述 第一行输入的是通过的车辆颜色信息 [0,1,1,2] 代表4 秒钟通过的车…...

Linux安全加固

一、重要文件 /etc/passwd #记录本地用户的属性信息&#xff0c;如UID、GID /etc/shadow #存放用户的口令信息 只有系统管理员能查看 /etc/pam.d/system-auth #账户安全配置文件 /etc/login.defs #修改登录的配置文件 /etc/profile …...

Java基础学习(6)

Java基础学习一 字符串1.1 API 与 API文档1.1.1 如何使用帮助文档查找想要导用的方法1.2 String 概述1.3 创建String对象的两种方式第一种第二种1.4 Java常用字符串方法1.4.1 比较1.4.2 字符串通过索引取出1.4.3 取出字符串中的单个字符1.4.4 替换出字符串当中的字符1.4.5 取出…...

【LeetCode】链表练习 9 道题

第一题&#xff1a;移除链表元素 题目描述&#xff1a; 给你一个链表的头节点head和一个整数val&#xff0c;请你删除链表中所有满足Node.val val的节点&#xff0c;并返回新的头节点 。 列表中的节点数目在范围 [0, 10^4] 内1 < Node.val < 500 < val < 50 /…...

轴承远程监控系统解决方案

一、项目背景 随着现代机械设备朝着高集成、高精密度、系统化、自动化的方向发展&#xff0c;在工业生产中一旦机器发生故障&#xff0c;即使局部失灵&#xff0c;都可能导致设备工作失效&#xff0c;甚至造成整个自动化车间停产&#xff0c;从而给工业生产带来巨大的损失。轴承…...

阿里云轻量服务器Workbench root远程连接和一键连接的区别

阿里云轻量应用服务器远程连接支持Workbench root用户连接和Workbench一键连接&#xff0c;Workbench root需要输入root密码&#xff0c;一键连接不需要输入密码&#xff0c;但是也无法获得root权限&#xff0c;阿里云百科来详细说下阿里云轻量应用服务器远程连接说明&#xff…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...