目录

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

相关链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: