摘要
在游戲《飛機(jī)大戰(zhàn)獨(dú)眼外星人》中,玩家控制著一艘最初出現(xiàn)在屏幕底部中央的飛機(jī)。玩家可以使用箭頭鍵左右移動飛機(jī),還可使用空格鍵進(jìn)行射擊。游戲開始時,一群外星人出現(xiàn)在天空中,他們在屏幕中向下移動。玩家的任務(wù)是射殺這些外星人。玩家將所有外星人都消滅干凈后,將出現(xiàn)一群新的外星人,他們移動的速度更快。只要有外星人撞到了玩家的飛機(jī)或到達(dá)了屏幕底部,玩家就損失一艘飛機(jī)。玩家損失三艘飛機(jī)后,游戲結(jié)束。
1.引言
???Pygame最初是由Pete Shinner編寫的,該項目于2000年10月啟動,六個月后,pygame版本1.0發(fā)布。pygame是一個利用SDL(Simple
DirectMedia Layer)寫就的游戲庫。SDL 是一個用于控制多媒體的跨平臺C庫,與DirectX相當(dāng),它已被用于數(shù)百種商業(yè)和開源游戲。Pete Shinner對Python和SDL兩個項目的簡潔與優(yōu)雅印象深刻,他決定將Python和SDL結(jié)合起來,組建一個真正利用Python的項目,目標(biāo)是讓做簡單的事情變得容易,讓困難的事情變簡單。
2. 系統(tǒng)結(jié)構(gòu)

* alien_invasion.py
主文件alien_invasion.py創(chuàng)建一系列整個游戲都要用到的對象:存儲在ai_settings 中的設(shè)置、存儲在 screen 中的主顯示surface以及一個飛機(jī)實(shí)例。文件 alien_invasion.py 還包含游戲的主循環(huán),這是一個調(diào)用 check_events() 、 ship.update() 和 update_screen() 的 while 循環(huán)。要玩游戲,只需運(yùn)行文件alien_invasion.py。其他文件(settings.py、
game_functions.py、ship.py)包含的代碼被直接或間接地導(dǎo)入到這個文件中。
* settings.py
文件settings.py包含 Settings 類,這個類只包含方法 __init__() ,它初始化控制游戲外觀和飛機(jī)速度的屬性。
* game_functions.py
文件game_functions.py包含一系列函數(shù),游戲的大部分工作都是由它們完成的。函數(shù)
check_events() 檢測相關(guān)的事件,如按鍵和松開,并使用輔助函數(shù)check_keydown_events() 和check_keyup_events() 來處理這些事件。就目前而言,這些函數(shù)管理飛機(jī)的移動。模塊game_functions 還包含函數(shù) update_screen() ,它用于在每次執(zhí)行主循環(huán)時都重繪屏幕。
* ship.py
文件ship.py包含 Ship 類,這個類包含方法 __init__() 、管理飛機(jī)位置的方法 update() 以及在屏幕上繪制飛機(jī)的方法 blitme() 。表示飛機(jī)的圖像存儲在文件夾images下的文件ship.bmp中。
* bullet.py
用來添加射擊功能。將編寫玩家按空格鍵時發(fā)射子彈(小矩形)的代碼。子彈將在屏
幕中向上穿行,抵達(dá)屏幕上邊緣后消失。

* alien.py
alien.py用來控制每個外星人的行為,創(chuàng)建Ship 類那樣創(chuàng)建這個類,同樣的,需要在alien_invasion.py中創(chuàng)建一個 Alien 實(shí)例
* game_stats.py
game_stats.py用于跟蹤游戲統(tǒng)計信息,記錄飛機(jī)被撞了多少次,同時跟蹤統(tǒng)計信息還有助于記分。幫助確定外星人與飛機(jī)發(fā)生碰撞時,該做些什么

