欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python pygame實(shí)現(xiàn)滾動(dòng)橫版射擊游戲城市之戰(zhàn)

 更新時(shí)間:2019年11月25日 16:47:32   作者:李興球  
這篇文章主要為大家詳細(xì)介紹了python pygame實(shí)現(xiàn)滾動(dòng)橫版射擊游戲城市之戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

pygame城市之戰(zhàn)橫版射擊游戲,按上下左右方向箭頭操作飛機(jī)。這是一個(gè)橫板射擊小游戲,在黑夜的城市上空,你將要操作一架飛機(jī)去射擊敵機(jī),爆炸效果還不錯(cuò)。

在游戲中定義了滾動(dòng)的背景類,定義了飛機(jī)類Plane,定義了子彈類,敵機(jī)類,爆炸類等,是學(xué)習(xí)Pygame和面向?qū)ο缶幊痰暮美印?/p>

代碼:

import math
import time
import pygame
from pygame.locals import *
from random import choice,randint
 
class ScrolledBackground(pygame.sprite.Sprite):
 def __init__(self,image,screen):
  pygame.sprite.Sprite.__init__(self)
  self.screen = screen
  self.width = screen.get_width()
  self.height = screen.get_height()
  self.image0 = pygame.image.load(image).convert_alpha()
  self.image1 = pygame.image.load(image).convert_alpha()
 
  self.rect0 = self.image0.get_rect()  
  self.rect1 = self.image1.get_rect()
  self.rect1.left = self.rect0.right
  self.dx = -10
  self.dy = 0
  
 def update(self):
  pass
 
 def draw(self):
  pass
 
 
class Plane(pygame.sprite.Sprite):
 def __init__(self,image,keys,screen):
  pygame.sprite.Sprite.__init__(self)
  self.keys = keys     # 上下左右按鍵
  self.image = pygame.image.load(image).convert_alpha()
  self.screen = screen
  self.rect = self.image.get_rect()
  self.rect.centery = self.screen.get_height()//2
  self.xspeed = 0
  self.yspeed = 0
  self.dead = False     # 新增加的屬性
  
 def keys_check(self,all_keys): 
  pass
 
 def update(self):
  self.rect.move_ip(self.xspeed,self.yspeed)
  
 def draw(self):
  self.screen.blit(self.image,self.rect)
  
class Bullet(pygame.sprite.Sprite):
 def __init__(self,image,plane,group,screen):
  pygame.sprite.Sprite.__init__(self)
  self.plane = plane
  self.image = pygame.image.load(image).convert_alpha()
  self.rect = self.image.get_rect()
  self.rect.center = plane.rect.center
  self.group = group
  self.group.add(self)
  self.screen = screen
  self.screen_width = screen.get_width()
  self.screen_height = screen.get_height()  
  
 def update(self):
  self.rect.move_ip(10,0)
  if self.rect.left > self.screen_width :
   self.group.remove(self)
   
def split_images(image,rows,cols):
 """image是一張圖片,把它切分為若干圖,返回列表"""
 global explosion_images_list
 image = pygame.image.load(image)
 step_width = image.get_width()//cols
 step_height = image.get_height()//rows
 
 pass   
   
class Explosion(pygame.sprite.Sprite):
 """爆炸效果類,顯示一系列幀圖"""
 def __init__(self,surimages,position,group):
  pygame.sprite.Sprite.__init__(self)
  self.surimages = surimages      # 爆炸效果用到的surface列表
  self.index = 0
  self.amounts = len(surimages)
  self.image = self.surimages[self.index]   # 初始造型
  self.rect = self.image.get_rect()    # 矩形對(duì)象
  self.rect.center = position      # 爆炸位置
  self.group = group
  self.group.add(self)
  self.interval_time = 0.01      # 造型切換時(shí)間
  self.begin_time = time.time()     # 爆炸起始時(shí)間
  
 def update(self):         # 換造型
  
  if time.time() - self.begin_time >= self.interval_time: # 超時(shí),則換造型
   if self.index < self.amounts:
    self.image = self.surimages[self.index]
    self.index = self.index + 1
    self.begin_time = time.time()
   else:
    self.group.remove(self)     # 造型切換完了則從組中移除自己
    
class Enemy(pygame.sprite.Sprite):
 def __init__(self,images,group,screen):
  """images是surface列表"""
  pygame.sprite.Sprite.__init__(self)
  self.screen = screen
  self.screen_width = self.screen.get_width()  # 獲取屏幕寬度
  self.screen_height = self.screen.get_height() # 獲取屏幕高度
  self.image = choice(images)      # 隨機(jī)選擇一個(gè)surface
  self.rect = self.image.get_rect()
  self.rect.left = self.screen_width + randint(10,self.screen_width)
  self.rect.centery = randint(0,self.screen_height)
  self.group = group
  self.group.add(self)       # 加入到自己的組
 def update(self):
  self.rect.move_ip(-5,0)
  if self.rect.right <= 0 :
   self.group.remove(self)
  
