日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

基于pygame的射击小游戏制作(四)击杀外星人

發(fā)布時(shí)間:2025/3/12 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于pygame的射击小游戏制作(四)击杀外星人 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在本篇文章中,主要學(xué)習(xí)射擊子彈時(shí)外星人消失,達(dá)到擊殺外星人的效果

一、編程思路

1.1擊殺

我們需要在碰撞發(fā)生后讓外星人立即消失,故在更新子彈的位置后檢測(cè)碰撞。我們創(chuàng)建一個(gè)字典,這個(gè)字典的每一個(gè)鍵都是一顆子彈,而相應(yīng)的鍵值則包含擊中的外星人。sprite.groupcollide()將每顆子彈的rect與每個(gè)rect比較。每當(dāng)有子彈和外星人的rect重疊時(shí),判斷其被子彈擊中,groupcollide()就在返回字典中添加一個(gè)鍵-值對(duì)。
game_functions.py

def update_bullets(aliens, bullets): """更新子彈的位置,并刪除已消失的子彈""" --snip-- # 檢查是否有子彈擊中了外星人 # 如果是這樣,就刪除相應(yīng)的子彈和外星人 collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)

緊接著在alien_invasion.py的while循環(huán)中加入該方法

# 開(kāi)始游戲主循環(huán) while True: gf.check_events(ai_settings, screen, ship, bullets) ship.update() gf.update_bullets(aliens, bullets) gf.update_aliens(ai_settings, aliens) gf.update_screen(ai_settings, screen, ship, aliens, bullets)

此時(shí)的運(yùn)行效果如下:

1.2產(chǎn)生新外星人

要在所有外星人被消滅之后再產(chǎn)生新的一群外星人,我們需要檢查aliens編組是否為空,如果為空,就調(diào)用empty()刪除所有元素,從而刪除現(xiàn)有的子彈,再調(diào)用creat_fleet(),產(chǎn)生一群新的外星人

def update_bullets(ai_settings, screen, ship, aliens, bullets):--snip--# 檢查是否有子彈擊中了外星人# 如果是,就刪除相應(yīng)的子彈和外星人collisions = pygame.sprite.groupcollide(bullets, aliens,True, True)if len(aliens) == 0:# 刪除現(xiàn)有的子彈并新建一群外星人?bullets.empty()create_fleet(ai_settings, screen, ship, aliens)

1.3 重構(gòu)update_bullets()

把處理子彈和外星人碰撞的代碼已到一個(gè)獨(dú)立的函數(shù)中,避免該函數(shù)過(guò)長(zhǎng)。

def update_bullets(ai_settings, screen, ship, aliens, bullets):"""更新子彈的位置,刪除已消失的子彈"""#更新子彈位置bullets.update()# 刪除已經(jīng)消失的子彈for bullet in bullets.copy():if bullet.rect.bottom <= 0:bullets.remove(bullet)check_bullet_alien_collisions(ai_settings, screen,ship, aliens, bullets)

1.4 結(jié)束游戲

在外星人與飛船碰撞時(shí)或者外星人到達(dá)屏幕底端就結(jié)束游戲。首先我們要檢測(cè)外星人與飛船是否碰撞,調(diào)用方法spritecollideany(),它檢查編組中的外星人是否發(fā)生碰撞,找到與飛船碰撞的外星人后就停止遍歷編組。

# 檢測(cè)外星人和飛船之間的碰撞if pygame.sprite.spritecollideany(ship, aliens):print("Ship hit!!!")

新建一個(gè)GameStats.py,通過(guò)跟蹤游戲的統(tǒng)計(jì)信息來(lái)記錄飛船被撞了多少次,reset_stats()中初始化大部分統(tǒng)計(jì)信息,然后在__init__中調(diào)用,有外星人撞到飛船時(shí),我們將余下的飛船數(shù)減1,創(chuàng)建一群新的外星人,并將飛船重新放置到屏幕底端中央,并暫停0.5秒。
game_stats.py

class GameStates():"""跟蹤游戲的統(tǒng)計(jì)信息"""def __init__(self, ai_settings):"""初始化統(tǒng)計(jì)信息"""self.ai_settings = ai_settingsself.reset_stats()#游戲剛啟動(dòng)時(shí)處于活動(dòng)狀態(tài)self.game_active = Truedef reset_stats(self):"""初始化在游戲運(yùn)行期間可能變化的統(tǒng)計(jì)信息"""self.ships_left = self.ai_settings.ship_limit