* button.py
創(chuàng)建一個 Button 類,用于創(chuàng)建帶標(biāo)簽的實(shí)心矩形。
* scoreboard.py
為在屏幕上顯示得分,需要創(chuàng)建一個新類 Scoreboard 。這個類用于顯示當(dāng)前得分、最高得分、等級和余下的飛機(jī)數(shù)。同樣的在alien_invasion.py中創(chuàng)建一個 Scoreboard 實(shí)例
介紹系統(tǒng)的結(jié)構(gòu),對使用的相關(guān)技術(shù),相關(guān)模塊進(jìn),實(shí)現(xiàn)功能的原理進(jìn)行介紹,采用框架圖,示例圖等進(jìn)行表述,使人可以對系統(tǒng)的框架和原理有個比較好的把握;
3. 實(shí)現(xiàn)代碼
alien.py
import pygame
from pygame.sprite import Sprite
class Alien(Sprite):
???"""表示單個外星人的類"""
??? def__init__(self,ai_settings,screen):
???????"""初始化外星人并設(shè)置其起始位置"""
???????super().__init__()
???????self.screen=screen
???????self.ai_settings=ai_settings
???????#加載外星人圖像,并設(shè)置其rect屬性
???????self.image=pygame.image.load('D:/zixue/python/Project-Alien-Invasion/images/alien.bmp')
???????self.rect=self.image.get_rect()
???????#每個外星人最初都在屏幕左上角附近
???????self.rect.x=self.rect.width
???????self.rect.y=self.rect.height
???????#存儲外星人的準(zhǔn)確位置
???????self.x=float(self.rect.x)
??? defblitme(self):
???????"""在指定位置繪制外星人"""
???????self.screen.blit(self.image,self.rect)
??? defcheck_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
??? defupdate(self):
???????"""向左或向右移動外星人"""
???????self.x+=(self.ai_settings.alien_speed_factor*self.ai_settings.fleet_direction)
???????self.rect.x=self.x
alien_invasion.py
import pygame
from?pygame.sprite import Group
from settings import Settings
from game_stats import GameStats
from scoreboard import Scoreboard
from ship import Ship
from button import Button
import game_functions as gf
def run_game():
??? #初始化pygame、設(shè)置和屏幕對象
???pygame.init()
???ai_settings=Settings() #創(chuàng)建一個Settings實(shí)例
???screen=pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
???pygame.display.set_caption("飛機(jī)大戰(zhàn)獨(dú)眼外星人")
??? #創(chuàng)建開始按鈕
???play_button=Button(ai_settings,screen,"Play")
??? #創(chuàng)建存儲游戲統(tǒng)計信息的實(shí)例,并創(chuàng)建記分牌
???stats=GameStats(ai_settings)
???sb=Scoreboard(ai_settings,screen,stats)
??? #創(chuàng)建一艘飛機(jī)、一個子彈編組和一個外星人編組
???ship=Ship(ai_settings,screen)
??? #創(chuàng)建一個用于存儲子彈的編組
???bullets=Group()
??? #創(chuàng)建一個外星人
???aliens=Group()
??? #創(chuàng)建外星人群
???gf.create_fleet(ai_settings,screen,ship,aliens)
??? #開始游戲的主循環(huán)
???while True:
???????gf.check_events(ai_settings,screen,stats,sb,play_button,ship,aliens,bullets)
???????if stats.game_active:
???????????ship.update()
???????????gf.update_bullets(ai_settings,screen,stats,sb,ship,aliens,bullets)
???????????gf.update_aliens(ai_settings,stats,screen,sb,ship,aliens,bullets)
???????gf.update_screen(ai_settings,screen,stats,sb,ship,aliens,bullets,play_button)
run_game()
bullet.py
import pygame
from pygame.sprite import Sprite
class Bullet(Sprite):
???"""一個對飛機(jī)發(fā)射的子彈進(jìn)行管理的類"""
??? def__init__(self,ai_settings,screen,ship):
???????"""在飛機(jī)所處的位置創(chuàng)建一個子彈對象"""
???????super().__init__()
???????self.screen=screen
???????#在(0,0)處創(chuàng)建一個表示子彈的矩形,再設(shè)置正確的位置
???????self.rect=pygame.Rect(0,0,ai_settings.bullet_width,ai_settings.bullet_height)
???????self.rect.centerx=ship.rect.centerx
???????self.rect.top=ship.rect.top
???????#存儲用小數(shù)表示的子彈位置
???????self.y=float(self.rect.y)
???????self.color=ai_settings.bullet_color
???????self.speed_factor=ai_settings.bullet_speed_factor
??? defupdate(self):
???????"""向上移動子彈"""
???????#更新表示子彈位置的小數(shù)值
???????self.y-=self.speed_factor
???????#更新表示子彈的rect的位置
???????self.rect.y=self.y
??? defdraw_bullet(self):
???????"""在屏幕上繪制子彈"""
???????pygame.draw.rect(self.screen,self.color,self.rect)
button.py
import pygame.font
class Button():
??? def__init__(self,ai_settings,screen,msg):
???????"""初始化按鈕的屬性"""
???????self.screen=screen
???????self.screen_rect=screen.get_rect()
???????#設(shè)置按鈕的尺寸和其他屬性
???????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)
???????#創(chuàng)建按鈕的rect對象,并使其居中
???????self.rect=pygame.Rect(0,0,self.width,self.height)
???????self.rect.center=self.screen_rect.center
???????#按鈕的標(biāo)簽只需創(chuàng)建一次
???????self.prep_msg(msg)
??? defprep_msg(self,msg):
???????"""將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
??? defdraw_button(self):
???????#繪制一個用顏色填充的按鈕,再繪制文本
???????self.screen.fill(self.button_color,self.rect)
???????self.screen.blit(self.msg_image,self.msg_image_rect)
game_functions.py
import sys
from time import sleep
import pygame
from bullet import Bullet
from alien import Alien
leveling = 2
deffire_bullet(ai_settings,screen,ship,bullets):
???"""如果還沒有到達(dá)限制,就發(fā)射一顆子彈"""
??? #創(chuàng)建一顆子彈,并將其加入到編組bullets中
??? iflen(bullets) < ai_settings.bullets_allowed:
???????new_bullet = Bullet(ai_settings, screen, ship)
???????bullets.add(new_bullet)
def check_keydown_events(event,ai_settings,screen,ship,bullets):
???"""響應(yīng)按鍵"""
??? ifevent.key == pygame.K_RIGHT:
???????#向右移動飛機(jī)?
???????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)
???elif event.key==pygame.K_q:
???????sys.exit()
def check_keyup_events(event, ship):
???"""響應(yīng)松開"""
??? ifevent.key == pygame.K_RIGHT:
???????ship.moving_right = False
???elif event.key == pygame.K_LEFT:
???????ship.moving_left = False
def check_events(ai_settings,screen,stats,sb,play_button,ship,aliens,bullets):
???"""響應(yīng)按鍵和鼠標(biāo)事件"""
??? #監(jiān)視鍵盤和鼠標(biāo)時間
??? forevent 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)
???????????check_keydown_events(event,ai_settings,screen,ship,bullets)
???????elif event.type==pygame.KEYUP:
???????????check_keyup_events(event,ship)
???????elif event.type==pygame.MOUSEBUTTONDOWN:
???????????mouse_x,mouse_y=pygame.mouse.get_pos()
???????????check_play_button(ai_settings,screen,stats,sb,play_button,ship,aliens,bullets,mouse_x,mouse_y)
def check_play_button(ai_settings,screen,stats,sb,play_button,ship,aliens,bullets,mouse_x,mouse_y):
???"""在玩家單擊Play按鈕時開始新游戲"""
???button_clicked=play_button.rect.collidepoint(mouse_x,mouse_y)
??? ifbutton_clicked and not stats.game_active:
???????#重置游戲設(shè)置
???????ai_settings.initialize_dynamic_settings()
???????#隱藏光標(biāo)
???????pygame.mouse.set_visible(False)
???????#重置游戲統(tǒng)計信息
???????stats.reset_stats()
???????stats.game_active=True
???????#重置記分牌圖像
???????sb.prep_score()
???????sb.prep_high_score()
???????sb.prep_level()
???????sb.prep_ships()
???????#清空外星人列表和子彈列表
???????aliens.empty()
???????bullets.empty()
???????#創(chuàng)建一群新的外星人,并讓飛機(jī)居中
???????create_fleet(ai_settings,screen,ship,aliens)
???????ship.center_ship()
defupdate_screen(ai_settings,screen,stats,sb,ship,aliens,bullets,play_button):
???"""更新屏幕上的圖像,并切換到新屏幕"""
??? #調(diào)用screen.fill 方法:每次循環(huán)時都重繪屏幕
???screen.fill(ai_settings.bg_color)
??? #在飛機(jī)和外星人后面重繪所有的子彈
??? forbullet in? bullets:
???????bullet.draw_bullet()
???ship.blitme()
???aliens.draw(screen)
?? ?sb.show_score()
??? #如果游戲處于非活動狀態(tài),就繪制Play按鈕
??? ifnot stats.game_active:
???????play_button.draw_button()
??? #讓最近繪制的屏幕可見
???pygame.display.flip()
defupdate_bullets(ai_settings,screen,stats,sb,ship,aliens,bullets):
???"""更新子彈的位置,并刪除已消失的子彈"""
??? #更新子彈的位置
???bullets.update()
??? #刪除已消失的子彈
??? forbullet in bullets.copy():
???????if bullet.rect.bottom <= 0:
???????????bullets.remove(bullet)
? ??check_bullet_alien_collisions(ai_settings,screen,stats,sb,ship,aliens,bullets)
defcheck_bullet_alien_collisions(ai_settings,screen,stats,sb,ship,aliens,bullets):
???"""響應(yīng)子彈和外星人的碰撞"""
??? #刪除發(fā)生碰撞的子彈和外星人
???collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)
??? ifcollisions:
???????for aliens in collisions.values():
???????????stats.score+=ai_settings.alien_points*len(aliens)
???????????sb.prep_score()
???????check_high_score(stats,sb)
??? iflen(aliens) == 0:
???????#如果整群外星人都被消滅,就提高一個等級
???????bullets.empty()
???????ai_settings.increase_speed()
???????#提高等級?
???????stats.level+=1
???????leveling = stats.level
???????sb.prep_level()
???????create_fleet(ai_settings, screen, ship, aliens)
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)-4)? #向下圓整
???return number_aliens_x
def create_alien(ai_settings,screen,aliens,alien_number,row_number):
???"""創(chuàng)建一個外星人并將其放在當(dāng)前行"""
???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)
defcreate_fleet(ai_settings,screen,ship,aliens):
???"""創(chuàng)建外星人群"""
??? #創(chuàng)建一個外星人,并計算每行可容納多少個外星人
???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)
??? #創(chuàng)建外星人群
??? forrow_number in range(number_rows):
???????for alien_number in range(number_aliens_x):
???????????create_alien(ai_settings,screen,aliens,alien_number,row_number)
defget_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)+leveling-8)
???return number_rows
def check_fleet_edges(ai_settings,aliens):
???"""有外星人到達(dá)邊緣時采取相應(yīng)的措施"""
??? foralien in aliens.sprites():
???????if alien.check_edges():
???????????change_fleet_direction(ai_settings,aliens)
???????????break
defchange_fleet_direction(ai_settings,aliens):
???"""將整群外星人下移,并改變它們的方向"""
??? foralien in aliens.sprites():
???????alien.rect.y+= ai_settings.fleet_drop_speed
???ai_settings.fleet_direction*=-1
defship_hit(ai_settings,stats,screen,sb,ship,aliens,bullets):
???"""響應(yīng)被外星人撞到的飛機(jī)"""
??? ifstats.ships_left > 0:
???????#將ships_left減1
???????stats.ships_left-=1
???????#更新記分牌
???????sb.prep_ships()
???????#清空外星人列表和子彈列表?
???????aliens.empty()
???????bullets.empty()
???????#創(chuàng)建一群新的外星人,并將飛機(jī)放到屏幕底端中央
???????create_fleet(ai_settings,screen,ship,aliens)
???????ship.center_ship()
???????#暫停
???????sleep(0.5)
???else:
???????stats.game_active=False
???? ???pygame.mouse.set_visible(True)
defcheck_aliens_bottom(ai_settings,stats,screen,sb,ship,aliens,bullets):
???"""檢查是否有外星人到達(dá)了屏幕底端"""
???screen_rect=screen.get_rect()
??? foralien in aliens.sprites():
???????if alien.rect.bottom>=screen_rect.bottom:
???????????#像飛機(jī)被撞到一樣進(jìn)行處理
???????????ship_hit(ai_settings,stats,screen,sb,ship,aliens,bullets)
???????????break
defupdate_aliens(ai_settings,stats,screen,sb,ship,aliens,bullets):
???"""
??? 檢查是否有外星人位于屏幕邊緣,并更新整群外星人的位置
???"""
???check_fleet_edges(ai_settings,aliens)
???aliens.update()
??? #檢測外星人和飛機(jī)之間的碰撞
??? ifpygame.sprite.spritecollideany(ship,aliens):
???????ship_hit(ai_settings,screen,stats,sb,ship,aliens,bullets)
??? #檢查是否有外星人抵達(dá)屏幕底端
???check_aliens_bottom(ai_settings,stats,screen,sb,ship,aliens,bullets)
def check_high_score(stats,sb):
???"""檢查是否誕生了新的最高得分"""
??? ifstats.score>stats.high_score:
???????stats.high_score=stats.score
???????sb.prep_high_score()
game_stats.py
class GameStats():
???"""跟蹤游戲的統(tǒng)計信息"""
??? def__init__(self,ai_settings):
???????"""初始化統(tǒng)計信息"""
???????self.ai_settings=ai_settings
???????self.reset_stats()
???????#讓游戲一開始處于非活動狀態(tài)
???????self.game_active=False
???????#在任何情況下都不應(yīng)重置最高得分
???????self.high_score=0
??? defreset_stats(self):
???????"""初始化在游戲運(yùn)行期間可能變化的統(tǒng)計信息"""
???????self.ships_left=self.ai_settings.ship_limit
???????self.score=0
???????self.level=1
scoreboard.py
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
???????#顯示得分信息時使用的字體設(shè)置
???????self.text_color=(30,30,30)
???????self.font=pygame.font.SysFont(None,48)
???????# #準(zhǔn)備包含最高得分和當(dāng)前得分的圖像
???????self.prep_score()
???????self.prep_high_score()
???????self.prep_level()
???????self.prep_ships()
??? defprep_score(self):
???? ???"""將得分轉(zhuǎn)換為一幅渲染的圖像"""
???????rounded_score = 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
??? defshow_score(self):
???????"""在屏幕上顯示飛機(jī)和得分"""
???????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)
???????#繪制飛機(jī)
???????self.ships.draw(self.screen)
??? defprep_high_score(self):
???????"""將最高得分轉(zhuǎn)換為渲染的圖像"""
???????high_score=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
??? defprep_level(self):
???????"""將等級轉(zhuǎn)換為渲染的圖像"""
???????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
??? defprep_ships(self):
???????"""顯示還余下多少艘飛機(jī)"""
???????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)
settings.py
class Settings():
???"""存儲的所有設(shè)置的類"""
??? def__init__(self):
???????"""初始化游戲的靜態(tài)設(shè)置"""
???????#屏幕設(shè)置
???????self.screen_width=1000
???????self.screen_height=600
???????self.bg_color=(230,230,230) #設(shè)置背景色:RGB
???????#飛機(jī)的設(shè)置
???????self.ship_speed_factor=1.3
???????self.ship_limit=10
???????#子彈設(shè)置
???????self.bullet_speed_factor=3
???????self.bullet_width=3
???????self.bullet_height=15
???????self.bullet_color=60,60,60
???????self.bullets_allowed=3
???????#外星人設(shè)置
???????self.alien_speed_factor=1
???????self.fleet_drop_speed=5
???????# fleet_direction為1表示向右移,為-1表示向左移
???????self.fleet_direction=1
???????#以什么樣的速度加快游戲節(jié)奏
???????self.speedup_scale=1.2
???????#外星人點(diǎn)數(shù)的提高速度
???????self.score_scale=1.2
???????self.initialize_dynamic_settings()
??? definitialize_dynamic_settings(self):
???????"""初始化隨游戲進(jìn)行而變化的設(shè)置"""
???????self.ship_speed_factor=1.5
???????self.bullet_speed_factor=3
???????self.alien_speed_factor=1
???????# fleet_direction為1表示向右;為-1表示向左
?? ?????self.fleet_direction=1
???????#記分
???????self.alien_points=50
??? defincrease_speed(self):
???????"""提高速度設(shè)置和外星人點(diǎn)數(shù)"""
???????self.ship_speed_factor*=self.speedup_scale
???????self.bullet_speed_factor*=self.speedup_scale
???????self.alien_speed_factor*=self.speedup_scale
???????self.alien_points=int(self.alien_points*self.score_scale)
ship.py
import pygame
from pygame.sprite import Sprite
class Ship(Sprite):
??? def__init__(self,ai_settings,screen):
???????"""初始化飛機(jī)并設(shè)置其初始位置"""
???????super().__init__()
???????self.screen=screen
???????self.ai_settings=ai_settings
???????#加載飛機(jī)圖像并獲取其外接矩形
???????self.image=pygame.image.load('D:/zixue/python/Project-Alien-Invasion/images/ship.bmp')
???????self.rect=self.image.get_rect()
???????self.screen_rect=screen.get_rect()
???????#將每艘新飛機(jī)放在屏幕底部中央?
???????self.rect.centerx=self.screen_rect.centerx # x坐標(biāo)
???????self.rect.bottom=self.screen_rect.bottom # y坐標(biāo)
???????#在飛機(jī)的屬性center中存儲小數(shù)值
???????self.center=float(self.rect.centerx)
???????#移動標(biāo)志
???????self.moving_right=False
???????self.moving_left=False
??? defupdate(self):
???????"""根據(jù)移動標(biāo)志調(diào)整飛機(jī)的位置"""
???????#更新飛機(jī)的center值,而不是rect
???????if self.moving_right and self.rect.right
???????????self.center +=self.ai_settings.ship_speed_factor
???????if self.moving_left and self.rect.left>0:
???????????self.center -=self.ai_settings.ship_speed_factor
???????#根據(jù)self.center更新rect對象
???????self.rect.centerx=self.center
??? defblitme(self):
???????"""在指定位置繪制飛機(jī)"""
???????self.screen.blit(self.image,self.rect)
??? defcenter_ship(self):
???????"""讓飛機(jī)在屏幕上居中"""
???????self.center=self.screen_rect.centerx
4. 實(shí)驗
?





5. 總結(jié)和展望
???游戲關(guān)卡設(shè)計不夠合理,沒有呈現(xiàn)明顯的難度遞增,未加入音效和背景音樂,游戲游玩時顯得有點(diǎn)枯燥,不能自定義難度,任意選擇關(guān)卡,游戲里面沒有各種加狀態(tài)的道具,敵人的攻擊模式單一。未來完善時會一一加入,參照飛機(jī)大戰(zhàn)、雷霆戰(zhàn)機(jī)等優(yōu)秀游戲進(jìn)行修改和加入新功能。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 前言 作為一個編程小白選手,經(jīng)過一段時間的基礎(chǔ)語法學(xué)習(xí),終于迎來了首個項目學(xué)習(xí),從一步步的模仿到理解到每個步驟的思...
- 駕駛飛船 學(xué)會如何控制屏幕圖像移動 響應(yīng)按鍵 通過方法pygame.event.get()來獲取事件,將每次事件都...
- 5月以來,哪怕對市場風(fēng)向再不敏感的人,也感覺到陣陣涼意。二級市場連續(xù)下挫,一級市場融資環(huán)境惡化,不論企業(yè)融資數(shù)量還...
- 推薦指數(shù): 6.0 書籍主旨關(guān)鍵詞:特權(quán)、焦點(diǎn)、注意力、語言聯(lián)想、情景聯(lián)想 觀點(diǎn): 1.統(tǒng)計學(xué)現(xiàn)在叫數(shù)據(jù)分析,社會...