第十二章—武裝飛船

来源:https://www.cnblogs.com/liuhaier/archive/2018/04/30/8947522.html
-Advertisement-
Play Games

12-1 藍色天空 :創建一個背景為藍色的Pygame視窗。 輸出: 12-2 游戲角色 :找一幅你喜歡的游戲角色點陣圖圖像或將一幅圖像轉換為點陣圖。創建一個類,將該角色繪製到屏幕中央,並將該圖像的背景色設置為屏幕背景色,或將 屏幕背景色設置為該圖像的背景色。 alien_invasion1.py ro ...


12-1 藍色天空 :創建一個背景為藍色的Pygame視窗。

 1 import sys
 2 import pygame
 3 def run_game():
 4     #初始化游戲並創建一個屏幕對象
 5     pygame.init()
 6     screen=pygame.display.set_mode((1200,800))
 7     pygame.display.set_caption("Alien Invasion")
 8     #設置背景顏色
 9     bg_color=(0,0,255)
10     #開始游戲的主迴圈
11     while True:
12         #監視鍵盤和滑鼠事件
13         for event in pygame.event.get():
14             if event.type==pygame.QUIT:
15                 sys.exit()
16         #每次迴圈時都會重繪屏幕
17         screen.fill(bg_color)
18         #讓最近繪製的屏幕可見
19         pygame.display.flip()
20 run_game()

輸出:

12-2 游戲角色 :找一幅你喜歡的游戲角色點陣圖圖像或將一幅圖像轉換為點陣圖。創建一個類,將該角色繪製到屏幕中央,並將該圖像的背景色設置為屏幕背景色,或將 屏幕背景色設置為該圖像的背景色。

alien_invasion1.py

 1 import sys
 2 import pygame
 3 from rocket import Rocket
 4 
 5 def run_game():
 6     #初始化游戲並創建一個屏幕對象
 7     pygame.init()
 8     screen=pygame.display.set_mode((800,600))
 9     pygame.display.set_caption("Alien Invasion")
10 
11     #創建一艘火箭
12     rocket=Rocket(screen)
13 
14     #設置背景顏色
15     bg_color=(0,0,255)
16     #開始游戲的主迴圈
17     while True:
18         #監視鍵盤和滑鼠事件
19         for event in pygame.event.get():
20             if event.type==pygame.QUIT:
21                 sys.exit()
22         #每次迴圈時都會重繪屏幕
23         screen.fill(bg_color)
24         rocket.blitme()
25         #讓最近繪製的屏幕可見
26         pygame.display.flip()
27 run_game()

rocket.py

 1 import pygame
 2 class Rocket():
 3     def __init__(self,screen):
 4         '''初始化火箭並設置其初始位置'''
 5         self.screen=screen
 6         #載入火箭圖像圖像並獲取其外接矩形
 7         self.image=pygame.image.load('image/rocket.bmp')
 8         self.rect = self.image.get_rect()
 9         self.screen_rect = screen.get_rect()
10 
11         #將每艘新火箭放在屏幕中央
12         self.rect.centerx = self.screen_rect.centerx
13         self.rect.centery = self.screen_rect.centery
14         # 在飛船的屬性center中存儲小數值
15         self.center = float(self.rect.centerx)
16 
17     def blitme(self):
18         # 在指定位置繪製飛船
19         self.screen.blit(self.image, self.rect)

輸出:

12-3 火箭 :編寫一個游戲,開始時屏幕中央有一個火箭,而玩家可使用四個方向鍵上下左右移動火箭。請務必確保火箭不會移到屏幕外面。 

alien_invasion1.py

 1 import sys
 2 import pygame
 3 import game_functions1 as gf
 4 from settings1 import Settings
 5 from rocket import Rocket
 6 
 7 def run_game():
 8     #初始化游戲並創建一個屏幕對象
 9     pygame.init()
10     ai_settings=Settings()
11     screen=pygame.display.set_mode(
12         (ai_settings.screen_width,ai_settings.screen_height))#視窗尺寸
13     pygame.display.set_caption("Rocket")
14     #創建一個火箭
15     rocket=Rocket(ai_settings,screen)
16     #開始游戲主迴圈
17     while True:
18         #監視鍵盤和滑鼠事件
19         gf.check_events(rocket)
20         rocket.update()
21         gf.update_screen(ai_settings,screen,rocket)
22 run_game()

輸出:

12-4 按鍵 :創建一個程式,顯示一個空屏幕。在事件迴圈中,每當檢測到pygame.KEYDOWN 事件時都列印屬性event.key。運行這個程式,並按各種鍵,看看Pygame如何響應。

 

 1 import sys
 2 import pygame
 3 def run_game():
 4     pygame.init()
 5     screen=pygame.display.set_mode((1000,600))
 6     pygame.display.set_caption('kong')
 7     bg_color = (230, 230, 230)
 8     while True:
 9         for event in pygame.event.get():
