Skip to content

Commit c0e7d2f

Browse files
committed
[学习内容]外星人入侵项目实践
1. 创建外星人类 2. 创建多个外星人并初始化位置 未完成: 3. 打印刷新外星人 90%
1 parent 12061b0 commit c0e7d2f

5 files changed

Lines changed: 210 additions & 29 deletions

File tree

alien.py

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
#coding: utf-8
2+
3+
4+
import pygame
5+
from pygame.sprite import Sprite
6+
7+
8+
class Alien(Sprite):
9+
"""表示单个外星人的类"""
10+
11+
def __init__(self, screen):
12+
"""初始化外星人"""
13+
super(Alien, self).__init__()
14+
self.__screen = screen
15+
self.__image = 'alien.png'
16+
17+
# 加载外星人图像
18+
self.__image = pygame.image.load('alien.png')
19+
self.__rect = self.__image.get_rect()
20+
21+
# 每个外星人最初都在屏幕左上角附近
22+
self.__rect.x = self.__rect.width
23+
self.__rect.y = self.__rect.height
24+
self.__center = self.__rect.centerx
25+
26+
# 存储外星人准确的位置
27+
self.__x = float(self.__rect.x)
28+
self.__y = float(self.__rect.y)
29+
30+
self.__speed = 1
31+
self.__min_distance_alien = 50
32+
self.__min_distance_wall = 40
33+
self.__current_distance_alien_left = 0
34+
self.__current_distance_alien_right = 0
35+
self.__current_distance_wall_left = 0
36+
self.__current_distance_wall_right = 0
37+
self.__current_distance_bottom = 0
38+
self.__current_distance_top = 0
39+
40+
def blitme(self):
41+
"""在指定的位置绘制外星人"""
42+
self.__screen.blit(self.__image, self.__rect)
43+
44+
def update(self):
45+
"""重写更新函数,根据移动规则改变外星人位置"""
46+
self.__y += self.__speed
47+
# self.__x += self.__speed
48+
self.__rect.y = self.__y
49+
# self.__rect.x = self.__x
50+
self.__center = self.__rect.centerx
51+
52+
def moving(self):
53+
"""移动外星人"""
54+
55+
def stop(self):
56+
"""停止外星人"""
57+
58+
def set_move_speed(self, speed):
59+
"""设置移动速度"""
60+
self.__speed = speed
61+
62+
def get_scrren(self):
63+
return self.__screen
64+
65+
def set_rect(self, rect):
66+
self.__rect = rect
67+
return True
68+
69+
def get_rect(self):
70+
return self.__rect
71+
72+
def set_width(self, width):
73+
self.__rect.x = width
74+
return True
75+
76+
def get_width(self):
77+
return self.__rect.x
78+
79+
def set_height(self, height):
80+
self.__rect.y = height
81+
return True
82+
83+
def get_height(self):
84+
return self.__rect.y
85+
86+
def get_self_center(self):
87+
return self.__center
88+
89+
def get_distance_alien(self):
90+
return self.__distance_alien
91+
92+
def get_distance_wall(self):
93+
return self.__distance_wall
94+
95+
96+
97+

alien_invasion.py

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
#coding: utf-8
22

33

4-
import sys
4+
# import sys
55
import pygame
66
from settings import Settings
77
from ship import Ship
8+
# from alien import Alien
89
import game_functions as gf
910
from pygame.sprite import Group
10-
import bullet as Bullte
11+
# import bullet as Bullte
1112

1213

1314
def run_game():
@@ -18,18 +19,33 @@ def run_game():
1819
scrren = pygame.display.set_mode((ai_settings.scrren_width, ai_settings.scrren_height))
1920
pygame.display.set_caption("Alien Invasion")
2021

21-
# 创建一艘飞船
22+
# 创建一艘飞船
2223
ship = Ship(scrren)
2324
ai_settings.set_ship_default(ship)
2425

26+
# 创建外星人
27+
aliens = Group()
28+
alien_num = ai_settings.cal_alien_num_line_default(scrren)
29+
print alien_num
30+
gf.creat_fleet_alien(scrren, aliens, alien_num)
31+
ai_settings.set_alien_info_default(aliens, alien_num)
32+
33+
34+
35+
2536
# 开始游戏的主循环
2637
while True:
27-
# 监视键盘和鼠标事件
38+
# 0.监视键盘和鼠标事件
2839
gf.check_event(ship)
2940

30-
# 每次循环时都重绘屏幕
31-
# bullets.update()
32-
gf.redraw_scrren(ai_settings, scrren, ship)
41+
# 1.更新飞船数据
42+
ship.update()
43+
44+
# 2.更新外星人数据
45+
aliens.update()
46+
47+
# 3.重绘屏幕
48+
gf.redraw_scrren(ai_settings.bg_color, scrren, ship, aliens)
3349

3450

3551
print run_game.__doc__

game_functions.py

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import pygame
55
import bullet as BULLET
66
from bullet import *
7+
from alien import *
78

89

910
def check_keyup_event(event, ship):
@@ -38,32 +39,49 @@ def check_event(ship):
3839
check_keyup_event(event, ship)
3940

4041

42+
def redraw_ship(ship):
43+
# 重绘飞船
44+
ship.blitme()
45+
46+
4147
def redraw_bullet(bullets):
42-
bullets.update()
4348
# 在飞船和外星人后面重绘所有子弹
49+
bullets.update()
4450
for bullet in bullets.copy():
4551
BULLET.delete_bullte(bullet, bullets)
4652

4753
for bullet in bullets.sprites():
4854
bullet.draw_bullet()
55+
# print len(bullets)
56+
57+
58+
def redraw_alien(scrren, aliens):
59+
aliens.update()
60+
# aliens_num = len(aliens)
61+
# aliens.draw(scrren)
4962

50-
print len(bullets)
5163

52-
def redraw_scrren(ai_settings, scrren, ship):
64+
def redraw_scrren(bg_color, scrren, ship, aliens):
5365
"""更新屏幕上的图像"""
54-
# 每次循环时都重绘屏幕
55-
scrren.fill(ai_settings.bg_color)
66+
# 1.重刷背景
67+
scrren.fill(bg_color)
5668

57-
bullets = ship.get_bullets()
58-
redraw_bullet(bullets)
69+
# 2.重绘飞船
70+
redraw_ship(ship)
5971

60-
ship.blitme()
61-
# 让最近绘图的屏幕可见
62-
pygame.display.flip()
63-
ship.update()
64-
bullets.update()
72+
# 3.重绘子弹
73+
redraw_bullet(ship.get_bullets())
6574

75+
# 4.重绘外星人
76+
redraw_alien(scrren, aliens)
6677

78+
# 让最近绘图的屏幕可见
79+
pygame.display.flip()
6780

6881

82+
def creat_fleet_alien(screen, aliens, aliens_num):
83+
"""创建一群外星人"""
84+
for alien in range(aliens_num):
85+
alien = Alien(screen)
86+
aliens.add(alien)
6987

settings.py

Lines changed: 48 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,20 +24,63 @@ def __init__(self):
2424
self.bullet_height = 10
2525
self.bullet_color = 0, 0, 0
2626

27+
# 外星人设置
28+
self.alien_speed = 1
29+
self.alien_max_num = 10
30+
#
31+
self.alien_min_distance_alien = 50
32+
self.alien_min_distance_wall = 40
33+
self.alien_min_distance_bottom = 30
34+
self.alien_min_distance_top = 60
35+
2736
def set_ship(self, ship, speed, bullet):
37+
"""设置飞船属性"""
2838
ship.set_move_speed(speed)
2939
ship.set_bullet_allowed(bullet)
40+
return True
3041

3142
def set_ship_default(self, ship):
43+
"""设置默认飞船属性"""
3244
ship.set_move_speed(self.ship_speed)
3345
ship.set_bullet_allowed(self.ship_bullet_allowed)
3446
ship.set_bullets(self.bullet_width, self.bullet_height, self.bullet_color, self.bullet_speed)
47+
return True
3548

