摘要
在游戲《飛機(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)
* 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)
?
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)行修改和加入新功能。
- 文/潘曉璐 我一進(jìn)店門轿曙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)弄捕,“玉大人,你說(shuō)我怎么就攤上這事导帝∈匚剑” “怎么了?”我有些...
- 文/不壞的土叔 我叫張陵您单,是天一觀的道長(zhǎng)斋荞。 經(jīng)常有香客問(wèn)我,道長(zhǎng)睹限,這世上最難降的妖魔是什么譬猫? 我笑而不...
- 正文 為了忘掉前任,我火速辦了婚禮羡疗,結(jié)果婚禮上染服,老公的妹妹穿的比我還像新娘。我一直安慰自己叨恨,他們只是感情好柳刮,可當(dāng)我...
- 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般秉颗。 火紅的嫁衣襯著肌膚如雪痢毒。 梳的紋絲不亂的頭發(fā)上,一...
- 那天蚕甥,我揣著相機(jī)與錄音哪替,去河邊找鬼。 笑死菇怀,一個(gè)胖子當(dāng)著我的面吹牛凭舶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播爱沟,決...
- 文/蒼蘭香墨 我猛地睜開(kāi)眼帅霜,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了呼伸?” 一聲冷哼從身側(cè)響起身冀,我...
- 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎括享,沒(méi)想到半個(gè)月后搂根,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡铃辖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年兄墅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片澳叉。...
- 正文 年R本政府宣布瓶殃,位于F島的核電站充包,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏遥椿。R本人自食惡果不足惜基矮,卻給世界環(huán)境...
- 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望冠场。 院中可真熱鬧家浇,春花似錦、人聲如沸碴裙。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至莺琳,卻和暖如春还棱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背惭等。 一陣腳步聲響...
- 正文 我出身青樓珠十,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親凭豪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
推薦閱讀更多精彩內(nèi)容
- 前言 作為一個(gè)編程小白選手晒杈,經(jīng)過(guò)一段時(shí)間的基礎(chǔ)語(yǔ)法學(xué)習(xí)嫂伞,終于迎來(lái)了首個(gè)項(xiàng)目學(xué)習(xí),從一步步的模仿到理解到每個(gè)步驟的思...
- 駕駛飛船 學(xué)會(huì)如何控制屏幕圖像移動(dòng) 響應(yīng)按鍵 通過(guò)方法pygame.event.get()來(lái)獲取事件拯钻,將每次事件都...
- 1. Markdown 這是第一次用markdown進(jìn)行寫(xiě)作帖努,一邊要寫(xiě)課后感想一邊要考慮MD的語(yǔ)法問(wèn)題,可能會(huì)比較...
- 5月以來(lái)小作,哪怕對(duì)市場(chǎng)風(fēng)向再不敏感的人亭姥,也感覺(jué)到陣陣涼意。二級(jí)市場(chǎng)連續(xù)下挫顾稀,一級(jí)市場(chǎng)融資環(huán)境惡化达罗,不論企業(yè)融資數(shù)量還...
- 推薦指數(shù): 6.0 書(shū)籍主旨關(guān)鍵詞:特權(quán)、焦點(diǎn)静秆、注意力粮揉、語(yǔ)言聯(lián)想、情景聯(lián)想 觀點(diǎn): 1.統(tǒng)計(jì)學(xué)現(xiàn)在叫數(shù)據(jù)分析抚笔,社會(huì)...