導語
三月疫情原因,很多地方都封閉式管理了!
在回家無聊的打醬油,小編今天給大伙帶來了一波小游戲——全民左右飛機大戰!在這個快熬
不下去的日子里,打打飛機消遣閑暇時間,也是蠻愜意的,這幾天小編必須全身心投入到飛機
大戰中來!肝了幾天這款小游戲終于面市啦!
??
正文這次的游戲操作很簡單,就是左右移動飛機,躲避敵人飛機,打落敵機會隨機掉落金幣,我們
要打擊的敵人!每個玩家有五條命,被敵機撞到即掛掉一條命,所以要珍惜生命喲!這款是升
級版本的飛機大戰哦~還有更多不同的飛機類型等你來探索,看看你能闖過多少關吧!
小編才闖到第二個飛機,相信你肯定會超過我滴!來試試呀~
一、環境安裝
1)各種素材(圖片、字體等)
2)運行環境
小編使用的環境:Python3、Pycharm社區版、Pygame模塊部分自帶。
模塊安裝:pip install -i https://pypi.douban.com/simple/ pygame
二、代碼展示
1)文章思路
Plane 打飛機小游戲 ——
游戲說明: * 目前只做了一個關卡,有三種敵機,自己飛機的子彈類型有四種 * 在游戲中空格鍵
是暫停,游戲結束后ESC鍵是重新開始 * 暫時沒有加入音效 * 游戲窗口尺寸為512*768
關卡內元素介紹 ——
1. ENEMY_RED:紅色小敵機,數量多,出現頻率高,擊落后有機率出現錢幣,可以加分。
2. ENEMY_BLUE:藍色中型敵機,出現頻率低,需要多顆子彈擊落,擊落后有機率出現星
星,可以加強火力 。
3. ENEMY_BOSS:綠色大型敵機,出現頻率低,可以發射子彈,需要很多顆子彈擊落,擊落后
得分較高 。
4. BULLET_BOSS: 綠色大型敵機發射的子彈
5. OWN: 自己的飛機 6. OWN_BULLET: 自己飛機發射的子彈
系統文件——
【start.py】:開始游戲的主文件 -
【level_01.py】:游戲第一關 - 【sprites.py】:建立游戲精靈類文件
【initialize.py】:系統設置文件,包含各種游戲基本元素的設定值 - .fonts\...:游戲使用的
字體 - .images\...:游戲使用的圖像文件 - .screenshot...:游戲畫面截屏 ## 游戲畫面
截屏 * 游戲載入圖片 ![游戲載入]
2)附代碼講解
配置的文件、窗口、圖片等設置。
import pygameSCREEN_RECT = pygame.Rect(0, 0, 512, 768) # 用一個常量來存儲屏幕的位置和大小,常量用全大寫表示SCREEN_CENTER = [SCREEN_RECT.width/2, SCREEN_RECT.height/2]CREATE_ENEMY_EVENT = pygame.USEREVENT # 敵機事件定時器常量值OWN_FIRE_EVENT = pygame.USEREVENT + 1 # 發射子彈定時器常量值BONUS_ENEMY_EVENT = pygame.USEREVENT + 2 # 加分敵機的定時器常量值STAR_ENEMY_EVENT = pygame.USEREVENT + 3 # 星星敵機的定時器常量值BOSS_ENEMY_EVENT = pygame.USEREVENT + 4 # BOSS敵機的定時器常量值BULLET_BOSS_EVENT = pygame.USEREVENT + 5 # BOSS敵機的子彈定時器常量值ENEMY_TIMER = 600 # 敵機出現的時間頻率BULLET_TIMER = 400 # 子彈出現的時間頻率BONUS_TIMER = 5000 # 加分敵機出現的時間頻率START_TIMER = 20000 # 星星敵機出現的時間頻率BOSS_TIMER = 120000 # BOSS敵機出現的時間頻率BULLET_BOSS_TIMER = 1500 # BOSS敵機子彈出現的時間頻率LIFE_NUMS = 5 # 生命值MOVE_SPEED = 5 # 已方飛機移動速度STAR_ENEMY_LIFE = 6 # 打掉星星敵機需要的子彈BOSS_ENEMY_LIFE = 100 # 打掉BOSS敵機需要的子彈BACKGROUND = r'.imagesackground.png'GAME_OVER = r'.imagesgameover.png'OWN_IMAGE = r'.imagesown.png'OWN_DOWN_IMAGE = r'.imagesown_died.png'ENEMY_RED_IMAGE = r'.imagenemy_red.png'ENEMY_BLUE_IMAGE = r'.imagenemy_blue.png'ENEMY_DOWN_IMAGE = r'.imagenemy_down.png'BULLET_IMAGE = r'.imagesullet.png'BULLET_BOSS_IMAGE = r'.imagesullet_boss.png'LIFE_IMAGE = r'.imageslife.png'GOLD_COIN_IMAGE = r'.imagesonus.png'STAR_IMAGE = r'.imagesstar.png'READY_IMAGE = r'.imageady.png'BOSS_IMAGE = r'.imagesoss.png'LOGO_IMAGE = r'.imageslogo.ico'SYS_FONT = r'.fontsBOLDER.ttf'GAME_NAME = '小飛機'FPS = 60 # 屏幕刷新頻率
3)主程序
import threadingfrom sprites import *from initialize import *# noinspection PyPep8Naming# 主游戲類class PlaneGame(object): def __init__(lf): lf.score = 0 lf.bullet_grade = 1 # 初始的子彈等級 lf.boss_flag = 0 # 判斷BOSS是否出現 lf.ready_time = pygame.time.get_ticks() # 用來控制顯示ready畫面的時鐘 lf.star_enemy_life = STAR_ENEMY_LIFE # 星星敵機需要幾顆子彈 lf.boss_enemy_life = BOSS_ENEMY_LIFE # BOSS敵機需要幾顆子彈 lf.bullet_type = {1: 'One', 2: 'Two', 3: 'Three', 4: 'Four'} lf.screen = pygame.display.t_mode(SCREEN_RECT.size) logo = pygame.image.load(LOGO_IMAGE) # 設置游戲窗口圖標 pygame.display.t_icon(logo) pygame.display.t_caption(GAME_NAME) # 設置游戲窗口名稱 lf.clock = pygame.time.Clock() # 創建游戲時鐘 lf.__createSprite() # 調用私有方法, 創建精靈和組 pygame.time.t_timer(CREATE_ENEMY_EVENT, ENEMY_TIMER) # 設置定時器事件 pygame.time.t_timer(OWN_FIRE_EVENT, BULLET_TIMER) pygame.time.t_timer(BONUS_ENEMY_EVENT, BONUS_TIMER) pygame.time.t_timer(STAR_ENEMY_EVENT, START_TIMER) pygame.time.t_timer(BOSS_ENEMY_EVENT, BOSS_TIMER) pygame.time.t_timer(BULLET_BOSS_EVENT, BULLET_BOSS_TIMER) lf.life_num = LIFE_NUMS def __createSprite(lf): """ 私有方法,創建精靈和組 """ bg1 = BackGround(BACKGROUND) # 創建背景和組 bg2 = BackGround(BACKGROUND) bg2.rect.y = -bg2.rect.height # ??? lf.back_group = pygame.sprite.Group(bg1, bg2) lf.ready_go_group = pygame.sprite.Group() # 創建ready組 lf.ready_go_group.add(ReadyGo()) lf.enemy_red_group = pygame.sprite.Group() # 創建紅色敵機組 lf.enemy_down_group = pygame.sprite.Group() # 創建被擊中敵機組 lf.bonus_enemy_group = pygame.sprite.Group() # 創建加分敵機組 lf.gold_coin_group = pygame.sprite.Group() # 創建金幣組 lf.star_enemy_group = pygame.sprite.Group() # 創建星星敵機組 lf.boss_enemy = EnemyBoss() # ??? lf.boss_enemy_group = pygame.sprite.Group() # 創建BOSS敵機組 lf.bullet_boss_group = pygame.sprite.Group() # 創建BOSS子彈組 lf.star_coin_group = pygame.sprite.Group() # 創建星星組 lf.own_died_group = pygame.sprite.Group() # 創建自己死亡飛機的組 lf.__retOwn() # 創建自己的飛機和組 def start(lf): """ 游戲開始 """ while True: lf.clock.tick(FPS) # 刷新幀率 lf.__eventHandler() # 事件監聽 lf.__checkCollide() # 碰撞檢測 lf.__updateSprites() # 更新/繪制畫面 pygame.display.update() # 更新屏幕顯示 lf.__gameOver() # 游戲結束 def __eventHandler(lf): """ 事件監聽(監聽定時器常量) """ for event in pygame.event.get(): if event.type == pygame.QUIT: # 判斷是否退出游戲 PlaneGame.quit() elif event.type == CREATE_ENEMY_EVENT: # 當事件值等于CREATE_ENEMY_EVENT時,將敵機精靈添加到組 enemy = EnemyRed() lf.enemy_red_group.add(enemy) elif event.type == BONUS_ENEMY_EVENT: # 當事件值等于BONUS_ENEMY_EVENT時,將加分敵機加入到組 bonus_enemy = EnemyRed() lf.bonus_enemy_group.add(bonus_enemy) elif event.type == STAR_ENEMY_EVENT: # 當事件值等于STAR_ENEMY_EVENT時,將星星敵機加入到組 lf.star_enemy_life = STAR_ENEMY_LIFE # 賦予新的星星敵機生命值 star_enemy = EnemyBlue() lf.star_enemy_group.add(star_enemy) elif event.type == BOSS_ENEMY_EVENT: # 當事件值等于BOSS_ENEMY_EVENT時,將BOSS敵機加入到組 lf.boss_enemy_life = BOSS_ENEMY_LIFE # 賦予新的BOSS敵機生命值 lf.boss_enemy = EnemyBoss() # ???? lf.boss_enemy_group.add(lf.boss_enemy) lf.boss_flag = 1 # 修改BOSS出現的flag elif event.type == OWN_FIRE_EVENT: # 當事件值等于OWN_FIRE_EVENT時,按子彈等級開火 for n in lf.bullet_type: grade = 4 if lf.bullet_grade > 4 el lf.bullet_grade if grade == n: exec('lf.own.fire{}()'.format(lf.bullet_type[n])) if lf.boss_flag == 1: # 如果BOSS出現,則發射子彈 if event.type == BULLET_BOSS_EVENT: lf.boss_enemy.fire() keys_presd = pygame.key.get_presd() # 使用鍵盤提供的方法獲取按鍵, 得到一個按鍵元組 if keys_presd[pygame.K_RIGHT]: # 按右方向鍵時向右移動,水平速度為4 lf.own.speed_y = 0 # 同時將垂直方向的速度變為0 lf.own.speed_x = MOVE_SPEED elif keys_presd[pygame.K_LEFT]: # 按左方向鍵時向右移動,水平速度為4 lf.own.speed_y = 0 lf.own.speed_x = -MOVE_SPEED elif keys_presd[pygame.K_UP]: # 按上方向鍵時向右移動,垂直速度為-4 lf.own.speed_x = 0 # 同時將水平方向的速度變為0 lf.own.speed_y = -MOVE_SPEED elif keys_presd[pygame.K_DOWN]: # 按下方向鍵時向右移動,垂直速度為4 lf.own.speed_x = 0 lf.own.speed_y = MOVE_SPEED elif keys_presd[pygame.K_SPACE]: # 按空格鍵時暫停游戲 lf.__gamePau(True) el: # 按其他鍵或不按時不移動 lf.own.speed_x = 0 lf.own.speed_y = 0 def __checkCollide(lf): """ 碰撞檢測 """ # 當子彈和敵機碰撞,敵機爆炸,得分加1,groupcollide()是精靈基類中的方法,返回一個字典,子彈是鍵,敵機是值 killers = pygame.sprite.groupcollide(lf.own.bullets, lf.enemy_red_group, True, True) # 子彈摧毀敵機 if len(killers) > 0: # 如果返回值長度大于0時,得分加1 lf.score += 1 enemy_down = SpriteDown(ENEMY_DOWN_IMAGE, list(killers.keys())[0].rect, 0) # 取出碰撞字典中的鍵用來定位顯示爆炸 lf.enemy_down_group.add(enemy_down) # 當敵機和已機碰撞,飛機數量減1,1秒后重新顯示一架飛機 died_1 = pygame.sprite.groupcollide(lf.enemy_red_group, lf.own_group, True, True) # 敵機撞毀自己飛機 died_2 = pygame.sprite.groupcollide(lf.bonus_enemy_group, lf.own_group, True, True) # 加分敵機撞毀自己飛機 died_3 = pygame.sprite.groupcollide(lf.star_enemy_group, lf.own_group, True, True) # 星星敵機撞毀自己飛機 died_4 = pygame.sprite.groupcollide(lf.boss_enemy.bullets, lf.own_group, True, True) # BOSS敵機子彈擊毀已機 died_5 = pygame.sprite.groupcollide(lf.boss_enemy_group, lf.own_group, True, True) # BOSS敵機撞毀已機 died_owns = {**died_1, **died_2, **died_3, **died_4, **died_5} # 合并字典 if len(died_owns) > 0: # 列表有內容代表發生碰撞了 lf.life_num -= 1 # 飛機數量減1 own_died = SpriteDown(OWN_DOWN_IMAGE, list(died_owns.keys())[0].rect, 0) lf.own_died_group.add(own_died) lf.s = threading.Timer(1, lf.__retOwn) # 設置一個多線程定時調用函數,1秒后開始執行 lf.s.start() # 當子彈和加分敵機碰撞,出現金幣繼續下落 bonus_enemies = pygame.sprite.groupcollide(lf.own.bullets, lf.bonus_enemy_group, True, True) if len(bonus_enemies) > 0: lf.score += 1 gold_coin = SpriteDown(GOLD_COIN_IMAGE, list(bonus_enemies.keys())[0].rect, 1) lf.gold_coin_group.add(gold_coin) # 當已機和硬幣碰撞,得分+5,金幣消失 gold = pygame.sprite.groupcollide(lf.gold_coin_group, lf.own_group, True, Fal) if len(gold) > 0: lf.score += 5 # 當子彈和星星敵機碰撞,子彈消失,超過n顆子彈后出現星星繼續下落 if lf.star_enemy_life <= 0: star_enemy = pygame.sprite.groupcollide(lf.own.bullets, lf.star_enemy_group, True, True) if len(star_enemy) > 0: lf.score += 5 star_coin = SpriteDown(STAR_IMAGE, list(star_enemy.keys())[0].rect, 1) lf.star_coin_group.add(star_coin) el: star_enemies = pygame.sprite.groupcollide(lf.own.bullets, lf.star_enemy_group, True, Fal) if len(star_enemies) > 0: lf.star_enemy_life -= 1 # 當子彈和BOSS敵機碰撞,子彈消失,超過n顆子彈后BOSS敵機爆炸 if lf.boss_enemy_life <= 0: boss_enemy = pygame.sprite.groupcollide(lf.own.bullets, lf.boss_enemy_group, True, True) if len(boss_enemy) > 0: lf.score += 300 enemy_down = SpriteDown(ENEMY_DOWN_IMAGE, list(boss_enemy.keys())[0].rect, 1) lf.enemy_down_group.add(enemy_down) lf.boss_flag = 0 el: boss_enemies = pygame.sprite.groupcollide(lf.own.bullets, lf.boss_enemy_group, True, Fal) if len(boss_enemies) > 0: lf.boss_enemy_life -= 1 # 當已機和星星碰撞,得分+10,子彈等級+1 star = pygame.sprite.groupcollide(lf.star_coin_group, lf.own_group, True, Fal) if len(star) > 0: lf.score += 10 lf.bullet_grade += 1 def __retOwn(lf): """ 自己飛機重生 """ lf.own = Own() # 創建自己的飛機精靈和精靈組 lf.own_group = pygame.sprite.Group(lf.own) lf.bullet_grade = 1 # 初始的子彈等級 def __infoDisplay(lf, text, pos, angle): """ -- 顯示游戲信息 :param text: 文字內容 :param pos: 位置[x, y] :param angle: 用來定位的角 :return: """ score_font = pygame.font.Font(SYS_FONT, 24) score_text = score_font.render(text, True, (255, 255, 255)) text_rect = score_text.get_rect() exec('text_rect.{}={}'.format(angle, pos)) lf.screen.blit(score_text, text_rect) def __updateSprites(lf): """ 更新/繪制精靈組 """ lf.back_group.update() lf.back_group.draw(lf.screen) lf.__infoDisplay('score ' + str(lf.score), [20, 10], 'topleft') lf.__infoDisplay('level 01', [492, 10], 'topright') lf.__infoDisplay('life ' + str(lf.life_num), [230, 10], 'topleft') if pygame.time.get_ticks() < lf.ready_time + 3000: # 顯示ready畫面3秒 lf.ready_go_group.update() lf.ready_go_group.draw(lf.screen) if pygame.time.get_ticks() > lf.ready_time + 4000: # ready畫面1秒后開始顯示游戲元素 lf.enemy_red_group.update() lf.enemy_red_group.draw(lf.screen) # 顯示敵機 lf.bonus_enemy_group.update() lf.bonus_enemy_group.draw(lf.screen) # 顯示加分敵機 lf.star_enemy_group.update() lf.star_enemy_group.draw(lf.screen) # 顯示星星敵機 lf.boss_enemy_group.update() lf.boss_enemy_group.draw(lf.screen) # 顯示BOSS敵機 lf.enemy_down_group.update() lf.enemy_down_group.draw(lf.screen) # 顯示敵機爆炸 lf.own.bullets.update() lf.own.bullets.draw(lf.screen) # 顯示已方子彈 lf.boss_enemy.bullets.update() lf.boss_enemy.bullets.draw(lf.screen) # 顯示BOSS子彈 lf.own_died_group.update() lf.own_died_group.draw(lf.screen) # 顯示已方飛機爆炸 lf.gold_coin_group.update() lf.gold_coin_group.draw(lf.screen) # 顯示金幣 lf.star_coin_group.update() lf.star_coin_group.draw(lf.screen) # 顯示星星 lf.own_group.update() lf.own_group.draw(lf.screen) # 顯示已方飛機 def __gamePau(lf, pau=Fal): """ 暫停游戲, 按任意鍵退出""" lf.__infoDisplay('Any key to continue...', SCREEN_CENTER, 'center') pygame.display.update() # 更新屏幕顯示 while pau: for event in pygame.event.get(): if event.type == pygame.QUIT: PlaneGame.quit() elif event.type == pygame.KEYDOWN: pau = Fal def __gameOver(lf): """ 游戲結束,按ESC重新開始 """ if lf.life_num == 0: # 如果飛機數量為0,退出游戲 game_over = pygame.image.load(GAME_OVER) # 顯示GAMEOVER圖片 lf.screen.blit(game_over, (50, 150)) lf.__infoDisplay('press ESC play again...', SCREEN_CENTER, 'center') pygame.display.update() # 更新屏幕顯示 flag = True while flag: for event in pygame.event.get(): if event.type == pygame.QUIT: PlaneGame.quit() elif event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: # 按SPACE重新開始游戲 flag = Fal PlaneGame().start() @staticmethod def quit(): """ 靜態函數,退出游戲 """ pygame.quit() exit()
三、效果展示
1)游戲界面
?2)運行游戲
3)金幣掉落
4)游戲結束
總結嘻嘻!打掉藍色戰機加星星之后玩起來特別爽的哦~以上沒截圖,大家可以自己試試的啦!
文章寫到這里結束,需要源碼滴私信小編06即可免費領取啦!
往期還有更多好玩兒的源碼等你來領取哦~
本文發布于:2023-02-28 21:04:00,感謝您對本站的認可!
本文鏈接:http://www.newhan.cn/zhishi/a/167772150998032.html
版權聲明:本站內容均來自互聯網,僅供演示用,請勿用于商業和其他非法用途。如果侵犯了您的權益請與我們聯系,我們將在24小時內刪除。
本文word下載地址:全民飛機大戰刷金幣(全民飛機大戰刷金幣軟件).doc
本文 PDF 下載地址:全民飛機大戰刷金幣(全民飛機大戰刷金幣軟件).pdf
| 留言與評論(共有 0 條評論) |