3649
def set_bullet_info(self, bullet, width, height, speed, color):
37-
bullet.setting_info(width, height, speed, color)
50+
"""设置子弹属性"""
51+
return bullet.setting_info(width, height, speed, color)
3852

3953
def set_bullet_info_defalut(self, bullet):
40-
bullet.set_info(self.bullet_width,
41-
self.bullet_height,
42-
self.bullet_speed,
43-
self.bullet_color)
54+
"""设置子弹默认属性"""
55+
return bullet.set_info(self.bullet_width,
56+
self.bullet_height,
57+
self.bullet_speed,
58+
self.bullet_color)
59+
60+
def cal_alien_num_line(self, alien_distance_alien, alien_distance_wall, scrren):
61+
"""计算一行可以放置多少个外星人"""
62+
# 屏幕宽度 = (外星人数 - 1)* 外星人间距 + 2 * 外星人到墙距离
63+
scrren_rect = scrren.get_rect()
64+
alien_num = int(scrren_rect.width - 2 * alien_distance_wall) / alien_distance_alien + 1
65+
return alien_num
66+
67+
def cal_alien_num_line_default(self, scrren):
68+
"""计算一行可以放置多少外星人"""
69+
scrren_rect = scrren.get_rect()
70+
return int((scrren_rect.width - 2 * self.alien_min_distance_wall) / self.alien_min_distance_alien + 1)
71+
72+
def set_alien_info_default(self, aliens, alien_num):
73+
"""设置外星人属性"""
74+
num = 1
75+
for alien in aliens:
76+
77+
rect = alien.get_rect()
78+
alien_width = alien.get_width()
79+
alien_height = alien.get_height()
80+
rect.y = self.alien_min_distance_bottom
81+
rect.x = self.alien_min_distance_wall + (num - 1) * (alien_width + self.alien_min_distance_alien)
82+
alien.set_rect(rect)
83+
num += 1
84+
print num
85+
print alien.get_rect()
86+
return True

ship.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,24 @@ class Ship():
99
def __init__(self, scrren):
1010
"""初始化飞船并设置其初始位置"""
1111
self.__scrren = scrren
12-
self.__image = pygame.image.load('ship.png')
12+
# 通过配置文件加载图像
13+
# ship_file_object = open('ship_image_name.txt', 'r')
14+
# image_name =ship_file_object.readlines(0)
15+
# print type(image_name)
16+
# print image_name[0]
17+
# image_name_ex = image_name[0]
18+
# self.__image = pygame.image.load(image_name_ex)
19+
# ship_file_object.close()
20+
self.__image = pygame.image.load_extended('ship.png')
1321
self.__rect = self.__image.get_rect()
1422
self.__scrren_rect = scrren.get_rect()
1523

24+
1625
# 持续移动标志
1726
self.__moving_riht = False
1827
self.__moving_left = False
1928
self.__speed_factor = 1
2029

21-
2230
# 将每艘飞船防止在屏幕底部中央
2331
self.__rect.centerx = (self.__scrren_rect.right + self.__scrren_rect.left) / 2
2432
self.__rect.bottom = self.__scrren_rect.bottom
@@ -39,10 +47,10 @@ def blitme(self):
3947

4048
def update(self):
4149
"""根据移动标志调整飞船的位置"""
42-
if True == self.__moving_riht and self.__rect.right < self.__scrren_rect.right:
50+
if (True is self.__moving_riht) and self.__rect.right < self.__scrren_rect.right:
4351
self.__self_center += self.__speed_factor
4452

45-
if True == self.__moving_left and self.__rect.left > self.__scrren_rect.left:
53+
if (True is self.__moving_left) and self.__rect.left > self.__scrren_rect.left:
4654
self.__self_center -= self.__speed_factor
4755

4856
self.__rect.centerx = self.__self_center
@@ -103,7 +111,6 @@ def set_bullets(self, width, height, color, speed):
103111
self.__bullet_color = color
104112
self.__bullet_speed = speed
105113

106-
107114
def fire_bullets(self):
108115
# 限定子弹数量
109116
if self.__bullet_allowed > len(self.__bullets):

0 commit comments

Comments
 (0)