飛機(jī)大戰(zhàn)獨(dú)眼外星人

摘要

在游戲《飛機(jī)大戰(zhàn)獨(dú)眼外星人》中炸茧,玩家控制著一艘最初出現(xiàn)在屏幕底部中央的飛機(jī)。玩家可以使用箭頭鍵左右移動(dòng)飛機(jī)玛荞,還可使用空格鍵進(jìn)行射擊。游戲開(kāi)始時(shí)呕寝,一群外星人出現(xiàn)在天空中勋眯,他們?cè)谄聊恢邢蛳乱苿?dòng)。玩家的任務(wù)是射殺這些外星人下梢。玩家將所有外星人都消滅干凈后客蹋,將出現(xiàn)一群新的外星人,他們移動(dòng)的速度更快孽江。只要有外星人撞到了玩家的飛機(jī)或到達(dá)了屏幕底部讶坯,玩家就損失一艘飛機(jī)。玩家損失三艘飛機(jī)后岗屏,游戲結(jié)束辆琅。

1.引言

???Pygame最初是由Pete Shinner編寫(xiě)的,該項(xiàng)目于2000年10月啟動(dòng)这刷,六個(gè)月后婉烟,pygame版本1.0發(fā)布。pygame是一個(gè)利用SDL(Simple

DirectMedia Layer)寫(xiě)就的游戲庫(kù)崭歧。SDL 是一個(gè)用于控制多媒體的跨平臺(tái)C庫(kù),與DirectX相當(dāng)撞牢,它已被用于數(shù)百種商業(yè)和開(kāi)源游戲率碾。Pete Shinner對(duì)Python和SDL兩個(gè)項(xiàng)目的簡(jiǎn)潔與優(yōu)雅印象深刻叔营,他決定將Python和SDL結(jié)合起來(lái),組建一個(gè)真正利用Python的項(xiàng)目所宰,目標(biāo)是讓做簡(jiǎn)單的事情變得容易绒尊,讓困難的事情變簡(jiǎn)單。

2. 系統(tǒng)結(jié)構(gòu)


飛機(jī)

* alien_invasion.py

主文件alien_invasion.py創(chuàng)建一系列整個(gè)游戲都要用到的對(duì)象:存儲(chǔ)在ai_settings 中的設(shè)置仔粥、存儲(chǔ)在 screen 中的主顯示surface以及一個(gè)飛機(jī)實(shí)例婴谱。文件 alien_invasion.py 還包含游戲的主循環(huán),這是一個(gè)調(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)入到這個(gè)文件中诵竭。


* settings.py

文件settings.py包含 Settings 類话告,這個(gè)類只包含方法 __init__() ,它初始化控制游戲外觀和飛機(jī)速度的屬性卵慰。


* game_functions.py

文件game_functions.py包含一系列函數(shù)沙郭,游戲的大部分工作都是由它們完成的。函數(shù)

check_events() 檢測(cè)相關(guān)的事件裳朋,如按鍵和松開(kāi)病线,并使用輔助函數(shù)check_keydown_events() 和check_keyup_events() 來(lái)處理這些事件。就目前而言再扭,這些函數(shù)管理飛機(jī)的移動(dòng)氧苍。模塊game_functions 還包含函數(shù) update_screen() ,它用于在每次執(zhí)行主循環(huán)時(shí)都重繪屏幕泛范。


* ship.py

文件ship.py包含 Ship 類让虐,這個(gè)類包含方法 __init__() 、管理飛機(jī)位置的方法 update() 以及在屏幕上繪制飛機(jī)的方法 blitme() 罢荡。表示飛機(jī)的圖像存儲(chǔ)在文件夾images下的文件ship.bmp中赡突。


* bullet.py

用來(lái)添加射擊功能。將編寫(xiě)玩家按空格鍵時(shí)發(fā)射子彈(小矩形)的代碼区赵。子彈將在屏

幕中向上穿行惭缰,抵達(dá)屏幕上邊緣后消失。


外星人

* alien.py

alien.py用來(lái)控制每個(gè)外星人的行為笼才,創(chuàng)建Ship 類那樣創(chuàng)建這個(gè)類漱受,同樣的,需要在alien_invasion.py中創(chuàng)建一個(gè) Alien 實(shí)例


* game_stats.py

