参考资料

  • 《零基础入门学习python》

源代码以及素材资料(图片,音频)可从下面的github中下载:

  • 飞机大战源代码以及素材资料github项目地址链接

—————————————————————————————————————————————————————

文章目录

  • 经典飞机大战

    • 一.游戏设定
    • 二.我方飞机
    • 三.敌方飞机
    • 四.发射子弹
    • 五.发放补给包
    • 六.主模块

经典飞机大战

不知道大家有没有打过飞机,喜不喜欢打飞机。当我第一次接触这个东西的时候,我的内心是被震撼到的。第一次接触打飞机的时候作者本人是身心愉悦的,因为周边的朋友都在打飞机, 每次都会下意识彼此较量一下,看谁打得更好。打飞机也是需要有一定的技巧的,熟练的朋友一把能打上半个小时,生疏的则三五分钟就败下阵来。

一.游戏设定

游戏界面如下图所示
游戏的基本设定:

另外还对游戏做了一些改进,比如为中飞机和大飞机增加了血槽的显示,这样玩家可以直观地知道敌机快被消灭了没有;我方有三次机会,每次被敌人消灭,新诞生的飞机会有3秒钟的安全期;游戏结束后会显示历史最高分数。

这个游戏加上基本的注释代码量在800行左右,代码看上去比较多,多打代码少动脑。所以大家不要怕,越是多的代码,逻辑就越容易看得清楚,就越好学习。好,那让我们从无到有,从简单到复杂来一起打造这个游戏吧!

 

二.我方飞机

首先创建一个myplane. py模块来定义我方飞机:

import pygameclass MyPlane(pygame.sprite.Sprite):def __init__(self, bg_size):pygame.sprite.Sprite.__init__(self)self.image1 = pygame.image.load("images/me1.png").convert_alpha()self.image2 = pygame.image.load("images/me2.png").convert_alpha()self.destroy_images = []self.destroy_images.extend([\pygame.image.load("images/me_destroy_1.png").convert_alpha(), \pygame.image.load("images/me_destroy_2.png").convert_alpha(), \pygame.image.load("images/me_destroy_3.png").convert_alpha(), \pygame.image.load("images/me_destroy_4.png").convert_alpha() \])self.rect = self.image1.get_rect()self.width, self.height = bg_size[0], bg_size[1]self.rect.left, self.rect.top = \(self.width - self.rect.width) // 2, \self.height - self.rect.height - 60self.speed = 10self.active = Trueself.invincible = Falseself.mask = pygame.mask.from_surface(self.image1)# 分别定义moveUp()、moveDown()、moveLeft()和moveRight()控制我方飞机上、下、左、右移动:def moveUp(self):if self.rect.top > 0:self.rect.top -= self.speedelse:self.rect.top = 0def moveDown(self):if self.rect.bottom < self.height - 60:self.rect.top += self.speedelse:self.rect.bottom = self.height - 60def moveLeft(self):if self.rect.left > 0:self.rect.left -= self.speedelse:self.rect.left = 0def moveRight(self):if self.rect.right < self.width:self.rect.left += self.speedelse:self.rect.right = self.widthdef reset(self):self.rect.left, self.rect.top = \(self.width - self.rect.width) // 2, \self.height - self.rect.height - 60self.active = Trueself.invincible = True

三.敌方飞机

既然英雄已经有了,那现在就是需要创造敌人的时候。敌机分为小、中、大三个尺寸,它们的速度依次是快、中、慢,在游戏界面的上方位置创造位置随机的敌机,可以让它们不在同一排出现。将敌机的定义写在enemy. py模块中:

