WXr/半成.py

109 lines
5.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import pygame #导入pygame模块
from pygame.locals import * #导入pygame.locals模块
import time #导入time模块
#子弹类
class Bullet(object):
#构造方法,用于初始化子弹对象的属性
def __init__(self, screen_temp, x, y):
self.x = x+40 #子弹起始x坐标
self.y = y-20 #子弹起始y坐标
self.screen = screen_temp #窗口
self.image = pygame.image.load("C:/work/youxi/zidan.png") #创建一个子弹图片
#显示子弹图片的方法
def display(self):
self.screen.blit(self.image, (self.x, self.y)) #显示子弹图片
#子弹移动方法
def move(self):
self.y-=10 #子弹y坐标自减10
#判断子弹是否越界的方法
def judge(self):
if self.y<0: #如果子弹的y坐标小于0
return True #返回true正确
else:
return False #返回false错误
#玩家飞机类
class Aircraft_obj(object):
#构造方法,初始化飞机对象的属性
def __init__(self, screen_temp):
self.x = 190 #飞起起始x坐标
self.y = 708 #飞机起始y坐标
self.screen = screen_temp #窗口
self.image = pygame.image.load("C:/work/youxi/1.png") #创建一个飞机图片
self.bullet_list = [] #存储发射出去的子弹对象
#显示飞机图片的方法(这里包括了显示子弹的图片)
def display(self):
self.screen.blit(self.image, (self.x, self.y)) #显示飞机图片
#显示飞机发射的所有子弹
for bullet in self.bullet_list:
bullet.display() #显示子弹
bullet.move() #移动子弹
if bullet.judge(): #判断子弹是否越界
self.bullet_list.remove(bullet) #删除子弹
#飞机左移方法
def move_left(self):
if self.x < 10: #x坐标小于10移动距离
pass #不做任何事
else:
self.x -= 10 #X坐标自减少10
#飞机右移方法
def move_right(self):
if self.x > 480-100-10: #X坐标大于窗口宽度-飞机宽度-移动距离)的值
pass #不做任何事
else:
self.x += 10 #坐标自增加10
#存储发射子弹的方法
def fire(self):
self.bullet_list.append(Bullet(self.screen, self.x, self.y))#将发射的子弹对象存储到bullet_list中
#敌机类
class EnemyPlane(object):
#构造方法,初始化敌机对象的属性
def __init__(self, screen_temp):
self.x = 0 #敌机的起始x坐标
self.y = 0 #敌机的起始y坐标
self.screen = screen_temp #窗口
self.image = pygame.image.load("C:/work/youxi/2.png") #创建一个敌机图片
self.direction = "right" #用来存储飞机移动方向,默认向右移动
#爆炸效果用的属性
self.hit = False #表示是否要爆炸
self.bomb_lists = [] #用来存储爆炸时需要的图片
self.__crate_images() #调用这个方法向bomb_lists中添加图片
self.image_num = 0 #用来记录while循环的次数当次数达到一定值时才显示一张爆炸的图然后清空
self.image_index = 0 #用来记录当前要显示的爆炸效果的图片的序号
#敌机移动方法
def move(self):
if self.hit == True: #如被击中,敌机不移动
pass
else:
if self.direction=="right": #如果是向右移动
self.x += 5 #x坐标自增加5
elif self.direction=="left": #如果是向左移动
self.x -= 5 #x坐标自减少5
if self.x>480-50: #如x坐标大于窗口减去敌机宽度的值
self.direction = "left" #移动方向改为左
elif self.x<0: #如果x坐标小于0
self.direction = "right" #移动方向改为右
#将爆炸需要的图片添加到self.bomb_lists中
def __crate_images(self):
self.bomb_lists.append(pygame.image.load("C:/work/youxi/zha.png"))
self.bomb_lists.append(pygame.image.load("C:/work/youxi/zha.png"))
self.bomb_lists.append(pygame.image.load("C:/work/youxi/zha.png"))
self.bomb_lists.append(pygame.image.load("C:/work/youxi/zha.png"))
#判断爆炸的方法x1为子弹最左侧的横坐标x2为子弹最右侧的横坐标y为子弹当前的纵坐标
def blast(self,x1,x2,y):
#判断子弹能命中敌机的三种情况51是敌机图片的宽度39是敌机图片的高度
if ((x1>=self.x and x2<=self.x+51) or x2==self.x or x1==self.x+51) and y<39:
self.hit = True
def display(self): #显示敌机的方法
#如果被击中,就显示爆炸效果,否则显示普通的飞机效果
if self.hit == True: #如果满足爆炸条件,就显示爆炸的图片
self.screen.blit(self.bomb_lists[self.image_index], (self.x, self.y))
self.image_num+=1 #统计循环次数,为了使玩家看清爆炸效果
if self.image_num == 7: #如果循环次数达到7次
self.image_num=0 #将循环次数改为0次
self.image_index+=1 #图片显示序号加1换为另一张图
if self.image_index>3: #如果图片序号大于3一共4张图片
time.sleep(1) #暂停一秒
exit() #调用exit退出游戏
else: #否则显示正常的敌机图片
self.screen.blit(self.image,(self.x, self.y))