pygame外星人2
生活随笔
收集整理的這篇文章主要介紹了
pygame外星人2
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
---恢復(fù)內(nèi)容開始---
一、game_functions將各個(gè)模塊的功能整合起來,供主文件調(diào)用
1 # -*- coding:utf-8 -*- 2 3 import sys 4 import pygame 5 from bullets import Bullet 6 from alien import Alien 7 from pygame.sprite import Sprite 8 import time 9 10 11 12 def check_keydown_events(ai_settings, event, screen, ship, bullets): 13 '''響應(yīng)按鍵''' 14 if event.key == pygame.K_RIGHT: 15 '''更新移動(dòng)標(biāo)志''' 16 ship.moving_right = True 17 elif event.key == pygame.K_LEFT: 18 ship.moving_left = True 19 elif event.key == pygame.K_UP: 20 ship.moving_up = True 21 elif event.key == pygame.K_DOWN: 22 ship.moving_down = True 23 elif event.key == pygame.K_SPACE: 24 '''創(chuàng)建一個(gè)子彈,并將其加入到編組中,若未消失子彈數(shù)目小于設(shè)定值則發(fā)射''' 25 fire_bullets(ai_settings, bullets, screen, ship) 26 elif event.key == pygame.K_q: 27 sys.exit() 28 29 30 def check_keyup_events(event, ship): 31 '''響應(yīng)松開按鍵''' 32 if event.key == pygame.K_RIGHT: 33 ship.moving_right = False 34 elif event.key == pygame.K_LEFT: 35 ship.moving_left = False 36 elif event.key == pygame.K_UP: 37 ship.moving_up = False 38 elif event.key == pygame.K_DOWN: 39 ship.moving_down = False 40 41 42 def check_events(ai_settings, screen, ship, bullets, stats, play_button, aliens, sb): 43 '''響應(yīng)按鍵以及鼠標(biāo)事件''' 44 for event in pygame.event.get(): 45 if event.type == pygame.KEYDOWN: # 對于每個(gè)按鍵注冊為KEYDOEWN事件并判斷其類型 46 check_keydown_events(ai_settings, event, screen, ship, bullets) 47 elif event.type == pygame.KEYUP: 48 check_keyup_events(event, ship) 49 elif event.type == pygame.MOUSEBUTTONDOWN: 50 mouse_x, mouse_y = pygame.mouse.get_pos() 51 check_play_button(stats, play_button, mouse_x, mouse_y, ai_settings, screen, ship, aliens, bullets, sb) 52 53 54 def check_play_button(stats, play_button, mouse_x, mouse_y, ai_settings, screen, ship, aliens, bullets, sb): 55 '''在玩家單擊play按鈕且此時(shí)游戲狀態(tài)為False時(shí)才開始游戲''' 56 button_clicked = play_button.rect.collidepoint(mouse_x, mouse_y) 57 if button_clicked and not stats.game_active: 58 '''重置游戲設(shè)置''' 59 ai_settings.initialize_dynamic_settings() 60 61 '''隱藏光標(biāo)''' 62 pygame.mouse.set_visible(False) 63 64 '''重置游戲統(tǒng)計(jì)信息''' 65 stats.reset_stats() 66 stats.game_active = True 67 68 '''在點(diǎn)擊play按鈕之后清空外星人和子彈''' 69 aliens.empty() 70 bullets.empty() 71 72 '''重置記分牌圖像''' 73 sb.prep_score() 74 sb.prep_level() 75 sb.prep_ships() 76 77 '''創(chuàng)建新外星人,并將飛船居中''' 78 create_fleet(ai_settings, screen, ship, aliens) 79 ship.center_ship() 80 81 82 def fire_bullets(ai_settings, bullets, screen, ship): 83 if len(bullets) <= ai_settings.bullet_allowed: 84 new_bullet = Bullet(ai_settings, screen, ship) 85 bullets.add(new_bullet) 86 87 88 def update_screen(ai_settings, stats, screen, ship, aliens, bullets, play_button, sb): 89 '''更新屏幕上的圖像,并切換到新屏幕''' 90 screen.fill(ai_settings.bg_color) 91 92 '''在飛船和外星人后面繪制所有子彈''' 93 for bullet in bullets.sprites(): 94 bullet.draw_bullet() 95 ship.blitme() 96 aliens.draw(screen) 97 98 '''顯示得分''' 99 sb.show_score() 100 101 '''在游戲非活動(dòng)狀態(tài)時(shí)顯示play按鈕''' 102 if not stats.game_active: 103 play_button.draw_button() 104 105 '''讓最近的屏幕可見''' 106 pygame.display.flip() 107 108 109 def update_bullets(ai_settings, screen, ship, bullets, aliens, stats, sb): 110 '''更新子彈位置,并刪除消失的子彈''' 111 bullets.update() # 更新子彈位置 112 113 '''刪除消失的子彈''' 114 for bullet in bullets.copy(): 115 if bullet.rect.bottom <= 0: 116 bullets.remove(bullet) 117 118 check_bullet_alien_collisions(ai_settings, screen, ship, bullets, aliens, stats, sb) 119 120 121 def check_bullet_alien_collisions(ai_settings, screen, ship, bullets, aliens, stats, sb): 122 '''檢查是否有子彈與外星人碰撞,如果碰撞,則刪除響應(yīng)的外星人和子彈''' 123 collisions = pygame.sprite.groupcollide(bullets, aliens, True, True) 124 125 '''子彈撞到外星人時(shí)加分并更新圖像,且將每個(gè)被消滅的外星人都計(jì)入分?jǐn)?shù)''' 126 '''字典collisions中,與外星人碰撞的子彈是鍵,其值為被子彈擊中的外星人,遍歷collisions中的值,將其中的每個(gè)外星人的分 127 數(shù)都記上''' 128 if collisions: 129 for aliens in collisions.values(): 130 stats.score += ai_settings.alien_points * len(aliens) 131 sb.prep_score() 132 check_highest_score(stats, sb) 133 134 if len(aliens) == 0: 135 '''刪除現(xiàn)有的子彈并新建一批外星人''' 136 bullets.empty() 137 ai_settings.increase_speed() 138 139 '''提升等級(jí)''' 140 stats.level += 1 141 sb.prep_level() 142 143 create_fleet(ai_settings, screen, ship, aliens) 144 145 146 def get_number_aliens_x(ai_settings, alien_width): 147 '''計(jì)算每一行可以容納多少個(gè)外星人''' 148 available_space_x = ai_settings.screen_width - 2 * alien_width 149 number_aliens_x = int(available_space_x / (2 * alien_width)) 150 return number_aliens_x 151 152 153 def create_alien(ai_settings, screen, aliens, alien_number, row_number ): 154 alien = Alien(ai_settings, screen) 155 alien_width = alien.rect.width 156 alien.x = alien_width + 2 * alien_width * alien_number 157 alien.rect.x = alien.x 158 alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number 159 aliens.add(alien) 160 161 162 def get_number_rows(ai_settings, ship_height, alien_height): 163 '''計(jì)算屏幕上能容納多少行外星人''' 164 available_y = (ai_settings.screen_height - (3 * alien_height) - ship_height) 165 number_rows = int(available_y/(2 * alien_height)) 166 return number_rows 167 168 169 def create_fleet(ai_settings, screen, ship, aliens): 170 '''創(chuàng)建外星人群''' 171 '''創(chuàng)建一個(gè)外星人,并計(jì)算每行能容納多少個(gè)''' 172 '''外星人間距為外星人寬''' 173 alien = Alien(ai_settings, screen) 174 number_aliens_x = get_number_aliens_x(ai_settings, alien.rect.width) 175 number_rows = get_number_rows(ai_settings, ship.rect.height, alien.rect.height) 176 177 178 '''創(chuàng)建第一行外星人''' 179 for row_number in range(number_rows): 180 for alien_number in range(number_aliens_x): 181 '''創(chuàng)建一個(gè)外星人并將其加入當(dāng)前行''' 182 alien = Alien(ai_settings, screen) 183 create_alien(ai_settings, screen, aliens, alien_number, row_number) 184 185 186 def check_fleet_edges(ai_settings, aliens): 187 '''有外星人到達(dá)邊緣時(shí)采取的措施''' 188 for alien in aliens.sprites(): 189 if alien.check_edges(): 190 change_fleet_direction(ai_settings, aliens) 191 break 192 193 194 def change_fleet_direction(ai_settings, aliens): 195 '''將整群外星人下移并改變方向''' 196 for alien in aliens.sprites(): 197 alien.rect.y += ai_settings.fleet_drop_speed 198 ai_settings.fleet_direction *= -1 199 200 201 def ship_hit(ai_settings, stats, screen, ship, aliens, bullets, sb): 202 '''響應(yīng)被外星人撞到的飛船''' 203 if stats.ships_left > 0: 204 '''將ships_left減1''' 205 stats.ships_left -= 1 206 207 '''清空外星人列表和子彈列表''' 208 aliens.empty() 209 bullets.empty() 210 ship.center_ship() 211 sb.prep_ships() 212 213 '''創(chuàng)建一群新的外星人,并把飛船放到屏幕中央''' 214 create_fleet(ai_settings, screen, ship, aliens) 215 216 217 '''暫停一段時(shí)間''' 218 time.sleep(0.5) 219 else: 220 stats.game_active = False 221 pygame.mouse.set_visible(True) 222 223 224 def check_aliens_bottom(ai_settings, stats, screen, ship, aliens, bullets, sb): 225 '''檢查是否有外星人到達(dá)底端''' 226 screen_rect = screen.get_rect() 227 for alien in aliens.sprites(): 228 if alien.rect.bottom >= screen_rect.bottom: 229 '''碰到底部與碰到飛船一樣處理''' 230 ship_hit(ai_settings, stats, screen, ship, aliens, bullets, sb) 231 break 232 233 234 def update_aliens(ai_settings, stats, aliens, ship, screen, bullets, sb): 235 '''更新外星人位置''' 236 check_fleet_edges(ai_settings, aliens) 237 aliens.update() 238 239 '''檢測外星人和飛船之間的碰撞,若為真,則停止游戲''' 240 if pygame.sprite.spritecollide(ship, aliens, True): 241 ship_hit(ai_settings, stats, screen, ship, aliens, bullets, sb) 242 243 '''檢查外星人是否到達(dá)屏幕底端''' 244 check_aliens_bottom(ai_settings, stats, screen, ship, aliens, bullets, sb) 245 246 247 def check_highest_score(stats, sb): 248 '''檢測是否產(chǎn)生了最高分''' 249 if stats.score > stats.highest_score: 250 stats.highest_score = stats.score 251 sb.prep_highest_score()二、記分板
1 # -*- coding:utf-8 -*- 2 3 class GameStats(): 4 '''跟蹤游戲的統(tǒng)計(jì)信息''' 5 6 def __init__(self, ai_settings): 7 '''初始化統(tǒng)計(jì)信息''' 8 self.ai_settings = ai_settings 9 self.reset_stats() 10 self.game_active = False 11 12 '''在任何情況下都不重置游戲最高得分''' 13 self.highest_score = 0 14 15 16 def reset_stats(self): 17 '''初始化在游戲運(yùn)行期間可能變化的統(tǒng)計(jì)信息''' 18 self.ships_left = self.ai_settings.ship_limit 19 self.score = 0 20 self.level = 1?三、設(shè)置游戲按鈕
1 # -*- coding:utf-8 -*- 2 3 import pygame.font 4 5 class Button(): 6 7 def __init__(self, ai_settings, screen, msg): 8 '''初始化按鈕的屬性''' 9 self.screen = screen 10 self.screen_rect = screen.get_rect() 11 12 '''設(shè)置按鈕的其他屬性''' 13 self.width, self.height = 200, 50 14 self.button_color = (0, 255, 0) 15 self.text_color = (255, 255, 255) 16 self.font = pygame.font.SysFont(None, 48) 17 18 '''創(chuàng)建按鈕的rect對象,并使其居中''' 19 self.rect = pygame.Rect(0, 0 , self.width, self.height) 20 self.rect.center = self.screen_rect.center 21 22 '''將字符串渲染成圖片''' 23 self.prep_msg(msg) 24 25 def prep_msg(self, msg): 26 '''將msg渲染為圖像,并使其在按鈕上居中''' 27 self.msg_image = self.font.render(msg, True, self.text_color, self.button_color) 28 self.msg_image_rect = self.msg_image.get_rect() 29 self.msg_image_rect.center = self.rect.center 30 31 def draw_button(self): 32 '''繪制一個(gè)用背景顏色填充的按鈕,然后繪制文本圖像''' 33 pygame.draw.rect(self.screen, self.button_color, self.rect) 34 self.screen.blit(self.msg_image, self.msg_image_rect)?
游戲可能是復(fù)雜的,但分別編寫其中的一些模塊,會(huì)使得整個(gè)問題變得簡單。
轉(zhuǎn)載于:https://www.cnblogs.com/czmiracle/p/11426526.html
總結(jié)
以上是生活随笔為你收集整理的pygame外星人2的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pygame外星人
- 下一篇: sonarqube执行命令遇上的小问题