class Eullet(pygame.sprite.Sprite):
 """敵方子彈類"""
 def __init__(self,image,selfgroup,enemy_group,plane,screen):
  """參數(shù)列表:image,已轉(zhuǎn)換成surface的對(duì)象
      selfgroup,所在的組
      enemy_group,敵人組.
      plane,我方飛機(jī)
      screen,屏幕對(duì)象
  """ 
  pass
  
 def update(self):
  self.rect.move_ip(-self.dx//30,-self.dy//30)
  if self.beyond_edge() :
   self.group.remove(self)
 
 def beyond_edge(self): 
  pass
 
def collision_check():
 """對(duì)游戲中的對(duì)象進(jìn)行碰撞檢測(cè),碰撞檢測(cè)有以下幾種:
  1、我方飛機(jī)碰到敵方飛機(jī),都爆炸。給我方飛機(jī)增加dead屬性。
  2、我方飛機(jī)碰到敵方子彈,我方飛機(jī)爆炸,游戲結(jié)束。
  3、敵方飛機(jī)碰到我方子彈,敵方飛機(jī)爆炸。
  以下引用的是全局變量
 """
 global enemy_counter
 "我方飛機(jī)和敵方飛機(jī)任何一架的碰撞"
 if not plane1.dead:
  eny = pygame.sprite.spritecollideany(plane1, group_enemy)
  if eny!=None :               # 碰到了,我方飛機(jī)死,游戲結(jié)束    
   Explosion(explosion_images_list,eny.rect.center,group_explosion) # 在敵方飛機(jī)處發(fā)生爆炸
   Explosion(explosion_images_list,plane1.rect.center,group_explosion) # 在我方飛機(jī)處發(fā)生爆炸
   plane1.dead = True
   group_enemy.remove(eny)            # 從敵方組中移除碰撞的敵機(jī)
   
 "我方飛機(jī)碰到敵方子彈,我方死,游戲結(jié)束。"
 if not plane1.dead:
  b = pygame.sprite.spritecollideany(plane1, group_enemy_bullet)
  if b!=None :               # 碰到了,我方飛機(jī)死,游戲結(jié)束    
   Explosion(explosion_images_list,plane1.rect.center,group_explosion) # 在我方飛機(jī)處發(fā)生爆炸
   plane1.dead = True
   
 "敵方飛機(jī)碰到我方子彈,我方子彈爆,敵方爆炸"
 result_dict = pygame.sprite.groupcollide(group_bullet1, group_enemy, True, True) # 一顆子彈可能打到幾架飛機(jī)
 if result_dict !={}:
  missle = list(result_dict.keys())[0]          # 碰到我方子彈
  enemy_list = result_dict[missle]
  #Explosion(explosion_images_list,missle.rect.center,group_explosion)
  enemy_counter += len(enemy_list)       # 大于一定的數(shù)量,如果我方戰(zhàn)機(jī)沒死,則成功結(jié)束
  for e in enemy_list: Explosion(explosion_images_list,e.rect.center,group_explosion)
  
  pygame.display.set_caption("風(fēng)火輪少兒編程_城市之戰(zhàn)射擊游戲,當(dāng)前打爆敵機(jī)數(shù):" + str(enemy_counter) + ",請(qǐng)自行編寫游戲成功結(jié)束的代碼!")
  
  
 
if __name__ == "__main__":
 
 width,height = 480,360
 enemy_bullet = "images/bullet2.png"
 enemy_images = ["images/enemy0.png","images/enemy1.png","images/enemy2.png","images/enemy3.png"]
 explosion_images = "images/explosion.png"
 image = "images/night city with street.png"
 plane_image1 = "images/plane.png"
 bullet_image1 = "images/bullet.png"
 
 pygame.init()
 screen = pygame.display.set_mode((width,height))
 pygame.display.set_caption("城市之戰(zhàn),按上下左右操作飛機(jī)。風(fēng)火輪少兒編程_www.scratch8.net")
 
 enemy_bullet = pygame.image.load(enemy_bullet)
 enemy_images = [pygame.image.load(img) for img in enemy_images] # 形成敵機(jī)的surface列表
 explosion_images_list = []        # 爆炸效果surface列表
 explosion_images = split_images(explosion_images,2,13) # 按2行13列切分圖形,返回surface列表
 
 
 keys1 = [K_UP,K_DOWN,K_LEFT,K_RIGHT]
 plane1 = Plane(plane_image1,keys1,screen)
 bg = ScrolledBackground(image,screen)
 running = True
 clock = pygame.time.Clock()
 
 bullet1_shoot_EVENT = USEREVENT + 1
 pygame.time.set_timer(bullet1_shoot_EVENT,500)
 
 "敵機(jī)定時(shí)生成事件"
 enemy_EVENT = USEREVENT + 2
 pygame.time.set_timer(enemy_EVENT,1000)
 
 "敵機(jī)定時(shí)發(fā)射子彈事件"
 enemy_shoot_EVENT = USEREVENT + 3
 pygame.time.set_timer(enemy_shoot_EVENT,50)
 
 group_explosion = pygame.sprite.Group()
 group_bullet1 = pygame.sprite.Group()
 group_enemy = pygame.sprite.Group()
 group_enemy_bullet = pygame.sprite.Group()
 enemy_amounts = 100       # 大于這個(gè)數(shù)量則游戲成功結(jié)束
 enemy_counter = 0
 while running:
  for event in pygame.event.get():
   if event.type == QUIT:
    running = False
    break
   if event.type == bullet1_shoot_EVENT: # 我方子彈1發(fā)射事件
    if not plane1.dead:
     Bullet(bullet_image1,plane1,group_bullet1,screen)
   if event.type == enemy_EVENT:   # 定時(shí)生成一架敵機(jī)
    Enemy(enemy_images,group_enemy,screen)
    
   if event.type == enemy_EVENT:   # 定時(shí)生成一枚敵機(jī)子彈
    Eullet(enemy_bullet,group_enemy_bullet,group_enemy,plane1,screen)
    
   
  all_keys = pygame.key.get_pressed() # 所有按鍵檢測(cè)
  plane1.keys_check(all_keys)   # 對(duì)plane1進(jìn)行按鍵檢測(cè)
  
  bg.update()       # 更新背景坐標(biāo)
  group_bullet1.update()    # 我方子彈更新
  if not plane1.dead :
   plane1.update()     # 飛機(jī)1坐標(biāo)更新
  group_enemy.update()     # 敵機(jī)坐標(biāo)
  group_enemy_bullet.update()   # 敵機(jī)子彈更新
  group_explosion.update()    # 爆炸效果更新
  
  "坐標(biāo)都更新完后,應(yīng)該進(jìn)行碰撞檢測(cè)"
  collision_check()
  
  screen.fill((0,0,0))
  bg.draw()
  group_bullet1.draw(screen)
  if not plane1.dead :
   plane1.draw()
  group_enemy.draw(screen)
  group_enemy_bullet.draw(screen)
  group_explosion.draw(screen)
  pygame.display.update()
  clock.tick(30)
 pygame.quit()

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • PyTorch 中的 torch.utils.data 解析(推薦)

    PyTorch 中的 torch.utils.data 解析(推薦)

    這篇文章主要介紹了PyTorch?torch.utils.data.Dataset概述案例詳解,主要介紹對(duì)?torch.utils.data.Dataset?的理解,需要的朋友可以參考下
    2023-02-02
  • python web框架的總結(jié)

    python web框架的總結(jié)

    在本篇文章里小編給大家整理的是一篇關(guān)于python web框架的總結(jié)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)參考下。
    2021-03-03
  • Python語言描述連續(xù)子數(shù)組的最大和

    Python語言描述連續(xù)子數(shù)組的最大和

    這篇文章主要介紹了Python語言描述連續(xù)子數(shù)組的最大和,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • Python數(shù)據(jù)解析bs4庫使用BeautifulSoup方法示例

    Python數(shù)據(jù)解析bs4庫使用BeautifulSoup方法示例

    這篇文章主要為大家介紹了Python數(shù)據(jù)解析bs4庫使用BeautifulSoup方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • 在pycharm中設(shè)置顯示行數(shù)的方法

    在pycharm中設(shè)置顯示行數(shù)的方法

    今天小編就為大家分享一篇在pycharm中設(shè)置顯示行數(shù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • Python2.7編程中SQLite3基本操作方法示例

    Python2.7編程中SQLite3基本操作方法示例

    這篇文章主要介紹了Python2.7編程中SQLite3基本操作方法,涉及Python2.7操作sqlite3數(shù)據(jù)庫的增刪改查及防注入等相關(guān)技巧,需要的朋友可以參考下
    2017-08-08
  • 執(zhí)行Python程序時(shí)模塊報(bào)錯(cuò)問題

    執(zhí)行Python程序時(shí)模塊報(bào)錯(cuò)問題

    這篇文章主要介紹了執(zhí)行Python程序時(shí)模塊報(bào)錯(cuò)問題及解決方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Python實(shí)現(xiàn)PS濾鏡碎片特效功能示例

    Python實(shí)現(xiàn)PS濾鏡碎片特效功能示例

    這篇文章主要介紹了Python實(shí)現(xiàn)PS濾鏡碎片特效功能,結(jié)合實(shí)例形式分析了Python實(shí)現(xiàn)PS濾鏡碎片效果的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2018-01-01
  • django如何根據(jù)現(xiàn)有數(shù)據(jù)庫表生成model詳解

    django如何根據(jù)現(xiàn)有數(shù)據(jù)庫表生成model詳解

    這篇文章主要給大家介紹了關(guān)于django如何根據(jù)現(xiàn)有數(shù)據(jù)庫表生成model的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Django具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-08-08
  • matplotlib之pyplot模塊坐標(biāo)軸標(biāo)簽設(shè)置使用(xlabel()、ylabel())

    matplotlib之pyplot模塊坐標(biāo)軸標(biāo)簽設(shè)置使用(xlabel()、ylabel())

    這篇文章主要介紹了matplotlib之pyplot模塊坐標(biāo)軸標(biāo)簽設(shè)置使用(xlabel()、ylabel()),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02

最新評(píng)論