外星人大戰---------遊戲開發(三)
前兩章已經針對於遊戲螢幕以及飛船移動,以及發射子彈有了簡單的設定,現在就開始新增外星人。螢幕邊緣附近新增一個外星人,然後生成一群外星人,外星人向兩邊和下面移動,並刪除被子彈擊中的外星人,最後顯示使用者擁有的飛船數量,用完後結束遊戲。
做專案就是先一步一步構建,然後再研究已有的程式碼看看是否還可以重構程式碼,簡潔程式碼
1.建立第一個外星人:外星人的創建於飛船類似,也是先建立一個alien類,用於後續管控alien,首先我們把外星人的圖片放入images的資料夾下,建立alien類:
#外星人類 import pygame from pygame.sprite import Sprite class Alien(Sprite): def __init__(self,ai_settings,screen): super().__init__() self.ai_settings=ai_settings self.screen=screen #載入圖片和獲取矩形 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)
修改功能模組:
#-*-coding:GBK-*- #-*-coding:utf-8-*- #遊戲的功能模組,包括響應鍵盤滑鼠事件,移動飛船等 import sys import pygame from bullet import Bullet def check_keydown_events(event,ai_settings,screen,ship,bullets): #響應按鍵 if event.key==pygame.K_RIGHT: ship.moving_right=True #改變標誌位 elif event.key==pygame.K_LEFT: ship.moving_left=True elif event.key==pygame.K_SPACE: #響應按空格鍵 fire_bullet(ai_settings,screen,ship,bullets) def fire_bullet(ai_settings,screen,ship,bullets): #發射子彈 if len(bullets)<ai_settings.bullets_allowed: new_bullet=Bullet(ai_settings,screen,ship) bullets.add(new_bullet) def check_keyup_events(event,ship): #響應按鍵鬆開 if event.key==pygame.K_RIGHT: ship.moving_right=False elif event.key==pygame.K_LEFT: ship.moving_left=False def check_events(ai_settings,screen,ship,bullets): #響應鍵盤和滑鼠事件 for event in pygame.event.get(): if event.type==pygame.QUIT: sys.exit() elif event.type==pygame.KEYDOWN: check_keydown_events(event,ai_settings,screen,ship,bullets) elif event.type==pygame.KEYUP: #監測是否放開鍵盤 check_keyup_events(event,ship) def update_screen(ai_settings,screen,ship,alien,bullets): # 更新螢幕 screen.fill(ai_settings.bg_color) for bullet in bullets.sprites(): bullet.draw_bullet() ship.blitme() alien.blitme() pygame.display.flip() def update_bullets(bullets): #更新子彈的位置,並刪除已消失的子彈 bullets.update() for bullet in bullets.copy(): if bullet.rect.bottom<=0: bullets.remove(bullet)
主程式如下:
#-*-coding:GBK-*- #-*-coding:utf-8-*- import pygame from setting import Setting from ship import Ship import game_functions as gf from pygame.sprite import Group from alien import Alien def run_game(): pygame.init() #初始化,建立螢幕物件 ai_settings=Setting() #建立一個800*800的螢幕 screen=pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height)) pygame.display.set_caption("Alien Invasion") #對於這個視窗的命名為Alien Invasion ship=Ship(ai_settings,screen) #建立飛船 bullets=Group() alien=Alien(ai_settings,screen) #建立外星人 while True: gf.check_events(ai_settings,screen,ship,bullets) ship.update() gf.update_bullets(bullets) gf.update_screen(ai_settings,screen,ship,alien,bullets) run_game()
輸出如下:
2.建立一群外星人,首先我們要考慮當前的遊戲螢幕一行能容納多少外星人,所以確定水平距離和垂直距離。
修改功能模組:
#-*-coding:GBK-*-
#-*-coding:utf-8-*-
#遊戲的功能模組,包括響應鍵盤滑鼠事件,移動飛船等
import sys
import pygame
from bullet import Bullet
from alien import Alien
def check_keydown_events(event,ai_settings,screen,ship,bullets): #響應按鍵
if event.key==pygame.K_RIGHT:
ship.moving_right=True #改變標誌位
elif event.key==pygame.K_LEFT:
ship.moving_left=True
elif event.key==pygame.K_SPACE: #響應按空格鍵
fire_bullet(ai_settings,screen,ship,bullets)
def fire_bullet(ai_settings,screen,ship,bullets): #發射子彈
if len(bullets)<ai_settings.bullets_allowed:
new_bullet=Bullet(ai_settings,screen,ship)
bullets.add(new_bullet)
def check_keyup_events(event,ship): #響應按鍵鬆開
if event.key==pygame.K_RIGHT:
ship.moving_right=False
elif event.key==pygame.K_LEFT:
ship.moving_left=False
def check_events(ai_settings,screen,ship,bullets): #響應鍵盤和滑鼠事件
for event in pygame.event.get():
if event.type==pygame.QUIT:
sys.exit()
elif event.type==pygame.KEYDOWN:
check_keydown_events(event,ai_settings,screen,ship,bullets)
elif event.type==pygame.KEYUP: #監測是否放開鍵盤
check_keyup_events(event,ship)
def update_screen(ai_settings,screen,ship,aliens,bullets): # 更新螢幕
screen.fill(ai_settings.bg_color)
for bullet in bullets.sprites():
bullet.draw_bullet()
ship.blitme()
aliens.draw(screen)
pygame.display.flip()
def update_bullets(bullets): #更新子彈的位置,並刪除已消失的子彈
bullets.update()
for bullet in bullets.copy():
if bullet.rect.bottom<=0:
bullets.remove(bullet)
#建立外星人群
def creat_fleet(ai_settings,screen,aliens):
alien=Alien(ai_settings,screen) #建立一個外星人,計算一行可以容納多少
alien_width=alien.rect.width
available_space_x=ai_settings.screen_width-2*alien_width
number_aliens_x=int(available_space_x/(2*alien_width))
for alien_number in range(number_aliens_x):
alien=Alien(ai_settings,screen)
alien.x=alien_width+2*alien_width*alien_number
alien.rect.x=alien.x
aliens.add(alien)
對編組aliens呼叫draw(),pygame 自動繪製編組裡的每個元素;接著建立一個函式建立外星人群,首先要匯入Alien類,首先建立一個外星人,計算遊戲螢幕一行能放下多少個外星人,每個人外星人的間距為外星人的寬度,在從外星人的rect屬性中獲得外星人的寬度,值儲存於alien_width中,計算一行的可用空間:用螢幕的寬度減去左邊和右邊的間距,也就是兩個外星人的寬度。再接著計算一行可以放入多少個外星人。一個外星人的顯示是需要兩個外星人的寬度,所以公式為:可用空間除以外星人寬度的2倍。又因為外星人的個數必須要試整數,所以要取整。現在已經可以知道一行有多少外星人,所以開始建立,編寫一個迴圈,來建立外星人,設定x座標加入當前行,再新增到編組裡。
主程式:
#-*-coding:GBK-*-
#-*-coding:utf-8-*-
import pygame
from setting import Setting
from ship import Ship
import game_functions as gf
from pygame.sprite import Group
from alien import Alien
def run_game():
pygame.init() #初始化,建立螢幕物件
ai_settings=Setting() #建立一個800*800的螢幕
screen=pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
pygame.display.set_caption("Alien Invasion") #對於這個視窗的命名為Alien Invasion
ship=Ship(ai_settings,screen) #建立飛船
bullets=Group()
aliens=Group()
gf.creat_fleet(ai_settings,screen,aliens)
while True:
gf.check_events(ai_settings,screen,ship,bullets)
ship.update()
gf.update_bullets(bullets)
gf.update_screen(ai_settings,screen,ship,aliens,bullets)
run_game()
輸出如下:
再次重構功能模組:
#-*-coding:GBK-*-
#-*-coding:utf-8-*-
#遊戲的功能模組,包括響應鍵盤滑鼠事件,移動飛船等
import sys
import pygame
from bullet import Bullet
from alien import Alien
def check_keydown_events(event,ai_settings,screen,ship,bullets): #響應按鍵
if event.key==pygame.K_RIGHT:
ship.moving_right=True #改變標誌位
elif event.key==pygame.K_LEFT:
ship.moving_left=True
elif event.key==pygame.K_SPACE: #響應按空格鍵
fire_bullet(ai_settings,screen,ship,bullets)
def fire_bullet(ai_settings,screen,ship,bullets): #發射子彈
if len(bullets)<ai_settings.bullets_allowed:
new_bullet=Bullet(ai_settings,screen,ship)
bullets.add(new_bullet)
def check_keyup_events(event,ship): #響應按鍵鬆開
if event.key==pygame.K_RIGHT:
ship.moving_right=False
elif event.key==pygame.K_LEFT:
ship.moving_left=False
def check_events(ai_settings,screen,ship,bullets): #響應鍵盤和滑鼠事件
for event in pygame.event.get():
if event.type==pygame.QUIT:
sys.exit()
elif event.type==pygame.KEYDOWN:
check_keydown_events(event,ai_settings,screen,ship,bullets)
elif event.type==pygame.KEYUP: #監測是否放開鍵盤
check_keyup_events(event,ship)
def update_screen(ai_settings,screen,ship,aliens,bullets): # 更新螢幕
screen.fill(ai_settings.bg_color)
for bullet in bullets.sprites():
bullet.draw_bullet()
ship.blitme()
aliens.draw(screen)
pygame.display.flip()
def update_bullets(bullets): #更新子彈的位置,並刪除已消失的子彈
bullets.update()
for bullet in bullets.copy():
if bullet.rect.bottom<=0:
bullets.remove(bullet)
#建立外星人群
def get_number_aliens_x(ai_settings,alien_width): #計算每行可以放入多少外星人
available_space_x=ai_settings.screen_width-2*alien_width
number_aliens_x=int(available_space_x/(2*alien_width))
return number_aliens_x
def creat_alien(ai_settings,screen,aliens,alien_number):
alien=Alien(ai_settings,screen) #建立一個外星人,放入當前行
alien_width=alien.rect.width
alien_x=alien_width+2*alien_width*alien_number
alien.rect.x=alien.x
aliens.add(alien)
def creat_fleet(ai_settings,screen,aliens):
alien=Alien(ai_settings,screen) #建立一個外星人,計算一行可以容納多少
number_aliens_x=get_number_aliens_x(ai_settings,alien.rect.width)
#建立第一行外星人
for alien_number in range(number_aliens_x):
creat_alien(ai_settings,screen,aliens,alien_number)
驗證過沒有問題:
3.新增行,上面的程式碼只是在第一行新增外星人,現在就要計算螢幕能裝多少行,用螢幕的垂直高度減取第一行的上邊距,外星人的高度和外星人之間的距離,以及飛船的高度:
修改功能模組:
#-*-coding:GBK-*-
#-*-coding:utf-8-*-
#遊戲的功能模組,包括響應鍵盤滑鼠事件,移動飛船等
import sys
import pygame
from bullet import Bullet
from alien import Alien
def check_keydown_events(event,ai_settings,screen,ship,bullets): #響應按鍵
if event.key==pygame.K_RIGHT:
ship.moving_right=True #改變標誌位
elif event.key==pygame.K_LEFT:
ship.moving_left=True
elif event.key==pygame.K_SPACE: #響應按空格鍵
fire_bullet(ai_settings,screen,ship,bullets)
def fire_bullet(ai_settings,screen,ship,bullets): #發射子彈
if len(bullets)<ai_settings.bullets_allowed:
new_bullet=Bullet(ai_settings,screen,ship)
bullets.add(new_bullet)
def check_keyup_events(event,ship): #響應按鍵鬆開
if event.key==pygame.K_RIGHT:
ship.moving_right=False
elif event.key==pygame.K_LEFT:
ship.moving_left=False
def check_events(ai_settings,screen,ship,bullets): #響應鍵盤和滑鼠事件
for event in pygame.event.get():
if event.type==pygame.QUIT:
sys.exit()
elif event.type==pygame.KEYDOWN:
check_keydown_events(event,ai_settings,screen,ship,bullets)
elif event.type==pygame.KEYUP: #監測是否放開鍵盤
check_keyup_events(event,ship)
def update_screen(ai_settings,screen,ship,aliens,bullets): # 更新螢幕
screen.fill(ai_settings.bg_color)
for bullet in bullets.sprites():
bullet.draw_bullet()
ship.blitme()
aliens.draw(screen)
pygame.display.flip()
def update_bullets(bullets): #更新子彈的位置,並刪除已消失的子彈
bullets.update()
for bullet in bullets.copy():
if bullet.rect.bottom<=0:
bullets.remove(bullet)
#建立外星人群
def get_number_aliens_x(ai_settings,alien_width): #計算每行可以放入多少外星人
available_space_x=ai_settings.screen_width-2*alien_width
number_aliens_x=int(available_space_x/(2*alien_width))
return number_aliens_x
def creat_alien(ai_settings,screen,aliens,alien_number,row_number):
alien=Alien(ai_settings,screen) #建立一個外星人,放入當前行
alien_width=alien.rect.width
alien.x=alien_width+2*alien_width*alien_number
alien.rect.x=alien.x
alien.rect.y=alien.rect.height+2*alien.rect.height*row_number
aliens.add(alien)
#計算螢幕可以放入多少行
def get_number_rows(ai_settings,ship_height,alien_height):
available_space_y=(ai_settings.screen_height-(3*alien_height)-ship_height)
number_rows=int(available_space_y/(2*alien_height))
return number_rows
def creat_fleet(ai_settings,screen,ship,aliens):
alien=Alien(ai_settings,screen) #建立一個外星人,計算一行可以容納多少
number_aliens_x=get_number_aliens_x(ai_settings,alien.rect.width)
number_rows=get_number_rows(ai_settings,ship.rect.height,alien.rect.height)
for row_number in range(number_rows):
for alien_number in range(number_aliens_x):
creat_alien(ai_settings,screen,aliens,alien_number,row_number)
首先定義一個計算有多行的函式get_number_rows,再用兩個迴圈,一個外部迴圈建立行數,一個內部行數建立每行的外星人。
主程式如下:
#-*-coding:GBK-*-
#-*-coding:utf-8-*-
import pygame
from setting import Setting
from ship import Ship
import game_functions as gf
from pygame.sprite import Group
def run_game():
pygame.init() #初始化,建立螢幕物件
ai_settings=Setting() #建立一個800*800的螢幕
screen=pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
pygame.display.set_caption("Alien Invasion") #對於這個視窗的命名為Alien Invasion
ship=Ship(ai_settings,screen) #建立飛船
bullets=Group()
aliens=Group()
gf.creat_fleet(ai_settings,screen,ship,aliens)
while True:
gf.check_events(ai_settings,screen,ship,bullets)
ship.update()
gf.update_bullets(bullets)
gf.update_screen(ai_settings,screen,ship,aliens,bullets)
run_game()
輸出如下:
4.讓外星人移動:讓外星人在螢幕上向右移動,撞到邊緣後下移一定的距離,再沿相反的方向移動。
首先實現向右移動,就像飛船裡的右移動一樣,在設定類裡新增外星人的速度:
#-*-coding:GBK-*-
#-*-coding:utf-8-*-
#儲存外星人遊戲開發的設定
class Setting():
def __init__(self):
self.screen_width=800 #設定螢幕高度寬度,背景顏色
self.screen_height=600
self.bg_color=(230,230,230)
self.ship_speed_factor=1 #設定飛船移動
#子彈設定
self.bullet_speed_factor=1
self.bullet_width=3
self.bullet_height=15
self.bullet_color=(0,0,255)
self.bullets_allowed=3
#外星人的設定
self.alien_speed_factor=1
在alien類修改:
#-*-coding:GBK-*-
#-*-coding:utf-8-*-
#外星人類
import pygame
from pygame.sprite import Sprite
class Alien(Sprite):
def __init__(self,ai_settings,screen):
super().__init__()
self.ai_settings=ai_settings
self.screen=screen
#載入圖片和獲取矩形
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 update(self):
self.x+=self.ai_settings.alien_speed_factor #向右移動
self.rect.x=self.x
功能模組:
#-*-coding:GBK-*-
#-*-coding:utf-8-*-
#遊戲的功能模組,包括響應鍵盤滑鼠事件,移動飛船等
import sys
import pygame
from bullet import Bullet
from alien import Alien
def check_keydown_events(event,ai_settings,screen,ship,bullets): #響應按鍵
if event.key==pygame.K_RIGHT:
ship.moving_right=True #改變標誌位
elif event.key==pygame.K_LEFT:
ship.moving_left=True
elif event.key==pygame.K_SPACE: #響應按空格鍵
fire_bullet(ai_settings,screen,ship,bullets)
def fire_bullet(ai_settings,screen,ship,bullets): #發射子彈
if len(bullets)<ai_settings.bullets_allowed:
new_bullet=Bullet(ai_settings,screen,ship)
bullets.add(new_bullet)
def check_keyup_events(event,ship): #響應按鍵鬆開
if event.key==pygame.K_RIGHT:
ship.moving_right=False
elif event.key==pygame.K_LEFT:
ship.moving_left=False
def check_events(ai_settings,screen,ship,bullets): #響應鍵盤和滑鼠事件
for event in pygame.event.get():
if event.type==pygame.QUIT:
sys.exit()
elif event.type==pygame.KEYDOWN:
check_keydown_events(event,ai_settings,screen,ship,bullets)
elif event.type==pygame.KEYUP: #監測是否放開鍵盤
check_keyup_events(event,ship)
def update_screen(ai_settings,screen,ship,aliens,bullets): # 更新螢幕
screen.fill(ai_settings.bg_color)
for bullet in bullets.sprites():
bullet.draw_bullet()
ship.blitme()
aliens.draw(screen)
pygame.display.flip()
def update_bullets(bullets): #更新子彈的位置,並刪除已消失的子彈
bullets.update()
for bullet in bullets.copy():
if bullet.rect.bottom<=0:
bullets.remove(bullet)
#建立外星人群
def get_number_aliens_x(ai_settings,alien_width): #計算每行可以放入多少外星人
available_space_x=ai_settings.screen_width-2*alien_width
number_aliens_x=int(available_space_x/(2*alien_width))
return number_aliens_x
def creat_alien(ai_settings,screen,aliens,alien_number,row_number):
alien=Alien(ai_settings,screen) #建立一個外星人,放入當前行
alien_width=alien.rect.width
alien.x=alien_width+2*alien_width*alien_number
alien.rect.x=alien.x
alien.rect.y=alien.rect.height+2*alien.rect.height*row_number
aliens.add(alien)
#計算螢幕可以放入多少行
def get_number_rows(ai_settings,ship_height,alien_height):
available_space_y=(ai_settings.screen_height-(3*alien_height)-ship_height)
number_rows=int(available_space_y/(2*alien_height))
return number_rows
def creat_fleet(ai_settings,screen,ship,aliens):
alien=Alien(ai_settings,screen) #建立一個外星人,計算一行可以容納多少
number_aliens_x=get_number_aliens_x(ai_settings,alien.rect.width)
number_rows=get_number_rows(ai_settings,ship.rect.height,alien.rect.height)
for row_number in range(number_rows):
for alien_number in range(number_aliens_x):
creat_alien(ai_settings,screen,aliens,alien_number,row_number)
#更新外星人的位置
def update_aliens(aliens):
aliens.update()
主程式:
#-*-coding:GBK-*-
#-*-coding:utf-8-*-
import pygame
from setting import Setting
from ship import Ship
import game_functions as gf
from pygame.sprite import Group
def run_game():
pygame.init() #初始化,建立螢幕物件
ai_settings=Setting() #建立一個800*800的螢幕
screen=pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
pygame.display.set_caption("Alien Invasion") #對於這個視窗的命名為Alien Invasion
ship=Ship(ai_settings,screen) #建立飛船
bullets=Group()
aliens=Group()
gf.creat_fleet(ai_settings,screen,ship,aliens)
while True:
gf.check_events(ai_settings,screen,ship,bullets)
ship.update()
gf.update_bullets(bullets)
gf.update_aliens(aliens)
gf.update_screen(ai_settings,screen,ship,aliens,bullets)
run_game()
執行程式後,外星人向右移動,並逐漸消失在右邊邊緣:
接下來就是撞到右邊邊緣後下移再左移:
修改設定類:
#-*-coding:GBK-*-
#-*-coding:utf-8-*-
#儲存外星人遊戲開發的設定
class Setting():
def __init__(self):
self.screen_width=800 #設定螢幕高度寬度,背景顏色
self.screen_height=600
self.bg_color=(230,230,230)
self.ship_speed_factor=1 #設定飛船移動
#子彈設定
self.bullet_speed_factor=1
self.bullet_width=3
self.bullet_height=15
self.bullet_color=(0,0,255)
self.bullets_allowed=3
#外星人的設定
self.alien_speed_factor=1
self.fleet_drop_speed=10
self.fleet_direction=1 #fleet_direction為1表示右移。為-1左移
檢查外星人是否到了邊緣位置:
#-*-coding:GBK-*-
#-*-coding:utf-8-*-
#外星人類
import pygame
from pygame.sprite import Sprite
class Alien(Sprite):
def __init__(self,ai_settings,screen):
super().__init__()
self.ai_settings=ai_settings
self.screen=screen
#載入圖片和獲取矩形
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 update(self):
self.x+=self.ai_settings.alien_speed_factor*self.ai_settings.fleet_direction #向右移動
self.rect.x=self.x
def check_edges(self):
screen_rect=self.screen.get_rect()
if self.rect.right>=screen_rect.right:
return True
elif self.rect.left<=0:
return True
修改功能模組:
#-*-coding:GBK-*-
#-*-coding:utf-8-*-
#遊戲的功能模組,包括響應鍵盤滑鼠事件,移動飛船等
import sys
import pygame
from bullet import Bullet
from alien import Alien
def check_keydown_events(event,ai_settings,screen,ship,bullets): #響應按鍵
if event.key==pygame.K_RIGHT:
ship.moving_right=True #改變標誌位
elif event.key==pygame.K_LEFT:
ship.moving_left=True
elif event.key==pygame.K_SPACE: #響應按空格鍵
fire_bullet(ai_settings,screen,ship,bullets)
def fire_bullet(ai_settings,screen,ship,bullets): #發射子彈
if len(bullets)<ai_settings.bullets_allowed:
new_bullet=Bullet(ai_settings,screen,ship)
bullets.add(new_bullet)
def check_keyup_events(event,ship): #響應按鍵鬆開
if event.key==pygame.K_RIGHT:
ship.moving_right=False
elif event.key==pygame.K_LEFT:
ship.moving_left=False
def check_events(ai_settings,screen,ship,bullets): #響應鍵盤和滑鼠事件
for event in pygame.event.get():
if event.type==pygame.QUIT:
sys.exit()
elif event.type==pygame.KEYDOWN:
check_keydown_events(event,ai_settings,screen,ship,bullets)
elif event.type==pygame.KEYUP: #監測是否放開鍵盤
check_keyup_events(event,ship)
def update_screen(ai_settings,screen,ship,aliens,bullets): # 更新螢幕
screen.fill(ai_settings.bg_color)
for bullet in bullets.sprites():
bullet.draw_bullet()
ship.blitme()
aliens.draw(screen)
pygame.display.flip()
def update_bullets(bullets): #更新子彈的位置,並刪除已消失的子彈
bullets.update()
for bullet in bullets.copy():
if bullet.rect.bottom<=0:
bullets.remove(bullet)
#建立外星人群
def get_number_aliens_x(ai_settings,alien_width): #計算每行可以放入多少外星人
available_space_x=ai_settings.screen_width-2*alien_width
number_aliens_x=int(available_space_x/(2*alien_width))
return number_aliens_x
def creat_alien(ai_settings,screen,aliens,alien_number,row_number):
alien=Alien(ai_settings,screen) #建立一個外星人,放入當前行
alien_width=alien.rect.width
alien.x=alien_width+2*alien_width*alien_number
alien.rect.x=alien.x
alien.rect.y=alien.rect.height+2*alien.rect.height*row_number
aliens.add(alien)
#計算螢幕可以放入多少行
def get_number_rows(ai_settings,ship_height,alien_height):
available_space_y=(ai_settings.screen_height-(3*alien_height)-ship_height)
number_rows=int(available_space_y/(2*alien_height))
return number_rows
def creat_fleet(ai_settings,screen,ship,aliens):
alien=Alien(ai_settings,screen) #建立一個外星人,計算一行可以容納多少
number_aliens_x=get_number_aliens_x(ai_settings,alien.rect.width)
number_rows=get_number_rows(ai_settings,ship.rect.height,alien.rect.height)
for row_number in range(number_rows):
for alien_number in range(number_aliens_x):
creat_alien(ai_settings,screen,aliens,alien_number,row_number)
#更新外星人的位置
def update_aliens(ai_settings,aliens):
check_fleet_edges(ai_settings,aliens)
aliens.update()
#對於外星人到達邊緣採取的措施:
def check_fleet_edges(ai_settings,aliens):
for alien in aliens.sprites():
if alien.check_edges():
change_fleet_direction(ai_settings,aliens)
break
#下移外星人
def change_fleet_direction(ai_settings,aliens):
for alien in aliens.sprites():
alien.rect.y+=ai_settings.fleet_drop_speed
ai_settings.fleet_direction*=-1
主程式:
#-*-coding:GBK-*-
#-*-coding:utf-8-*-
import pygame
from setting import Setting
from ship import Ship
import game_functions as gf
from pygame.sprite import Group
def run_game():
pygame.init() #初始化,建立螢幕物件
ai_settings=Setting() #建立一個800*800的螢幕
screen=pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
pygame.display.set_caption("Alien Invasion") #對於這個視窗的命名為Alien Invasion
ship=Ship(ai_settings,screen) #建立飛船
bullets=Group()
aliens=Group()
gf.creat_fleet(ai_settings,screen,ship,aliens)
while True:
gf.check_events(ai_settings,screen,ship,bullets)
ship.update()
gf.update_bullets(bullets)
gf.update_aliens(ai_settings,aliens)
gf.update_screen(ai_settings,screen,ship,aliens,bullets)
run_game()
執行後,外星人將在螢幕來回移動,在邊緣後向下移動。