鱼C论坛

 找回密码
 立即注册
查看: 2845|回复: 0

[学习笔记] Python飞机大战教程3:各种敌机

[复制链接]
发表于 2023-1-14 14:36:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 KeyError 于 2023-1-31 13:00 编辑

敌只因

敌机有小型,中型,大型,分别写一个类

  1. #enemy.py
  2. import pygame
  3. from random import randint


  4. class SmallEnemy(pygame.sprite.Sprite):
  5.     def __init__(self,bg_size):
  6.         pygame.sprite.Sprite.__init__(self)


  7.         self.image=pygame.image.load("images/enemy1.png").convert_alpha()
  8.         self.rect=self.image.get_rect()
  9.         self.width,self.height=bg_size[0],bg_size[1]
  10.         self.speed=2
  11.         self.active=True
  12.         self.rect.left,self.rect.top=\
  13.                                        randint(0,self.width-self.rect.width),\
  14.                                        randint(-5*self.height,0)
  15.         self.mask=pygame.mask.from_surface(self.image)

  16.     def move(self):
  17.         if self.rect.top<self.height:
  18.             self.rect.top+=self.speed
  19.         else:
  20.             self.reset()
  21.     #重新出现
  22.     def reset(self):
  23.         self.active=True
  24.         self.rect.left,self.rect.top=\
  25.                                        randint(0,self.width-self.rect.width),\
  26.                                        randint(-5*self.height,0)


  27. class MidEnemy(pygame.sprite.Sprite):
  28.     energy=8
  29.    
  30.     def __init__(self,bg_size):
  31.         pygame.sprite.Sprite.__init__(self)


  32.         self.image=pygame.image.load("images/enemy2.png").convert_alpha()
  33.         self.image_hit=pygame.image.load("images/enemy2_hit.png").convert_alpha()
  34.         self.rect=self.image.get_rect()
  35.         self.width,self.height=bg_size[0],bg_size[1]
  36.         self.speed=1
  37.         self.active=True
  38.         self.rect.left,self.rect.top=\
  39.                                        randint(0,self.width-self.rect.width),\
  40.                                        randint(-10*self.height,-self.height)
  41.         self.mask=pygame.mask.from_surface(self.image)
  42.         self.energy=8
  43.         self.hit=False

  44.     def move(self):
  45.         if self.rect.top<self.height:
  46.             self.rect.top+=self.speed
  47.         else:
  48.             self.reset()

  49.     def reset(self):
  50.         self.active=True
  51.         self.energy=8
  52.         self.rect.left,self.rect.top=\
  53.                                        randint(0,self.width-self.rect.width),\
  54.                                        randint(-10*self.height,-self.height)


  55. class BigEnemy(pygame.sprite.Sprite):
  56.     energy=20

  57.     def __init__(self,bg_size):
  58.         pygame.sprite.Sprite.__init__(self)


  59.         self.image1=pygame.image.load("images/enemy3_n1.png").convert_alpha()
  60.         self.image2=pygame.image.load("images/enemy3_n2.png").convert_alpha()
  61.         self.image_hit=pygame.image.load("images/enemy3_hit.png").convert_alpha()
  62.         self.rect=self.image1.get_rect()
  63.         self.width,self.height=bg_size[0],bg_size[1]
  64.         self.speed=1
  65.         self.active=True
  66.         self.rect.left,self.rect.top=\
  67.                                        randint(0,self.width-self.rect.width),\
  68.                                        randint(-15*self.height,-5*self.height)
  69.         self.mask=pygame.mask.from_surface(self.image1)
  70.         self.energy=BigEnemy.energy
  71.         self.hit=False
  72.         self.bullet=[]

  73.     def move(self):
  74.         if self.rect.top<self.height:
  75.             self.rect.top+=self.speed
  76.         else:
  77.             self.reset()

  78.     def reset(self):
  79.         self.active=True
  80.         self.energy=BigEnemy.energy
  81.         self.rect.left,self.rect.top=\
  82.                                        randint(0,self.width-self.rect.width),\
  83.                                        randint(-15*self.height,-5*self.height)