game_stats.py用于跟蹤游戲統(tǒng)計(jì)信息骡送,記錄飛機(jī)被撞了多少次昂羡,同時(shí)跟蹤統(tǒng)計(jì)信息還有助于記分絮记。幫助確定外星人與飛機(jī)發(fā)生碰撞時(shí),該做些什么


記分

* button.py

創(chuàng)建一個(gè) Button 類虐先,用于創(chuàng)建帶標(biāo)簽的實(shí)心矩形怨愤。


* scoreboard.py

為在屏幕上顯示得分,需要?jiǎng)?chuàng)建一個(gè)新類 Scoreboard 蛹批。這個(gè)類用于顯示當(dāng)前得分撰洗、最高得分、等級(jí)和余下的飛機(jī)數(shù)腐芍。同樣的在alien_invasion.py中創(chuàng)建一個(gè) Scoreboard 實(shí)例


介紹系統(tǒng)的結(jié)構(gòu)差导,對(duì)使用的相關(guān)技術(shù),相關(guān)模塊進(jìn)甸赃,實(shí)現(xiàn)功能的原理進(jìn)行介紹柿汛,采用框架圖,示例圖等進(jìn)行表述埠对,使人可以對(duì)系統(tǒng)的框架和原理有個(gè)比較好的把握络断;

3. 實(shí)現(xiàn)代碼

alien.py

import pygame

from pygame.sprite import Sprite


class Alien(Sprite):

???"""表示單個(gè)外星人的類"""


??? 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()


???????#每個(gè)外星人最初都在屏幕左上角附近

???????self.rect.x=self.rect.width

???????self.rect.y=self.rect.height


???????#存儲(chǔ)外星人的準(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):

???????"""向左或向右移動(dòng)外星人"""

???????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è)置和屏幕對(duì)象

???pygame.init()

???ai_settings=Settings() #創(chuàng)建一個(gè)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)建開(kāi)始按鈕

???play_button=Button(ai_settings,screen,"Play")


??? #創(chuàng)建存儲(chǔ)游戲統(tǒng)計(jì)信息的實(shí)例,并創(chuàng)建記分牌

???stats=GameStats(ai_settings)

???sb=Scoreboard(ai_settings,screen,stats)


??? #創(chuàng)建一艘飛機(jī)襟沮、一個(gè)子彈編組和一個(gè)外星人編組

???ship=Ship(ai_settings,screen)


??? #創(chuàng)建一個(gè)用于存儲(chǔ)子彈的編組

???bullets=Group()


??? #創(chuàng)建一個(gè)外星人

???aliens=Group()


??? #創(chuàng)建外星人群

???gf.create_fleet(ai_settings,screen,ship,aliens)





??? #開(kāi)始游戲的主循環(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):

???"""一個(gè)對(duì)飛機(jī)發(fā)射的子彈進(jìn)行管理的類"""


??? def__init__(self,ai_settings,screen,ship):

???????"""在飛機(jī)所處的位置創(chuàng)建一個(gè)子彈對(duì)象"""

???????super().__init__()

???????self.screen=screen


???????#在(0,0)處創(chuàng)建一個(gè)表示子彈的矩形锥惋,再設(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

???????#存儲(chǔ)用小數(shù)表示的子彈位置

???????self.y=float(self.rect.y)


???????self.color=ai_settings.bullet_color

???????self.speed_factor=ai_settings.bullet_speed_factor


??? defupdate(self):

???????"""向上移動(dòng)子彈"""

???????#更新表示子彈位置的小數(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對(duì)象,并使其居中

???????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):

???????#繪制一個(gè)用顏色填充的按鈕膀跌,再繪制文本

???????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):

???"""如果還沒(méi)有到達(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:

???????#向右移動(dòng)飛機(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)松開(kāi)"""

??? 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)視鍵盤(pán)和鼠標(biāo)時(shí)間

