python语言实现飞机大战
第一步:pygame的安裝
同時按下win+R打開運行
Enter打開命令提示符,先輸入pip -V查看pip版本號,主要是為了查看pip是否正常。
然后先嘗試安裝pygame測試下能否正常安裝,輸入命令pip install pygame。
因為我的電腦已經(jīng)安裝過了,所以不會顯示安裝過程。
素材
最好新建一個飛機大戰(zhàn)的項目文件夾,然后先把圖片素材放進去,我就提供兩張,貌似還有水印,也可以直接去百度,有很多資源的,記得要把名字起好,做到能見名知意。
首先是地圖:
然后是我方飛機和敵方飛機:
最后是子彈:
飛機精靈庫
接下來就是代碼時間,在項目里先創(chuàng)建一個飛機大戰(zhàn)所有精靈的python文件
import random import pygame#定義屏幕大小的常量 SCREEN_RECT=pygame.Rect(0,0,520,700) #刷新的幀率 FRAME_PER_SEC=60 #創(chuàng)建敵機的定時器常量 CREATE_ENEMY_EVENT=pygame.USEREVENT #英雄發(fā)射子彈事件 HERO_FIRE_EVENT=pygame.USEREVENT+1class GameSprite (pygame.sprite.Sprite):'''飛機大戰(zhàn)游戲精靈'''def __init__(self,image_name,speed=1):#調(diào)用父類的初始化方法super().__init__()#定義對象的屬性self.image = pygame.image.load(image_name)self.rect = self.image.get_rect()self.speed = speeddef update(self):#在屏幕的垂直方向上移動self.rect.y += self.speedclass Background(GameSprite):'''游戲背景精靈'''def __init__(self,is_alt=False):#1.調(diào)用父類方法實現(xiàn)精靈的創(chuàng)建(image/rect/speed)super().__init__("./地圖.png")#2.判斷是否交替圖像,如果是,需要設(shè)置初始位置if is_alt:self.rect.y=-self.rect.heightdef update(self):#1.調(diào)用父類的方法實現(xiàn)super().update()#2.判斷屏幕是否移出屏幕,如果移出屏幕將圖像設(shè)置到屏幕的上方if self.rect.y>=SCREEN_RECT.height:self.rect.y=-self.rect.heightclass Enemy(GameSprite):'''敵機精靈'''def __init__(self):#1.調(diào)用父類方法,創(chuàng)建敵機精靈,同時指定敵機圖片super().__init__("./敵機.png")#2.指定敵機的初始隨機速度 2-4self.speed=random.randint(2,4)#3.指定敵機的初始隨機位置self.rect.bottom=0max_x=SCREEN_RECT.width-self.rect.widthself.rect.x=random.randint(0,max_x)passdef update(self):#1.調(diào)用父類方法,保持垂直方向的飛行super().update()#2.判斷是否飛出屏幕,如果是,需要從精靈組刪除敵機if self.rect.y>=SCREEN_RECT.height:#print("飛出屏幕,需要從精靈組刪除……")#kill方法可以將精靈從所有的精靈組中移出,精靈就會被自動銷毀self.kill()def __del__(self):#print("敵機陣亡 %s"%self.rect)passclass Hero(GameSprite):'''英雄精靈'''def __init__(self):#1.調(diào)用父類方法,設(shè)置image&speedsuper().__init__("./飛機.png",0)#2.設(shè)置英雄的初始位置self.rect.centerx=SCREEN_RECT.centerxself.rect.bottom=SCREEN_RECT.bottom-50#3.創(chuàng)建子彈的精靈組self.bullets=pygame.sprite.Group()def update(self):#英雄在水平方向移動self.rect.x += self.speed#控制英雄不能離開屏幕if self.rect.x<0:self.rect.x=0elif self.rect.right>SCREEN_RECT.right:self.rect.right=SCREEN_RECT.rightdef fire(self):#print("發(fā)射子彈")#1.創(chuàng)建子彈精靈bullet=BUllet()#2.設(shè)置精靈的位置bullet.rect.bottom=self.rect.ybullet.rect.centerx=self.rect.centerx#3.將精靈添加到精靈組self.bullets.add(bullet)class BUllet(GameSprite):'''子彈精靈'''def __init__(self):#調(diào)用父類方法,設(shè)置子彈圖片,設(shè)置初始速度super().__init__("./子彈.png",-2)def update(self):#調(diào)用父類方法,讓子彈沿垂直方向飛行super().update()#判斷子彈是否飛出屏幕if self.rect.bottom<0:self.kill()def __del__(self):pass這里邊是飛機大戰(zhàn)的所有精靈和精靈組,保存好之后,再寫飛機大戰(zhàn)的主程序。
飛機大戰(zhàn)主程序
import pygame from plane_sprites import *class PlaneGame(object):'''飛機大戰(zhàn)主游戲'''def __init__(self):print("游戲初始化")#1.創(chuàng)建游戲的窗口self.screen=pygame.display.set_mode(SCREEN_RECT.size)#2.創(chuàng)建游戲的時鐘self.clock=pygame.time.Clock()#3.調(diào)用私有方法,精靈和精靈組的創(chuàng)建self.__create_sprites()#4.設(shè)置定時器事件,創(chuàng)建敵機 1spygame.time.set_timer(CREATE_ENEMY_EVENT,300)#5.設(shè)置定時器事件,創(chuàng)建子彈 0.5spygame.time.set_timer(HERO_FIRE_EVENT,300)def __create_sprites(self):#創(chuàng)建背景精靈和精靈組bg1=Background()bg2=Background(True)self.back_group=pygame.sprite.Group(bg1,bg2)#創(chuàng)建敵機的精靈組self.enemy_group=pygame.sprite.Group()#創(chuàng)建英雄的精靈和精靈組self.hero=Hero()self.hero_group=pygame.sprite.Group(self.hero)def start_game(self):print("游戲開始……")while True:#1.設(shè)置刷新幀率self.clock.tick(FRAME_PER_SEC)#2.事件監(jiān)聽self.__event_handler()#3.碰撞檢測self.__check_collide()#4.更新/繪制精靈組self.__update_sprites()#5.更新屏幕顯示pygame.display.update()passdef __event_handler(self):for event in pygame.event.get():#判斷是否退出游戲if event.type==pygame.QUIT:PlaneGame.__game_over()elif event.type==CREATE_ENEMY_EVENT:#print("敵機出場……")#創(chuàng)建敵機精靈enemy=Enemy()#將敵機精靈添加到敵機精靈組self.enemy_group.add(enemy)elif event.type==HERO_FIRE_EVENT:self.hero.fire()#使用鍵盤提供的方法獲取鍵盤按鍵——按鍵元組keys_pressed=pygame.key.get_pressed()#判斷元組中對應(yīng)的按鍵索引值 1if keys_pressed[pygame.K_RIGHT]:#print("向右移動……")self.hero.speed = 5elif keys_pressed[pygame.K_LEFT]:#print("向左移動……")self.hero.speed = -5else:self.hero.speed = 0def __check_collide(self):#1.子彈摧毀敵機pygame.sprite.groupcollide(self.hero.bullets,self.enemy_group,True,True)#2.敵機撞毀英雄enemies=pygame.sprite.spritecollide(self.hero,self.enemy_group,True)#3.判斷列表是否有內(nèi)容if len(enemies)>0:#讓英雄犧牲self.hero.kill()#結(jié)束游戲PlaneGame.__game_over()def __update_sprites(self):self.back_group.update()self.back_group.draw(self.screen)self.enemy_group.update()self.enemy_group.draw(self.screen)self.hero_group.update()self.hero_group.draw(self.screen)self.hero.bullets.update()self.hero.bullets.draw(self.screen)@staticmethoddef __game_over():print("游戲結(jié)束")pygame.quit()exit()if __name__ == '__main__':#創(chuàng)建游戲?qū)ο?/span>game = PlaneGame()#啟動游戲game.start_game()至于為什么要分兩個文件,emmmm,這個,python嘛,完全面向?qū)ο蟮木幊陶Z言,當然要找個對象了,兩個人在一起才不孤單,三個的話。。。。。
游戲界面
作死模式:
作為游戲的開發(fā)者,怎么能認慫呢,盤它!!!
不足之處
時間有限,只粗糙的寫了很簡單的一部分,不過注釋我都寫的很充分了,大家可以根據(jù)注釋改進一下,比如加上分數(shù)或者設(shè)置關(guān)卡之類的,加油。
結(jié)語
附上我最近看到的一句很有感觸的話:
“在自己的價值觀沒有實現(xiàn)之前,一切的陪伴都是累贅。”
總結(jié)
以上是生活随笔為你收集整理的python语言实现飞机大战的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《信息学奥赛一本通》分治算法 找数
- 下一篇: 01、python数据分析与机器学习实战