Python+Pygame實戰之實現小蜜蜂歷險記遊戲
導語
親愛的小可愛們,大傢好! 歡迎來到木子的遊戲編程空間
經常聽到有朋友說,學習編程是一件非常枯燥無味的事情。其實,大傢有沒有認真想過,可能是我們的學習方法不對?
比方說,你有沒有想過,可以通過打遊戲來學編程?
今天又又又更新一款新遊戲給大傢啦,期待不期待呀?教大傢如何通過邊打遊戲邊學編程!準備好瞭嗎?我們即將開始激動人心的遊戲編程之旅。
或許你之前學習過一點編程,但若是你從沒接觸過遊戲編程,那麼你仍然會對遊戲程序的運行感到不解。遊戲程序不像計算一個公式或謎題,得到答案之後程序就結束瞭,遊戲程序一直是處於運行中的,隻要你不主動退出,那麼你可以永遠呆在遊戲之中。這就遊戲循環的神奇魔力。下面我們進入今天的主題——制作一款《小蜜蜂歷險記》小遊戲!
一、運行環境
小編使用的環境:Python3、Pycharm社區版、Pygame模塊部分自帶就不一一 展示啦。
模塊安裝:pip install -i https://pypi.douban.com/simple/ +pygame
二、素材(圖片等)
圖片的話可以自己準備,但是要註意的大小尺寸問題還有圖片是.png模式的哈。
三、代碼展示
這款小遊戲主要分為兩大塊代碼:plame_sprites.py、主程序plane_main.py。
1)plame_sprites.py(屏幕的大小、背景、敵機等類的設置)
import random import pygame # 屏幕大小的常量 SCREEN_RECT = pygame.Rect(0, 0, 480, 650) # 刷新的幀率 FRAME_PER_SEC = 60 # 創建敵機定時器常量 CREATE_ENEMY_EVENT = pygame.USEREVENT # 創建子彈定時器常量 HERO_FIRE_EVENT = pygame.USEREVENT + 1 class GrameSprite(pygame.sprite.Sprite): """"飛機大戰遊戲精靈類""" def __init__(self, image_name, speed=1,speed1=1): # 調用父類方法 super().__init__() pygame.image.load(image_name).convert_alpha() self.image = pygame.image.load(image_name).convert_alpha() self.rect = self.image.get_rect() self.speed = speed self.speed1=speed1 def update(self): self.rect.y += self.speed class Background(GrameSprite): """背景類""" def __init__(self, is_flag=False): super().__init__('./images/background1.jpeg') if is_flag: self.rect.y = -self.rect.height def update(self): super().update() if self.rect.y >= SCREEN_RECT.height: self.rect.y = -SCREEN_RECT.height class Enemy(GrameSprite): """"敵機類""" def __init__(self): super().__init__('./images/enemy0.png') self.speed = random.randint(2, 3) max_x = SCREEN_RECT.width - self.rect.width self.rect.x = random.randint(0, max_x) self.rect.bottom = 0 def __del__(self): # print('敵機掛瞭%s' % self.rect) pass def update(self): super().update() if self.rect.y >= SCREEN_RECT.height: # kill方法可以將精靈從精靈組中移除,精靈就會被銷毀 self.kill() class Hero(GrameSprite): """英雄類""" def __init__(self): super().__init__('./images/hero1.png', 0) self.rect.centerx = SCREEN_RECT.centerx self.rect.bottom = SCREEN_RECT.bottom - 120 # 創建子彈精靈組 self.bullet_group = pygame.sprite.Group() def update(self): self.rect.x += self.speed self.rect.y += self.speed1 if self.rect.x < 0: self.rect.x = 0 elif self.rect.right > SCREEN_RECT.right: self.rect.right = SCREEN_RECT.right if self.rect.y>SCREEN_RECT.height: self.rect.bottom=SCREEN_RECT.height elif self.rect.y<0: self.rect.bottom=0 def fire(self): bullet = Bullet() bullet.rect.bottom = self.rect.y - 20 bullet.rect.centerx = self.rect.centerx self.bullet_group.add(bullet) class Bullet(GrameSprite): """子彈類""" def __init__(self): super().__init__('./images/new_arrow.png', -4) def __del__(self): pass # print('子彈銷毀') def update(self): super().update() if self.rect.bottom < 0: self.kill()
2)主程序plane_main.py
import pygame from plame_sprites import * class PlaneGame(object): def __init__(self): # 1.創建遊戲窗口 self.screen = pygame.display.set_mode(SCREEN_RECT.size) # 2.創建時鐘對象 self.clock = pygame.time.Clock() # 3.創建精靈組 self.__create_speites() # 4.設置定時器 pygame.time.set_timer(CREATE_ENEMY_EVENT, 1000) pygame.time.set_timer(HERO_FIRE_EVENT, 500) def __create_speites(self): bg1 = Background() bg2 = Background(True) self.back_group = pygame.sprite.Group(bg1, bg2) # 創建敵機精靈組 self.enemy_group = pygame.sprite.Group() # 創建英雄 self.hero = Hero() self.hero_group = pygame.sprite.Group( self.hero ) def __event_handler(self): for event in pygame.event.get(): # 退出 if event.type == pygame.QUIT: PlaneGame.__game_over() # 判斷事件是不是定時器 elif event.type == CREATE_ENEMY_EVENT: enemy = Enemy() self.enemy_group.add(enemy) if event.type==pygame.KEYDOWN: if event.key==pygame.K_SPACE: self.hero.fire() # elif event.type == pygame.KEYDOWN and event.key == pygame.K_RIGHT: # print('按下向右') # 獲取按下的鍵盤被按下的鍵 keys_pressd = pygame.key.get_pressed() # 判斷用戶按下的方向 if keys_pressd[pygame.K_RIGHT]: self.hero.speed = 3 elif keys_pressd[pygame.K_LEFT]: self.hero.speed = -3 elif keys_pressd[pygame.K_UP]: self.hero.speed1 =-3 elif keys_pressd[pygame.K_DOWN]: self.hero.speed1 = 3 else: self.hero.speed = 0 self.hero.speed1=0 def __check_collide(self): # 子彈打飛機 pygame.sprite.groupcollide(self.hero.bullet_group,self.enemy_group,True,True) # 敵機撞英雄 enemies = pygame.sprite.spritecollide(self.hero,self.enemy_group,True) if len(enemies) > 0: self.hero.kill() # 清空所有的子彈 精靈組的 子彈 # self.hero.bullet_group.empty() # 停止在事件隊列上重復創建子彈事件 # pygame.time.set_timer(HERO_FIRE_EVENT, 0) # Restart = pygame.image.load('./images/restart_sel.png') # self.screen.blit(Restart, (0, 0)) # pygame.display.update() PlaneGame.__game_over() def __update_sprites(self): # 精靈組 更新精靈的位置 self.back_group.update() self.enemy_group.update() self.hero_group.update() self.hero.bullet_group.update() # 繪制所有得精靈 self.back_group.draw(self.screen) self.enemy_group.draw(self.screen) self.hero_group.draw(self.screen) self.hero.bullet_group.draw(self.screen) @staticmethod def __game_over(): pygame.quit() exit() def start_game(self): while True: # 1.設置刷新幀率 self.clock.tick(FRAME_PER_SEC) # 2.事件監聽 self.__event_handler() # 3.碰撞檢測 self.__check_collide() # 4.更新/繪制精靈組 self.__update_sprites() # 5.更新顯示 pygame.display.update() if __name__ == '__main__': game = PlaneGame() game.start_game()
四、效果展示
圖片背景優化瞭一下子的哈,背景更好看啦~小蜜蜂當然是在花叢中啦!
1)隨機截圖界面
2)擊殺敵人(小瓢蟲)
3)隨機背景截圖
撞擊死亡,上下左右移動方向鍵,空格放箭。
以上就是Python+Pygame實戰之實現小蜜蜂歷險記遊戲的詳細內容,更多關於Python Pygame小蜜蜂歷險記的資料請關註WalkonNet其它相關文章!