只需要修改一下招聘的名字和音乐的名字那么这个程序就可以使用了
- import sys
- import pygame
- from pygame.sprite import Group
- from pygame.sprite import Sprite
- from pygame.locals import *
- import time
- from pygame import mixer
-
-
- import pygame.font
-
- #初始化设置
- class Settings():
- #定义全局变量
- def __init__ (self):
- self.screen_width = 1200
- self.screen_height = 800
- self.bg_color = (230,230,230)
-
-
- #后面的就是开始设置子弹了
- self.bullet_speed_factor = 1
- self.bullet_width = 3
- self.bullet_height = 15
- self.bullet_color = 60, 60, 60
-
-
-
- #这里是计数器的参数
- self.alien_points = 50
-
-
- #飞船的所有条件
- class Ship():
- def __init__(self,screen):
- #初始化飞船并设置器初始位置
- self.screen = screen
- image = pygame.image.load('头像.png')
- self.image = pygame.transform.scale(image, (100, 100))
- #捕捉照片的坐标
- self.rect = self.image.get_rect()
- #这个是捕捉屏幕的位置
- self.screen_rect = screen.get_rect()
- #将每艘新飞船放在屏幕底部中央
- #就是让照片的X和Y和屏幕的X,Y一样
- self.rect.centerx = self.screen_rect.centerx
- self.rect.bottom = self.screen_rect.bottom
-
- # j就把填充好的最终结果给最后那个blitme
- def blitme(self):
- # 指定位置绘制飞船
- # blit方法先填充照片,后面填充已经和screen保持一致的位置
- self.screen.blit(self.image, self.rect)
-
-
-
- class Buttle1(pygame.sprite.Sprite):
- # 构造函数
- def __init__(self, init_position):
- pygame.sprite.Sprite.__init__(self) # 父类构造函数
- '''精灵图片:加载图片(1)或者绘制(2)'''
- # 方法(1)
- # self.image = pygame.image.load('resources/images/enemy.png')
- # 方法(2)
- self.image = pygame.Surface([100, 100]) # 绘制大小
- self.image.fill((255, 255, 255)) # 填充颜色
- self.rect = self.image.get_rect()
- #这里的这个toplft是关键字
- self.rect.x = init_position[0]-50
- self.rect.y = init_position[1]
- self.speed = 5
-
- # 每个精灵组执行update,组内所有精灵都会update
- def update(self):
- self.rect.top = self.rect.top - self.speed
- if self.rect.top > 800:
- self.kill()
-
-
- #创建自动化的外星人
- #他所接受的是经过修改的ai_settings
- class Alien(Sprite):
- #传入屏幕参数就是为了后面的blitem画画,在screen上面
- """表示单个外星人的类"""
- def __init__(self, ai_settings, screen):
- """初始化外星人并设置其起始位置"""
- #自己继承自己的种类和上面的那个一样,其实就是为了Sprite的继承
- #pygame.sprite.Sprite.__init__(self) # 父类构造函数
- super(Alien, self).__init__()
- #这个里面是为了给外星人用的
- self.screen = screen
- #这个是为了干什么
- self.ai_settings = ai_settings
- # 加载外星人图像,并设置其rect属性
- self.image = pygame.transform.scale(pygame.image.load('头像.png'), (100, 100))
- # 这里就有点难看懂了
- self.rect = self.image.get_rect()
- # 每个外星人最初都在屏幕左上角附近---这个就有点恼火了为什么这样
- x = float(self.rect.width)
- self.rect.x = x
- y = float(self.rect.height)
- self.rect.y = y
- # 存储外星人的准确位置
- #self.x = float(self.rect.x)
- #self.rect.topleft = init_position
-
-
-
- def update(self):
- """在指定位置绘制外星人"""
- #top是关键字
- self.rect.top = self.rect.top + 1
- if self.rect.top > 800:
- self.kill()
- #self.screen.blit(self.image, self.rect)
-
-
-
-
- class Button():
-
- def __init__(self, screen):
-
-
- """初始化按钮的属性"""
- self.screen = screen
- self.screen_rect = screen.get_rect()
-
- # 设置按钮的尺寸和其他属性
- self.width, self.height = 200, 50
- #颜色
- self.button_color = (0, 255, 0)
- #字体颜色
- self.text_color = (255, 255, 255)
- #字体设置
- self.font = pygame.font.SysFont(None, 48)
-
- # 创建按钮的rect对象,并使其居中
- #按钮创建
- self.rect = pygame.Rect(0, 0, self.width, self.height)
- self.rect.center = self.screen_rect.center
-
- # 按钮的标签只需创建一次
- #这个东西非常重要,它创建的是让这个函数变成全局变量
- self.prep_msg()
-
- def prep_msg(self):
- """将msg渲染为图像,并使其在按钮上居中"""
- self.msg_image = self.font.render("Play", True, self.text_color,
- self.button_color)
- self.msg_image_rect = self.msg_image.get_rect()
- self.msg_image_rect.center = self.rect.center
-
- def draw_button(self):
- # 绘制一个用颜色填充的按钮,再绘制文本
- #fill是颜色填充
- self.screen.fill(self.button_color, self.rect)
- #blit是绘画
- self.screen.blit(self.msg_image, self.msg_image_rect)
-
-
- class Scoreboard():
- """显示得分信息的类"""
-
- def __init__(self, ai_settings, screen, score):
- """初始化显示得分涉及的属性"""
- self.screen = screen
- self.screen_rect = screen.get_rect()
- self.ai_settings = ai_settings
-
- self.score = score
- # 显示得分信息时使用的字体设置
- self.text_color = (30, 30, 30)
- self.font = pygame.font.SysFont(None, 48)
- # 准备初始得分图像---其实就是全局变量的函数
- self.prep_score()
-
- def prep_score(self):
- """将得分转换为一幅渲染的图像"""
- score_str = str(self.score)
- self.score_image = self.font.render(score_str, True, self.text_color,
- self.ai_settings.bg_color)
- # 将得分放在屏幕右上角
- self.score_rect = self.score_image.get_rect()
- self.score_rect.right = self.screen_rect.right - 20
- self.score_rect.top = 20
-
- def show_score(self):
- """在屏幕上显示得分"""
- self.screen.blit(self.score_image, self.score_rect)
-
-
- #这个是用来定义事件的----这个里面是事件更新,更新飞船的各类参数
- def check_events(ship,screen,bullets,ai_settings):
- # 监听键盘事件
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- sys.exit()
- elif event.type == pygame.KEYDOWN:
- if event.key == pygame.K_RIGHT and ship.rect.right < ship.screen_rect.right:
- ship.rect.centerx += 60
-
- elif event.key == pygame.K_LEFT and ship.rect.left > 0:
- ship.rect.centerx -= 60
-
-
- elif event.key == pygame.K_DOWN and ship.rect.bottom < ship.screen_rect.bottom:
- ship.rect.bottom += 60
-
-
-
- elif event.key == pygame.K_UP and ship.rect.top > 0:
- #ship.rect.bottom > ship.screen_rect.bottom:
- ship.rect.bottom -= 60
-
-
- elif event.key == pygame.K_SPACE:
- # 创建一颗子弹,并将其加入到编组bullets中---最关键的就是这里了,只能操作一次从此就自动化了
- init_position = ship.rect
- #加入了飞船和屏幕参数
- new_bullet = Buttle1(init_position)
- bullets.add(new_bullet)
-
-
-
- def check_play_button(game_active, play_button, mouse_x, mouse_y):
- """在玩家单击Play按钮时开始新游戏"""
- if play_button.rect.collidepoint(mouse_x, mouse_y):
- game_active = True
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- def update_bullets(aliens, bullets):
- """更新子弹的位置,并删除已消失的子弹"""
- # 检查是否有子弹击中了外星人
- # 如果是这样,就删除相应的子弹和外星人
-
- collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)
-
-
- #外星人组参数修改
- #创建外星人事件
- #外星人的参数给够然后再加入小组
- def create_fleet(ai_settings, screen, aliens):
- """创建外星人群"""
-
- # 创建一个外星人,并计算一行可容纳多少个外星人
- # 外星人间距为外星人宽度---这个是为了调用里面的长度和宽度
- alien = Alien(ai_settings, screen)
- #这里是刚刚获取的外星人image
- alien_width = alien.rect.width
- #屏幕的宽度减去两倍的外星人宽度---剩余的可以用来装外星人的空间
- available_space_x = ai_settings.screen_width - 2 * alien_width
- #装外星人的数量---为了确保不是塞满的,一个空间里面要留两个外星人的宽度,所以除以2
- number_aliens_x = int(available_space_x / (2 * alien_width))
-
- # 创建第一行外星人
- for alien_number in range(number_aliens_x):
- # 将参数传给外星人
- alien = Alien(ai_settings, screen)
- #开始制造外星人横轴坐标
- alien.x = alien_width + 2 * alien_width * alien_number
- alien.rect.x = alien.x
- aliens.add(alien)
-
-
-
-
-
-
- def run_game():
- pygame.init()
- #导入全局设置
- ai_settings = Settings()
- #屏幕大小
- screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
- pygame.display.set_caption("Alien Invasion")
- ship = Ship(screen)
- #bullet = Buttle1()
-
- button = Button(screen)
-
- pygame.key.set_repeat(pygame.KEYDOWN, 1) # 实现重复按下的功能,间隔10毫秒
- group = pygame.sprite.Group()
- bullets = group
- aliens = Group()
- create_fleet(ai_settings, screen, aliens)
-
-
-
- #按钮的制作准备
- #play_button = Button(ai_settings, screen)
- stats = True
-
-
- #计数器的准备
- score = 0
-
- file = r"C:\Users\hh\PycharmProjects\pythonProject\哈哈.mp3"
- pygame.mixer.init() # mixer的初始化
- print("林志炫 - 没离开过") # 输出提示要播放的歌曲
- music = pygame.mixer.music.load(file) # 载入一个音乐文件用于播放
-
-
-
-
-
- while True:
- #事件更新---接受飞船位置加鼠标事件
- #这个只是用来改参数的,实际上那个飞船还是在屏幕的前面,而不是像这里所看到的那样飞船在屏幕的前面
- #check_events(ship,screen,ai_settings)
- screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height))
- # 监听键盘事件
- #check_events(ship,screen,bullets,ai_settings)
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
-
- sys.exit()
-
-
- elif event.type == pygame.MOUSEBUTTONDOWN:
- mouse_x, mouse_y = pygame.mouse.get_pos()
- if button.rect.collidepoint(mouse_x, mouse_y):
- aliens.empty()
- bullets.empty()
- #光标的可见与不可见
- pygame.mouse.set_visible(False)
-
-
- stats = False
-
-
- elif event.type == pygame.KEYDOWN:
-
- if event.key == pygame.K_RIGHT and ship.rect.right < ship.screen_rect.right:
-
- ship.rect.centerx += 1
-
- elif event.key == pygame.K_LEFT and ship.rect.left > 0:
-
- ship.rect.centerx -= 1
-
- elif event.key == pygame.K_DOWN and ship.rect.bottom < ship.screen_rect.bottom:
-
- ship.rect.bottom += 1
-
- elif event.key == pygame.K_UP and ship.rect.top > 0:
-
- # ship.rect.bottom > ship.screen_rect.bottom:
-
- ship.rect.bottom -= 1
-
- elif event.key == pygame.K_SPACE:
-
- # 创建一颗子弹,并将其加入到编组bullets中---最关键的就是这里了,只能操作一次从此就自动化了
-
- # 加入了飞船和屏幕参数
- init_position = ship.rect.centerx, ship.rect.bottom
- new_bullet = Buttle1(init_position)
- bullets.add(new_bullet)
-
- # 全自动进行---无休止
-
-
-
-
- #只要没有开始按钮那么游戏开始
- if stats != True:
- aliens.update()
- # 精灵组里面自带的draw可以直接按照rect参数顺序画画
- aliens.draw(screen)
- bullets.update() # 子弹是无限自己更新
- bullets.draw(screen)
- ship.blitme()
-
- #只要有游戏开始按钮那么光标就可以见
- if stats:
- pygame.mouse.set_visible(True)
-
-
-
-
-
- #反正是刚刚开始的,没有任何动作那么游戏开始按钮就一直在
- if stats:
- button.draw_button()
-
- #这个是子弹和外星人同归于尽
- collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)
-
- # 这里是计分器
- if collisions:
- score += ai_settings.alien_points
-
- sb = Scoreboard(ai_settings, screen, score)
- sb.show_score()
-
-
-
-
- #这个是飞船和外星人同归于尽的
- if pygame.sprite.spritecollideany(ship, aliens):
- stats = True
- #print("Ship hit!!!")
-
-
- while len(aliens) == 0:
- bullets.empty()
- create_fleet(ai_settings, screen, aliens)
-
-
-
-
-
-
-
- # 音乐文件路径(下面这行的路径为mac的路径, win可以自行拷贝)
-
-
- # 检查音乐流播放,有返回True,没有返回False
- # 如果没有音乐流则选择播放
- if pygame.mixer.music.get_busy() == False: # 检查是否正在播放音乐
- pygame.mixer.music.play() # 开始播放音乐流
-
-
-
-
-
- # 屏幕可见---官方解释是为了更新画面
- pygame.display.flip()
-
- '''elif event.type == pygame.MOUSEBUTTONDOWN:
- mouse_x, mouse_y = pygame.mouse.get_pos()
- if button.rect.collidepoint(mouse_x, mouse_y):
- # 精灵组里面自带的draw可以直接按照rect参数顺序画画
- aliens.draw(screen)'''
-
-
-
-
-
-
- '''image = pygame.image.load('头像.png')
- image = pygame.transform.scale(image, (100, 100))
- rect = image.get_rect()
- screen_rect = screen.get_rect()
- rect.centerx = screen_rect.centerx
- rect.bottom = screen_rect.bottom
- screen.blit(image, rect)
- pygame.display.flip()
- #ship.blitme()'''
-
-
- run_game()