import pygame
from random import *class SmallEnemy(pygame.sprite.Sprite):def __init__(self, bg_size):pygame.sprite.Sprite.__init__(self)self.image = pygame.image.load("images/enemy1.png").convert_alpha()self.destroy_images = []self.destroy_images.extend([ \pygame.image.load("images/enemy1_down1.png").convert_alpha(), \pygame.image.load("images/enemy1_down2.png").convert_alpha(), \pygame.image.load("images/enemy1_down3.png").convert_alpha(), \pygame.image.load("images/enemy1_down4.png").convert_alpha() \])self.rect = self.image.get_rect()self.width, self.height = bg_size[0], bg_size[1]self.speed = 2self.active = Trueself.rect.left, self.rect.top = \randint(0, self.width - self.rect.width), \randint(-5 * self.height, 0)self.mask = pygame.mask.from_surface(self.image)def move(self):if self.rect.top < self.height:self.rect.top += self.speedelse:self.reset()def reset(self):self.active = Trueself.rect.left, self.rect.top = \randint(0, self.width - self.rect.width), \randint(-5 * self.height, 0)class MidEnemy(pygame.sprite.Sprite):energy = 8def __init__(self, bg_size):pygame.sprite.Sprite.__init__(self)self.image = pygame.image.load("images/enemy2.png").convert_alpha()self.image_hit = pygame.image.load("images/enemy2_hit.png").convert_alpha()self.destroy_images = []self.destroy_images.extend([ \pygame.image.load("images/enemy2_down1.png").convert_alpha(), \pygame.image.load("images/enemy2_down2.png").convert_alpha(), \pygame.image.load("images/enemy2_down3.png").convert_alpha(), \pygame.image.load("images/enemy2_down4.png").convert_alpha() \])self.rect = self.image.get_rect()self.width, self.height = bg_size[0], bg_size[1]self.speed = 1self.active = Trueself.rect.left, self.rect.top = \randint(0, self.width - self.rect.width), \randint(-10 * self.height, -self.height)self.mask = pygame.mask.from_surface(self.image)self.energy = MidEnemy.energyself.hit = Falsedef move(self):if self.rect.top < self.height:self.rect.top += self.speedelse:self.reset()def reset(self):self.active = Trueself.energy = MidEnemy.energyself.rect.left, self.rect.top = \randint(0, self.width - self.rect.width), \randint(-10 * self.height, -self.height)class BigEnemy(pygame.sprite.Sprite):energy = 20def __init__(self, bg_size):pygame.sprite.Sprite.__init__(self)self.image1 = pygame.image.load("images/enemy3_n1.png").convert_alpha()self.image2 = pygame.image.load("images/enemy3_n2.png").convert_alpha()self.image_hit = pygame.image.load("images/enemy3_hit.png").convert_alpha()self.destroy_images = []self.destroy_images.extend([ \pygame.image.load("images/enemy3_down1.png").convert_alpha(), \pygame.image.load("images/enemy3_down2.png").convert_alpha(), \pygame.image.load("images/enemy3_down3.png").convert_alpha(), \pygame.image.load("images/enemy3_down4.png").convert_alpha(), \pygame.image.load("images/enemy3_down5.png").convert_alpha(), \pygame.image.load("images/enemy3_down6.png").convert_alpha() \])self.rect = self.image1.get_rect()self.width, self.height = bg_size[0], bg_size[1]self.speed = 1self.active = Trueself.rect.left, self.rect.top = \randint(0, self.width - self.rect.width), \randint(-15 * self.height, -5 * self.height)self.mask = pygame.mask.from_surface(self.image1)self.energy = BigEnemy.energyself.hit = Falsedef move(self):if self.rect.top < self.height:self.rect.top += self.speedelse:self.reset()def reset(self):self.active = Trueself.energy = BigEnemy.energyself.rect.left, self.rect.top = \randint(0, self.width - self.rect.width), \randint(-15 * self.height, -5 * self.height)

四.发射子弹

现在的情况是我方飞机处于落后挨打的状态,敌强我弱,所以应该拿起武器进行反击! 接下来定义子弹,子弹分为两种: 一种是普通子弹一次只发射一颗; 另一种是补给发放的超级子弹一次可以发射两颗。

我们将子弹定义为独立的模块bullet.py:

import pygameclass Bullet1(pygame.sprite.Sprite):def __init__(self, position):pygame.sprite.Sprite.__init__(self)self.image = pygame.image.load("images/bullet1.png").convert_alpha()self.rect = self.image.get_rect()self.rect.left, self.rect.top = positionself.speed = 12self.active = Falseself.mask = pygame.mask.from_surface(self.image)def move(self):self.rect.top -= self.speedif self.rect.top < 0:self.active = Falsedef reset(self, position):self.rect.left, self.rect.top = positionself.active = Trueclass Bullet2(pygame.sprite.Sprite):def __init__(self, position):pygame.sprite.Sprite.__init__(self)self.image = pygame.image.load("images/bullet2.png").convert_alpha()self.rect = self.image.get_rect()self.rect.left, self.rect.top = positionself.speed = 14self.active = Falseself.mask = pygame.mask.from_surface(self.image)def move(self):self.rect.top -= self.speedif self.rect.top < 0:self.active = Falsedef reset(self, position):self.rect.left, self.rect.top = positionself.active = True

五.发放补给包

游戏设计每30秒随机发放一个补给包,可 能是超级子弹,也可能是全屏炸弹。补给包有自己的图像和运动轨迹,不妨单独为其定义一个模块supply.py:

import pygame
from random import *class Bullet_Supply(pygame.sprite.Sprite):def __init__(self, bg_size):pygame.sprite.Sprite.__init__(self)self.image = pygame.image.load("images/bullet_supply.png").convert_alpha()self.rect = self.image.get_rect()self.width, self.height = bg_size[0], bg_size[1]self.rect.left, self.rect.bottom = \randint(0, self.width - self.rect.width), -100self.speed = 5self.active = Falseself.mask = pygame.mask.from_surface(self.image)def move(self):if self.rect.top < self.height:self.rect.top += self.speedelse:self.active = Falsedef reset(self):self.active = Trueself.rect.left, self.rect.bottom = \randint(0, self.width - self.rect.width), -100class Bomb_Supply(pygame.sprite.Sprite):def __init__(self, bg_size):pygame.sprite.Sprite.__init__(self)self.image = pygame.image.load("images/bomb_supply.png").convert_alpha()self.rect = self.image.get_rect()self.width, self.height = bg_size[0], bg_size[1]self.rect.left, self.rect.bottom = \randint(0, self.width - self.rect.width), -100self.speed = 5self.active = Falseself.mask = pygame.mask.from_surface(self.image)def move(self):if self.rect.top < self.height:self.rect.top += self.speedelse:self.active = Falsedef reset(self):self.active = Trueself.rect.left, self.rect.bottom = \randint(0, self.width - self.rect.width), -100

六.主模块

所有的模块都到齐了,接下来就该实现我们的主模块了


