GitHub:
目前只做了第一部分:一个界面,有个飞机,可以左右移动,放子弹。
暂无计划做第二部分。
alien_invasion.py
<span style="color: #0000ff;">import<span style="color: #000000;"> pygame
<span style="color: #0000ff;">from settings <span style="color: #0000ff;">import<span style="color: #000000;"> Settings
<span style="color: #0000ff;">from ship <span style="color: #0000ff;">import<span style="color: #000000;"> Ship
<span style="color: #0000ff;">import<span style="color: #000000;"> game_functions as gf
<span style="color: #0000ff;">from pygame.sprite <span style="color: #0000ff;">import<span style="color: #000000;"> Group
<span style="color: #0000ff;">def<span style="color: #000000;"> run_game():
<span style="color: #008000;">#<span style="color: #008000;"> 初始化游戏并创建一个屏幕对象
<span style="color: #000000;"> pygame.init()
ai_settings =<span style="color: #000000;"> Settings()
screen =<span style="color: #000000;"> pygame.display.set_mode((ai_settings.screen_width,ai_settings.screnn_height))
pygame.display.set_caption(<span style="color: #800000;">'<span style="color: #800000;">Alien Invasion<span style="color: #800000;">'<span style="color: #000000;">)
</span><span style="color: #008000;">#</span><span style="color: #008000;"> 创建一艘飞船</span>
ship =<span style="color: #000000;"> Ship(ai_settings,screen)
</span><span style="color: #008000;">#</span><span style="color: #008000;"> 创建一个存储的子弹组</span>
bullets =<span style="color: #000000;"> Group()
</span><span style="color: #008000;">#</span><span style="color: #008000;"> 设置背景色</span>
bg_color = (230,230,230<span style="color: #000000;">)
</span><span style="color: #008000;">#</span><span style="color: #008000;"> 开始游戏的主循环</span>
<span style="color: #0000ff;">while</span><span style="color: #000000;"> True:
gf.check_events(ai_settings,screen,ship,bullets)
ship.update()
gf.update_bullets(bullets)
gf.update_screen(ai_settings,bullets)
run_game()
bullet.py
<span style="color: #0000ff;">from pygame.sprite <span style="color: #0000ff;">import<span style="color: #000000;"> Sprite
<span style="color: #0000ff;">class<span style="color: #000000;"> Bullet(Sprite):
</span><span style="color: #0000ff;">def</span> <span style="color: #800080;">__init__</span><span style="color: #000000;">(self,ai_settings,ship):
super(Bullet,self).</span><span style="color: #800080;">__init__</span><span style="color: #000000;">()
self.screen </span>=<span style="color: #000000;"> screen
self.rect </span>=<span style="color: #000000;"> pygame.Rect(0,ai_settings.bullet_width,ai_settings.bullet_height)
self.rect.centerx </span>=<span style="color: #000000;"> ship.rect.centerx
self.rect.top </span>=<span style="color: #000000;"> ship.rect.top
</span><span style="color: #008000;">#</span><span style="color: #008000;"> 存储用小数表示的子弹位置</span>
self.y =<span style="color: #000000;"> float(self.rect.y)
self.color </span>=<span style="color: #000000;"> ai_settings.bullet_color
self.speed_factor </span>=<span style="color: #000000;"> ai_settings.bullet_speed_factor
</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> update(self):
self.y </span>-=<span style="color: #000000;"> self.speed_factor
</span><span style="color: #008000;">#</span><span style="color: #008000;"> 更新子弹位置</span>
self.rect.y =<span style="color: #000000;"> self.y
</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> draw_bullet(self):
pygame.draw.rect(self.screen,self.color,self.rect)</span></pre>
game_functions
<span style="color: #0000ff;">import<span style="color: #000000;"> pygame
<span style="color: #0000ff;">from bullet <span style="color: #0000ff;">import<span style="color: #000000;"> Bullet
<span style="color: #0000ff;">def<span style="color: #000000;"> check_events(ai_settings,bullets):
<span style="color: #008000;">#<span style="color: #008000;"> 监听键盘和鼠标的事件
<span style="color: #0000ff;">for event <span style="color: #0000ff;">in<span style="color: #000000;"> pygame.event.get():
<span style="color: #0000ff;">if event.type ==<span style="color: #000000;"> pygame.QUIT:
sys.exit()
<span style="color: #0000ff;">elif event.type ==<span style="color: #000000;"> pygame.KEYDOWN:
check_keydown_events(event,bullets)
<span style="color: #0000ff;">elif event.type ==<span style="color: #000000;"> pygame.KEYUP:
check_keyup_events(event,ship)
<span style="color: #0000ff;">def<span style="color: #000000;"> update_screen(ai_settings,bullets):
<span style="color: #008000;">#<span style="color: #008000;"> 每次循环时都重绘屏幕
<span style="color: #000000;"> screen.fill(ai_settings.bg_color)
</span><span style="color: #008000;">#</span><span style="color: #008000;"> 在飞船和外星人后面重绘所有子弹</span>
<span style="color: #0000ff;">for</span> bullet <span style="color: #0000ff;">in</span><span style="color: #000000;"> bullets.sprites():
bullet.draw_bullet()
ship.blitme()
</span><span style="color: #008000;">#</span><span style="color: #008000;"> 让最近绘制的屏幕可见</span>
<span style="color: #000000;"> pygame.display.flip()
<span style="color: #0000ff;">def<span style="color: #000000;"> check_keydown_events(event,bullets):
<span style="color: #0000ff;">if event.key ==<span style="color: #000000;"> pygame.K_RIGHT:
ship.moving_right =<span style="color: #000000;"> True
<span style="color: #0000ff;">elif event.key ==<span style="color: #000000;"> pygame.K_LEFT:
ship.moving_left =<span style="color: #000000;"> True
<span style="color: #0000ff;">elif event.key ==<span style="color: #000000;"> pygame.K_SPACE:
<span style="color: #008000;">#<span style="color: #008000;"> 创建一颗子弹,并将其加入到编组 bullets 中
<span style="color: #000000;"> fire_bullet(ai_settings,bullets)
<span style="color: #0000ff;">def<span style="color: #000000;"> check_keyup_events(event,ship):
<span style="color: #0000ff;">if event.key ==<span style="color: #000000;"> pygame.K_RIGHT:
ship.moving_right =<span style="color: #000000;"> False
<span style="color: #0000ff;">elif event.key ==<span style="color: #000000;"> pygame.K_LEFT:
ship.moving_left =<span style="color: #000000;"> False
<span style="color: #0000ff;">def<span style="color: #000000;"> update_bullets(bullets):
bullets.update()
</span><span style="color: #008000;">#</span><span style="color: #008000;"> 删除已经消失的子弹</span>
<span style="color: #0000ff;">for</span> bullet <span style="color: #0000ff;">in</span><span style="color: #000000;"> bullets.copy():
</span><span style="color: #0000ff;">if</span> bullet.rect.bottom <=<span style="color: #000000;"> 0:
bullets.remove(bullet)