前言
??我們之前通過四篇文章給大家詳細介紹了武裝飛船的相關內容,這是我們外星人入侵專案的第一個環節,首先要有飛船,并且能夠射出子彈,并且初步給大家介紹了游戲開發程序中計劃的制定;使用pygame撰寫游戲的基本框架;包括設定背景色的方式、將設定存盤在可供游戲的各個部分訪問的獨立類中的具體實作方式,另外在螢屏上繪制了影像、讓玩家控制游戲元素的移動;創建自動移動的元素,在螢屏中間向上飛馳的子彈,最后洗掉不再需要的物件;如何定期對專案的代碼撒進行重構,讓我們代碼耦合性較低,代碼利用率高,為我們接下來功能的實作提供方便,
外星人需求分析
??當我們開發較大的專案的時候,我們每進入開發階段就應該清楚我們相應的開發計劃,要搞清楚接下來要通過撰寫代碼來完成哪些任務都是不錯的想法的主意,我們接下來的具體步驟如下:
?? 研究既有代碼,確實實作新功能前是否要進行重構
??在螢屏上左上角添加一個外星人,并指定合適的邊距
??根據第一個外星人的邊距和螢屏上尺寸計算螢屏上可容納多少個外星人,我們將撰寫一個回圈來創建一些列外星人,這些外星人填滿了螢屏的上半部分,
??讓外星人群向兩邊和下方移動,直到外星人被全部擊落,有外星人撞到飛船,或有外星人抵達螢屏低端,如果整群外星人都被擊落,我們將再創建一群外星人,如果有外星人撞到了飛船或抵達螢屏低端,我們將銷毀飛船并創建一群外星人,
??限制玩家可用的飛船數量,配給的飛船用完后,游戲結束,
??本文將在實作功能的同時完善這個計劃,但就目前而言,這個思路足以支撐我們去實作該需求,
??在給我們專案添加新功能前,還應審核既有代碼,每進入一個新階段,通常專案都會更復雜,因此,最好對混亂或低效的代碼進行清理,
??我們在開發的時候不斷地重構,因此,當需要做的清理作業不多,但每次為測驗新功能而運行這個游戲時,都必須使用滑鼠來關閉它,這對于一個資深的程式員來說也太業余了,下面我們通過一行代碼讓它更加的專業:
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:
# 創建一顆子彈,并將其加入到編組bullets中
fire_bullet(ai_settings, screen, ship, bullets)
elif event.key == pygame.K_q:
sys.exit()
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, bullets):
"""更新螢屏上的影像,并切換到新螢屏"""
# 每次回圈時都重繪螢屏
screen.fill(ai_settings.bg_color)
# 在飛船和外星人后面重繪所有子彈
for bullet in bullets.sprites():
bullet.draw_bullet()
ship.blitme()
# 讓最近繪制的螢屏可見
pygame.display.flip()
def update_bullets(bullets):
"""更新子彈的位置,并洗掉已消失的子彈"""
# 更新子彈的位置
bullets.update()
# 洗掉已消失的子彈
for bullet in bullets.copy():
if bullet.rect.bottom <= 0:
bullets.remove(bullet)
??在check_keydown_events()中,我們添加了一個代碼塊,以便在玩家按Q時結束游戲,這樣的修改很安全,因為Q鍵離箭頭和空格鍵很遠,玩家不小心按Q鍵而導致游戲結束的可能性不大,現在測驗時可按Q關閉游戲,而無需使用滑鼠來關閉視窗了,具體如下:

創建第一個外星人
??在螢屏上放置外星人與放置飛船其實是差不多的,每個外星人的行為都由Alien類控制,我們將像創建Ship類那樣創建這個類,處于簡化考慮,我們也使用位圖來表示外星人,這個資料大家在下載飛船的時候應該一起都下載好了,相應的外星人圖片如下:

