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寫飛機(jī)大戰(zhàn)游戲之pygame入門(4):獲取鼠標(biāo)的位置及運(yùn)動(dòng)
- python實(shí)現(xiàn)飛機(jī)大戰(zhàn)游戲(pygame版)
- python pygame模塊編寫飛機(jī)大戰(zhàn)
- python飛機(jī)大戰(zhàn)pygame碰撞檢測(cè)實(shí)現(xiàn)方法分析
- python實(shí)現(xiàn)飛機(jī)大戰(zhàn)游戲
相關(guān)文章
Python實(shí)現(xiàn)淘寶秒殺功能的示例代碼
這篇文章主要介紹了Python實(shí)現(xiàn)淘寶秒殺功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01
基于python實(shí)現(xiàn)ROC曲線繪制廣場(chǎng)解析
這篇文章主要介紹了基于python實(shí)現(xiàn)ROC曲線繪制廣場(chǎng)解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
Python通過(guò)RabbitMQ服務(wù)器實(shí)現(xiàn)交換機(jī)功能的實(shí)例教程
RabbitMQ是一個(gè)基于消息隊(duì)列的服務(wù)器程序,Python可以通過(guò)Pika庫(kù)來(lái)驅(qū)動(dòng)它,這里我們將來(lái)看一個(gè)Python通過(guò)RabbitMQ服務(wù)器實(shí)現(xiàn)交換機(jī)功能的實(shí)例教程:2016-06-06
Pycharm學(xué)習(xí)教程(6) Pycharm作為Vim編輯器使用
這篇文章主要為大家詳細(xì)介紹了最全的Pycharm學(xué)習(xí)教程第六篇,Pycharm作為Vim編輯器使用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
python一行sql太長(zhǎng)折成多行并且有多個(gè)參數(shù)的方法
今天小編就為大家分享一篇python一行sql太長(zhǎng)折成多行并且有多個(gè)參數(shù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
詳解pytest實(shí)現(xiàn)mark標(biāo)記功能詳細(xì)介紹
這篇文章主要介紹了詳解pytest實(shí)現(xiàn)mark標(biāo)記功能詳細(xì)介紹,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04

