小飛機大戰外星人小游戲全部源代碼(硬肝) PS:各模塊名和代碼中需要的圖片放在了文章最后,方便各位學習。

      網友投稿 889 2022-05-29

      import pygame

      from pygame.sprite import Sprite

      class Alien(Sprite) :

      #表示單個外星人的類

      def __init__(self,ai_game):

      #初始化外星人并設置其起始位置。

      super().__init__()

      self.screen = ai_game.screen

      self.settings = ai_game.settings

      #加載外星人圖像并設置其rect屬性

      self.image = pygame.image.load('images/alien.bmp')

      self.rect = self.image.get_rect()

      #每個外星人最初都在屏幕左上角附近

      self.rect.x = self.rect.width

      self.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 True

      def update(self):

      # 向右移動外星人

      self.x += (self.settings.alien_speed * self.settings.fleet_direction )

      self.rect.x = self.x

      import sys

      from time import sleep

      import pygame

      from settings import Settings

      from game_stats import GameStats

      from scoreboard import Scoreboard

      from button import Button

      from ship import Ship

      from bullet import Bullet

      from alien import Alien

      class 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().width

      self.settings.screen_height = self.screen.get_rect().height

      pygame.display.set_caption('Alien Invasion')

      #創建存儲游戲統計信息的實例

      #并創建記分牌

      self.stats = GameStats(self)

      self.sb = Scoreboard(self)

      #設置背景色

      #self.bg_color = (230,230,230) ? ? ?#后續代碼已修改,忽略此處

      self.ship = Ship(self)

      self.bullets = pygame.sprite.Group()

      self.aliens = pygame.sprite.Group()

      self._create_fleet()

      #創建play按鈕

      self.play_button = Button(self , 'Play')

      def run_game(self):

      #開始游戲的主循環

      while True:

      self._check_events() ? ? ? ?# 監視鍵盤和鼠標事件

      if self.stats.game_active:

      self.ship.update()

      self._update_bullets()

      self._update_aliens()

      self._update_screen()

      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 += 1

      self.sb.prep_level()

      #事件是用戶玩游戲時執行的操作,如按鍵或移動鼠標。

      #為程序響應事件,可編寫一個事件循環,以偵聽事件并根據發生的事件類型執行合適的任務

      #下面的for循環就是一個事件循環。

      def _check_events(self): ? ? ? ? ? #為訪問Pygame檢測到的事件,使用函數pygame.event.get()

      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 = True

      self.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_keydown_events(self,event) :

      if event.key == pygame.K_RIGHT :

      self.ship.moving_right = True

      elif event.key == pygame.K_LEFT :

      self.ship.moving_left = True

      elif event.key == pygame.K_UP :

      self.ship.moving_up = True

      elif event.key == pygame.K_DOWN :

      self.ship.moving_down = True

      #添加退出的快捷鍵Q

      elif 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 = False

      if event.key == pygame.K_LEFT:

      self.ship.moving_left = False

      if event.key == pygame.K_UP:

      self.ship.moving_up = False

      if event.key == pygame.K_DOWN:

      self.ship.moving_down = False

      def _fire_bullet(self):

      #創建一顆子彈,并將其加入編組bullets中

      if len(self.bullets) < self.settings.bullets_allowed :

      new_bullet = Bullet(self)

      self.bullets.add(new_bullet)

      def _update_screen(self) : ? ? ? #更新屏幕上的圖像,并切換到新屏幕。

      #每次循環都會重繪屏幕

      self.screen.fill(self.settings.bg_color)

      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()

      def _create_fleet(self):

      #創建外星人群

      #創建一個外星人并且計算一行可容納多少個外星人

      #外星人的間距為外星人寬度

      alien = Alien(self)

      alien_width , alien_height = alien.rect.size

      available_space_x = self.settings.screen_width - (3 * alien_width)

      number_aliens_x = available_space_x // (3 * alien_width)

      #計算屏幕可以容納多少行外星人

      ship_height = self.ship.rect.height

      available_space_y = (self.settings.screen_height - (8 * alien_height ) - ship_height)

      number_rows = available_space_y // (3 * 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.size

      alien.x = alien_width + 2 * alien_width * alien_number

      alien.rect.x = alien.x

      alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number

      self.aliens.add(alien)

      def _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_fleet_edges(self):

      #有外星人到達邊緣時采取相應的措施

      for alien in self.aliens.sprites() :

      if alien.check_edges() :

      self._change_fleet_direction()

      break

      def _change_fleet_direction(self):

      #將整群外星人下移,并改變他們的方向

      for alien in self.aliens.sprites() :

      alien.rect.y += self.settings.fleet_drop_speed

      self.settings.fleet_direction *= -1

      def _ship_hit(self):

      #響應飛船被外星人撞到。

      if self.stats.ship_left > 0 :

      #將ships_left減少1并且更新記分牌

      self.stats.ship_left -= 1

      self.sb.prep_ships()

      #清空余下的外星人和子彈

      self.aliens.empty()

      self.bullets.empty()

      #創建一群新的外星人,并將飛船放到屏幕底端的中央

      self._create_fleet()

      self.ship.center_ship()

      #暫停

      sleep(0.5)

      else :

      self.stats.game_active = False

      pygame.mouse.set_visible(True)

      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()

      break

      if __name__ == '__main__':

      #創建游戲實例并運行游戲。

      ai = AlienInvasion()

      ai.run_game()

      import pygame

      from pygame.sprite import Sprite

      class Bullet(Sprite) :

      #管理飛船所發射子彈的類

      def __init__(self,ai_game):

      #在飛船當前位置創建一個子彈對象。

      super().__init__()

      self.screen = ai_game.screen

      self.settings = ai_game.settings

      self.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.y

      def draw_bullet(self):

      #在屏幕上繪制子彈

      pygame.draw.rect(self.screen,self.color,self.rect)

      import pygame.font

      #讓Pygame能夠將文本渲染到屏幕上

      class Button:

      def __init__(self , ai_game , msg):

      #初始化按鈕屬性

      #msg是要在按鈕中顯示的文本

      self.screen = ai_game.screen

      self.screen_rect = self.screen.get_rect()

      #設置按鈕的尺寸和其他屬性

      self.width , self.height = 200 , 50

      self.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_iamge_rect = self.msg_image.get_rect()

      self.msg_iamge_rect.center = self.rect.center

      def draw_button(self):

      #繪制一個用顏色填充的按鈕,在繪制文本

      #用fill()繪制表示按鈕的矩形

      # 用blit()向其傳遞一幅圖像以及與該圖像相關聯的rect,并在屏幕上繪制文本圖像

      self.screen.fill(self.button_color , self.rect)

      self.screen.blit(self.msg_image , self.msg_iamge_rect)

      class GameStats :

      #跟蹤游戲的統計信息

      def __init__(self, ai_game):

      #初始化統計信息

      self.settings = ai_game.settings

      self.reset_stats()

      #讓游戲一開始處于非活動狀態

      self.game_active = False

      #任何情況下都不應重置最高得分

      self.high_score = 0

      def reset_stats(self):

      #初始化在游戲運行期間可能變化的統計信息

      self.ship_left = self.settings.ship_limit

      #為在每次開始游戲是都重置得分

      self.score = 0

      self.level = 1

      import pygame.font

      from pygame.sprite import Group

      from ship import Ship

      class Scoreboard :

      #顯示得分信息的類

      def __init__(self , ai_game):

      #初始化顯示得分涉及的屬性

      self.ai_game = ai_game

      self.screen = ai_game.screen

      self.screen_rect = self.screen.get_rect()

      self.settings = ai_game.settings

      self.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 = 'SCORE' + ':' + "{:,}".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 - 20

      self.score_rect.top = 20

      def prep_high_score(self):

      #將最高得分轉換為渲染的圖像

      high_score = round(self.stats.high_score , -1)

      high_score_str ='HIGH_SCORE' + ':' + "{:,}".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.centerx

      self.high_score_rect.top = self.score_rect.top

      def prep_level(self):

      # 將等級轉換為渲染的圖像

      level_str = 'LEVEL' + ':' + 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.right

      self.level_rect.top = self.score_rect.bottom + 10

      def prep_ships(self):

      #顯示還余下多少艘飛船

      self.ships = Group()

      for ship_number in range(self.stats.ship_left):

      ship = Ship(self.ai_game)

      ship.rect.x = 10 + ship_number * ship.rect.width

      ship.rect.y = 10

      self.ships.add(ship)

      def 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.score

      self.prep_high_score()

      class Settings:

      #存儲游戲《外星人入侵》中所有設置的類

      def __init__(self):

      #初始化游戲的設置

      #屏幕設置

      self.screen_width = 1200

      self.screen_height = 800

      self.bg_color = (255,255,255)

      小飛機大戰外星人的小游戲的全部源代碼(硬肝) PS:各模塊名和代碼中需要的圖片放在了文章最后,方便各位學習。

      self.bullets_allowed = 3

      #飛船設置

      #self.ship_speed = 1.0

      self.ship_limit = 2

      #子彈設置

      #self.bullet_speed = 1.5

      self.bullet_width = 3

      self.bullet_height = 15

      self.bullet_color = (178,34,34)

      #外星人設置

      #self.alien_speed = 0.6

      self.fleet_drop_speed = 10

      #fleet_direction 為1表示向右移動。為-1表示向左移動

      #self.fleet_direction = 1

      #加快游戲節奏的速度

      self.speedup_scale = 1.28

      #外星人分數的提高速度

      self.score_scale = 1.5

      self.initialize_dynamic_settings()

      def initialize_dynamic_settings(self):

      #初始化隨游戲進行而變化的設置

      self.ship_speed = 1.0

      self.bullet_speed = 1.5

      self.alien_speed = 0.6

      # fleet_direction 為1表示向右移動。為-1表示向左移動

      self.fleet_direction = 1

      #記分

      self.alien_points = 50

      def increase_speed(self):

      #提高速度設置和外星人分數

      self.ship_speed *= self.speedup_scale

      self.bullet_speed *= self.speedup_scale

      self.alien_speed *= self.speedup_scale

      self.alien_points = int(self.alien_points * self.score_scale)

      print(self.alien_points)

      import pygame

      from pygame.sprite import Sprite

      class Ship(Sprite):

      #管理飛船的類

      def __init__(self,ai_game):

      #初始化飛船并設置其初始位置

      super().__init__()

      self.screen = ai_game.screen

      self.settings = ai_game.settings

      self.screen_rect = ai_game.screen.get_rect()

      #加載飛船圖像并獲取其外接矩形。

      self.image = pygame.image.load('images/ship.bmp')

      self.rect = self.image.get_rect()

      #對于每艘新飛船,都將其放在屏幕底部的中央。

      self.rect.midbottom = self.screen_rect.midbottom

      #在飛船的屬性x中存儲小數值

      self.x = float(self.rect.x)

      self.y = float(self.rect.y)

      #移動標志

      self.moving_right = False

      self.moving_left = False

      self.moving_up = False

      self.moving_down = False

      def update(self):

      #根據移動標志調整飛船的位置,并使飛船不會飛出屏幕。

      #更新飛船而不是rect對象的x值

      if self.moving_right and self.rect.right < self.screen_rect.right:

      self.x += self.settings.ship_speed

      if self.moving_left and self.rect.left > 0 :

      self.x -= self.settings.ship_speed

      if self.moving_up and self.rect.top >= 0 :

      self.y -= self.settings.ship_speed

      if self.moving_down and self.rect.bottom < self.settings.screen_height:

      self.y += self.settings.ship_speed

      #根據self.x更新rect對象。

      self.rect.x = self.x

      self.rect.y = self.y

      def blitme(self):

      #在指定位置繪制飛船

      self.screen.blit(self.image,self.rect)

      def center_ship(self):

      #讓飛船在屏幕低端居中

      self.rect.midbottom = self.screen_rect.midbottom

      self.x = float(self.rect.x)

      self.y = float(self.rect.y)

      5G游戲

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:服務端技術進階(四)一篇文讀懂分布式系統本質:高吞吐、高可用、可擴展
      下一篇:公共數據資源開放助力普惠金融
      相關文章
      自拍偷自拍亚洲精品偷一| 国产成人亚洲精品91专区手机| 亚洲性久久久影院| 2020年亚洲天天爽天天噜| 亚洲视频在线一区二区三区| 亚洲AV无码1区2区久久| 亚洲另类激情综合偷自拍| 亚洲av无码专区国产乱码在线观看 | 亚洲中文久久精品无码1| 亚洲国产精品成人精品小说 | 78成人精品电影在线播放日韩精品电影一区亚洲 | 亚洲精品无AMM毛片| 亚洲日本成本人观看| 亚洲AV色欲色欲WWW| 亚洲第一区在线观看| 亚洲国产一区视频| 国产亚洲情侣一区二区无码AV | 国产亚洲精品不卡在线| 在线精品亚洲一区二区三区| 亚洲中文字幕无码永久在线| 亚洲成AV人片在线播放无码| 亚洲男人天堂av| 亚洲国产成人久久| 亚洲中文无码永久免| 噜噜综合亚洲AV中文无码| 亚洲国产成人久久精品99| 不卡一卡二卡三亚洲| 亚洲爆乳无码专区| 亚洲福利视频网站| 亚洲中文无码永久免| 亚洲成a人在线看天堂无码| 久久精品亚洲乱码伦伦中文| 国产亚洲精品岁国产微拍精品| 久久亚洲AV午夜福利精品一区 | 亚洲天堂一区在线| 亚洲欧美日韩国产精品一区| 亚洲Aⅴ无码一区二区二三区软件 亚洲AⅤ视频一区二区三区 | 国产精品亚洲αv天堂无码 | 亚洲精品无码少妇30P| 亚洲精品无码AV中文字幕电影网站 | 亚洲av日韩av高潮潮喷无码|