外星人入侵(python設計小游戲)

這個游戲簡而言之就是操作一個飛機對前方的飛船進行射擊,和一款很久之前的游戲很像,這里是超級低配版那個游戲,先來看看效果圖:

由于設計的是全屏的,所以電腦不能截圖。。。。

下面的就是你操控的飛船,上面的是要消滅的外星艦隊,左上角是剩余的生命,中間是歷史最高分,右邊是當前分數以及當前階段。

每當你消滅完整個外星艦隊時,就會進入下一階段,各種屬性都會得到提升。下面話不多說,直接展示完整代碼:

1.image

首先是圖片素材,我都放在了image這個文件夾里面:

可以直接復制我這個圖片,我這個后綴是bmp,如果用網上找的圖片的話要注意一下后綴問題,不然有一部分代碼會報錯的,需要自己更改

2.alian_invasion.py

這個是整個項目的主文件,運行的時候要在這個文件下面運行,里面注釋寫的比較完整,可以直接看詳細的注釋,相關代碼如下:

import sys
import pygamefrom settings import Settings
from ship import Ship
from bullet import Bullet
from alien import  Alien
from time import sleep
from game_stats import GameStats
from button import Button
from scoreboard import Scoreboardclass AlienInvasion():"""管理游戲資源和行為的類"""def __init__(self):"""初始化游戲并創建游戲資源"""pygame.init()self.clock = pygame.time.Clock()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()#游戲啟動后處于非存活狀態self.game_active = False#創造play按鈕self.play_button = Button(self,"play")def run_game(self):"""開始游戲的主循環"""while True:self._check_events()if self.game_active:self.ship.update()self._update_bullets()self._update_aliens()self._update_screen()self.clock.tick(60)def _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.game_active:#還原游戲設置self.settings.initialize_dynamic_settings()#重置游戲的統計信息self.stats.reset_stats()self.sb.prep_score()self.sb.prep_level()self.sb.prep_ships()self.game_active = True#清空外星人列表和子彈列表self.bullets.empty()self.aliens.empty()#創造一個新的外星艦隊,并將飛船放在屏幕下方的中央self._create_fleet()self.ship.center_ship()#隱藏光標pygame.mouse.set_visible(False)def _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 _fire_bullet(self):"""創造一個子彈,并將其加入編組buttle"""if len(self.bullets) < self.settings.bullet_allowed:new_bullet = Bullet(self)self.bullets.add(new_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 _update_screen(self):# 每次循環都重繪屏幕self.screen.fill(self.settings.bg_color)for bullet in self.bullets.sprites():bullet.draw_bullet()self.ship.blitme()self.aliens.draw(self.screen)#顯示得分self.sb.show_score()#如果游戲處于非存活狀態,就繪制play按鈕if not self.game_active:self.play_button.draw_button()# 讓最近繪制的屏幕可見pygame.display.flip()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 _create_fleet(self):"""創造外星艦隊"""#創造一個外星人alien = Alien(self)alien_width,alien_height = alien.rect.sizecurrent_x,current_y = alien_width,alien_heightwhile current_y < (self.settings.screen_height - 3 * alien_height):while current_x < (self.settings.screen_width - 2 * alien_width):self._creat_alien(current_x,current_y)current_x += 2 * alien_width#添加一個外星人后,重置x值并遞增y值current_x = alien_widthcurrent_y += 2 * alien_heightdef _creat_alien(self,x_position,y_position):"""創造一個外星人,并將其放入外星艦隊"""new_alien = Alien(self)new_alien.x = x_positionnew_alien.rect.x = x_positionnew_alien.rect.y = y_positionself.aliens.add(new_alien)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()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 _ship_hit(self):"""響應飛船和外星人的碰撞"""if self.stats.ships_left > 0:#將ships_left減1并更新計分板self.stats.ships_left -= 1self.sb.prep_ships()self.bullets.empty()self.aliens.empty()self._create_fleet()self.ship.center_ship()sleep(0.5)else:self.game_active = Falsepygame.mouse.set_visible(True)def _check_aliens_bottom(self):"""檢查是否有外星人到達了屏幕的下邊緣"""for alien in self.aliens.sprites():if alien.rect.bottom >= self.settings.screen_height:#像飛船一樣被處理self._ship_hit()breakif __name__ == '__main__':#創建游戲實例并運行游戲ai = AlienInvasion()ai.run_game()

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()return (self.rect.right >= screen_rect.right) or (self.rect.left <= 0)def update(self):"""向右移動外星人"""self.x += self.settings.alien_speed * self.settings.fleet_directionself.rect.x = self.x

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.midtopself.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)

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,135,0)self.text_colot = (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_colot,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)

