赞
踩
1.pygame模块
1. 熟悉Python面向对象编程的方法和套路
- 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(1, 4)
-
- # 向下移动
- def move_down(self):
- #移动飞机
- self.img_rect.move_ip(0, self.speed)
- # 判断如果在屏幕消失后 位置重置
- if self.img_rect[1] >= WINDOW_HEIGHT:
- self.reset()
-
-
-
- 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 = 2
- # 子弹弹夹
- 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
- # coding=utf-8
- #导入的模块可以是安装的,也可以是自己编写的模块文件,import导入类似C语言头文件的写法
- 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()
- self.__delay()
-
- def __delay(self):
- i = 100000
- while i > 0:
- i -= 1
-
- # 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()c
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。