10             if event.type==pygame.QUIT:
11                 sys.exit()
12             elif event.type == pygame.KEYDOWN:
13                 if event.key==pygame.K_DOWN:
14                     bg_color = (255, 0, 0)
15                 else :
16                     bg_color = (0, 255, 0)
17         screen.fill(bg_color)
18         pygame.display.flip()
19 
20 run_game()

輸出:

點擊運行後鍵盤無操作:

鍵盤向下鍵:

鍵盤其他鍵:

 12-5 側面射擊 :編寫一個游戲,將一艘飛船放在屏幕左邊,並允許玩家上下移動飛船。在玩家按空格鍵時,讓飛船發射一顆在屏幕中向右穿行的子彈,併在子彈離開 屏幕而消失後將其刪除。

settings2.py

 1 class Settings():
 2     #存儲《外星人入侵》的所有設置的類
 3     def __init__(self):
 4         #初始化游戲的設置
 5         #屏幕設置
 6         self.screen_width=1000
 7         self.screen_height=500
 8         self.bg_color=(230,230,230)
 9         #飛船的設置
10         self.ship_speed_factor=1.5
11 
12         #子彈的設置
13         self.bullet_speed_factor=1
14         self.bullet_width=15
15         self.bullet_height=3
16         self.bullet_color=(60,60,60)
17         self.bullets_allowed=6

ship2.py

 1 import pygame
 2 class Ship():
 3     def __init__(self,ai_settings,screen):
 4         #初始化飛船並設置其初始位置
 5         self.screen=screen
 6         self.ai_settings=ai_settings
 7         #載入飛船圖像並獲取其外接矩形
 8         self.image=pygame.image.load('image/ship.bmp')
 9         self.rect=self.image.get_rect()
10         self.screen_rect=screen.get_rect()
11         #將每艘新飛船放在屏幕左側中央
12         self.rect.left=self.screen_rect.left
13         self.rect.centery=self.screen_rect.centery
14         #在飛船的屬性center中存儲小數值
15         self.centery=float(self.rect.centery)
16 
17         #移動標誌
18         self.moving_up=False
19         self.moving_down = False
20     def update(self):
21         """根據移動標誌調整飛船位置"""
22         #更新飛船的center值,而不是rect
23         if self.moving_up and self.rect.top>0:
24             self.centery-=self.ai_settings.ship_speed_factor
25         if self.moving_down and self.rect.bottom<self.screen_rect.bottom:
26             self.centery+=self.ai_settings.ship_speed_factor
27 
28         #根據self.centery更新rect對象
29         self.rect.centery=self.centery
30 
31     def blitme(self):
32         #在指定位置繪製飛船
33         self.screen.blit(self.image,self.rect)

bullet2.py

 1 import pygame
 2 from pygame.sprite import Sprite
 3 
 4 class Bullet(Sprite):
 5     '''一個對飛船發射的子彈進行管理的類'''
 6     def __init__(self,ai_settings,screen,ship):
 7         """在飛船所處的位置創建一個子彈對象"""
 8         super(Bullet,self).__init__()
 9         self.screen=screen
10         #在(0,0)處創建一個表示子彈的矩形,再設置正確的位置
11         self.rect=pygame.Rect(0,0,ai_settings.bullet_width,
12                               ai_settings.bullet_height)
13         self.rect.centery=ship.rect.centery
14         self.rect.left=ship.rect.left
15         #存儲用小數表示的子彈位置
16         self.x=float(self.rect.x)
17         self.color= ai_settings.bullet_color
18         self.speed_factor=ai_settings.bullet_speed_factor
19     def update(self):
20         """向右移動子彈"""
21         #更新表示子彈位置的小數值
22         self.x+=self.speed_factor
23         #更新表示子彈的rect的位置
24         self.rect.x=self.x
25 
26     def draw_bullet(self):
27         """在屏幕上繪製子彈"""
28         pygame.draw.rect(self.screen,self.color,self.rect)

game_functions2.py

 1 import sys
 2 import pygame
 3 from bullet2 import Bullet
 4 def check_keydown_events(event,ai_settings,screen,ship,bullets):
 5     """響應按鍵"""
 6     if event.key == pygame.K_UP:
 7         # 向上移動飛船
 8         ship.moving_up = True
 9     elif event.key == pygame.K_DOWN:
