diff --git a/Planewar.py b/Planewar.py index d4c8259b310ceb395951a6462d3780414e484dca..ec2434dd6aee34e15dfca9a85f4a8765e0de2af8 100644 --- a/Planewar.py +++ b/Planewar.py @@ -10,8 +10,8 @@ import time import random import pickle -width = 901 -height = 897 +width = 512 +height = 768 score = 0 enemy_list = [] bullet_list = [] @@ -50,25 +50,35 @@ class BasePlane(Base): global enemy_list global width, height - def __init__(self, plane_type, screen_temp, x, y, image_name, picture_num, HP_temp, authority): - Base.__init__(self, screen_temp, x, y, image_name) # plane_type飞机类型 + def __init__(self, plane_type, screen_temp, x, y, image, picture_num, HP_temp, authority): + Base.__init__(self, screen_temp, x, y, image) # plane_type飞机类型 self.bullet_list = [] # 存储发射出去的子弹的引用 self.plane_type = plane_type # 飞机类型标示 self.hp = HP_temp # 飞机hp self.authority = authority self.time = 0 # self.fire_bullet_count = 0#飞机已发射子弹计数 - + self.explode_image = [pygame.transform.scale(pygame.image.load('image/explode/explode1.png').convert_alpha(), (self.w, self.h)), + pygame.transform.scale(pygame.image.load('image/explode/explode2.png').convert_alpha(), (self.w, self.h)), + pygame.transform.scale(pygame.image.load('image/explode/explode3.png').convert_alpha(), (self.w, self.h))] + def display(self): global score if self.hp > 0: self.screen.blit(self.image, (self.x, self.y)) self.hit() else: - if self.time < 100: - explode_image = pygame.image.load('image/explode/explode2.png').convert_alpha() + if self.time < 10: self.screen.blit(self.image, (self.x, self.y)) - self.screen.blit(explode_image, (self.x, self.y)) + self.screen.blit(self.explode_image[0], (self.x, self.y)) + self.time += 1 + elif self.time < 20: + self.screen.blit(self.image, (self.x, self.y)) + self.screen.blit(self.explode_image[1], (self.x, self.y)) + self.time += 1 + elif self.time < 30: + self.screen.blit(self.image, (self.x, self.y)) + self.screen.blit(self.explode_image[2], (self.x, self.y)) self.time += 1 else: if self.authority == 'enemy' and self.hp <= 0: @@ -86,6 +96,15 @@ class BasePlane(Base): self.hp -= bullet.damage bullet.damage = 0 bullet.visible = False + if supply_list and self.hp: + for supply in supply_list: + if self.authority == 'player': + if supply.x < self.x + self.w and supply.x + supply.w > self.x and supply.y < self.y + self.h and supply.y + supply.h > self.y: + self.hp += supply.capacity + if self.hp > self.hp_amount: + self.hp = self.hp_amount + supply.capacity = 0 + supply.visible = False def pos_check(self): if self.x < 0: @@ -103,10 +122,11 @@ class BasePlane(Base): class EnemyPlane(BasePlane): def __init__(self, screen_temp): + image_list = ["image/enemyplane/enemyplane1.png", "image/enemyplane/enemyplane2.png", "image/enemyplane/enemyplane3.png"] random_num_x = random.randint(12, 418) - random_num_y = random.randint(-50, -40) + random_num_y = random.randint(-100, -10) self.direction = "left" - BasePlane.__init__(self, 0, screen_temp, random_num_x, random_num_y, "image/enemyplane/enemyplane1.png", 4, 1, "enemy") + BasePlane.__init__(self, 0, screen_temp, random_num_x, random_num_y, image_list[random.randint(0, 2)], 4, 1, "enemy") def move(self): self.pos_check() @@ -129,25 +149,73 @@ class EnemyPlane(BasePlane): else: self.bullet_list.append(Bullet(self.screen, self.x, self.y + 60, 'enemy')) +class BossPlane(BasePlane): + def __init__(self, screen_temp): + BasePlane.__init__(self, 0, screen_temp, 0, -100, "image/enemyplane/enemyplane4.png", 4, 20, "enemy") + self.x = width / 2 - self.w / 2 + self.bar = Bar(screen_temp, int(width * 0.1), int(height * 0.1), int(width * 0.8), int(height * 0.02)) + + def move(self): + self.fire() + if self.y < 100: + self.y += 1 + + def fire(self): + if len(self.bullet_list) != 0: + if self.y - 14 + 50 > self.bullet_list[-1].y: + self.bullet_list.append(Bullet(self.screen, self.x, self.y + 60, 'enemy')) + self.bullet_list.append(Bullet(self.screen, self.x + self.w / 2, self.y + 60, 'enemy')) + else: + self.bullet_list.append(Bullet(self.screen, self.x, self.y + 60, 'enemy')) + self.bullet_list.append(Bullet(self.screen, self.x + self.w / 2, self.y + 60, 'enemy')) class PlayerPlane(BasePlane): global supply_size - def __init__(self, screen_temp, player_no): - #x = self.screen.get_width()/2 # 默认玩家出现在最下面最中间 - #y = self.screen.get_height() - x = 400 - y = 200 - BasePlane.__init__(self, 3, screen_temp, x, y, "image/plane/plane1.png", 4, 10, "player") #super().__init__() + def __init__(self, screen_temp, x, y, player_no): + self.image_list = ["image/plane/plane1.png", "image/plane/plane2.png", "image/plane/plane3.png", "image/plane/plane4.png"] + BasePlane.__init__(self, 3, screen_temp, x - 40, y - 100, self.image_list[0], 4, 100, "player") #super().__init__() self.player_no = player_no - self.level = 1 + self.level = 0 + self.levelup_flag = False + self.levelup_time = 0 self.exp = 0 self.hp_amount = 100 self.move_dict = {'horizontal': 0, 'vertical': 0, 'space': 0} + self.levelup_image = [pygame.transform.scale(pygame.image.load('image/levelup/1.png').convert_alpha(), (self.w, self.h)), + pygame.transform.scale(pygame.image.load('image/levelup/2.png').convert_alpha(), (self.w, self.h)), + pygame.transform.scale(pygame.image.load('image/levelup/3.png').convert_alpha(), (self.w, self.h)), + pygame.transform.scale(pygame.image.load('image/levelup/4.png').convert_alpha(), (self.w, self.h))] - def levelup(self): - self.level += 1 + def levelup(self): + if(score <= 150): + if int(score / 50) > self.level : + self.level = int(score / 50) + self.levelup_flag = True + self.image = pygame.image.load(self.image_list[self.level]).convert_alpha() + if self.levelup_flag: + if self.levelup_time < 20: + self.screen.blit(self.image, (self.x, self.y)) + self.screen.blit(self.levelup_image[0], (self.x, self.y)) + self.levelup_time += 1 + elif self.levelup_time < 40: + self.screen.blit(self.image, (self.x, self.y)) + self.screen.blit(self.levelup_image[1], (self.x, self.y)) + self.levelup_time += 1 + elif self.levelup_time < 60: + self.screen.blit(self.image, (self.x, self.y)) + self.screen.blit(self.levelup_image[2], (self.x, self.y)) + self.levelup_time += 1 + elif self.levelup_time < 80: + self.screen.blit(self.image, (self.x, self.y)) + self.screen.blit(self.levelup_image[3], (self.x, self.y)) + self.levelup_time += 1 + else: + self.levelup_flag = False + self.levelup_time = 0 + def move(self, horizontal_speed, vertical_speed): + self.levelup() self.pos_check() if self.move_dict['horizontal'] != 0 and self.move_dict['vertical'] != 0: self.x += horizontal_speed * self.move_dict['horizontal'] @@ -192,15 +260,27 @@ class Bullet(Base): elif self.authority == 'enemy': self.y += 8 +class Supply(Base): + def __init__(self, screen_temp): + random_num_x = random.randint(12, 418) + random_num_y = random.randint(-100, -10) + super().__init__(screen_temp, random_num_x, random_num_y, "image/supply/hpsupply.png") + self.capacity = random.randint(1, 20) + self.visible = True -class PlayerBullet(Bullet): - global bullet_type - - -class EnemyBullet(Bullet): - global bullet_type - - + def display(self): + if self.visible: + self.screen.blit(self.image, (self.x, self.y)) + + def judge(self): + if self.y < 797: + return True + else: + return False + + def move(self): + self.y += 1 + class Game(object): def __init__(self, screen, player_list, enemy_list): self.player_list = player_list @@ -217,7 +297,19 @@ class Game(object): model = pickle.load(f) return model +# 血条 +class Bar(object): + def __init__(self, screen, x, y, w, h): + self.x = x + self.y = y + self.w = w + self.h = h + self.screen = screen + def display(self, percent): + pygame.draw.rect(self.screen, (178, 178, 178), (self.x, self.y, self.w, self.h)) + pygame.draw.rect(self.screen, (255, 0, 0), (self.x, self.y, self.w * percent, self.h)) + # 标签 class Label(object): def __init__(self, screen, x, y, w, h): @@ -266,18 +358,6 @@ class Button(object): 1] > self.y: return True - -class Supply(Base): - def __init__(self, screen_temp, x, y, image_name, supply_type): - super().__init__(screen_temp, x, y, image_name) - - def display(self): - self.screen.blit(self.image, (self.x, self.y)) - - def move(self): - self.y += 1 - - def sum_bullet(player_list, enemy_list): global bullet_list for item in player_list: @@ -288,12 +368,15 @@ def sum_bullet(player_list, enemy_list): def create_enemy(screen): - global width global enemy_list if len(enemy_list) < 5: enemy_list.append(EnemyPlane(screen)) - +def create_supply(screen): + global supply_list + if len(supply_list) < 1: + supply_list.append(Supply(screen)) + def game_fail(): pass @@ -430,12 +513,12 @@ def main(): global supply_list pygame.init() # 初始化pygame - bg_size = width, height = 512,768 + bg_size = width, height screen = pygame.display.set_mode(bg_size) # 显示窗口 pygame.display.set_caption("飞机大战") - #创建一个背景图片,路径需做出背景图片放入文件夹中填入路径,haven't finished + #创建一个背景图片,路径需做出背景图片放入文件夹中填入路径 background = pygame.image.load("image/background/background1.jpg").convert() score_label = Label(screen, width - 120, 0, 120, 30) @@ -610,17 +693,20 @@ def main(): if game_status is start: horizontal_speed = 10 - game_level vertical_speed = 10 - game_level - print(horizontal_speed) + #print(horizontal_speed) if game_mode == 'single': - player_list = [PlayerPlane(screen, player_no=0)] + player_list = [PlayerPlane(screen, width / 2, height, player_no=0)] + bar_list = [Bar(screen, int(width * 0.1), int(height * 0.9), int(width * 0.8), int(height * 0.02))] else: - player_list = [PlayerPlane(screen, player_no=0), - PlayerPlane(screen, player_no=1)] - + player_list = [PlayerPlane(screen, width / 3, height, player_no=0), + PlayerPlane(screen, width / 3 * 2, height, player_no=1)] + bar_list = [Bar(screen, int(width * 0.1), int(height * 0.9), int(width * 0.35), int(height * 0.02)), + Bar(screen, int(width * 0.55), int(height * 0.9), int(width * 0.35), int(height * 0.02))] button_pause_text = "Pause" game_pause = False button_pause = Button(screen, width - 120, 30, 120, 30, button_pause_text) - + boss_num = 0 + while True: if game_status is main_menu: print("main menu") @@ -634,12 +720,23 @@ def main(): # Game(screen, player_list, enemy_list) # Game.load_game() - for player in player_list: - player.display() + for i in range(len(player_list)): + player_list[i].display() + bar_list[i].display(player_list[i].hp / player_list[i].hp_amount) + create_enemy(screen) + create_supply(screen) + if int(score / 100) > boss_num: + enemy_list.append(BossPlane(screen)) + boss_num += 1 for enemy in enemy_list: enemy.display() enemy.move() + if isinstance(enemy, BossPlane): + enemy.bar.display(enemy.hp / 20) + for supply in supply_list: + supply.display() + supply.move() bullet_list = [] bullet_list = sum_bullet(player_list, enemy_list) # bullet_del_list = [] @@ -647,6 +744,9 @@ def main(): if item.judge(): item.display() item.move() + for supply in supply_list: + if not supply.judge(): + supply_list.remove(supply) ''' else: bullet_del_list.append(item) for item in bullet_del_list: @@ -664,6 +764,7 @@ def main(): if player_list[0].hp <= 0: player_list.clear() enemy_list.clear() + supply_list.clear() pygame.display.update() game_status = end_menu break @@ -678,7 +779,5 @@ def main(): pygame.display.update() time.sleep(0.02) - - if __name__ == "__main__": main() diff --git a/image/levelup/1.png b/image/levelup/1.png new file mode 100644 index 0000000000000000000000000000000000000000..97e83a13dff43feef3917af2e9808332f6e8a681 Binary files /dev/null and b/image/levelup/1.png differ diff --git a/image/levelup/2.png b/image/levelup/2.png new file mode 100644 index 0000000000000000000000000000000000000000..56e084e823e176a44aabf91287848521fb685584 Binary files /dev/null and b/image/levelup/2.png differ diff --git a/image/levelup/3.png b/image/levelup/3.png new file mode 100644 index 0000000000000000000000000000000000000000..bb4997c5d959d12911c0bba577c811308fa69ab8 Binary files /dev/null and b/image/levelup/3.png differ diff --git a/image/levelup/4.png b/image/levelup/4.png new file mode 100644 index 0000000000000000000000000000000000000000..fed6f43eeda1f6d09c0563366ff9ad32b888f36d Binary files /dev/null and b/image/levelup/4.png differ diff --git a/image/supply/hpsupply.png b/image/supply/hpsupply.png new file mode 100644 index 0000000000000000000000000000000000000000..689af434a840ae513a7677a8f1a4e1cbb2923630 Binary files /dev/null and b/image/supply/hpsupply.png differ