game_functions.py

def ship_hit(ai_settings, stats, screen, ship, aliens, bullets):"""響應(yīng)被外星人撞到的飛船"""if stats.ships_left > 0:#將ships_left減1stats.ships_left -= 1#清空外星人列表和子彈列表aliens.empty()bullets.empty()#創(chuàng)建新的外星人create_fleet(ai_settings, screen, ship, aliens)ship.center_ship()#暫停sleep(0.5)else:stats.game_active = False

check_aliens_bottom()在外星人到達(dá)屏幕底端時(shí)像外星人碰撞飛船一樣做出響應(yīng)

def check_aliens_bottom(ai_settings, stats, screen, ship, aliens, bullets):"""檢查是否有外星人到達(dá)"""screen_rect = screen.get_rect()for alien in aliens.sprites():if alien.rect.bottom >= screen_rect.bottom:#像飛船被撞到一樣進(jìn)行處理ship_hit(ai_settings, stats, screen, ship, aliens, bullets)break

在game_stats.py的init方法里加入游戲活動(dòng)狀態(tài)game_active = True,可以在玩家生命次數(shù)用完時(shí)game_active = False 結(jié)束游戲。

二、源程序

alien_invasion.py

import sys #退出游戲 import pygame #包含開(kāi)發(fā)所需功能 from settings import Settings from ship import Ship from alien import Alien import game_functions as gf from pygame.sprite import Group from game_stats import GameStates def run_game():# 初始化背景設(shè)置pygame.init()ai_settings = Settings()# 創(chuàng)建游戲窗口screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height))pygame.display.set_caption("Alien Invasion")"""創(chuàng)建一艘飛船"""ship = Ship(ai_settings, screen)"""創(chuàng)建一個(gè)外星人"""alien = Alien(ai_settings, screen)"""創(chuàng)建一個(gè)用于存儲(chǔ)子彈的編組"""bullets = Group()aliens = Group()#創(chuàng)建外星人群gf.create_fleet(ai_settings,screen, ship, aliens)"""設(shè)置背景色"""bg_color = (230,230,230)"""存儲(chǔ)游戲統(tǒng)計(jì)信息"""stats = GameStates(ai_settings)"""游戲主循環(huán)"""while True:"""監(jiān)視鍵鼠事件"""gf.check_events(ai_settings, screen, ship, bullets)if stats.game_active:ship.update()#print(len(bullets))gf.update_bullets(ai_settings, screen, ship, aliens, bullets)gf.update_aliens(ai_settings, stats, screen, ship, aliens, bullets)gf.update_screen(ai_settings, screen, ship, aliens, bullets)run_game()

game_stats.py

class GameStates():"""跟蹤游戲的統(tǒng)計(jì)信息"""def __init__(self, ai_settings):"""初始化統(tǒng)計(jì)信息"""self.ai_settings = ai_settingsself.reset_stats()#游戲剛啟動(dòng)時(shí)處于活動(dòng)狀態(tài)self.game_active = Truedef reset_stats(self):"""初始化在游戲運(yùn)行期間可能變化的統(tǒng)計(jì)信息"""self.ships_left = self.ai_settings.ship_limit

game_functions.py