# main.py
import pygame
import sys
import traceback
import myplane
import enemy
import bullet
import supplyfrom pygame.locals import *
from random import *pygame.init()
pygame.mixer.init()bg_size = width, height = 480, 700
screen = pygame.display.set_mode(bg_size)
pygame.display.set_caption("飞机大战 -- FishC Demo")background = pygame.image.load("images/background.png").convert()BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)# 载入游戏音乐
pygame.mixer.music.load("sound/game_music.ogg")
pygame.mixer.music.set_volume(0.2)
bullet_sound = pygame.mixer.Sound("sound/bullet.wav")
bullet_sound.set_volume(0.2)
bomb_sound = pygame.mixer.Sound("sound/use_bomb.wav")
bomb_sound.set_volume(0.2)
supply_sound = pygame.mixer.Sound("sound/supply.wav")
supply_sound.set_volume(0.2)
get_bomb_sound = pygame.mixer.Sound("sound/get_bomb.wav")
get_bomb_sound.set_volume(0.2)
get_bullet_sound = pygame.mixer.Sound("sound/get_bullet.wav")
get_bullet_sound.set_volume(0.2)
upgrade_sound = pygame.mixer.Sound("sound/upgrade.wav")
upgrade_sound.set_volume(0.2)
enemy3_fly_sound = pygame.mixer.Sound("sound/enemy3_flying.wav")
enemy3_fly_sound.set_volume(0.2)
enemy1_down_sound = pygame.mixer.Sound("sound/enemy1_down.wav")
enemy1_down_sound.set_volume(0.2)
enemy2_down_sound = pygame.mixer.Sound("sound/enemy2_down.wav")
enemy2_down_sound.set_volume(0.2)
enemy3_down_sound = pygame.mixer.Sound("sound/enemy3_down.wav")
enemy3_down_sound.set_volume(0.5)
me_down_sound = pygame.mixer.Sound("sound/me_down.wav")
me_down_sound.set_volume(0.2)def add_small_enemies(group1, group2, num):for i in range(num):e1 = enemy.SmallEnemy(bg_size)group1.add(e1)group2.add(e1)def add_mid_enemies(group1, group2, num):for i in range(num):e2 = enemy.MidEnemy(bg_size)group1.add(e2)group2.add(e2)def add_big_enemies(group1, group2, num):for i in range(num):e3 = enemy.BigEnemy(bg_size)group1.add(e3)group2.add(e3)def inc_speed(target, inc):for each in target:each.speed += incdef main():pygame.mixer.music.play(-1)# 生成我方飞机me = myplane.MyPlane(bg_size)enemies = pygame.sprite.Group()# 生成敌方小型飞机small_enemies = pygame.sprite.Group()add_small_enemies(small_enemies, enemies, 15)# 生成敌方中型飞机mid_enemies = pygame.sprite.Group()add_mid_enemies(mid_enemies, enemies, 4)# 生成敌方大型飞机big_enemies = pygame.sprite.Group()add_big_enemies(big_enemies, enemies, 2)# 生成普通子弹bullet1 = []bullet1_index = 0BULLET1_NUM = 4for i in range(BULLET1_NUM):bullet1.append(bullet.Bullet1(me.rect.midtop))# 生成超级子弹bullet2 = []bullet2_index = 0BULLET2_NUM = 8for i in range(BULLET2_NUM // 2):bullet2.append(bullet.Bullet2((me.rect.centerx - 33, me.rect.centery)))bullet2.append(bullet.Bullet2((me.rect.centerx + 30, me.rect.centery)))clock = pygame.time.Clock()# 中弹图片索引e1_destroy_index = 0e2_destroy_index = 0e3_destroy_index = 0me_destroy_index = 0# 统计得分score = 0score_font = pygame.font.Font("font/font.ttf", 36)# 标志是否暂停游戏paused = Falsepause_nor_image = pygame.image.load("images/pause_nor.png").convert_alpha()pause_pressed_image = pygame.image.load("images/pause_pressed.png").convert_alpha()resume_nor_image = pygame.image.load("images/resume_nor.png").convert_alpha()resume_pressed_image = pygame.image.load("images/resume_pressed.png").convert_alpha()paused_rect = pause_nor_image.get_rect()paused_rect.left, paused_rect.top = width - paused_rect.width - 10, 10paused_image = pause_nor_image# 设置难度级别level = 1# 全屏炸弹bomb_image = pygame.image.load("images/bomb.png").convert_alpha()bomb_rect = bomb_image.get_rect()bomb_font = pygame.font.Font("font/font.ttf", 48)bomb_num = 3# 每30秒发放一个补给包bullet_supply = supply.Bullet_Supply(bg_size)bomb_supply = supply.Bomb_Supply(bg_size)SUPPLY_TIME = USEREVENTpygame.time.set_timer(SUPPLY_TIME, 30 * 1000)# 超级子弹定时器DOUBLE_BULLET_TIME = USEREVENT + 1# 标志是否使用超级子弹is_double_bullet = False# 解除我方无敌状态定时器INVINCIBLE_TIME = USEREVENT + 2# 生命数量life_image = pygame.image.load("images/life.png").convert_alpha()life_rect = life_image.get_rect()life_num = 3# 用于阻止重复打开记录文件recorded = False# 游戏结束画面gameover_font = pygame.font.Font("font/font.TTF", 48)again_image = pygame.image.load("images/again.png").convert_alpha()again_rect = again_image.get_rect()gameover_image = pygame.image.load("images/gameover.png").convert_alpha()gameover_rect = gameover_image.get_rect()# 用于切换图片switch_image = True# 用于延迟delay = 100running = Truewhile running:for event in pygame.event.get():if event.type == QUIT:pygame.quit()sys.exit()elif event.type == MOUSEBUTTONDOWN:if event.button == 1 and paused_rect.collidepoint(event.pos):paused = not pausedif paused:pygame.time.set_timer(SUPPLY_TIME, 0)pygame.mixer.music.pause()pygame.mixer.pause()else:pygame.time.set_timer(SUPPLY_TIME, 30 * 1000)pygame.mixer.music.unpause()pygame.mixer.unpause()elif event.type == MOUSEMOTION:if paused_rect.collidepoint(event.pos):if paused:paused_image = resume_pressed_imageelse:paused_image = pause_pressed_imageelse:if paused:paused_image = resume_nor_imageelse:paused_image = pause_nor_imageelif event.type == KEYDOWN:if event.key == K_SPACE:if bomb_num:bomb_num -= 1bomb_sound.play()for each in enemies:if each.rect.bottom > 0:each.active = Falseelif event.type == SUPPLY_TIME:supply_sound.play()if choice([True, False]):bomb_supply.reset()else:bullet_supply.reset()elif event.type == DOUBLE_BULLET_TIME:is_double_bullet = Falsepygame.time.set_timer(DOUBLE_BULLET_TIME, 0)elif event.type == INVINCIBLE_TIME:me.invincible = Falsepygame.time.set_timer(INVINCIBLE_TIME, 0)# 根据用户的得分增加难度if level == 1 and score > 50000:level = 2upgrade_sound.play()# 增加3架小型敌机、2架中型敌机和1架大型敌机add_small_enemies(small_enemies, enemies, 3)add_mid_enemies(mid_enemies, enemies, 2)add_big_enemies(big_enemies, enemies, 1)# 提升小型敌机的速度inc_speed(small_enemies, 1)elif level == 2 and score > 300000:level = 3upgrade_sound.play()# 增加5架小型敌机、3架中型敌机和2架大型敌机add_small_enemies(small_enemies, enemies, 5)add_mid_enemies(mid_enemies, enemies, 3)add_big_enemies(big_enemies, enemies, 2)# 提升小型敌机的速度inc_speed(small_enemies, 1)inc_speed(mid_enemies, 1)elif level == 3 and score > 600000:level = 4upgrade_sound.play()# 增加5架小型敌机、3架中型敌机和2架大型敌机add_small_enemies(small_enemies, enemies, 5)add_mid_enemies(mid_enemies, enemies, 3)add_big_enemies(big_enemies, enemies, 2)# 提升小型敌机的速度inc_speed(small_enemies, 1)inc_speed(mid_enemies, 1)elif level == 4 and score > 1000000:level = 5upgrade_sound.play()# 增加5架小型敌机、3架中型敌机和2架大型敌机add_small_enemies(small_enemies, enemies, 5)add_mid_enemies(mid_enemies, enemies, 3)add_big_enemies(big_enemies, enemies, 2)# 提升小型敌机的速度inc_speed(small_enemies, 1)inc_speed(mid_enemies, 1)screen.blit(background, (0, 0))if life_num and not paused:# 检测用户的键盘操作key_pressed = pygame.key.get_pressed()if key_pressed[K_w] or key_pressed[K_UP]:me.moveUp()if key_pressed[K_s] or key_pressed[K_DOWN]:me.moveDown()if key_pressed[K_a] or key_pressed[K_LEFT]:me.moveLeft()if key_pressed[K_d] or key_pressed[K_RIGHT]:me.moveRight()# 绘制全屏炸弹补给并检测是否获得if bomb_supply.active:bomb_supply.move()screen.blit(bomb_supply.image, bomb_supply.rect)if pygame.sprite.collide_mask(bomb_supply, me):get_bomb_sound.play()if bomb_num < 3:bomb_num += 1bomb_supply.active = False# 绘制超级子弹补给并检测是否获得if bullet_supply.active:bullet_supply.move()screen.blit(bullet_supply.image, bullet_supply.rect)if pygame.sprite.collide_mask(bullet_supply, me):get_bullet_sound.play()is_double_bullet = Truepygame.time.set_timer(DOUBLE_BULLET_TIME, 18 * 1000)bullet_supply.active = False# 发射子弹if not (delay % 10):bullet_sound.play()if is_double_bullet:bullets = bullet2bullets[bullet2_index].reset((me.rect.centerx - 33, me.rect.centery))bullets[bullet2_index + 1].reset((me.rect.centerx + 30, me.rect.centery))bullet2_index = (bullet2_index + 2) % BULLET2_NUMelse:bullets = bullet1bullets[bullet1_index].reset(me.rect.midtop)bullet1_index = (bullet1_index + 1) % BULLET1_NUM# 检测子弹是否击中敌机for b in bullets:if b.active:b.move()screen.blit(b.image, b.rect)enemy_hit = pygame.sprite.spritecollide(b, enemies, False, pygame.sprite.collide_mask)if enemy_hit:b.active = Falsefor e in enemy_hit:if e in mid_enemies or e in big_enemies:e.hit = Truee.energy -= 1if e.energy == 0:e.active = Falseelse:e.active = False# 绘制大型敌机for each in big_enemies:if each.active:each.move()if each.hit:screen.blit(each.image_hit, each.rect)each.hit = Falseelse:if switch_image:screen.blit(each.image1, each.rect)else:screen.blit(each.image2, each.rect)# 绘制血槽pygame.draw.line(screen, BLACK, \(each.rect.left, each.rect.top - 5), \(each.rect.right, each.rect.top - 5), \2)# 当生命大于20%显示绿色,否则显示红色energy_remain = each.energy / enemy.BigEnemy.energyif energy_remain > 0.2:energy_color = GREENelse:energy_color = REDpygame.draw.line(screen, energy_color, \(each.rect.left, each.rect.top - 5), \(each.rect.left + each.rect.width * energy_remain, \each.rect.top - 5), 2)# 即将出现在画面中,播放音效if each.rect.bottom == -50:enemy3_fly_sound.play(-1)else:# 毁灭if not (delay % 3):if e3_destroy_index == 0:enemy3_down_sound.play()screen.blit(each.destroy_images[e3_destroy_index], each.rect)e3_destroy_index = (e3_destroy_index + 1) % 6if e3_destroy_index == 0:enemy3_fly_sound.stop()score += 10000each.reset()# 绘制中型敌机:for each in mid_enemies:if each.active:each.move()if each.hit:screen.blit(each.image_hit, each.rect)each.hit = Falseelse:screen.blit(each.image, each.rect)# 绘制血槽pygame.draw.line(screen, BLACK, \(each.rect.left, each.rect.top - 5), \(each.rect.right, each.rect.top - 5), \2)# 当生命大于20%显示绿色,否则显示红色energy_remain = each.energy / enemy.MidEnemy.energyif energy_remain > 0.2:energy_color = GREENelse:energy_color = REDpygame.draw.line(screen, energy_color, \(each.rect.left, each.rect.top - 5), \(each.rect.left + each.rect.width * energy_remain, \each.rect.top - 5), 2)else:# 毁灭if not (delay % 3):if e2_destroy_index == 0:enemy2_down_sound.play()screen.blit(each.destroy_images[e2_destroy_index], each.rect)e2_destroy_index = (e2_destroy_index + 1) % 4if e2_destroy_index == 0:score += 6000each.reset()# 绘制小型敌机:for each in small_enemies:if each.active:each.move()screen.blit(each.image, each.rect)else:# 毁灭if not (delay % 3):if e1_destroy_index == 0:enemy1_down_sound.play()screen.blit(each.destroy_images[e1_destroy_index], each.rect)e1_destroy_index = (e1_destroy_index + 1) % 4if e1_destroy_index == 0:score += 1000each.reset()# 检测我方飞机是否被撞enemies_down = pygame.sprite.spritecollide(me, enemies, False, pygame.sprite.collide_mask)if enemies_down and not me.invincible:me.active = Falsefor e in enemies_down:e.active = False# 绘制我方飞机if me.active:if switch_image:screen.blit(me.image1, me.rect)else:screen.blit(me.image2, me.rect)else:# 毁灭if not (delay % 3):if me_destroy_index == 0:me_down_sound.play()screen.blit(me.destroy_images[me_destroy_index], me.rect)me_destroy_index = (me_destroy_index + 1) % 4if me_destroy_index == 0:life_num -= 1me.reset()pygame.time.set_timer(INVINCIBLE_TIME, 3 * 1000)# 绘制全屏炸弹数量bomb_text = bomb_font.render("× %d" % bomb_num, True, WHITE)text_rect = bomb_text.get_rect()screen.blit(bomb_image, (10, height - 10 - bomb_rect.height))screen.blit(bomb_text, (20 + bomb_rect.width, height - 5 - text_rect.height))# 绘制剩余生命数量if life_num:for i in range(life_num):screen.blit(life_image, \(width - 10 - (i + 1) * life_rect.width, \height - 10 - life_rect.height))# 绘制得分score_text = score_font.render("Score : %s" % str(score), True, WHITE)screen.blit(score_text, (10, 5))# 绘制游戏结束画面elif life_num == 0:# 背景音乐停止pygame.mixer.music.stop()# 停止全部音效pygame.mixer.stop()# 停止发放补给pygame.time.set_timer(SUPPLY_TIME, 0)if not recorded:recorded = True# 读取历史最高得分with open("record.txt", "r") as f:record_score = int(f.read())# 如果玩家得分高于历史最高得分,则存档if score > record_score:with open("record.txt", "w") as f:f.write(str(score))# 绘制结束画面record_score_text = score_font.render("Best : %d" % record_score, True, (255, 255, 255))screen.blit(record_score_text, (50, 50))gameover_text1 = gameover_font.render("Your Score", True, (255, 255, 255))gameover_text1_rect = gameover_text1.get_rect()gameover_text1_rect.left, gameover_text1_rect.top = \(width - gameover_text1_rect.width) // 2, height // 3screen.blit(gameover_text1, gameover_text1_rect)gameover_text2 = gameover_font.render(str(score), True, (255, 255, 255))gameover_text2_rect = gameover_text2.get_rect()gameover_text2_rect.left, gameover_text2_rect.top = \(width - gameover_text2_rect.width) // 2, \gameover_text1_rect.bottom + 10screen.blit(gameover_text2, gameover_text2_rect)again_rect.left, again_rect.top = \(width - again_rect.width) // 2, \gameover_text2_rect.bottom + 50screen.blit(again_image, again_rect)gameover_rect.left, gameover_rect.top = \(width - again_rect.width) // 2, \again_rect.bottom + 10screen.blit(gameover_image, gameover_rect)# 检测用户的鼠标操作# 如果用户按下鼠标左键if pygame.mouse.get_pressed()[0]:# 获取鼠标坐标pos = pygame.mouse.get_pos()# 如果用户点击“重新开始”if again_rect.left < pos[0] < again_rect.right and \again_rect.top < pos[1] < again_rect.bottom:# 调用main函数,重新开始游戏main()# 如果用户点击“结束游戏”elif gameover_rect.left < pos[0] < gameover_rect.right and \gameover_rect.top < pos[1] < gameover_rect.bottom:# 退出游戏pygame.quit()sys.exit()# 绘制暂停按钮screen.blit(paused_image, paused_rect)# 切换图片if not (delay % 5):switch_image = not switch_imagedelay -= 1if not delay:delay = 100pygame.display.flip()clock.tick(60)if __name__ == "__main__":try:main()except SystemExit:passexcept:traceback.print_exc()pygame.quit()input()

切记: 所有的模块应该放在同一个文件夹下

最后运行我们的主模块就大功告成了!

下面是运行结果:

来源:https://blog.csdn.net/qq_43328040/article/details/106853332#_15

Python代码实现飞机大战(经典)相关推荐

  1. Python代码实现飞机大战

    参考资料 <零基础入门学习python> 源代码以及素材资料(图片,音频)可从下面的github中下载: 飞机大战源代码以及素材资料github项目地址链接 --------------- ...

  2. 飞机大战python代码_飞机大战Python程序

    import pygame from plane_sprites import * class PlaneGame( object ): # 初始化 开始游戏类方法 启动游戏 def __init__ ...

  3. pygame小项目 ~ 3 :Python完成简易飞机大战

    pygame小项目 ~ 3 :Python完成简易飞机大战 子弹 敌机 我方战斗机全部采用图片 子弹击中和战斗机被击中全部采用碰撞检测 游戏的主函数代码 import spite from spite ...

  4. python入门笔记——飞机大战(极简版、未进行继承优化)

    python入门笔记--飞机大战(极简版.未进行继承优化) import random import pygame# 引用pygame里的模块 from pygame.locals import *# ...

  5. python小游戏——飞机大战小游戏(附源码)

    写在前面的一些P话: 大家之前用python编写过飞机大战的部分代码, 只能够展示英雄飞机,背景,敌机和发射子弹, 今天把背景音乐,击毁敌机,爆炸特效,得分等等相关功能一并加入进来, 代码有点长,三百 ...

  6. python飞机大战计分代码_Python 飞机大战代码练习

    Python 飞机大战代码练习 最近在自学Python,参照代码自己写了一遍飞机大战游戏的代码.主要应用的模块为pygame.整个代码如下所示,主要分为主模块和各种精灵类定义模块,记录一下自己的学习历 ...

  7. python语言实现飞机大战

    第一步:pygame的安装 同时按下win+R打开运行 Enter打开命令提示符,先输入pip -V查看pip版本号,主要是为了查看pip是否正常. 然后先尝试安装pygame测试下能否正常安装,输入 ...

  8. Python 之 游戏飞机大战项目实现

    项目实战 -- 飞机大战 目标 强化 面向对象 程序设计 体验使用 pygame 模块进行 游戏开发 实战步骤 pygame 快速体验 飞机大战 实战 确认模块 -- pygame pygame 就是 ...

  9. 小甲鱼python小游戏“飞机大战”源码素材

    话不多说,链接奉上. 百度网盘链接: https://pan.baidu.com/s/1KkmCqCBJ2Jq_IrewovYPAQ 提取码:43av 注:需下载Python pygame包 下载方式 ...

最新文章

  1. Spring Cloud第五章:服务网关Zuul
  2. re.findall()用法详解
  3. 编写线程安全的Java缓存读写机制 (原创)
  4. html验证座机号码_html5表单pattern属性配合正则验证电话和手机号码
  5. NumPy学习笔记(一)
  6. react 组件怎么公用_React、Redux与复杂业务组件的复用
  7. kaptchaCode(验证码)
  8. 40种网站设计常用方法
  9. 40029错误{“errcode“:40029,“errmsg“:“invalid code, rid: 623bbdcd-3c97f4af-5a2c06d6“}
  10. [Vue-cli3] is a Vue CLI 3 only command and you are using Vue CLI 2.9.6. You may...
  11. 五年来,开源论坛软件MyBB共修复100多个漏洞
  12. 测试oracle的存储过程,测试技能:在oracle中自用存储过程进行测试数据构造
  13. 现代编译原理——第五章:活动记录
  14. 使用opencv转化图片格式
  15. ConstraintLayout 属性详解 和Chain的使用
  16. 学习|Android使用TTS语音合成
  17. Hapi入门--独立路由
  18. 在CSDN设置“关注博主即可阅读全文”方法增加粉丝量超简单
  19. 折半查找法(二分法)流程图
  20. git ------ git clone方法总结(可直接加账户和密码)

热门文章

  1. C++ Opengl 绘制图像字符源码
  2. ios oc数组转换为c语言数组,iOS中将数组作为参数传递给服务器
  3. shell在指定目录下执行nohup_nohup:关闭shell程序依然执行
  4. 去掉字符串中的单引号和双引号_同时搞定Android和iOS的Dart语言(4):字符串类型...
  5. html分页首页上一页下一页,HTML静态分页(形如:首页,上一页,下一页,尾页)...
  6. 1.15.Flink state(状态)管理与恢复、什么是state、Keyed State、Operator State、状态容错(生成快照,恢复快照),checkPoint简介,重启策略等
  7. 47_pytorch循环神经网络(学习笔记)
  8. solr:关于dismax的使用情况(转:https://my.oschina.net/momohuang/blog/145379)
  9. Maven2的配置文件settings.xml
  10. 通过CSS切换图片效果,点击这个图片可以实现连接功能,这里的图片在一张大图片中,每个并要切换的图片没有切换,通过disposition定位的方式做