打飞机小游戏 python+pygame

首先安装python和pygame的环境

sudo apt-get install python

sudo apt-get install python-pygame

 

github项目地址:https://github.com/kiudou/fight_plane

代码中有好几个图,自己找

  1 # -*- coding: utf-8 -*-
  2 import pygame
  3 import random
  4 from sys import exit
  5 #定义敌机类
  6 class Enemy:
  7     def restart(self): #重置敌机的位置和速度
  8         self.x = random.randint(50, 400)
  9         self.y = random.randint(-200, -50)
 10         self.speed = random.random()+0.1
 11     def __init__(self): #初始化
 12         self.restart()
 13         self.image = pygame.image.load('enemy.png').convert_alpha()
 14     def move(self): #向下移动
 15         if self.y < 800 :
 16             self.y +=self.speed
 17         else : #重置
 18             self.restart()
 19 
 20 #定义Bullet类。封装子弹相关的数据和方法
 21 class Bullet:
 22     def __init__(self): #初始变量,两个_,该类被创建时会被自动,不然会出现AttributeError: Bullet instance has no attribute
 23         self.x = 0
 24         self.y = -1
 25         self.image = pygame.image.load('bullet.png').convert_alpha()
 26         self.active = False #默认不激活
 27     def move(self): #处理子弹的运动
 28         if self.active: #激活状态下,向上移动
 29             self.y -= 3
 30         if self.y < 0:
 31             self.active = False
 32     def restart(self):    #重置子弹位置
 33         mouseX, mouseY = pygame.mouse.get_pos()
 34         self.x = mouseX - self.image.get_width()/2
 35         self.y = mouseY - self.image.get_height()/2
 36         self.active = True #激活子弹
 37 #定义飞机类
 38 class Plane:
 39     def restart(self):
 40         self.x = 200
 41         self.y = 300
 42     def __init__(self):
 43         self.restart()
 44         self.image = pygame.image.load('plane.png').convert_alpha()
 45     def move(self):
 46          x,y = pygame.mouse.get_pos() #获取鼠标的位置
 47          x -= self.image.get_width() / 2 #使得鼠标在飞机图像的最中间
 48          y -= self.image.get_height() / 2
 49          self.x = x
 50          self.y = y
 51     
 52 def checkHit(enemy, bullet): #检测子弹和飞机是否相撞
 53     if(bullet.x > enemy.x and bullet.x < enemy.x+enemy.image.get_width()) and \
 54         (bullet.y > enemy.y and bullet.y < enemy.y+enemy.image.get_height()): #空格+\为代码换行
 55         enemy.restart()
 56         bullet.active = False
 57         return True
 58     return False
 59 
 60 def checkCrash(enemy, plane):#检测敌机与飞机是否相撞
 61     if (plane.x + 0.7*plane.image.get_width() > enemy.x) and (plane.x + 0.3*plane.image.get_width() < enemy.x + enemy.image.get_width()) and \
 62         (plane.y + 0.7*plane.image.get_height() > enemy.y) and (plane.y + 0.3*plane.image.get_height() < enemy.y + enemy.image.get_height()):
 63         return True
 64     return False
 65     
 66 pygame.init()
 67 screen = pygame.display.set_mode((450,700), 0, 32) #制作窗口
 68 pygame.display.set_caption('fight plane') #窗口名称
 69 background = pygame.image.load('background.jpg').convert() #加载背景图
 70 plane = Plane() #创建飞机对象
 71 enemies = [] #创建敌机list
 72 for i in range(5):
 73     enemies.append(Enemy())
 74 bullets = [] #创建子弹list
 75 for i in range(5): #list中添加5发子弹
 76     bullets.append(Bullet())
 77 count_b = len(bullets) #子弹总数
 78 index_b = 0 #即将激活的子弹序号
 79 interval_b = 0 #发射子弹间隔
 80 gameover = False
 81 score = 0
 82 font = pygame.font.Font(None,32) #创建一个font对象,None为默认字体,32为字号
 83 while True:
 84     for event in pygame.event.get():
 85         if event.type == pygame.QUIT:
 86             pygame.quit()
 87             exit()
 88         if gameover and event.type == pygame.MOUSEBUTTONUP: #点击鼠标游戏重置
 89             plane.restart()
 90             for e in enemies :
 91                 e.restart()
 92             for b in bullets :
 93                 b.active = False
 94             score = 0
 95             gameover = False
 96             index_b = 0
 97             interval_b = 0
 98     screen.blit(background,(0,0)) #画背景图像,从最左上角开始即(0,0)
 99     
100     if not gameover :
101         interval_b -= 1 #发射间隔递减,实际发射间隔受cpu影响
102         if interval_b < 0: #间隔小于0时,激发一个子弹
103             bullets[index_b].restart()
104             interval_b = 100 #重置时间间隔
105             index_b = (index_b + 1) %count_b #子弹序号周期性递减
106         for b in bullets: #绘制激活的子弹
107             if b.active:
108                 b.move()
109                 screen.blit(b.image,(b.x,b.y))
110                 for e in enemies:
111                     if checkHit(e, b) :#检测激活的子弹是否和飞机相撞
112                         score += 10
113         for e in enemies : #敌机的移动和描述        
114             if checkCrash(e, plane) :
115                 gameover = True
116             e.move() 
117             screen.blit(e.image,(e.x, e.y))
118         plane.move()
119         screen.blit(plane.image,(plane.x,plane.y)) #画飞机
120         text = font.render("Score:%d" %score,1,(0,0,0))
121         screen.blit(text,(0,0)) #在屏幕左上角显示分数
122     else :
123         text1 = font.render("Score:%d" %score,1,(0,0,0))
124         text2 = font.render("click restart",1,(0,0,0))
125         screen.blit(text1,(190,400)) #在屏幕中间显示分数
126         screen.blit(text2,(170,420))
127     pygame.display.update()    #刷新

 

posted @ 2017-10-03 16:31  启动  阅读(1233)  评论(0编辑  收藏  举报