复制代码



                               
登录/注册后可看大图


  1. #main.py
  2. import pygame
  3. import sys
  4. import traceback
  5. import myplne
  6. import enemy
  7. from pygame.locals import *


  8. pygame.init()
  9. pygamr.mixer.init()



  10. bg_size = width,height = 480,700    #尺寸
  11. screen = pygame.display.set_mode(bg_size)    #画布
  12. pygame.display.set_caption("飞机大战")    #标题

  13. #颜色常量
  14. BLACK=(0,0,0)
  15. GREEN=(0,255,0)
  16. WHITE=(255,255,255)
  17. RED=(255,0,0)
  18. YELLOW=(255,255,0)


  19. background=pygame.image.load("images/background.png").convert()


  20. def main():
  21.     clock = pygame.time.Clock()

  22.     me = myplne.MyPlane(bg_size)

  23.     def add_small(a,b,num):
  24.         for i in range(num):
  25.             e1=myenemy.SmallEnemy(bg_size)
  26.             a.add(e1)
  27.             b.add(e1)
  28.     def add_mid(a,b,num):
  29.         for i in range(num):
  30.             e2=myenemy.MidEnemy(bg_size)
  31.             a.add(e2)
  32.             b.add(e2)
  33.     def add_big(a,b,num):
  34.         for i in range(num):
  35.             e3=myenemy.BigEnemy(bg_size)
  36.             bu_i=0
  37.             BU_N=4
  38.             for i in range(BU_N):
  39.                 e3.bullet.append(mybullet.Bullet1(e3.rect.midtop))
  40.             a.add(e3)
  41.             b.add(e3)
  42.     def add_speed(feji,add):
  43.         for i in feji:
  44.             i.speed+=add


  45.     small=pygame.sprite.Group()
  46.     add_small(small,enemi,15)


  47.     mid=pygame.sprite.Group()
  48.     add_mid(mid,enemi,4)


  49.     big=pygame.sprite.Group()
  50.     add_big(big,enemi,2)

  51.     qie = True
  52.     while True:
  53.         for event in pygame.event.get():
  54.             if event.type == QUIT:    #如果用户点击关闭按钮
  55.                 pygame.quit()
  56.                 sys.exit()

  57.         #控制飞机
  58.         key_p=pygame.key.get_pressed()
  59.         if key_p[K_w] or key_p[K_UP]:
  60.             me.moveUp()
  61.         if key_p[K_s] or key_p[K_DOWN]:
  62.             me.moveDown()
  63.         if key_p[K_a] or key_p[K_LEFT]:
  64.             me.moveLeft()
  65.         if key_p[K_d] or key_p[K_RIGHT]:
  66.             me.moveRight()

  67.         if qie:
  68.             screen.blit(me.image1,me.rect)
  69.         else:
  70.             screen.blit(me.image2,me.rect)

  71.         for each in big:
  72.                 if each.active:
  73.                     each.move()
  74.                     if each.hit:
  75.                         screen.blit(each.image_hit,each.rect)
  76.                         each.hit=False
  77.                     else:
  78.                         if qie:
  79.                             screen.blit(each.image1,each.rect)
  80.                         else:
  81.                             screen.blit(each.image2,each.rect)


  82.                     pygame.draw.line(screen,BLACK,\
  83.                                      (each.rect.left,each.rect.top-5),\
  84.                                      (each.rect.right,each.rect.top-5),\
  85.                                      2)
  86.                     energy_r=each.energy/myenemy.BigEnemy.energy
  87.                     if energy_r>0.2:
  88.                         energy_c=GREEN
  89.                     else:
  90.                         energy_c=RED
  91.                     pygame.draw.line(screen,energy_c,\
  92.                                      (each.rect.left,each.rect.top-5),\
  93.                                      (each.rect.left+each.rect.width*energy_r,each.rect.top-5),\
  94.                                      2)
  95.                     for b in each.bullet:
  96.                         screen.blit(b.image,b.rect)
  97.                         b.move2()


  98.                
  99.                     if each.rect.bottom==-50:
  100.                         enemy3_fly_sound.play()
  101.         
  102.                 else:
  103.                     if not(delay%3):
  104.                         if e3_i==0:
  105.                             enemy3_down_sound.play()
  106.                         screen.blit(each.destroy_images[e3_i],each.rect)
  107.                         e3_i=(e3_i+1)%6
  108.                         if not(bool(e3_i)):
  109.                             me_down_sound.stop()
  110.                             each.reset()
  111.                     
  112.                
  113.             for each in mid:
  114.                 if each.active:
  115.                     if each.hit==False:
  116.                         screen.blit(each.image_hit,each.rect)
  117.                         hit=False
  118.                     else:
  119.                         screen.blit(each.image,each.rect)
  120.                         each.move()


  121.                     pygame.draw.line(screen,BLACK,\
  122.                                      (each.rect.left,each.rect.top-5),\
  123.                                      (each.rect.right,each.rect.top-5),\
  124.                                      2)
  125.                     en_r=each.energy/myenemy.MidEnemy.energy
  126.                     if en_r>0.2:
  127.                         en_c=GREEN
  128.                     else:
  129.                         en_c=RED
  130.                     pygame.draw.line(screen,en_c,\
  131.                                      (each.rect.left,each.rect.top-5),\
  132.                                      (each.rect.left+each.rect.width*en_r,\
  133.                                       each.rect.top-5),2)
  134.                                  
  135.                     
  136.                 else:
  137.                     if not(delay%3):
  138.                         if e2_i==0:
  139.                             enemy2_down_sound.play()
  140.                         screen.blit(each.destroy_images[e2_i],each.rect)
  141.                         e2_i=(e2_i+1)%4
  142.                         if e2_i==0:
  143.                             each.reset()
  144.             
  145.             for each in small:
  146.                 if each.active:
  147.                     each.move()
  148.                     screen.blit(each.image,each.rect)
  149.                 else:
  150.                     if not(delay%3):
  151.                         if e1_i==0:
  152.                             enemy1_down_sound.play()
  153.                         screen.blit(each.destroy_images[e1_i],each.rect)
  154.                         e1_i=(e1_i+1)%4
  155.                         if e1_i==0:
  156.                             each.reset()


  157.         screen.blit(background, (0,0))    #绘制背景

  158.         if not (delay % 5):
  159.             qie=not qie
  160.         delay-=1
  161.         if not delay:
  162.             delay=100
  163.         
  164.         pygame.display.flip()
  165.         clock.tick(60)    #限制帧率


  166. if __name__ == "__main__":
  167.     try:
  168.         main()
  169.     except SystemExit:
  170.         pass
  171.     except:
  172.         traceback.print_exc()    #报告异常
  173.         pygame.quit()
  174.         input()
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-22 19:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表