Python游戏开发--外星人入侵(源代码)
生活随笔
收集整理的這篇文章主要介紹了
Python游戏开发--外星人入侵(源代码)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1.效果展示
- 2. 《外星人入侵》源代碼
- 2.1 image
- 2.2 alien_invasion.py
- 2.3 alien.py
- 2.4 bullet.py
- 2.5 button.py
- 2.6 game_stats.py
- 2.7 scoreboarf.py
- 2.8 settings.py
- 2.9 ship.py
最近學習的python第一個項目實戰,《外星人入侵》,成功實現所有功能,給大家提供源代碼
環境安裝:python 3.7+ pygame
安裝 pygame pip install -- user pygame
或者
conda install --user pygame1.效果展示
先展示效果,消滅外星人,有三條命,按Q是退出全屏,空格鍵是子彈,按下play鍵開始游戲,擊敗外星人飛船會有積分加,三條命之后需要點擊play才能再次啟動
2. 《外星人入侵》源代碼
外星人入侵小游戲文件排版如下,先創建這幾個.py文件
2.1 image
2.2 alien_invasion.py
import sys from time import sleepimport pygamefrom settings import Settings from ship import Ship from bullet import Bullet from alien import Alien from game_stats import GameStats from button import Button from scoreboard import Scoreboardclass AlienInvasion:'''管理游戲資源和行為的類'''def __init__(self):'''初始化游戲并創建游戲資源'''pygame.init()self.settings = Settings()self.screen = pygame.display.set_mode((0,0),pygame.FULLSCREEN)self.settings.screen_width = self.screen.get_rect().widthself.settings.screen_height = self.screen.get_rect().heightpygame.display.set_caption('Alien Invasion')'''創建存儲游戲統計信息的實例''''''并創建記分牌''''''創建一個用于存儲游戲統計信息的實例'''self.stats =GameStats(self)self.sb = Scoreboard(self)self.ship =Ship(self)self.bullets = pygame.sprite.Group()self.aliens = pygame.sprite.Group()self._create_fleet()'''創建play按鈕'''self.play_button = Button(self,"Play")# '''設置背景色'''# self.bg_color = (self.settings.bg_color) cuowudef _ship_hit(self):'''響應飛船被外星人撞到'''if self.stats.ships_left >0:'''將ship_left減1并更新記分牌'''self.stats.ships_left -= 1self.sb.prep_ships()'''清除余下的外星人和子彈'''self.aliens.empty()self.bullets.empty()'''創建一群新的外星人,并將飛船放到屏幕底端的中央'''self._create_fleet()self.ship.center_ship()'''暫停'''sleep(0.5)else:self.stats.game_active = Falsepygame.mouse.set_visible(True)def _create_fleet(self):'''創建外星人群''''''創建一個外星人并計算一行可容納多少個外星人''''''外星人的間距為外星人寬度'''alien = Alien(self)alien_width, alien_height = alien.rect.sizeavailable_space_x = self.settings.screen_width - (2 * alien_width)number_aliens_x = available_space_x // (2 * alien_width )'''計算屏幕可容納多少行外星人'''ship_height = self.ship.rect.heightavailable_space_y = (self.settings.screen_height -(3 * alien_height) - ship_height)number_rows = available_space_y // (2 * alien_height)'''創建外星人群'''for row_number in range(number_rows):'''創建第一行外星人'''for alien_number in range(number_aliens_x):self._create_alien(alien_number,row_number)def _create_alien(self,alien_number,row_number):'''創建一個外星人并將其加入當前行'''alien = Alien(self)alien_width, alien_height =alien.rect.sizealien.x = alien_width + 2 * alien_width * alien_numberalien.rect.x = alien.xalien.rect.y =alien.rect.height + 2 * alien.rect.height * row_numberself.aliens.add(alien)def run_game(self):'''開始游戲的主循環'''while True:'''監視鍵盤和鼠標事件'''self._check_events()if self.stats.game_active:'''調用飛船的方法'''self.ship.update()'''子彈更新'''self._update_bullets()'''讓外星人移動'''self._update_aliens() #suojin+weizhi'''每次循環時都會重繪屏幕'''self._update_screen()def _check_fleet_edges(self):'''有外星人到達邊緣時采取相應的措施'''for alien in self.aliens.sprites():if alien.check_edges():self._change_fleet_direction()breakdef _change_fleet_direction(self):'''將整群人外星人下一,并改變它們的方向'''for alien in self.aliens.sprites():alien.rect.y += self.settings.fleet_drop_speedself.settings.fleet_direction *= -1def _update_aliens(self):'''檢測是否有外星人位于屏幕邊緣,更新外星人群中所有外星人的位置'''self._check_fleet_edges()self.aliens.update()'''檢測外星人和飛船之間的碰撞'''if pygame.sprite.spritecollideany(self.ship, self.aliens):self._ship_hit()'''檢查是否有外星人到達了屏幕底端'''self._check_aliens_bottom() #suojindef _check_events(self):'''響應按鍵和鼠標事件'''for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()elif event.type == pygame.KEYDOWN:self._check_keydown_events(event)elif event.type == pygame.KEYUP:self._check_keyup_events(event)elif event.type == pygame.MOUSEBUTTONDOWN:mouse_pos = pygame.mouse.get_pos()self._check_play_button(mouse_pos)def _check_play_button(self,mouse_pos):'''在玩家單機play按鈕時開始新游戲'''button_clicked = self.play_button.rect.collidepoint(mouse_pos)if button_clicked and not self.stats.game_active:'''重置游戲設置'''self.settings.initialize_dynamic_settings()'''重置游戲統計信息'''self.stats.reset_stats()self.stats.game_active = Trueself.sb.prep_score()self.sb.prep_level()self.sb.prep_ships()'''清空余下的外星人和子彈'''self.aliens.empty()self.bullets.empty()'''創建一群新的外星人并讓飛船居中'''self._create_fleet()self.ship.center_ship()'''隱藏鼠標光標'''pygame.mouse.set_visible(False)def _check_aliens_bottom(self):'''檢查是否有外星人到達了屏幕底端'''screen_rect =self.screen.get_rect()for alien in self.aliens.sprites():if alien.rect.bottom >= screen_rect.bottom:'''像飛船被撞一樣處理'''self._ship_hit()breakdef _check_keydown_events(self,event):'''響應按鍵'''if event.key == pygame.K_RIGHT:'''向右移動飛船'''self.ship.moving_right = Trueelif event.key == pygame.K_LEFT:'''向左移動飛船'''self.ship.moving_left = Trueelif event.key == pygame.K_q:sys.exit()elif event.key == pygame.K_SPACE:self._fire_bullet()def _check_keyup_events(self,event):'''響應松開'''if event.key == pygame.K_RIGHT:self.ship.moving_right = Falseelif event.key == pygame.K_LEFT:self.ship.moving_left = Falsedef _fire_bullet(self):'''創建一顆子彈,并將其加入編組bullets中'''if len(self.bullets) < self.settings.bullets_allowed:new_bullet = Bullet(self)self.bullets.add(new_bullet)def _update_bullets(self):'''更新子彈的位置并刪除消失的子彈''''''更新子彈的位置'''self.bullets.update()'''刪除消失的子彈'''for bullet in self.bullets.copy():if bullet.rect.bottom <= 0:self.bullets.remove(bullet)self._check_bullet_alien_collisions()def _check_bullet_alien_collisions(self):'''檢查是否有子彈擊中了外星人如果是,就刪除相應的子彈和外星人'''collisions = pygame.sprite.groupcollide(self.bullets, self.aliens, True,True)if collisions:for aliens in collisions.values():self.stats.score += self.settings.alien_points * len(aliens)self.sb.prep_score()self.sb.check_high_score()if not self.aliens:'''刪除現有的子彈并新建一群外星人'''self.bullets.empty()self._create_fleet()self.settings.increase_speed()'''提高等級'''self.stats.level += 1self.sb.prep_level()def _update_screen(self):'''更新屏幕上的圖像,并切換到新屏幕'''self.screen.fill(self.settings.bg_color)#loule settings.self.ship.blitme()for bullet in self.bullets.sprites():bullet.draw_bullet()self.aliens.draw(self.screen)'''顯示得分'''self.sb.show_score()'''如果游戲處于非活動狀態,就繪制Play按鈕'''if not self.stats.game_active:self.play_button.draw_button()'''讓最近繪制的屏幕可見'''pygame.display.flip()if __name__ == "__main__":'''創建游戲實例并運行游戲'''ai = AlienInvasion()ai.run_game()2.3 alien.py
import pygame from pygame.sprite import Spriteclass Alien(Sprite):'''表示單個外星人的類'''def __init__(self,ai_game):'''初始化外星人并設置其起始位置'''super().__init__()self.screen = ai_game.screenself.settings = ai_game.settings'''加載外星人圖像并設置其rect屬性'''self.image = pygame.image.load('image/alien.bmp')self.rect =self.image.get_rect()'''每個外星人最初都在屏幕左下角附近'''self.rect.x = self.rect.widthself.rect.y = self.rect.height'''存儲外星人的精確水平位置'''self.x = float(self.rect.x)def check_edges(self):'''如果外星人位于屏幕邊緣,就返回True'''screen_rect = self.screen.get_rect()if self.rect.right >= screen_rect.right or self.rect.left <= 0:return Truedef update(self):'''向左或者向右移動外星人'''self.x += (self.settings.alien_speed * self.settings.fleet_direction)# self.x += self.settings.alien_speed向右移動外星人self.rect.x = self.x2.4 bullet.py
import pygame from pygame.sprite import Spriteclass Bullet(Sprite):'''管理飛船所發射子彈的類'''def __init__(self,ai_game):'''在飛船當前位置創建一個子彈對象'''super().__init__()self.screen = ai_game.screenself.settings = ai_game.settingsself.color =self.settings.bullet_color'''在(0,0)處創建一個表示子彈的矩形,在設置正確的位置'''self.rect =pygame.Rect(0,0,self.settings.bullet_width,self.settings.bullet_height)self.rect.midtop =ai_game.ship.rect.midtop'''存儲用小數表示子彈位置'''self.y =float(self.rect.y)def update(self):'''向上移動子彈''''''更新表示子彈位置的小數值'''self.y -= self.settings.bullet_speed'''更新表示子彈的rect的位置'''self.rect.y = self.ydef draw_bullet(self):'''在屏幕上繪制子彈'''pygame.draw.rect(self.screen, self.color, self.rect)2.5 button.py
import pygame.fontclass Button:def __init__(self,ai_game,msg):'''初始化按鈕的屬性'''self.screen = ai_game.screenself.screen_rect = self.screen.get_rect()'''設置按鈕的尺寸和其他屬性'''self.width, self.height = 200,50self.button_color = (0,255,0)self.text_color =(255,255,255)self.font = pygame.font.SysFont(None,48)'''創建按鈕的rect對象,并使其居中'''self.rect = pygame.Rect(0,0,self.width,self.height)self.rect.center = self.screen_rect.center'''按鈕的標簽只需要創建一次'''self._prep_msg(msg)def _prep_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.centerdef draw_button(self):'''繪制一個用顏色填充的按鈕,再繪制文本'''self.screen.fill(self.button_color, self.rect)self.screen.blit(self.msg_image,self.msg_image_rect)2.6 game_stats.py
class GameStats:'''跟蹤游戲的統計信息'''def __init__(self,ai_game):'''初始化統計信息'''self.settings = ai_game.settingsself.reset_stats()'''游戲剛啟動時處于活動狀態'''self.game_active = False'''任何情況下都不應該重置最高得分'''self.high_score = 0def reset_stats(self):'''初始化在游戲運行期間可能變化的統計信息'''self.ships_left = self.settings.ship_limitself.score = 0self.level = 12.7 scoreboarf.py
import pygame.font from pygame.sprite import Group from ship import Shipclass Scoreboard:'''顯示得分信息的類'''def __init__(self,ai_game):'''初始化顯示得分涉及的屬性'''self.ai_game = ai_gameself.screen = ai_game.screenself.screen_rect = self.screen.get_rect()self.settings = ai_game.settingsself.stats = ai_game.stats'''顯示得分信息時使用的字體設置'''self.text_color = (30,30,30)self.font = pygame.font.SysFont(None,48)'''準備包含最高得分和當前得分的圖像'''self.prep_score()self.prep_ships()self.prep_high_score()self.prep_level()#cuowudef prep_ships(self):'''顯示還剩下多少艘飛船'''self.ships = Group()for ship_number in range(self.stats.ships_left): #cuowuship =Ship(self.ai_game)ship.rect.x = 10 + ship_number * ship.rect.widthship.rect.y = 10self.ships.add(ship) #cuowudef prep_high_score(self):'''將最高得分轉換為渲染的圖像'''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.settings.bg_color)'''將最高得分放在屏幕頂部中央'''self.high_score_rect = self.high_score_image.get_rect()self.high_score_rect.centerx = self.screen_rect.centerxself.high_score_rect.top = self.score_rect.topdef prep_score(self):'''將得分轉換成一副渲染的圖像'''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.settings.bg_color)'''在屏幕右下顯示得分'''self.score_rect =self.score_image.get_rect()self.score_rect.right = self.screen_rect.right - 20self.score_rect.top = 20def show_score(self):'''在屏幕上顯示得分和等級和余下的飛船數'''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 )self.ships.draw(self.screen)def check_high_score(self):'''檢查是否誕生了新的最高得分'''if self.stats.score > self.stats.high_score:self.stats.high_score = self.stats.scoreself.prep_high_score()def prep_level(self):'''將等級轉化為渲染的圖像'''level_str = str(self.stats.level)self.level_image = self.font.render(level_str,True,self.text_color, self.settings.bg_color)'''將等級放在得分下面'''self.level_rect = self.level_image.get_rect()self.level_rect.right = self.score_rect.rightself.level_rect.top = self.score_rect.bottom +102.8 settings.py
class Settings:'''存儲游戲《外星人入侵》中所有設置的類'''def __init__(self):'''初始化游戲的靜態設置''''''屏幕設置'''self.screen_width = 1200self.screen_height =800self.bg_color = (230,230,230)self.ship_limit = 3self.bullet_width = 3self.bullet_height = 15self.bullet_color = (60, 60, 60)self.bullets_allowed = 3 # 設置存儲的最大子彈數為3self.fleet_drop_speed = 10'''加快游戲節奏的速度'''self.speedup_scale = 1.1self.score_scale = 1.5self.initialize_dynamic_settings()# '''設置飛船速度'''# self.ship_speed = 1.5# '''子彈設置'''# self.bullet_speed = 1.5# self.alien_speed = 1.0# '''fleet_direction為1表示向有意,-1表示向左移'''# self.fleet_direction = 1 cuowudef initialize_dynamic_settings(self):'''初始化隨游戲進行而變化的設置'''self.ship_speed = 1.5self.bullet_speed =3.0self.alien_speed = 1.0'''fleet_direction為1表示向右,為-1表示向左'''self.fleet_direction = 1# '''計分'''self.alien_points = 50def increase_speed(self):'''提高速度設置和外星人分數'''self.ship_speed *= self.speedup_scaleself.bullet_speed *= self.speedup_scaleself.alien_speed *= self.speedup_scaleself.alien_points = int(self.alien_points * self.score_scale)# print(self.alien_points) cuowu2.9 ship.py
import pygame from pygame.sprite import Spriteclass Ship(Sprite):'''管理飛船的類'''def __init__(self,ai_game):'''初始化飛船并設置其初始化位置'''super().__init__()self.screen = ai_game.screen'''設置飛船速度'''self.settings = ai_game.settingsself.screen_rect = ai_game.screen.get_rect()'''加載飛船圖像并獲取其外接矩陣'''self.image = pygame.image.load('image/ship.bmp')self.rect = self.image.get_rect()'''對于每艘新飛船,都將其放在屏幕底部的中央'''self.rect.midbottom = self.screen_rect.midbottom'''在飛船的屬性x中存儲小數值'''self.x = float(self.rect.x)'''移動標志'''self.moving_right = Falseself.moving_left = Falsedef update(self):'''根據移動標志調整飛船的位置''''''更新飛船而不是rect對象的值'''if self.moving_right and self.rect.right < self.screen_rect.right:self.x += self.settings.ship_speedif self.moving_left and self.rect.left > 0:self.x -= self.settings.ship_speed'''根據self.x更新rect對象'''self.rect.x = self.xdef blitme(self):'''在指定位置繪制飛船'''self.screen.blit(self.image, self.rect)def center_ship(self):'''讓飛船在屏幕底端劇中'''self.rect.midbottom = self.screen_rect.midbottomself.x = float(self.rect.x) 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Python游戏开发--外星人入侵(源代码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python机器学习--sklearn数
- 下一篇: AdaBoost算法详解与python实