python 外星人入侵 完整版

11/12/2020 python

差不多用了三天的空闲时间,把这个案例看完了一遍,并且实际操作了一下,其实难度确实不高,很适合我们这样的新人去操作。不过其实遇到了许多的问题,但大多都是我的问题,做的我是心态崩了。

今天最后做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)
1
2
3
4
5
6
7
8
9

这一段,最后的 gf.update_screen 应该在 if 外,因为它是做出那个静态效果的,但是我当时把它放到了 if 里,所以改成 False 时,显示黑屏,我当时真的找了半天,因为他这个如果你没改 False 的话是没有任何问题出现的,最后随便一看,发现了这个错误,把我气的。

还有一些非常蠢的错误,基本上全是自己的失误吧,哎,说多了都是泪。

其实很重要的一个模块就是 pygame.sprite,毕竟你要修改游戏要进行交互等等吧,很重要。

不得不说,细节决定成败,这句话非常有道理!

我就把外星人、计分板和按钮的 Python 文件发一下源代码,其余的还是改成附件上传吧,毕竟有点小多。

计分板的 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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61

外星人的 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.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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

按钮的 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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

如果你有任何问题或需要进一步的帮助,请随时在评论区发送,我会尽力解答!