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()
輸出: