用Python开发一个迷你打飞机的游戏
转自:python专栏
1、打飞机的游戏
👉点击领取:最全Python资料合集
2、代码量200多行
3)我方战机
# 玩家类class Player(pygame.sprite.Sprite):def __init__(self, plane_img, player_rect, init_pos):pygame.sprite.Sprite.__init__(self)self.image = [] # 用来存储玩家对象精灵图片的列表for i in range(len(player_rect)):self.image.append(plane_img.subsurface(player_rect[i]).convert_alpha())self.rect = player_rect[0] # 初始化图片所在的矩形self.rect.topleft = init_pos # 初始化矩形的左上角坐标self.speed = 8 # 初始化玩家速度,这里是一个确定的值self.bullets = pygame.sprite.Group() # 玩家飞机所发射的子弹的集合self.img_index = 0 # 玩家精灵图片索引self.is_hit = False # 玩家是否被击中def shoot(self, bullet_img):bullet = Bullet(bullet_img, self.rect.midtop)self.bullets.add(bullet)def moveUp(self):if self.rect.top <= 0:self.rect.top = 0else:self.rect.top -= self.speeddef moveDown(self):if self.rect.top >= SCREEN_HEIGHT - self.rect.height:self.rect.top = SCREEN_HEIGHT - self.rect.heightelse:self.rect.top += self.speeddef moveLeft(self):if self.rect.left <= 0:self.rect.left = 0else:self.rect.left -= self.speeddef moveRight(self):if self.rect.left >= SCREEN_WIDTH - self.rect.width:self.rect.left = SCREEN_WIDTH - self.rect.widthelse:self.rect.left += self.speed
1)先是初始化游戏的界面大小,字体等等,读取声音和图片和基本配置:
# 初始化游戏pygame.init()screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))pygame.display.set_caption('飞机大战')# 载入游戏音乐bullet_sound = pygame.mixer.Sound('resources/sound/bullet.wav')enemy1_down_sound = pygame.mixer.Sound('resources/sound/enemy1_down.wav')game_over_sound = pygame.mixer.Sound('resources/sound/game_over.wav')bullet_sound.set_volume(0.3)enemy1_down_sound.set_volume(0.3)game_over_sound.set_volume(0.3)pygame.mixer.music.load('resources/sound/game_music.wav')pygame.mixer.music.play(-1, 0.0)pygame.mixer.music.set_volume(0.25)# 载入背景图background = pygame.image.load('resources/image/background.png').convert()game_over = pygame.image.load('resources/image/gameover.png')filename = 'resources/image/shoot.png'plane_img = pygame.image.load(filename)
其实用一个大的while 循环来写整个游戏的逻辑部分
while running:# 控制游戏最大帧率为60clock.tick(60)# 控制发射子弹频率,并发射子弹if not player.is_hit:if shoot_frequency % 15 == 0:bullet_sound.play()player.shoot(bullet_img)shoot_frequency += 1if shoot_frequency >= 15:shoot_frequency = 0# 生成敌机if enemy_frequency % 50 == 0:enemy1_pos = [random.randint(0, SCREEN_WIDTH - enemy1_rect.width), 0]enemy1 = Enemy(enemy1_img, enemy1_down_imgs, enemy1_pos)enemies1.add(enemy1)enemy_frequency += 1if enemy_frequency >= 100:enemy_frequency = 0# 移动子弹,若超出窗口范围则删除for bullet in player.bullets:bullet.move()if bullet.rect.bottom < 0:player.bullets.remove(bullet)# 移动敌机,若超出窗口范围则删除for enemy in enemies1:enemy.move()# 判断玩家是否被击中if pygame.sprite.collide_circle(enemy, player):enemies_down.add(enemy)enemies1.remove(enemy)player.is_hit = Truegame_over_sound.play()breakif enemy.rect.top > SCREEN_HEIGHT:enemies1.remove(enemy)# 将被击中的敌机对象添加到击毁敌机Group中,用来渲染击毁动画enemies1_down = pygame.sprite.groupcollide(enemies1, player.bullets, 1, 1)for enemy_down in enemies1_down:enemies_down.add(enemy_down)# 绘制背景screen.fill(0)screen.blit(background, (0, 0))# 绘制玩家飞机if not player.is_hit:screen.blit(player.image[player.img_index], player.rect)# 更换图片索引使飞机有动画效果player.img_index = shoot_frequency // 8else:player.img_index = player_down_index // 8screen.blit(player.image[player.img_index], player.rect)player_down_index += 1if player_down_index > 47:running = False# 绘制击毁动画for enemy_down in enemies_down:if enemy_down.down_index == 0:enemy1_down_sound.play()if enemy_down.down_index > 7:enemies_down.remove(enemy_down)score += 1000continuescreen.blit(enemy_down.down_imgs[enemy_down.down_index // 2], enemy_down.rect)enemy_down.down_index += 1# 绘制子弹和敌机player.bullets.draw(screen)enemies1.draw(screen)
先绘制出背景幕布 再绘制出玩家的战机,敌机 绑定战机和敌机的鼠标和键盘响应事件 发射子弹,通过坐标来判断子弹和敌机的碰撞,以及敌机和玩家战机的碰撞 最后还要计算得分
热门推荐