import sys import pygame from bullet import Bullet from alien import Alien from time import sleepdef check_events(ai_settings, screen, ship, bullets):#鍵鼠響應(yīng)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 check_keydown_events(event, ai_settings, screen, ship, bullets):"""響應(yīng)按鍵"""if event.key == pygame.K_RIGHT:# 向右移動(dòng)飛船ship.moving_right = Trueelif event.key == pygame.K_LEFT:ship.moving_left = Trueelif 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):if event.key == pygame.K_RIGHT:ship.moving_right = Falseelif event.key == pygame.K_LEFT:ship.moving_left = Falsedef update_screen(ai_settings, screen, ship, aliens, bullets):#更新屏幕圖像# 每次循環(huán)時(shí)都重繪屏幕screen.fill(ai_settings.bg_color)#在飛船和外星人后面重繪所有子彈for bullets in bullets.sprites():bullets.draw_bullet()ship.blitme()aliens.draw(screen)# 讓最近繪制的屏幕可見(jiàn)pygame.display.flip() # 不斷更新屏幕def check_bullet_alien_collisions(ai_settings, screen,ship, aliens, bullets):#檢查是否有子彈擊中了外星人#若擊中,刪除相應(yīng)的子彈和外星人collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)if len(aliens) == 0:#刪除現(xiàn)有的子彈并新建一群外星人bullets.empty()create_fleet(ai_settings, screen, ship, aliens)def update_bullets(ai_settings, screen, ship, aliens, bullets):"""更新子彈的位置,刪除已消失的子彈"""#更新子彈位置bullets.update()# 刪除已經(jīng)消失的子彈for bullet in bullets.copy():if bullet.rect.bottom <= 0:bullets.remove(bullet)check_bullet_alien_collisions(ai_settings, screen,ship, aliens, bullets)def fire_bullet(ai_settings, screen, ship, bullets):"""如果還沒(méi)有達(dá)到限制,就發(fā)射一顆子彈"""# 創(chuàng)建一顆子彈,并將其加入到編組bulletsif len(bullets) < ai_settings.bullets_allowed:new_bullet = Bullet(ai_settings, screen, ship)bullets.add(new_bullet)def create_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)建外星人群for row_number in range(number_rows):for alien_number in range(number_aliens_x):#創(chuàng)建第一個(gè)外星人并加入當(dāng)前行create_alien(ai_settings, screen, aliens,alien_number, row_number)def get_number_aliens_x(ai_settings, alien_width):"""計(jì)算每行可容納多少個(gè)外星人"""available_space_x = ai_settings.screen_width - 2 * alien_widthnumber_aliens_x = int(available_space_x / (2 * alien_width))return number_aliens_xdef create_alien(ai_settings, screen, aliens, alien_number , row_number):"""創(chuàng)建一個(gè)外星人并將其放在當(dāng)前行"""alien = Alien(ai_settings, screen)alien_width = alien.rect.widthalien.x = alien_width + 2 * alien_width * alien_numberalien.rect.x = alien.xalien.rect.y = alien.rect.height + 2 * alien.rect.height * row_numberaliens.add(alien)def get_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))return number_rowsdef check_fleet_edges(ai_settings, aliens):"""外星人到達(dá)邊緣時(shí)采取相應(yīng)的措施"""for alien in aliens.sprites():if alien.check_edges():change_fleet_direction(ai_settings, aliens)breakdef change_fleet_direction(ai_setting, aliens):"""將整群外星人下移,并改變他們的方向"""for alien in aliens.sprites():alien.rect.y += ai_setting.fleet_drop_speedai_setting.fleet_direction *= -1def update_aliens(ai_settings, stats, screen, ship, aliens, bullets):"""檢查是否有外星人位于屏幕邊緣,并更新整群外星人的位置"""check_fleet_edges(ai_settings, aliens)aliens.update()#檢測(cè)外星人和飛船之間的碰撞if pygame.sprite.spritecollideany(ship, aliens):ship_hit(ai_settings, stats, screen, ship, aliens, bullets)""""檢查是否到達(dá)地端"""check_aliens_bottom(ai_settings, stats, screen, ship,aliens, bullets)def ship_hit(ai_settings, stats, screen, ship, aliens, bullets):"""響應(yīng)被外星人撞到的飛船"""if stats.ships_left > 0:#將ships_left減1stats.ships_left -= 1#清空外星人列表和子彈列表aliens.empty()bullets.empty()#創(chuàng)建新的外星人create_fleet(ai_settings, screen, ship, aliens)ship.center_ship()#暫停sleep(0.5)else:stats.game_active = Falsedef check_aliens_bottom(ai_settings, stats, screen, ship, aliens, bullets):"""檢查是否有外星人到達(dá)"""screen_rect = screen.get_rect()for alien in aliens.sprites():if alien.rect.bottom >= screen_rect.bottom:#像飛船被撞到一樣進(jìn)行處理ship_hit(ai_settings, stats, screen, ship, aliens, bullets)break

三、運(yùn)行效果

總結(jié)

以上是生活随笔為你收集整理的基于pygame的射击小游戏制作(四)击杀外星人的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。