Datehoer的博客
我本将心向明月,奈何明月照沟渠
Datehoer的博客

当前位置:主页 > 技术分享 > python 外星人入侵 完整版

python 外星人入侵 完整版

浏览: 作者:Datehoer 发布日期:2020-11-12 14:50:25 来源: 原创
差不多用了三天的空闲时间,把这个案例看完了一遍,并且实际操作了一下,其实难度确实不高,很适合我们这样的新人去操作。
不过其实遇到了许多的问题,但大多都是我的问题,做的我是心态崩了。
今天最后做play按钮的时候,怎么也不出效果,把game_active 改为False就显示黑屏,而换成True显示内容但是没啥卵用,因为不是静态的。
当时是真的不想做了,因为确实没有啥错误,出去吃了个饭,再仔细一看发现我是真的蠢!

while True:
    # 监视鼠标和键盘事件
    gf.check_events(ai_settings, screen, stats, board, play_button, ship, aliens, bullets)
    if stats.game_active:
        ship.update()
        bullets.update()
        gf.update_bullets(ai_settings, screen, stats, board, ship, aliens, bullets)
        gf.update_aliens(ai_settings, screen, stats, board, ship, aliens, bullets)
    gf.update_screen(ai_settings, screen, stats, board, ship, aliens, bullets, play_button)

这一段,最后的gf.update_screen,应该是再if外的,因为他是做出那个静态效果的,但是我当时把他放到了if里,所以改成false时,显示黑屏,我当时真的找了半天,因为他这个如果你没改false的话是没有任何问题出现的,最后随便一看,发现了这个错误,把我气的。
还有一些非常蠢的错误,基本上全是自己的失误吧,哎,说多了都是泪。
其实很重要的一个模块就是pygame.sprites毕竟你要修改游戏要进行交互等等吧,很重要。---->《python sprites介绍》
不得不说,细节决定成败,这句话非常有道理!
我就把外星人,计分板和按钮的py文件发一下源代码,其余的还是改成附件上传吧,毕竟有点小多。
计分板的,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 = (50, 50, 50)
        self.font = pygame.font.SysFont(None, 48)
        # 初始化得分图像
        self.prep_score()
        self.prep_high_score()
        self.prep_level()
        self.prep_ships()


    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 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 = self.score_rect.top

    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.level_image.get_rect()
        self.level_rect.right = self.score_rect.right
        self.level_rect.top = self.score_rect.bottom + 10

    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 = 20

    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)
外星人的,alien.py
import pygame
from pygame.sprite import Sprite


class Alien(Sprite):
    def __init__(self, ai_settings, screen):
        """初始化外星人起始位置"""
        super(Alien, self).__init__()
        self.ai_settings = ai_settings
        self.screen = screen

        # 加载外星人图像,并设置其rect属性
        self.image = pygame.image.load("images/alien.bmp")
        self.rect = self.image.get_rect()
        # self.screen_rect = screen.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
按钮,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)

        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):
        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)


其余的下载链接--》天翼云
有什么问题可以在下面的评论区发送,我看到后会在第一时间解答!

版权:本文由Datehoer原创,著作权归作者所有。商业转载请联系作者获得授权,非商业转载请保留以上作者信息和原文链接本文链接:https://zjzdmc.top/jsfx/45.html。

文章推荐

热门标签

返回顶部
下面为相关推荐
说点什么吧
  • 全部评论(0