1、創建Alien類
??接下來,我們實作Alien類的實作,我們在創建alien.py之間首先要搞清楚專案層級關系,即我們在代碼哪里創建其類,并且將alien.bmp檔案放到/images下,具體創建位置如下:

??接下來我們實作alien.py代碼的撰寫:
import pygame
from pygame.sprite import Sprite
class Alien(Sprite):
"""表示單個外星人的類"""
def __init__(self, ai_settings, screen):
"""初始化外星人并設定其起始位置"""
super(Alien, self).__init__()
self.screen = screen
self.ai_settings = ai_settings
# 加載外星人影像,并設定其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)
??我們從代碼撰寫情況來看,此代碼與飛船Ship類實作除了位置不同之外,其他代碼還是很類似,每個外星人最初都位于螢屏左上角附近,我們將每個外星人的左邊距都設定為外星人的寬度,并將上邊距設定為外星人的高度,
2、創建Alien實體
??下面在alien_invasion.py中創建一個Alien實體:
import sys
import pygame
from settings import Settings
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 = Settings()
screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height))
pygame.display.set_caption("Alian 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()
??在這里,我們匯入了新創建的Alien類,并在進入主while回圈前創建了一個Alien實體,我們沒有修改外星人的位置,因此,該while回圈沒有任何新的東西,但我們修改了對update_screen()的呼叫,傳遞了一個外星人的實體,
3、讓外星人出現在螢屏上
??為了讓外星人出現在螢屏上,我們在update_screen()中呼叫其方法blitme()即可:
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:
# 創建一顆子彈,并將其加入到編組bullets中
fire_bullet(ai_settings, screen, ship, bullets)
elif event.key == pygame.K_q:
sys.exit()
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)
??我們先繪制飛船和子彈,在繪制外星人,讓外星人在螢屏上位于最前面,具體實作效果如下:

??第一個外星人正確地出現后,下面來撰寫繪制一群外星人的代碼,
總結
??我們之前通過四篇文章給大家詳細介紹了武裝飛船的相關內容,這是我們外星人入侵專案的第一個環節,首先要有飛船,并且能夠射出子彈,并且初步給大家介紹了游戲開發程序中計劃的制定;使用pygame撰寫游戲的基本框架;包括設定背景色的方式、將設定存盤在可供游戲的各個部分訪問的獨立類中的具體實作方式,另外在螢屏上繪制了影像、讓玩家控制游戲元素的移動;創建自動移動的元素,在螢屏中間向上飛馳的子彈,最后洗掉不再需要的物件;如何定期對專案的代碼撒進行重構,讓我們代碼耦合性較低,代碼利用率高,為我們接下來功能的實作提供方便,本文給大家介紹了外星人創建的思路,然后創建了第一個外星人,包括創建Alien類、創建Alien實體以及讓外星人出現在螢屏上,為了讓大家更好的吸收專案所用到的知識點,我們每一篇文章只給大家實作《外星人入侵》的一個功能,所以,希望大家能夠仔細閱讀,認真跟著寫代碼,理解其中的深入含義,吧這個專案的價值發揮到最大,其實這個專案已經很典型,代碼到處都是,但是,如果你只是簡單的粘貼復制,對你知識的學習沒有任何的價值,你還是得跟著過一遍,然后要知道每行代碼的含義或者是用到了前面我們介紹的哪一塊知識點,只有這樣,這個專案才會發揮不一樣的價值,希望大家認真學習,把基礎知識打扎實一點,Python是一門注重實際操作的語言,它是眾多編程語言中最簡單,也是最好入門的,當你把這門語言學會了,再去學習java、go以及C語言就比較簡單了,當然,Python也是一門熱門語言,對于人工智能的實作有著很大的幫助,因此,值得大家花時間去學習,生命不息,奮斗不止,我們每天努力,好好學習,不斷提高自己的能力,相信自己一定會學有所獲,加油!!!臨近中秋,提前祝大家中秋快樂!闔家歡樂!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/301613.html
標籤:其他