??? 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按鈕時(shí)開(kāi)始新游戲"""

???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)計(jì)信息

???????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)時(shí)都重繪屏幕

???screen.fill(ai_settings.bg_color)


??? #在飛機(jī)和外星人后面重繪所有的子彈

??? forbullet in? bullets:

???????bullet.draw_bullet()

???ship.blitme()

???aliens.draw(screen)

?? ?sb.show_score()


??? #如果游戲處于非活動(dòng)狀態(tài)巫玻,就繪制Play按鈕

??? ifnot stats.game_active:

???????play_button.draw_button()


??? #讓最近繪制的屏幕可見(jiàn)

???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:

???????#如果整群外星人都被消滅,就提高一個(gè)等級(jí)

???????bullets.empty()

???????ai_settings.increase_speed()


???????#提高等級(jí)?

???????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):

???"""計(jì)算每行可容納多少個(gè)外星人"""

???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)建一個(gè)外星人并將其放在當(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)建一個(gè)外星人仍秤,并計(jì)算每行可容納多少個(gè)外星人

???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):

???"""計(jì)算屏幕可容納多少行外星人"""

???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á)邊緣時(shí)采取相應(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()

??? #檢測(cè)外星人和飛機(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)計(jì)信息"""

??? def__init__(self,ai_settings):

???????"""初始化統(tǒng)計(jì)信息"""

???????self.ai_settings=ai_settings

???????self.reset_stats()


???????#讓游戲一開(kāi)始處于非活動(dòng)狀態(tài)

???????self.game_active=False


???????#在任何情況下都不應(yīng)重置最高得分

???????self.high_score=0


??? defreset_stats(self):

???????"""初始化在游戲運(yùn)行期間可能變化的統(tǒng)計(jì)信息"""

???????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í)使用的字體設(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):

???????"""將等級(jí)轉(zhuǎn)換為渲染的圖像"""

???????self.level_image=self.font.render(str(self.stats.level),True,self.text_color,self.ai_settings.bg_color)


???????#將等級(jí)放在得分下方

???????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():

???"""存儲(chǔ)的所有設(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中存儲(chǔ)小數(shù)值

???????self.center=float(self.rect.centerx)


???????#移動(dòng)標(biāo)志

???????self.moving_right=False

???????self.moving_left=False


??? defupdate(self):

???????"""根據(jù)移動(dòng)標(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對(duì)象

???????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í)驗(yàn)

?

開(kāi)始界面


敵人左右移動(dòng)

消滅部分?jǐn)橙?/div>

子彈

第二關(guān)

5. 總結(jié)和展望

???游戲關(guān)卡設(shè)計(jì)不夠合理袜茧,沒(méi)有呈現(xiàn)明顯的難度遞增屿良,未加入音效和背景音樂(lè),游戲游玩時(shí)顯得有點(diǎn)枯燥惫周,不能自定義難度,任意選擇關(guān)卡康栈,游戲里面沒(méi)有各種加狀態(tài)的道具递递,敵人的攻擊模式單一。未來(lái)完善時(shí)會(huì)一一加入啥么,參照飛機(jī)大戰(zhàn)登舞、雷霆戰(zhàn)機(jī)等優(yōu)秀游戲進(jìn)行修改和加入新功能。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末悬荣,一起剝皮案震驚了整個(gè)濱河市菠秒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌氯迂,老刑警劉巖践叠,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異嚼蚀,居然都是意外死亡禁灼,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門轿曙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)弄捕,“玉大人,你說(shuō)我怎么就攤上這事导帝∈匚剑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵您单,是天一觀的道長(zhǎng)斋荞。 經(jīng)常有香客問(wèn)我,道長(zhǎng)睹限,這世上最難降的妖魔是什么譬猫? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮羡疗,結(jié)果婚禮上染服,老公的妹妹穿的比我還像新娘。我一直安慰自己叨恨,他們只是感情好柳刮,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般秉颗。 火紅的嫁衣襯著肌膚如雪痢毒。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,071評(píng)論 1 285
  • 那天蚕甥,我揣著相機(jī)與錄音哪替,去河邊找鬼。 笑死菇怀,一個(gè)胖子當(dāng)著我的面吹牛凭舶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播爱沟,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼帅霜,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了呼伸?” 一聲冷哼從身側(cè)響起身冀,我...
    開(kāi)封第一講書(shū)人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎括享,沒(méi)想到半個(gè)月后搂根,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡铃辖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年兄墅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片澳叉。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡隙咸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出成洗,到底是詐尸還是另有隱情五督,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布瓶殃,位于F島的核電站充包,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏遥椿。R本人自食惡果不足惜基矮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望冠场。 院中可真熱鬧家浇,春花似錦、人聲如沸碴裙。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至莺琳,卻和暖如春还棱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背惭等。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工珍手, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人辞做。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓珠十,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親凭豪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容