python 外星人入侵 完整版

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

今天最后做play按钮的时候,怎么也不出效果,把 game_active 改为 False 就显示黑屏,而换成 True 显示内容但是没啥卵用,因为不是静态的。当时是真的不想做了,因为确实没有啥错误,出去吃了个饭,再仔细一看发现我是真的蠢!

1
2
3
4
5
6
7
8
9
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.sprite,毕竟你要修改游戏要进行交互等等吧,很重要。

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

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

计分板的 scoreboard.py

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

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

按钮的 button.py

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

发布于

2020-11-12

更新于

2023-10-19

许可协议

评论