6.game_stats.py

管理游戲信息的類,詳細的代碼如下:

class GameStats:"""跟蹤游戲的統計信息"""def __init__(self,ai_game):"""統計初始信息"""self.settings = ai_game.settingsself.reset_stats()#在任何情況下都不應該重置最高分self.high_score = 0def reset_stats(self):"""初始化在游戲運行期間可能變化的統計信息"""self.ships_left = self.settings.ship_limitself.score = 0self.level = 1

7.scoreboard.py

關于游戲得分的類,詳細代碼如下:

import pygame.font
from pygame.sprite import Groupfrom ship import Ship
class 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_high_score()self.prep_level()self.prep_ships()def prep_score(self):"""將得分渲染成圖像"""rounded_score = round(self.stats.score,-1)score_str = f"{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 prep_high_score(self):"""將最高分渲染成圖像"""high_score = round(self.stats.high_score,-1)high_score_str = f"{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 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 + 10def prep_ships(self):"""顯示還剩下多少飛船"""self.ships = Group()for ship_number in range(self.stats.ships_left):ship = Ship(self.ai_game)ship.rect.x = 10 + ship_number * ship.rect.widthship.rect.y = 10self.ships.add(ship)

8.settings.py

關于游戲設置的類,詳細代碼如下:

class Settings:"""初始化游戲的靜態設置"""def __init__(self):"""初始化游戲設置"""#屏幕設置self.screen_width = 1200self.screen_height = 800self.bg_color = (230,230,230)#飛船的設置self.ship_speed = 1.5self.ship_limit = 3#子彈設置self.bullet_speed = 2.5self.bullet_width = 3self.bullet_height = 15self.bullet_color = (60,60,60)self.bullet_allowed = 3#外星人設置self.alien_speed = 1.0self.fleet_drop_speed = 10#fleet_direction為1表示向右移動,-1表示向左移動self.fleet_direction = 1#以什么速度加快游戲的節奏self.speedup_scale = 1.1#外星人分數的提高速度self.score_scale = 1.5self.initialize_dynamic_settings()def initialize_dynamic_settings(self):"""初始化隨游戲進行而變化的設置"""self.ship_speed = 1.5self.bullet_speed = 2.5self.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)

9.ship.py

關于飛船的類,詳細代碼如下:

import pygame
from pygame.sprite import Sprite
class Ship(Sprite):"""管理飛船的類"""def __init__(self,ai_game):"""初始化飛船并設置其初始位置"""super().__init__()self.screen = ai_game.screenself.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#在飛船的屬性中儲存一個浮點數self.x = float(self.rect.x)#移動標志self.moving_right = Falseself.moving_left = Falsedef update(self):"""根據移動標志調整飛船位置"""if self.moving_right and self.moving_right < self.screen_rect.right:self.x += self.settings.ship_speedif self.moving_left and self.moving_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)

以上就是本項目的完整代碼,可以把他們放在同一個文件夾下面來運行試試。

如果遇到了一些報錯,在本地運行不了的情況,可以去這個連接直接下載我的完整項目,不過正常情況應該是不得報錯的,https://github.com/00paning/alian-invasion,我把整個項目放在了我這個GitHub倉庫里面,需要的可以自取。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/74849.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/74849.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/74849.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

什么是CMS?常用CMS有哪些?

一、內容管理系統&#xff08;Content Management System&#xff09;? ?什么是CMS?&#xff1a;位于 Web 前端&#xff08;服務器&#xff09;和后端辦公系統之間的軟件系統&#xff0c;用于內容創建、編輯、審批和發布。支持文本、圖片、視頻、數據庫等各類數字內容的管理…

Go 語言規范學習(3)

文章目錄 Properties of types and valuesRepresentation of valuesUnderlying types【底層類型】Core types【核心類型】Type identityAssignabilityRepresentabilityMethod sets BlocksDeclarations and scopeLabel scopesBlank identifierPredeclared identifiersExported i…

在 Ubuntu 上安裝 Docker 的完整指南

1. 卸載舊版本(如有) 在安裝新版本前,建議先卸載舊版本: sudo apt remove docker docker-engine docker.io containerd runc 2. 安裝依賴包 更新軟件包索引并安裝必要的依賴: sudo apt update sudo apt install -y ca-certificates curl gnupg lsb-release 3. 添加 Do…

turtle的九個使用

一 import turtle as t color [red,green,blue,orange,pink] for i in range(len(color)):t.penup()t.goto(-20070*i,0)t.pendown()t.pencolor(color[i])t.circle(50, steps 5) t.done()二 #在____________上補充代碼 #不要修改其他代碼import random as r import turtle a…

23種設計模式-備忘錄(Memento)設計模式

備忘錄設計模式 &#x1f6a9;什么是備忘錄設計模式&#xff1f;&#x1f6a9;備忘錄設計模式的特點&#x1f6a9;備忘錄設計模式的結構&#x1f6a9;備忘錄設計模式的優缺點&#x1f6a9;備忘錄設計模式的Java實現&#x1f6a9;代碼總結&#x1f6a9;總結 &#x1f6a9;什么是…

利用虛擬化技術實現高級Hook

虛擬化技術為系統監控和Hook提供了更強大、更隱蔽的實現方式。以下是幾種基于虛擬化的Hook技術實現方法&#xff1a; 1. 基于VT-x/AMD-V的硬件虛擬化Hook 基本原理 利用CPU的硬件虛擬化擴展(Intel VT-x/AMD-V)在Ring -1層級監控系統行為&#xff0c;實現無法被常規方法檢測的…

某魚、某寶 sign 簽名算法分析記錄

【作者主頁】&#xff1a;小魚神1024 【知識星球】&#xff1a;小魚神的逆向編程圈 【擅長領域】&#xff1a;JS逆向、小程序逆向、AST還原、驗證碼突防、Python開發、瀏覽器插件開發、React前端開發、NestJS后端開發等等 本文章中所有內容僅供學習交流使用&#xff0c;不用于其…

Compose筆記(十三)--事件總線

這一節了解一下Compose中的事件總線&#xff0c;在Jetpack Compose里&#xff0c;官方沒有直接提供事件總線&#xff0c;但可以借助第三方庫或者自定義實現來達成事件總線的功能&#xff0c;進而在不同的 Compose 控件間同步數據。 自定義事件總線 import androidx.compose.r…

Python的inspect模塊

在Python編程中&#xff0c;**inspect**模塊是一個強大的工具包&#xff0c;它提供了一系列函數來獲取對象的信息&#xff0c;主要用于獲取對象的源代碼、參數信息、類繼承關系、方法屬性等。這對于調試、自動化文檔生成、代碼分析等場景都非常有用。本文將詳細介紹inspect模塊…

2025跳槽學習計劃

&#xff08;1&#xff09;編程基礎&#xff1a; 目錄學習資料Chttps://www.bilibili.com/video/BV1z64y1U7hs?spm_id_from333.1387.favlist.content.clickLinuxPytorchhttps://www.bilibili.com/video/BV1if4y147hS?spm_id_from333.1387.favlist.content.clickopencv數據結…

WebRTC簡介及應用

WebRTC&#xff08;Web Real-Time Communication&#xff09;是一種支持瀏覽器和移動設備進行實時音視頻通信的技術&#xff0c;無需安裝插件或額外的軟件。它是一個開放標準&#xff0c;最初由Google推動&#xff0c;并被W3C&#xff08;萬維網聯盟&#xff09;和IETF&#xf…

【C語言】分支與循環(上)

前言&#xff1a;C語言是由順序結構、選擇結構、循環結構組成的結構化的程序設計語言。 那C語言是如何設計和實現這些結構的呢&#xff1f;話不多說&#xff0c;馬上開始。 三種結構如圖所示&#xff1a; 我們可以使用 if else語句、 switch語句 來實現選擇&#xff08;分支&am…

一次與chatgpt關于VO的深入討論。

我&#xff1a; {"usageRate":50,"projectInfo":[{"productName":"長江一號","deviceInfo":[{"deviceName":"AA","num":10},{"deviceName":"BB","num":3}]},…

Springboot學習筆記3.20

目錄 1.實戰篇第一課 我們將會在本次實戰中學習到哪些知識點&#xff1f; 開發模式和環境搭建&#xff1a; 注冊接口 1.Lombok 2.開發流程 1.controller層&#xff0c;這個層會指明訪問路徑和要執行的邏輯&#xff1a; 2.我們把返回結果根據接口文檔包裝成一個類result&a…

docker save如何遷移鏡像更節省空間?

文章目錄 方法一&#xff1a;使用docker save命令方法二&#xff1a;直接保存多個鏡像到一個tar文件哪個方法更節省磁盤空間&#xff1f;空間效率對比實際測試示例其他優勢結論 如何用腳本遷移加載鏡像 遷移鏡像時候&#xff0c;往往會碰到基礎鏡像相同的很多鏡像需要遷移&…

全新升級 | Built For You Spring ‘25 發布,Fin 智能客服實現新突破!

圖像識別、語音交互、任務自動化&#xff0c;立即體驗智能客服蛻變&#xff01; 上周&#xff0c;Intercom 舉辦了 Built For You Spring 25 發布會&#xff0c;正式揭曉了 AI Agent Fin 的一系列令人振奮的更新。Fin 正在以前所未有的速度革新客戶支持模式——它已經成功解決了…

需求導向的K8S網絡原理分析:Kube-proxy、Flannel、Calico的地位和作用

最近發現自己似乎從來沒學明白過Kubernetes網絡通信方案&#xff0c;特開一貼復習總結一下。 在k8s中&#xff0c;每個 Pod 都擁有一個獨立的 IP 地址&#xff0c;而且假定所有 Pod 都在一個可以直接連通的、扁平的網絡空間中。所以不管它們是否允許在同一個 Node&#xff08;宿…

Vulnhub:Digitalword.local: FALL靶機滲透

將靶機按照圖中連接方式打開&#xff0c;fall在virtualBox中打開 信息收集 掃描得ip arp-scan -l 掃描端口 nmap -A -T4 -sV -p- 掃描目錄 gobuster dir -u http://192.168.117.160 -x php,txt,html -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt 一個一個…

4、網工軟考—VLAN配置—hybird配置

1、實驗環境搭建&#xff1a; 2、實驗過程 SW1&#xff1a; 先創建vlan2和vlan3 [Huawei-Ethernet0/0/2]port link-type hybrid //hybird端口 [Huawei-Ethernet0/0/2]port hybrid pvid vlan 2 [Huawei-Ethernet0/0/2]port hybrid untagged vlan 10 //撕掉vlan10的標簽 …

【OCR】技術

OCR圖像識別 一、OCR是什么二、Python中如何實現OCR1.簡單應用 三、OCR的核心步驟1.?圖像預處理?&#xff08;提高識別準確率&#xff09;2.?文字識別3.?輸出結果 四、OCR到的應用場景五、注意事項六、擴展學習 此貼用來更新在工作中遇到的一些圖片解析內容 一、OCR是什么 …