python實(shí)現(xiàn)簡(jiǎn)單的飛機(jī)大戰(zhàn)游戲
本文實(shí)例為大家分享了python實(shí)現(xiàn)飛機(jī)大戰(zhàn)游戲的具體代碼,供大家參考,具體內(nèi)容如下
1、準(zhǔn)備環(huán)境
下載python(這里建議不需要安裝最新的,好像pygame還沒(méi)有對(duì)3.8支持的包,我也沒(méi)去試),安裝pygame模塊。
進(jìn)入cmd:
輸入“pip install pygame”——>顯示“successfully”安裝成功。
2、代碼塊:
import sys#退出程序 import pygame class Settings(): ? def __init__(self): ? ? self.screen_width=480 ? ? self.screen_height=852 ? ? self.bg_color = (255,192,203) ? ? self.hero_speed = 2#控制飛機(jī)移速 ? ?? ? ? self.bullet_speed = 4 ? ? self.bullet_width = 4 ? ? self.bullet_height = 8 ? ? self.bullet_color = (0,0,128)#設(shè)置子彈屬性 ? ? self.enemy_speed = 1 class Enemy(pygame.sprite.Sprite):#創(chuàng)建敵人類 ? def __init__(self,screen,settings): ? ? super(Enemy,self).__init__() ? ? self.screen = screen ? ? self.settings = settings ? ? self.image = pygame.image.load("image/enemy1.png") ? ? self.rect = self.image.get_rect() ? ? self.rect.x = 10 ? ? self.rect.y = 10 ? ? self.speed = settings.enemy_speed ? ? self.y = float(self.rect.y) ? def update(self): ? ? self.y += self.speed ? ? self.rect.y = self.y ?? ? def blitme(self):#繪制 ? ? self.screen.blit(self.image,self.rect) ? ? ? ?? class Bullet(pygame.sprite.Sprite):#繼承sprite 精靈 ? def __init__(self,screen,settings,hero): ? ? super(Bullet,self).__init__()#初始化父類 ? ? self.screen = screen ? ? self.settings = settings ? ? self.image = pygame.image.load('image/bullet1.png')#圖片繪制子彈 ? ? self.rect = self.image.get_rect() ? ? #self.rect = pygame.Rect(0,0,settings.bullet_width,settings.bullet_height) ? ? self.rect.centerx = hero.rect.centerx#子彈與飛機(jī)中心保持一致 ? ? self.rect.y =hero.rect.y#y坐標(biāo)也保持一致 ? ? self.y = float(hero.rect.y)#減小誤差 ? ? self.speed = settings.bullet_speed#把自身速度保存下來(lái) ? ? self.color = settings.bullet_color ? def update(self):#子彈移動(dòng) 子彈持續(xù)向上移動(dòng) 讓y坐標(biāo)減少即可 ? ? self.y -= self.speed ? ? self.rect.y = self.y ? def drawme(self):#繪制方法 ? ? #pygame.draw.rect(self.screen,self.color,self.rect)#繪制一個(gè)矩形上去 屏幕 顏色 位置及大小 ? ? self.screen.blit(self.image,self.rect) class Bg():#定義一個(gè)背景類 ? def __init__(self,screen): ? ? self.screen = screen ? ? self.image = pygame.image.load("image/background.png") ? ? self.rect = self.image.get_rect() ? def blitme(self):#繪制自身 ? ? self.screen.blit(self.image,self.rect) class Hero():#繪制飛機(jī) ? def __init__(self,screen,settings): ? ? self.screen = screen ? ? self.settings = settings#控制飛機(jī)移速 ? ? self.image = pygame.image.load("image/hero1.png") ? ? self.rect = self.image.get_rect() ? ? self.screen_rect = screen.get_rect() ? ? #self.rect.x = self.screen_rect.width/2 - self.rect.width/2#保證居中,屏幕寬度一半減去自身寬度一半 ? ? self.rect.centerx = self.screen_rect.centerx#利用中心點(diǎn)坐標(biāo) ? ? self.rect.bottom = self.screen_rect.bottom#botom自身高度,位于最下方 ? ? self.moving_right = False#設(shè)置一個(gè)標(biāo)志位,控制按鍵按下與抬起 ? ? self.moving_left = False ? ? self.centerx = float(self.screen_rect.centerx)#修改誤差,不讓它忽略小數(shù) ? ?? ? def blitme(self):#繪制自身 ? ? self.screen.blit(self.image,self.rect) ? def update(self):#控制飛機(jī)移動(dòng) ? ? if self.moving_right and self.rect.right < self.screen_rect.right:#控制飛機(jī)右邊不能超出屏幕邊界 ? ? ? self.centerx += self.settings.hero_speed ? ? if self.moving_left and self.rect.left > 0:#控制到左邊距離大于0 ? ? ? self.centerx -= self.settings.hero_speed ? ? self.rect.centerx = self.centerx def check_events(screen,settings,hero,bullets):#事件檢測(cè) ? for event in pygame.event.get(): ? ? if event.type == pygame.QUIT: ? ? ? pygame.quit() ? ? ? sys.exit() ? ? elif event.type == pygame.KEYDOWN:#判斷是否按鍵按下 ? ? ? if event.key == pygame.K_RIGHT:#判斷是否按下方向右鍵 ? ? ? ? hero.moving_right = True ? ? ? elif event.key == pygame.K_LEFT: ? ? ? ? hero.moving_left = True ? ? ? elif event.key == pygame.K_SPACE: ? ? ? ? new_bullet = Bullet(screen,settings,hero) ? ? ? ? bullets.add(new_bullet) ? ? ? ? ? elif event.type == pygame.KEYUP: ? ? ? if event.key == pygame.K_RIGHT: ? ? ? ? hero.moving_right = False ? ? ? elif event.key == pygame.K_LEFT: ? ? ? ? hero.moving_left = False def update_screen(bg,hero,bullets,enemys,screen): ? bg.blitme() ? for bullet in bullets.sprites(): ? ? bullet.drawme() ? hero.blitme() ? #enemy.blitme() ? enemys.draw(screen) ? pygame.display.flip()#刷新 def update_bullets(bullets): ? bullets.update() ? for bullet in bullets.sprites():#檢測(cè)子彈是否超出屏幕外,控制子彈刪除 ? ? if bullet.rect.bottom<0: ? ? ? bullets.remove(bullets) def update_enemys(enemys,bullets): ? enemys.update() ? pygame.sprite.groupcollide(bullets,enemys,True,True)#組的碰撞檢測(cè),傳遞兩個(gè)組,True代表碰撞后是否銷毀 def create_enemys(enemys,screen,settings):#控制多個(gè)敵人生成 ? enemy = Enemy(screen,settings) ? enemys.add(enemy) ? number_enemys = screen.get_rect().width/(20+enemy.rect.width)#利用屏幕總寬度除以單個(gè)敵人所占空間得出一行最大敵人數(shù) ? for index in range(int(number_enemys)): ? ? if index==0: ? ? ? continue#終止當(dāng)前循環(huán),繼續(xù)下次循環(huán) ? ? x = 10 + index * (20+enemy.rect.width)#敵人之間存在10像素間隔 ? ? new_enemy = Enemy(screen,settings) ? ? new_enemy.rect.x = x ? ? enemys.add(new_enemy) def run_game(): ? pygame.init()#創(chuàng)建可視化窗口5? ? settings = Settings() ? screen = pygame.display.set_mode((settings.screen_width,settings.screen_height))#設(shè)置窗口大小 ? bg = Bg(screen) ? hero = Hero(screen,settings) ? #enemy = Enemy(screen,settings) ? bullets = pygame.sprite.Group()#管理子彈 ? enemys = pygame.sprite.Group()#管理敵人 ? create_enemys(enemys,screen,settings) ?? ? while True: ? ? ? check_events(screen,settings,hero,bullets) ? ? hero.update() ? ? update_bullets(bullets) ? ? update_enemys(enemys,bullets) ? ? #print(len(bullets.sprites()))#驗(yàn)證刪除子彈代碼是否生效 ? ? update_screen(bg,hero,bullets,enemys,screen) ? ?? run_game()?
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- python實(shí)現(xiàn)簡(jiǎn)單的飛機(jī)大戰(zhàn)
- python實(shí)現(xiàn)飛機(jī)大戰(zhàn)(面向過(guò)程)
- python版飛機(jī)大戰(zhàn)代碼分享
- python實(shí)現(xiàn)飛機(jī)大戰(zhàn)
- python實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲
- 用Python寫(xiě)飛機(jī)大戰(zhàn)游戲之pygame入門(mén)(4):獲取鼠標(biāo)的位置及運(yùn)動(dòng)
- python實(shí)現(xiàn)飛機(jī)大戰(zhàn)游戲(pygame版)
- python pygame模塊編寫(xiě)飛機(jī)大戰(zhàn)
- python飛機(jī)大戰(zhàn)pygame碰撞檢測(cè)實(shí)現(xiàn)方法分析
- python實(shí)現(xiàn)飛機(jī)大戰(zhàn)游戲
相關(guān)文章
python獲取Linux下文件版本信息、公司名和產(chǎn)品名的方法
這篇文章主要介紹了python獲取Linux下文件版本信息、公司名和產(chǎn)品名的方法,主要涉及了pefile模塊的用法,需要的朋友可以參考下2014-10-10通過(guò)實(shí)例了解python__slots__使用方法
這篇文章主要介紹了通過(guò)實(shí)例了解python__slots__使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09Python 對(duì)象序列化與反序列化之pickle json詳細(xì)解析
我們知道在Python中,一切皆為對(duì)象,實(shí)例是對(duì)象,類是對(duì)象,元類也是對(duì)象。本文正是要聊聊如何將這些對(duì)象有效地保存起來(lái),以供后續(xù)使用2021-09-09