目录
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,把公开它的库选上终于好了
#导入模块
import pygame
#对pygame 进行实例化, 叫做硬件准备
pygame.init()
#导入模块
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)
#导入模块
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()
#导入模块
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()
#导入模块
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("向右")
#导入模块
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("向右")
#导入模块
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("向右")
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()
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()
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()
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()
所有的东西都在一起太多了,模块化一下
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()
# 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()
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
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))
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
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