10         # 向下移動飛船
11         ship.moving_down = True
12     elif event.key==pygame.K_SPACE:
13         fire_bullet(ai_settings, screen, ship, bullets)
14 
15 def fire_bullet(ai_settings,screen,ship,bullets):
16     """如果還沒有到達限制,就發射一顆子彈"""
17     # 創建一顆子彈,並將其加入到編組bullets中
18     if len(bullets) < ai_settings.bullets_allowed:
19         new_bullet = Bullet(ai_settings, screen, ship)
20         bullets.add(new_bullet)
21 
22 def check_keyup_events(event,ship):
23     """響應鬆開"""
24     if event.key == pygame.K_UP:
25         # 向上移動飛船
26         ship.moving_up = False
27     elif event.key == pygame.K_DOWN:
28         # 向上移動飛船
29         ship.moving_down = False
30 def check_events(ai_settings,screen,ship,bullets):
31     for event in pygame.event.get():
32         if event.type == pygame.QUIT:
33             sys.exit()
34         elif event.type==pygame.KEYDOWN:
35             check_keydown_events(event, ai_settings,screen,ship,bullets)
36 
37         elif event.type==pygame.KEYUP:
38             check_keyup_events(event, ship)
39 
40 def update_screen(ai_settings,screen,ship,bullets):
41     """更新屏幕上的圖像,並切換到新屏幕上"""
42     #每次迴圈時都重繪屏幕
43     screen.fill(ai_settings.bg_color)
44     #在飛船和外星人後面重繪所有子彈
45     for bullet in bullets.sprites():
46         bullet.draw_bullet()
47     ship.blitme()
48     #讓最近繪製屏幕可見
49     pygame.display.flip()
50 def update_bullets(bullets):
51     # 更新子彈位置,刪除已消失的子彈
52     #更新子彈位置
53     bullets.update()
54     #刪除已消失的子彈
55     for bullet in bullets.copy():
56         if bullet.rect.left >= 1000:
57             bullets.remove(bullet)
58             # print(len(bullets))
alien_invasion2.py
 1 import sys
 2 import pygame
 3 from pygame.sprite import Group
 4 import game_functions2 as gf
 5 from settings2 import Settings
 6 from ship2 import Ship
 7 
 8 def run_game():
 9     #初始化游戲並創建一個屏幕對象
10     pygame.init()
11     ai_settings=Settings()
12     screen=pygame.display.set_mode(
13         (ai_settings.screen_width,ai_settings.screen_height))#視窗尺寸
14     pygame.display.set_caption("Alien Invasion")
15     #創建一個飛船
16     ship=Ship(ai_settings,screen)
17     #創建一個用於存儲子彈的編組
18     bullets=Group()
19 
20     #開始游戲主迴圈
21     while True:
22         gf.check_events(ai_settings,screen,ship,bullets)
23         ship.update()
24         gf.update_bullets(bullets)
25         gf.update_screen(ai_settings,screen,ship,bullets)
26 run_game()

輸出:

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 網上關於PyQt5的教程很少,特別是界面跳轉這一塊兒,自己研究了半天,下來和大家分享一下 一、首先是主界面 二、跳轉界面Demo1 三、跳轉界面Demo2 ...
  • [TOC] Introducing Python Object Types 對象類型的優勢 1. Built in objects make programs easy to write 2. Built in objects are components of extensions 3. Buil ...
  • 三大框架整合的思路 1、Dao層: Mybatis的配置文件:SqlMapConfig.xml 不需要配置任何內容,需要有文件頭。文件必須存在。 applicationContext-dao.xml: mybatis整合spring,通過由spring創建資料庫連接池,spring管理SqlSess ...
  • 任何類型的實例作為消息在兩端獨立系統的機器之間進行傳遞時必須經過序列化/反序列化serialize/deserialize處理過程。假設以下場景:在一個網路里有兩台連接的伺服器,它們分別部署了獨立的akka系統。如果我們需要在這兩台伺服器的akka系統之間進行消息交換的話,所有消息都必須經過序列化/ ...
  • #String的內置方法 st='hello world' ★1、print(st.count('l')) #統計元素在字元串的個數 #==> 3 2、print(st.capitalize()) #首字母大寫 #==> Hello world ★3、print(st.center(50,'-')) ...
  • 1.1 運算符 邏輯/位運算符:not and or 關係運算符:like is 1.2 數據類型 字元串 string $ 位元組 byte 布爾 boolean 整數 integer % 長整數 long & 單精度 single ! 雙精度 double # 日期 date 貨幣 currenc ...
  • 本系列主要解決的問題:針對一個功能龐大的企業應用 + 應用面對不同區域的眾多客戶,如何做好應用的多版本管理、各區域線上模塊的快速更新及系統的穩定性保障,可以採取對應用進行核心模塊按模塊化方式進行管理。 產生背景: 2017年接手一個已經維護了7年多的老項目,項目經歷了幾波人的維護,混雜了各種開發技術 ...
  • Maven是什麼,以及為什麼要使用Maven?Maven這個詞可以翻譯為“知識的積累”,也可以翻譯為“專 家”或“內行”。(構建 = 編寫源代碼+編譯源代碼+單元測試+生成文檔+打包War+部署)Maven主要服務於基於Java平臺的項目構建、依賴管理和項目信息管理。Maven適用於傳統的瀑布式開發 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...