精华内容
下载资源
问答
  • python 外星人入侵游戏

    2020-07-14 09:51:12
    (1)python 外星人入侵游戏 学习总结 以及完整代码 https://blog.csdn.net/weixin_46467641/article/details/106007948 (2)error2-2 知识性错误:循环编写 (alien_invasion外星人群突然直线下降) ...

    参考链接:
    (1)python 外星人入侵游戏 学习总结 以及完整代码
    https://blog.csdn.net/weixin_46467641/article/details/106007948
    (2)error2-2 知识性错误:循环编写 (alien_invasion外星人群突然直线下降)
    https://blog.csdn.net/Cijo_Wang/article/details/99548388

    #当外星人群突然直线下降时,需要考虑是否是外星人的图片超出了范围
    错误
    def change_fleet_direction(ai_settings,aliens):
          '''将整群外星人下移,并改变它们的方向'''
             for alien in aliens.sprites():
                   alien.rect.y += ai_settings.fleet_drop_speed
                   ai_settings.fleet_direction *= -1
    
    正确
    def change_fleet_direction(ai_settings,aliens):
          '''将整群外星人下移,并改变它们的方向'''
             for alien in aliens.sprites():
                   alien.rect.y += ai_settings.fleet_drop_speed
             ai_settings.fleet_direction *= -1
    
    错因分析:
    在for内进行不断地循环,所以方向不断抵消,竖直方向进行速度增快
    存疑:在未射击前并不会出现这种问题,只在bullet打到alien后才会出现这种情况,但我发现不了和bullet之间的关系...如果有谁懂了这个联系摆脱评论一下...
    
    展开全文
  • python外星人入侵游戏

    2019-03-14 20:16:20
    使用python3.6所编写的一个游戏。其中用到了pygame第三方库,有兴趣的同学可以下载看看或者玩玩。已用pycharm测试,可以运行。
  • Python外星人入侵游戏

    2020-05-15 14:54:32
    游戏外星人入侵》中,玩家控制着一艘最初出现在屏幕底部中央的飞船。玩家可以使用箭头键左右移动飞船,还可使用空格键进行射击。游戏开始时,一群外星人出现在天空中,他们在屏幕中向下移动。玩家的任务是射杀...

    一、源码来源

    《Python从入门到实践》

    二、项目描述

    在游戏《外星人入侵》中,玩家控制着一艘最初出现在屏幕底部中央的飞船。玩家可以使用箭头键左右移动飞船,还可使用空格键进行射击。游戏开始时,一群外星人出现在天空中,他们在屏幕中向下移动。玩家的任务是射杀这些外星人。玩家将所有外星人都消灭干净后,将出现一群新的外星人,他们移动的速度更快。只要有外星人撞到了玩家的飞船或到达了屏幕底部,玩家就损失一艘飞船。玩家损失三艘飞船后,游戏结束。
    最终效果:
    在这里插入图片描述

    三、项目分析

    (1)创建并设置背景窗口
    (2)添加飞船图像,设置飞船移动方向、速度、活动范围等
    (3)添加子弹图像,设置子弹移动方向、速度等
    (4)添加外星飞船图像,设置飞船移动方向、速度、活动范围等
    (5)创建计分系统

    项目最终包含9个py文件。
    在这里插入图片描述
    源码下载地址

    四、详细代码

    1.alien_invasion.py
    import pygame
    import game_functions as gf
    from settings import Settings
    from ship import Ship
    from pygame.sprite import Group
    from game_status import GameStatus
    from button import Button
    from scoreboard import Scoreboard
    
    
    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("Aline Invasion")
    
        # 创建Play按钮
        play_button = Button(ai_settings, screen, "Play")
    
        # 创建一个用于存储游戏统计信息的实例,并创建记分牌
        status = GameStatus(ai_settings)
        sb = Scoreboard(ai_settings, screen, status)
    
        # 颜色
        bg_color = (230, 230, 230)
    
        # 创建一个飞船
        ship = Ship(ai_settings, screen)
    
        # 创建一个用于存储子弹的编组
        bullets = Group()
    
        # 创建一个外星人编组
        aliens = Group()
    
        # 创建一个外星人群
        gf.create_fleet(ai_settings, screen, aliens, ship)
    
        # 开始游戏主循环
        while True:
            # 检查玩家的输入
            gf.check_events(ai_settings, screen, status, sb, play_button, ship, aliens, bullets)
    
            if status.game_active:
                ship.update()
                # 更新屏幕上子弹
                gf.update_bullets(ai_settings, screen, status, sb, ship, aliens, bullets)
                # 更新屏幕上外星人
                gf.update_aliens(ai_settings, screen, status, sb, ship, aliens, bullets)
            # 更新后的位置重新绘制屏幕
            gf.update_screen(ai_settings, screen, status, sb, ship, aliens, bullets, play_button)
    
    
    run_game()
    
    2 .alien.py
    import pygame
    from pygame.sprite import Sprite
    
    
    class Alien(Sprite):
        def __init__(self, ai_settings, screen):
            """初始化外星人并设置其他起始位置"""
            super(Alien, self).__init__()
            self.screen = screen
            self.ai_settings = ai_settings
    
            self.image = pygame.image.load('images/alien.bmp')
            self.rect = self.image.get_rect()
    
            # 每个外星人最初都在屏幕左上角附近
            self.rect.x = self.rect.width
            self.rect.y = self.rect.height
    
            # 储存外星人的确切位置
            self.x = float(self.rect.x)
    
        def blitme(self):
            """指定位置绘制外星人"""
            self.screen.blit(self.image, self.rect)
    
        def check_edges(self):
            """外星人处于边缘上,就返回True"""
            screen_rect = self.screen.get_rect()
            if self.rect.right >= screen_rect.right:
                return True
            elif self.rect.left <= 0:
                return True
    
        def update(self):
            """向左或者向右移动外星人"""
            self.x += (self.ai_settings.alien_speed_factor *
                       self.ai_settings.fleet_direction)
            self.rect.x = self.x
    
    3. bullet.py
    import pygame
    from pygame.sprite import Sprite
    
    
    class Bullet(Sprite):
        """对飞船发射的子弹进行管理的类"""
        def __init__(self, ai_settings, screen, ship):
            """创建一个子弹对象"""
            super(Bullet, self).__init__()
            self.screen = screen
    
            # 在(0,0)处创建以一个表示子弹的矩形,再设置正确的位置
            self.rect = pygame.Rect(0, 0, ai_settings.bullet_width, ai_settings.bullet_height)
            self.rect.centerx = ship.rect.centerx
            self.rect.top = ship.rect.top
    
            # 存储用小数表示制单的位置
            self.y = float(self.rect.y)
    
            self.color = ai_settings.bullet_color
            self.speed_factor = ai_settings.bullet_speed_factor
    
        def update(self):
            # 更新表示制单位置的小数值
            self.y -= self.speed_factor
    
            # 更新表示子弹的rect位置
            self.rect.y = self.y
    
        def draw_bullet(self):
            # 在屏幕上绘制子弹
            pygame.draw.rect(self.screen, self.color, self.rect)
    
    4. button.py
    import pygame.font
    
    
    class Button():
        def __init__(self, ai_settings, screen, msg):
            """初始化按钮属性"""
            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(msg)
    
        def prep_msg(self, msg):
            """将msg渲染未图像,并使其在按钮上居中"""
            self.msg_image = self.font.render(msg, 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):
            # 绘制一个用颜色填充的按钮,再绘制文本
            self.screen.fill(self.button_color, self.rect)
            self.screen.blit(self.msg_image, self.msg_image_rect)
    
    5. game_functions.py
    import sys
    import pygame
    from bullet import Bullet
    from alien import Alien
    from time import sleep
    
    
    def check_events(ai_settings, screen, status, sb, play_button, ship, aliens, bullets):
        """响应按键和鼠标事件"""
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                check_keydown_events(event, ai_settings, screen, ship, bullets)
            elif event.type == pygame.KEYUP:
                check_keyup_events(event, ship)
            elif event.type == pygame.MOUSEBUTTONDOWN:
                mouse_x, mouse_y = pygame.mouse.get_pos()
                check_play_button(ai_settings, screen, status, sb, play_button, ship, aliens, bullets, mouse_x, mouse_y)
    
    
    def check_play_button(ai_settings, screen, status, sb, play_button, ship, aliens, bullets, mouse_x, mouse_y):
        """玩家代几Play按钮时开始新游戏"""
        button_clicked = play_button.rect.collidepoint(mouse_x, mouse_y)
        if button_clicked and not status.game_active:
    
            # 重置游戏设置
            ai_settings.initialize_dynamic_settings()
    
            # 隐藏光标
            pygame.mouse.set_visible(False)
    
            # 重置游戏统计信息
            status.reset_status()
            status.game_active = True
    
            # 重置记分牌图像
            sb.prep_score()
            sb.prep_high_score()
            sb.prep_level()
            sb.prep_ships()
    
            # 清空外星人列表和子弹列表
            aliens.empty()
            bullets.empty()
    
            # 创建一群新的外星人,并让飞船居中
            create_fleet(ai_settings, screen, aliens, ship)
            ship.center_ship()
    
    
    def check_keydown_events(event, ai_settings, screen, ship, bullets):
        """响应按键"""
        if event.key == pygame.K_RIGHT:
            ship.moving_right = True
        elif event.key == pygame.K_LEFT:
            ship.moving_left = True
        elif event.key == pygame.K_SPACE:
            fire_bullet(ai_settings, screen, ship, bullets)
        elif event.key == pygame.K_q:
            sys.exit()
    
    
    def fire_bullet(ai_settings, screen, ship, bullets):
        """创建新子弹并将其加入到编组bullets中"""
        if len(bullets) < ai_settings.bullets_allowed:
            new_bullet = Bullet(ai_settings, screen, ship)
            bullets.add(new_bullet)
    
    
    def check_keyup_events(event, ship):
        """响应松开"""
        if event.key == pygame.K_RIGHT:
            ship.moving_right = False
        elif event.key == pygame.K_LEFT:
            ship.moving_left = False
    
    
    def update_bullets(ai_settings, screen, status, sb, ship, aliens, bullets):
        """更新子弹的位置,并删除已消失的子弹"""
    
        # 更新子弹的位置
        bullets.update()
    
        # 删除已消失的子弹
        for bullet in bullets.copy():
            if bullet.rect.bottom <= 0:
                bullets.remove(bullet)
        check_bullet_alien_collisions(ai_settings, screen, status, sb, ship, aliens, bullets)
    
    
    def check_bullet_alien_collisions(ai_settings, screen, status, sb, ship, aliens, bullets):
        """响应子弹和外星人的碰撞"""
    
        # 击中敌人则删除相应的子弹和外星人
        collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)
        if collisions:
            for aliens in collisions.values():
                status.score += ai_settings.alien_points * len(aliens)
                sb.prep_score()
            check_high_score(status, sb)
        if len(aliens) == 0:
    
            # 删除子弹建立新的外星人
            bullets.empty()
            ai_settings.increase_speed()
    
            # 提高等级
            status.level += 1
            sb.prep_level()
            create_fleet(ai_settings, screen, aliens, ship)
    
    
    def update_screen(ai_setting, screen, status, sb, ship, aliens, bullets, paly_button):
        """更换屏幕上图像,并切换到新屏幕"""
    
        # 每次循环时都重绘屏幕
        screen.fill(ai_setting.bg_color)
    
        # 在飞船和外星人后买你重绘所有子弹
        for bullet in bullets.sprites():
            bullet.draw_bullet()
        ship.blitme()
        aliens.draw(screen)
    
        # 显示得分
        sb.show_score()
    
        # 如果游戏处于非活动状态,就绘制Play按钮
        if not status.game_active:
            paly_button.draw_button()
    
        # 让最近绘制的屏幕可见
        pygame.display.flip()
    
    
    def create_fleet(ai_settings, screen, aliens, ship):
        """创见外星人群"""
        alien = Alien(ai_settings, screen)
    
        # 外星人间距是外星人的宽度
        number_aliens_x = get_number_aliens_x(ai_settings, alien.rect.width)
        number_rows = get_number_rows(ai_settings, ship.rect.height, alien.rect.height)
    
        # 创建外星人
        for row_number in range(number_rows):
            for alien_number in range(number_aliens_x):
                create_alien(ai_settings, screen, aliens, alien_number, row_number)
    
    
    def get_number_aliens_x(ai_settings, alien_width):
        """计算可容纳多少个外星人"""
        available_space_x = ai_settings.screen_width - 2 * alien_width
        number_aliens_x = int(available_space_x / (2 * alien_width))
        return number_aliens_x
    
    
    def get_number_rows(ai_settings, ship_height, alien_height):
        """计算屏幕可容纳多少个外星人"""
        available_space_y = (ai_settings.screen_height - (3 * alien_height) - ship_height)
        num_rows = int(available_space_y / (2 * alien_height))
        return num_rows
    
    
    def create_alien(ai_settings, screen, aliens, alien_number, row_number):
        """创建一个外星人并将其打入当前行"""
        alien = Alien(ai_settings, screen)
        alien_width = alien.rect.width
        alien.x = alien_width + 2 * alien_width * alien_number
        alien.rect.x = alien.x
        alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number
        aliens.add(alien)
    
    
    def check_fleet_edges(ai_settings, aliens):
        """外星人到达边缘采取相应措施"""
        for alien in aliens.sprites():
            if alien.check_edges():
                change_fleet_direction(ai_settings, aliens)
                break
    
    
    def change_fleet_direction(ai_settings, aliens):
        """将外星人下移,并该改变他们方向"""
        for alien in aliens.sprites():
            alien.rect.y += ai_settings.fleet_drop_speed
        ai_settings.fleet_direction *= -1
    
    
    def ship_hit(ai_settings, screen, status, sb, ship, aliens, bullets):
        """响应被外星人撞到的飞船"""
        if status.ships_left > 0:
            status.ships_left -= 1
            sb.prep_ships()
            aliens.empty()
            bullets.empty()
            create_fleet(ai_settings, screen, aliens, ship)
            ship.center_ship()
            sleep(0.5)
        else:
            status.game_active = False
            pygame.mouse.set_visible(True)
    
    
    def check_aliens_bottom(ai_settings, screen, status, sb, ship, aliens, bullets):
        """检查是否有外星人达到了屏幕顶端"""
        screen_rect = screen.get_rect()
        for alien in aliens.sprites():
            if alien.rect.bottom >= screen_rect.bottom:
                # 像飞船被撞到一样进行处理
                ship_hit(ai_settings, screen, status, sb, ship, aliens, bullets)
                break
    
    
    def update_aliens(ai_settings, screen, status, sb, ship, aliens, bullets):
        """更新外星人群中外星人的位置"""
        check_fleet_edges(ai_settings, aliens)
        aliens.update()
        if pygame.sprite.spritecollideany(ship, aliens):
            ship_hit(ai_settings, screen, status, sb, ship, aliens, bullets)
    
        # 检查是否有外星人达到屏幕底端
        check_aliens_bottom(ai_settings, screen, status, sb, ship, aliens, bullets)
    
    
    def check_high_score(status, sb):
        """检查是否诞生了最高得分"""
        if status.score > status.high_score:
            status.high_score = status.score
            sb.prep_high_score()
    
    6. game_status.py
    class GameStatus():
        """跟踪游戏的统计信息"""
    
        def __init__(self, ai_settings):
            """初始化统计信息"""
            self.ai_settings = ai_settings
            self.reset_status()
    
            # 游戏处于非活动状态
            self.game_active = False
    
            # 在任何情况下不应该重置最高得分
            self.high_score = 0
    
        def reset_status(self):
            """初始化在游戏运行期间可能变化的统计信息"""
            self.ships_left = self.ai_settings.ship_limit
            self.score = 0
            self.level = 1
    
    7. scoreboard.py
    import pygame.font
    from pygame.sprite import Group
    from ship import Ship
    
    
    class Scoreboard():
        def __init__(self, ai_settings, screen, status):
            """初始化希纳是得分所涉及属性"""
            self.screen = screen
            self.screen_rect = screen.get_rect()
            self.ai_settings = ai_settings
            self.status = status
    
            # 显示得分信息使用的字体设置
            self.text_color = (30, 30, 30)
            self.font = pygame.font.SysFont(None, 48)
    
            # 准备最高得分与当前得分图像
            self.prep_score()
            self.prep_high_score()
            self.prep_level()
            self.prep_ships()
    
        def prep_score(self):
            """将得分转换成一副渲染的图像"""
            rounded_score = int(round(self.status.score, -1))
            score_str = "{:,}".format(rounded_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 prep_high_score(self):
            """将得分转换成一副渲染的图像"""
            high_score = int(round(self.status.high_score, -1))
            high_score_str = "{:,}".format(high_score)
            self.high_score_image = self.font.render(high_score_str, True, self.text_color, self.ai_settings.bg_color)
    
            # 将最高得分放在屏幕中央
            self.high_score_rect = self.high_score_image.get_rect()
            self.high_score_rect.centerx = self.screen_rect.centerx
            self.high_score_rect.top = self.high_score_rect.top
    
        def show_score(self):
            """在屏幕上显示得分与等级"""
            self.screen.blit(self.score_image, self.score_rect)
            self.screen.blit(self.high_score_image, self.high_score_rect)
            self.screen.blit(self.level_image, self.level_rect)
    
            # 绘制飞船
            self.ships.draw(self.screen)
    
        def prep_level(self):
            """将等级转换为渲染的图像"""
            self.level_image = self.font.render(str(self.status.level), True, self.text_color, self.ai_settings.bg_color)
    
            # 将等级放在得分的下面
            self.level_rect = self.level_image.get_rect()
            self.level_rect.right = self.score_rect.right
            self.level_rect.top = self.high_score_rect.bottom + 10
    
        def prep_ships(self):
            """显示余下的多少飞船"""
            self.ships = Group()
            for ship_number in range(self.status.ships_left):
                ship = Ship(self.ai_settings, self.screen)
                ship.rect.x = 10 + ship_number * ship.rect.width
                ship.rect.y = 10
                self.ships.add(ship)
    
    8.settings.py
    class Settings():
        """存储所有所有设置的类"""
    
        def __init__(self):
            # 屏幕设置
            self.screen_width = 1200
            self.screen_height = 800
            self.bg_color = (230, 230, 230)
            self.ship_speed_factor = 1.5
    
            # 子弹设置
            self.bullet_speed_factor = 3
            self.bullet_width = 3
            self.bullet_height = 15
            self.bullet_color = 60, 60, 60
            self.bullets_allowed = 3
    
            # 外星人设置
            self.alien_speed_factor = 1
            self.fleet_drop_speed = 10
            self.fleet_direction = 1
    
            # 飞船设置
            self.ship_speed_factor = 1.5
            self.ship_limit = 3
    
            # 提高游戏难度
            self.speedup_scale = 1.1
            self.initialize_dynamic_settings()
    
            # 外星人点数提高的速度
            self.score_scale = 1.5
            self.initialize_dynamic_settings()
    
        def initialize_dynamic_settings(self):
            """初始化随游戏进行而变化的设置"""
            self.ship_speed_factor = 1.5
            self.bullet_speed_factor = 3
            self.alien_speed_factor = 1
    
            # fleet_direction为1表似乎向右;为-1表示向左
            self.fleet_direction = 1
            self.alien_points = 50
    
        def increase_speed(self):
            """提高游戏速度设置"""
            self.ship_speed_factor *= self.speedup_scale
            self.bullet_speed_factor *= self.speedup_scale
            self.alien_speed_factor *= self.speedup_scale
            self.alien_points = int(self.alien_points * self.score_scale)
            print(self.alien_points)
    

    (9) ship.py

    import pygame
    from pygame.sprite import Sprite
    
    
    class Ship(Sprite):
        def __init__(self, ai_settings, screen):
    
            # 初始化飞船并设置其初始位置
            super(Ship, self).__init__()
            self.screen = screen
            self.ai_settings = ai_settings
    
            # 加载船图像
            self.image = pygame.image.load('images/ship.bmp')
            self.rect = self.image.get_rect()
            self.screen_rect = screen.get_rect()
    
            # 将每艘新飞船放在屏幕底部中央
            self.rect.centerx = self.screen_rect.centerx
            self.rect.bottom = self.screen_rect.bottom
    
            # 在飞船的属性中存储小数值
            self.center = float(self.rect.centerx)
    
            # 移动标志
            self.moving_right = False
            self.moving_left = False
    
        def blitme(self):
            """当前位置绘制飞船"""
            self.screen.blit(self.image, self.rect)
    
        def center_ship(self):
            """让飞船在屏幕上居中"""
            self.center = self.screen_rect.centerx
    
        def update(self):
            """根据移动表纸调整飞船的位置"""
            # 更新飞船的center值,而不是rect
            if self.moving_right and self.rect.right < self.screen_rect.right:
                self.center += self.ai_settings.ship_speed_factor
            if self.moving_left and self.rect.left > 0:
                self.center -= self.ai_settings.ship_speed_factor
    
            # 根据self.center更新rect对象
            self.rect.centerx = self.center
    
    展开全文
  • PYTHON游戏编程外星人入侵的完整实现思路,具体内容如下准备工作:下载python,比如Anaconda3(64 bit),导入pygame游戏包1.外星人设置,alien.py,代码:import pygamefrom pygame.sprite import Spriteclass ...

    PYTHON游戏编程外星人入侵的完整实现思路,具体内容如下

    准备工作:下载python,比如Anaconda3(64 bit),导入pygame游戏包

    201704181156515.png

    201704181156516.png

    201704181156517.png

    201704181156518.png

    201704181156529.png

    1.外星人设置,alien.py,代码:

    import pygame

    from pygame.sprite import Sprite

    class Alien(Sprite):

    """表示单个外星人的类"""

    def __init__(self,ai_settings,screen):

    """初始化外星人并设置其他位置"""

    super(Alien,self).__init__()

    self.screen = screen

    self.ai_settings = ai_settings

    #加载外星人图像,并设置其rect属性

    self.image = pygame.image.load('images/alien.bmp')

    self.rect = self.image.get_rect()

    #每个外星人最初都在屏幕左上角附近

    self.rect.x = self.rect.width

    self.rect.y = self.rect.height

    #存储外星人的准确位置

    self.x = float(self.rect.x)

    def blitme(self):

    """在指定位置绘制外星人"""

    self.screen.blit(self.image,self.rect)

    def check_edges(self):

    """如果外星人位于屏幕边缘,就返回True"""

    screen_rect = self.screen.get_rect()

    if self.rect.right >= screen_rect.right:

    return True

    elif self.rect.left <= 0:

    return True

    def update(self):

    """向右移动外星人"""

    self.x += (self.ai_settings.alien_speed_factor * self.ai_settings.fleet_direction)

    self.rect.x = self.x

    2.游戏主程序,alien_invasion.py,代码:

    import pygame

    from settings import Settings

    from game_stats import GameStats

    from button import Button

    from ship import Ship

    from pygame.sprite import Group

    import game_functions as gf

    from scoreboard import Scoreboard

    def run_game():

    pygame.init() # 初始化背景设置

    ai_settings = Settings() # 全局设置

    screen = pygame.display.set_mode( # 创建screen显示窗口

    (ai_settings.screen_width,ai_settings.screen_height)

    )

    pygame.display.set_caption('Alien Invasion') # 标题

    #新建Play按钮

    play_button = Button(ai_settings,screen,"Play")

    #创建一个用于存储游戏统计信息的实例,并创建记分牌

    stats = GameStats(ai_settings)

    sb = Scoreboard(ai_settings, screen, stats)

    # 创建飞船

    ship = Ship(ai_settings,screen)

    # 创建子弹编组

    bullets = Group()

    #创建一个外星人

    aliens = Group()

    #创建外星人群

    gf.create_fleet(ai_settings,screen,ship,aliens)

    # 开始游戏主循环

    while True:

    # 监视键盘和鼠标事件

    gf.check_events(ai_settings,screen,stats,sb,play_button,ship,aliens,bullets)

    if stats.game_active:

    # 移动飞船

    gf.update_ship(ship)

    # 更新子弹位置

    gf.update_bullets(ai_settings,screen,stats,sb,ship,aliens,bullets)

    #更新外星人

    gf.update_aliens(ai_settings,stats,screen,sb,ship,aliens,bullets)

    # 更新屏幕

    gf.update_screen(ai_settings,screen,stats,sb,ship,aliens,bullets,play_button)

    run_game()

    3.设置子弹,bullet.py,代码:

    import pygame

    from pygame.sprite import Sprite

    import time

    class Bullet(Sprite):

    '''飞船子弹进行管理'''

    def __init__(self,ai_settings,screen,ship):

    super(Bullet,self).__init__()

    self.screen = screen

    # 创建子弹矩形初始位置(0,0,3,15)分别对应lef,top,宽,高

    self.rect = pygame.Rect(0,0,

    ai_settings.bullet_width, ai_settings.bullet_height)

    self.rect.centerx = ship.rect.centerx # 设置中心点x轴坐标跟飞船一致

    self.rect.top = ship.rect.top # 设置y轴坐标顶部跟飞船一致

    # 设置成小数进行计算

    self.top = float(self.rect.top)

    self.color = ai_settings.bullet_color

    self.speed_factor = ai_settings.bullet_speed_factor

    def update(self):

    self.top -=self.speed_factor

    self.rect.top = self.top

    print(self.rect.top)

    def draw_bullet(self):

    pygame.draw.rect(self.screen,self.color,self.rect)

    4.设置Play按钮,button.py,代码:

    import pygame.font

    class Button():

    def __init__(self,ai_settings,screen,msg):

    """初始化按钮属性"""

    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(msg)

    def prep_msg(self,msg):

    """将msg渲染为图像,并使其在按钮上居中"""

    self.msg_image = self.font.render(msg,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):

    #绘制一个用颜色填充的按钮,再绘制文本

    self.screen.fill(self.button_color,self.rect)

    self.screen.blit(self.msg_image,self.msg_image_rect)

    5.设置游戏功能,game_functions.py,代码:

    import sys

    import pygame

    from bullet import Bullet

    from alien import Alien

    from time import sleep

    def check_events(ai_settings,screen,stats,sb,play_button,ship,aliens,bullets):

    # 监视键盘和鼠标事件

    for event in pygame.event.get():

    if event.type == pygame.QUIT: # 关闭窗口退出

    sys.exit()

    elif event.type == pygame.KEYDOWN:

    check_keydown_events(event,ai_settings,screen,ship,bullets)

    elif event.type == pygame.KEYUP:

    check_keyup_events(event,ship)

    elif event.type == pygame.MOUSEBUTTONDOWN:

    mouse_x, mouse_y = pygame.mouse.get_pos()

    check_play_button(ai_settings,screen,stats,sb,play_button,ship,aliens,bullets,mouse_x, mouse_y)

    def check_play_button(ai_settings,screen,stats,sb,play_button,ship,aliens,bullets,mouse_x, mouse_y):

    """在玩家单击Play按钮时开始游戏"""

    button_clicked = play_button.rect.collidepoint(mouse_x,mouse_y)

    if button_clicked and not stats.game_active:

    #重置游戏设置

    ai_settings.initialize_dynamic_settings()

    #隐藏光标

    pygame.mouse.set_visible(False)

    #重置游戏统计信息

    stats.reset_stats()

    stats.game_active = True

    #重置计分牌图像

    sb.prep_score()

    sb.prep_high_score()

    sb.prep_level()

    sb.prep_ships()

    #清空外星人列表和子弹列表

    aliens.empty()

    bullets.empty()

    #创建一群新的外星人,并让飞船居中

    create_fleet(ai_settings,screen,ship,aliens)

    ship.center_ship()

    def update_screen(ai_settings,screen,stats,sb,ship,aliens,bullets,play_button):

    '''更新屏幕上的图片,并切换到新屏幕'''

    screen.fill(ai_settings.bg_color) # 设置背景颜色

    ship.blitme() # 绘制飞船

    aliens.draw(screen)

    # 循环子弹组里面的元素,进行绘制 为空时不执行

    for bullet in bullets.sprites():

    bullet.draw_bullet() # 绘制子弹

    #显示得分

    sb.show_score()

    #如果游戏处于非活跃状态,就显示Play按钮

    if not stats.game_active:

    play_button.draw_button()

    # 显示最新屏幕,擦拭旧屏幕

    pygame.display.flip()

    # print('1')

    def check_keydown_events(event,ai_settings,screen,ship,bullets):

    if event.key == pygame.K_RIGHT:

    ship.moving_right = True

    elif event.key == pygame.K_LEFT:

    ship.moving_left = True

    elif event.key == pygame.K_SPACE:

    fire_bullet(ai_settings,screen,ship,bullets)

    elif event.key == pygame.K_q:

    sys.exit()

    def check_keyup_events(event,ship):

    if event.key == pygame.K_RIGHT:

    ship.moving_right = False

    elif event.key == pygame.K_LEFT:

    ship.moving_left = False

    def update_bullets(ai_settings,screen,stats,sb,ship,aliens,bullets):

    '''更新子弹位置,删除子弹'''

    bullets.update() # 子弹组每个成员执行self.update()操作

    for bullet in bullets.sprites():

    if bullet.rect.bottom <= 0: # 子弹出界 删除

    bullets.remove(bullet)

    check_bullet_alien_collisions(ai_settings,screen,stats,sb,ship,aliens,bullets)

    def check_bullet_alien_collisions(ai_settings,screen,stats,sb,ship,aliens,bullets):

    """响应外星人和子弹的碰撞"""

    #删除发生碰撞的子弹和外星人

    collisions = pygame.sprite.groupcollide(bullets,aliens,True,True)

    if collisions:

    for aliens in collisions.values():

    stats.score += ai_settings.alien_points * len(aliens)

    sb.prep_score()

    check_high_score(stats,sb)

    if len(aliens)==0:

    #删除现有的子弹并新建一群外星人,加快游戏进度节奏

    bullets.empty()

    ai_settings.increase_speed()

    #提高等级

    stats.level += 1

    sb.prep_level()

    create_fleet(ai_settings,screen,ship,aliens)

    def update_ship(ship):

    ship.update()

    def fire_bullet(ai_settings,screen,ship,bullets):

    # 创建一个子弹对象 加入到子弹组

    if len(bullets) < ai_settings.bullets_allowed: # 子弹少于允许值时再生成

    new_bullet = Bullet(ai_settings, screen, ship)

    bullets.add(new_bullet)

    def get_number_aliens_x(ai_settings,alien_width):

    """计算每行可容纳多少个外星人"""

    available_space_x = ai_settings.screen_width - 2 * alien_width

    number_aliens_x = int(available_space_x / (2 * alien_width))

    return number_aliens_x

    def get_number_rows(ai_settings,ship_height,alien_height):

    """计算屏幕可容纳多少行外星人"""

    available_space_y = (ai_settings.screen_height - (3 * alien_height) - ship_height)

    number_rows = int(available_space_y / (2 * alien_height))

    return number_rows

    def create_aliens(ai_settings,screen,aliens,alien_number,row_number):

    """创建一个外星人并将其放在当期行"""

    alien = Alien(ai_settings,screen)

    alien_width = alien.rect.width

    alien.x = alien_width + 2 * alien_width * alien_number

    alien.rect.x = alien.x

    alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number

    aliens.add(alien)

    def create_fleet(ai_settings,screen,ship,aliens):

    """创建外星人群"""

    #创建一个外星人,并计算一行可以容纳多少个外星人

    #外星人间距为外星人宽度

    alien = Alien(ai_settings,screen)

    number_aliens_x = get_number_aliens_x(ai_settings,alien.rect.width)

    number_rows = get_number_rows(ai_settings,ship.rect.height,alien.rect.height)

    #创建第一行外星人

    for row_number in range(number_rows):

    for alien_number in range(number_aliens_x):

    #创建一个外星人并将其加入当前行

    create_aliens(ai_settings,screen,aliens,alien_number,row_number)

    def check_fleet_edges(ai_settings,aliens):

    """有外星人到达边缘时采取相应措施"""

    for alien in aliens.sprites():

    if alien.check_edges():

    change_fleet_direction(ai_settings,aliens)

    break

    def change_fleet_direction(ai_settings,aliens):

    """将整群外星人下移,并改变他们的运动方向"""

    for alien in aliens.sprites():

    alien.rect.y += ai_settings.fleet_drop_speed

    ai_settings.fleet_direction *= -1

    def ship_hit(ai_settings,stats,screen,sb,ship,aliens,bullets):

    """响应被外星人撞到的飞船"""

    if stats.ships_left > 0:

    #将ship_left减1

    stats.ships_left -= 1

    #更新记分牌

    sb.prep_ships()

    #清空外星人列表和子弹列表

    aliens.empty()

    bullets.empty()

    #创建一群新的外星人,并将飞船放到屏幕低端中央

    create_fleet(ai_settings,screen,ship,aliens)

    ship.center_ship()

    #暂停

    sleep(0.5)

    else:

    stats.game_active = False

    pygame.mouse.set_visible(True)

    def check_aliens_bottom(ai_settings,stats,screen,sb,ship,aliens,bullets):

    """检查是否有外星人到达屏幕低端"""

    screen_rect = screen.get_rect()

    for alien in aliens.sprites():

    if alien.rect.bottom >= screen_rect.bottom:

    #像飞船被撞到一样进行处理

    ship_hit(ai_settings,stats,screen,sb,ship,aliens,bullets)

    break

    def update_aliens(ai_settings,stats,screen,sb,ship,aliens,bullets):

    """更新外星人群中所有外星人的位置"""

    check_fleet_edges(ai_settings,aliens)

    aliens.update()

    #检测外星人和飞船之间的碰撞

    if pygame.sprite.spritecollideany(ship,aliens):

    ship_hit(ai_settings,stats,screen,sb,ship,aliens,bullets)

    #检查是否有外星人到达屏幕低端

    check_aliens_bottom(ai_settings,stats,screen,sb,ship,aliens,bullets)

    def check_high_score(stats,sb):

    """检查是否诞生了新的最高纪录"""

    if stats.score > stats.high_score:

    stats.high_score = stats.score

    sb.prep_high_score()

    6.游戏统计信息,game_stats.py,代码:

    class GameStats():

    """跟踪游戏的统计信息"""

    def __init__(self,ai_settings):

    """初始化统计信息"""

    self.ai_settings = ai_settings

    self.reset_stats()

    #游戏刚启动时处于非活动状态

    self.game_active = False

    #在任何情况下不应该重置最高分

    self.high_score = 0

    self.level = 1

    def reset_stats(self):

    """初始化在游戏运行期间可能变化的统计信息"""

    self.ships_left = self.ai_settings.ship_limit

    self.score = 0

    7.分数设置,scoreboard.py,代码:

    import pygame.font

    from pygame.sprite import Group

    from ship import Ship

    class Scoreboard():

    """显示得分信息的类"""

    def __init__(self, ai_settings, screen, stats):

    """初始化显示得分涉及的属性"""

    self.screen =screen

    self.screen_rect = screen.get_rect()

    self.ai_settings = ai_settings

    self.stats = stats

    #显示得分信息时使用的字体设置

    self.text_color = (30, 30, 30)

    self.font = pygame.font.SysFont(None, 48)

    #准备初始化得分图像和当前最高分数

    self.prep_score()

    self.prep_high_score()

    self.prep_level()

    self.prep_ships()

    def prep_score(self):

    """将得分转换为一幅渲染的图像"""

    rounded_score = int(round(self.stats.score, -1))

    score_str = "{:,}".format(rounded_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 = 5

    def prep_high_score(self):

    """将最高得分转换为渲染图像"""

    high_score = int(round(self.stats.high_score, -1))

    high_score_str = "{:,}".format(high_score)

    self.high_score_image = self.font.render(high_score_str, True, self.text_color, self.ai_settings.bg_color)

    #将最高分放在屏幕最中央

    self.high_score_rect = self.high_score_image.get_rect()

    self.high_score_rect.centerx = self.screen_rect.centerx

    self.high_score_rect.top = 5

    def prep_level(self):

    """将等级转换为渲染图像"""

    self.level_image = self.font.render(str(self.stats.level), True, self.text_color, self.ai_settings.bg_color)

    #将得分放在右上角

    self.level_rect = self.score_image.get_rect()

    self.level_rect.right = self.screen_rect.right

    self.level_rect.top = self.score_rect.bottom

    def prep_ships(self):

    """显示还剩下多少艘飞船"""

    self.ships = Group()

    for ship_number in range(self.stats.ships_left):

    ship = Ship(self.ai_settings, self.screen)

    ship.rect.x = 10 + ship_number * ship.rect.width

    ship.rect.y = 10

    self.ships.add(ship)

    def show_score(self):

    """在屏幕上显示得分和等级"""

    self.screen.blit(self.score_image, self.score_rect)

    self.screen.blit(self.high_score_image, self.high_score_rect)

    self.screen.blit(self.level_image, self.level_rect)

    #绘制飞船

    self.ships.draw(self.screen)

    8.设置,settings.py,代码:

    class Settings():

    '''存储外星人入侵中所有的设置'''

    def __init__(self):

    '''初始化设置'''

    #屏幕设置

    self.screen_width = 1200

    self.screen_height = 600

    self.bg_color = (230,230,230) # 设置背景色 灰色

    #飞船设置

    self.ship_limit = 3

    self.ship_image_path = 'images/ship.bmp' # 飞船图片路径

    #子弹设置

    self.bullet_width = 3

    self.bullet_height = 15

    self.bullet_color = 60,60,60

    self.bullets_allowed = 3 # 允许屏幕中出现子弹的数量

    #外星人设置

    self.fleet_drop_speed = 10

    #以什么样的速度加快游戏节奏

    self.speedup_scale = 1.1

    #外星人点数提高速度

    self.score_scale = 1.5

    self.initialize_dynamic_settings()

    def initialize_dynamic_settings(self):

    """初始化随游戏进行而变化的设置"""

    self.ship_speed_factor = 1.5

    self.bullet_speed_factor = 3

    self.alien_speed_factor = 1

    #fleet_direction为1表示向右移,为-1表示向左移

    self.fleet_direction = 1

    #计分

    self.alien_points = 50

    def increase_speed(self):

    """提高速度设置,外星人点数"""

    self.ship_speed_factor *= self.speedup_scale

    self.bullet_speed_factor *= self.speedup_scale

    self.alien_speed_factor *= self.speedup_scale

    self.alien_points = int(self.alien_points * self.score_scale)

    print(self.alien_points)

    9.飞船设置,ship.py,代码:

    import pygame

    from pygame.sprite import Sprite

    class Ship(Sprite):

    '''飞船所有信息'''

    def __init__(self,ai_settings,screen):

    """初始化飞船,并设置其起始位置"""

    super(Ship,self).__init__()

    self.screen=screen

    self.ai_settings = ai_settings

    # 加载飞船图片、获取外接矩形

    self.image = pygame.image.load(self.ai_settings.ship_image_path) # 加载图片

    self.image = pygame.transform.smoothscale(self.image,(40,60))

    self.rect = self.image.get_rect() # 获取图片外接矩形

    self.screen_rect = screen.get_rect() #获取屏幕外接矩形

    # 将每搜新飞船放到并木底部中心

    self.rect.centerx = self.screen_rect.centerx

    self.rect.bottom = self.screen_rect.bottom

    # 设置成浮点类型

    self.center = float(self.rect.centerx) # self.rect.centerx设置不了浮点数 只能另设置一个变量进行运算

    # 移动标志

    self.moving_right = False

    self.moving_left = False

    def blitme(self):

    '''在指定位置绘制飞船'''

    self.screen.blit(self.image,self.rect)

    def update(self):

    # 向右移动飞船

    if self.moving_right and self.rect.right < self.screen_rect.right:

    self.center +=self.ai_settings.ship_speed_factor

    # 向左移动飞船

    if self.moving_left and self.rect.left > self.screen_rect.left:

    self.center -= self.ai_settings.ship_speed_factor

    self.rect.centerx = self.center

    def center_ship(self):

    """让飞船在屏幕上居中"""

    self.center = self.screen_rect.centerx

    效果展示:

    2017041811565210.png

    游戏资源:图片资源

    2017418120021325.jpg

    2017418120046186.jpg

    更多关于python游戏的精彩文章请点击查看以下专题:

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    展开全文
  • 主要为大家详细介绍了Python外星人入侵游戏编程完整的实现思路,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • Python外星人入侵游戏编程完整版--附源码
  • PYTHON游戏编程外星人入侵的完整实现思路,具体内容如下准备工作:下载python,比如Anaconda3(64 bit),导入pygame游戏包1.外星人设置,alien.py,代码:import pygamefrom pygame.sprite import Spriteclass ...

    PYTHON游戏编程外星人入侵的完整实现思路,具体内容如下

    准备工作:下载python,比如Anaconda3(64 bit),导入pygame游戏包

    201704181156515.png

    201704181156516.png

    201704181156517.png

    201704181156518.png

    201704181156529.png

    1.外星人设置,alien.py,代码:

    import pygame

    from pygame.sprite import Sprite

    class Alien(Sprite):

    """表示单个外星人的类"""

    def __init__(self,ai_settings,screen):

    """初始化外星人并设置其他位置"""

    super(Alien,self).__init__()

    self.screen = screen

    self.ai_settings = ai_settings

    #加载外星人图像,并设置其rect属性

    self.image = pygame.image.load('images/alien.bmp')

    self.rect = self.image.get_rect()

    #每个外星人最初都在屏幕左上角附近

    self.rect.x = self.rect.width

    self.rect.y = self.rect.height

    #存储外星人的准确位置

    self.x = float(self.rect.x)

    def blitme(self):

    """在指定位置绘制外星人"""

    self.screen.blit(self.image,self.rect)

    def check_edges(self):

    """如果外星人位于屏幕边缘,就返回True"""

    screen_rect = self.screen.get_rect()

    if self.rect.right >= screen_rect.right:

    return True

    elif self.rect.left <= 0:

    return True

    def update(self):

    """向右移动外星人"""

    self.x += (self.ai_settings.alien_speed_factor * self.ai_settings.fleet_direction)

    self.rect.x = self.x

    2.游戏主程序,alien_invasion.py,代码:

    import pygame

    from settings import Settings

    from game_stats import GameStats

    from button import Button

    from ship import Ship

    from pygame.sprite import Group

    import game_functions as gf

    from scoreboard import Scoreboard

    def run_game():

    pygame.init() # 初始化背景设置

    ai_settings = Settings() # 全局设置

    screen = pygame.display.set_mode( # 创建screen显示窗口

    (ai_settings.screen_width,ai_settings.screen_height)

    )

    pygame.display.set_caption('Alien Invasion') # 标题

    #新建Play按钮

    play_button = Button(ai_settings,screen,"Play")

    #创建一个用于存储游戏统计信息的实例,并创建记分牌

    stats = GameStats(ai_settings)

    sb = Scoreboard(ai_settings, screen, stats)

    # 创建飞船

    ship = Ship(ai_settings,screen)

    # 创建子弹编组

    bullets = Group()

    #创建一个外星人

    aliens = Group()

    #创建外星人群

    gf.create_fleet(ai_settings,screen,ship,aliens)

    # 开始游戏主循环

    while True:

    # 监视键盘和鼠标事件

    gf.check_events(ai_settings,screen,stats,sb,play_button,ship,aliens,bullets)

    if stats.game_active:

    # 移动飞船

    gf.update_ship(ship)

    # 更新子弹位置

    gf.update_bullets(ai_settings,screen,stats,sb,ship,aliens,bullets)

    #更新外星人

    gf.update_aliens(ai_settings,stats,screen,sb,ship,aliens,bullets)

    # 更新屏幕

    gf.update_screen(ai_settings,screen,stats,sb,ship,aliens,bullets,play_button)

    run_game()

    展开全文
  • 2020年初回顾这个以前写的文章,准备重新整理下文章,把学习python的基本语法为主,对比我的主要编程语言Java,Kotlin,捡起对Python的回忆。。。来源:Python编程:从入门到实践学习语法:菜鸟教程Python3我的编程...
  • 【实例简介】【实例截图】【核心代码】#--coding:utf-8--import pygamefrom pygame.sprite import Spriteclass ...表示单个外星人的类"""def __init__(self,ai_setting,screen):"""...
  • Python外外星星人人入入侵侵游游戏戏编编程程完完整整版版 这篇文章主要为大家详细介绍了Python外星人入侵游戏编程完整的实现思路文中示例代码介绍的非常详细具 有一 的参考价值感兴趣的小伙伴们可以参考一下 PYTHON...
  • python外星人入侵游戏 在《外星人入侵》中,玩家控制出现在屏幕底部中心的一艘火箭飞船。 玩家可以使用箭头键左右移动飞船,并使用空格键射击子弹。 游戏开始时,一群外星人注满了天空,在屏幕上来回移动。 玩家...
  • 八、计分,创建一个scoreboard.py的文件1、显示分数,在屏幕上显示最高分,...在外星人消灭后,提高等级代码如下import pygame.fontfrom pygame.sprite import Groupfrom ship import Shipclass Scoreboard():#显...
  • Python外星人入侵游戏——添加飞船和外星人图片

    万次阅读 多人点赞 2018-07-26 15:11:22
    Python外星人入侵游戏是自己在《Python编程从入门到实践》在本书里学到的。本篇主要介绍该游戏中所需要的两个图片。分别为飞船和外星人图片。 1、首先去到 http://www.ituring.com.cn/book/1861 网站,就会看到有关...
  • 创建Pygame窗口以及相应输入:import sysimport pygamedef run_game():#初始化游戏并创建屏幕对象pygame.init() #检查pygame包是否完整screen=pygame.display.set_mode((1200,800))#创建显示窗口pygame.display.set_...
  • 原博文2019-02-26 21:28 −https://github.com/ehmatthes/pcc/tree/master/chapter_12/images ...0538相关推荐2019-09-28 21:13 −Python python是一种跨平台的计算机程序设计语言,是一种面向对象的动态类型语言。...
  • 这篇文章主要为大家详细介绍了Python外星人入侵游戏编程完整的实现思路,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,PYTHON游戏编程外星人入侵的完整实现思路,具体内容如下...
  • 开学自学的python,通过敲代码练习的项目《外星人入侵》。游戏介绍:游戏在玩家每消灭一群向下移动的外星人后,都将玩家的等级提高一个等级;而等级越高,游戏的节奏越快,难度越大我使用的是python 3.7,在Windows...
  • 1 importsys23 importpygame4 from bullet importBullet5 from alien importAlien6 from time importsleep78 defcheck_events(ai_setting, screen, stats, sb, play_button, ship, aliens, bullets):9 """响应按键和...
  • 在本节中,我们将创建一个名为game_functions 的新模块,它将存储大量让游戏外星人入侵》运行的函数。通过创建模块game_functions ,可避免alien_invasion.py太长,并使其逻辑更容易理解。将check_events() 和...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,005
精华内容 1,202
关键字:

python外星人入侵游戏

python 订阅