项目名称:太空大战

开发环境:Python3.6.4

第三方库:Pygame1.9.6

代码编辑器:Sublime Text

先来看一下游戏画面吧!  游戏画面动态且丰富哦!

 

需求分析

  • 利用Python开发一个太空大战,提供UI,Bgm,丰富的游戏图片素材,左上角拥有玩家的生命进度条且能够动态变化,右上角拥有玩家的生命条数
  • 游戏精灵能够动态交互,打败敌人能够有动态的爆炸效果(用静态图片循环播放可实现),且打败敌人能够随机的掉落火箭,增加生命进度甚至增加生命条数(有一个所获几率的控制)的游戏精灵,打败敌人能够获得分数
  • 算法设计:能够根据玩家的生命进度及生命条数调整游戏难度和获得火箭,生命数等精灵的概率
  • 设计动态地图,使游戏更加动态化以及游戏化

功能模块

  • 库的导入

    1 import pygame
    2 import random
    3 from os import path
    4 import sys
    5 from pygame.locals import *
    6 import math
    7 from datetime import datetime, date, time
  • 图片导入

     1 img_dir = path.join(path.dirname(__file__),'img')
    2 background_dir = path.join(img_dir,'space.png')
    3 background_img1 = pygame.image.load(background_dir).convert()
    4 background_img2 = pygame.image.load(background_dir).convert()
    5 background_img3 = pygame.image.load('img/space.png').convert()
    6 background_rect = background_img1.get_rect()
    7 player_dir = path.join(img_dir,'spaceShips_005.png')
    8 player_img = pygame.image.load(player_dir).convert()
    9 player_img_small = pygame.transform.scale(player_img,(26,20))
    10 player_img_small.set_colorkey((0,0,0))
    11 enemy_dir = path.join(img_dir,'spaceMeteors_004.png')
    12 enemy_img = pygame.image.load(enemy_dir).convert()
    13 bullet_dir = path.join(img_dir,'bullet.png')
    14 bullet_img = pygame.image.load(bullet_dir).convert_alpha()
    15 missile_dir = path.join(img_dir,'spaceMissiles_040.png')
    16 missile_img = pygame.image.load(missile_dir).convert()
    17 spaceship_dir = path.join(img_dir,'spaceShips_007.png')
    18 spaceship_img = pygame.image.load(spaceship_dir).convert()
    19 spaceship_bullet_dir = path.join(img_dir,'spaceMissiles_001.png')
    20 spaceship_bullet_img = pygame.image.load(spaceship_bullet_dir).convert()
  • Bgm及音效文件的导入

    1 sound_dir = path.join(path.dirname(__file__),'sound')
    2 shoot_sound = pygame.mixer.Sound(path.join(sound_dir,'Laser_Shoot14.wav'))
    3 explosion_sound = pygame.mixer.Sound(path.join(sound_dir,'Explosion7.wav'))
    4 missile_sound = pygame.mixer.Sound(path.join(sound_dir,'Laser_Shoot5.wav'))
    5 pygame.mixer.music.load(path.join(sound_dir,'background_01.wav'))
  • 游戏精灵类的创建

     1 class Player(pygame.sprite.Sprite):
    2
    3 def __init__(self):
    4 pygame.sprite.Sprite.__init__(self)
    5 # self.image = pygame.Surface((50,50))
    6 self.image = pygame.transform.flip(player_img,False,True)
    7 self.image = pygame.transform.scale(self.image,(53,40))
    8 self.image.set_colorkey((0,0,0))
    9 # self.image.fill((0,255,0))
    10 self.rect = self.image.get_rect()
    11 self.rect.centerx = WIDTH/2
    12 self.rect.bottom = HEIGHT
    13 self.radius = 20
    14 self.score = 0
    15
    16
    17 self.hp = 100
    18 self.lives =3
    19 self.hidden = False
    20 self.hide_time = 0
    21
    22 self.is_missile_firing = False
    23 self.start_missile_time = 0
    24 self.last_missile_time = 0
    25
    26
    27
    28
    29 def update(self):
    30 key_state = pygame.key.get_pressed()
    31 if key_state[pygame.K_LEFT] or key_state[pygame.K_a]:
    32 self.rect.x -= 5
    33 if key_state[pygame.K_RIGHT] or key_state[pygame.K_d]:
    34 self.rect.x += 5
    35 if key_state[pygame.K_UP] or key_state[pygame.K_w]:
    36 self.rect.y -= 5
    37 if key_state[pygame.K_DOWN] or key_state[pygame.K_s]:
    38 self.rect.y += 5
    39 if self.rect.right > WIDTH:
    40 self.rect.right = WIDTH
    41 if self.rect.left < 0:
    42 self.rect.left = 0
    43 if self.rect.y < 0:
    44 self.rect.y = 0
    45 if self.rect.y > HEIGHT:
    46 self.rect.y = HEIGHT
    47
    48
    49 now = pygame.time.get_ticks()
    50 if self.hidden and now - self.hide_time > 1000:
    51 self.hidden = False
    52 self.rect.bottom = HEIGHT
    53 self.hp = 100
    54
    55 if self.is_missile_firing:
    56 if now - self.start_missile_time <= MISSILE_LIFETIME:
    57 if now - self.last_missile_time > MISSILE_INTERVAL:
    58 missile = Missile(self.rect.center)
    59 missiles.add(missile)
    60 self.last_missile_time = now
    61 else:
    62 self.is_missile_firing = False
    63
    64
    65
    66 def shoot(self):
    67 bullet = Bullet(self.rect.centerx,self.rect.centery)
    68 bullets.add(bullet)
    69 shoot_sound.play()
    70
    71 def fire_missile(self):
    72 self.is_missile_firing = True
    73 self.start_missile_time = pygame.time.get_ticks()
    74
    75 def hide(self):
    76 self.hidden = True
    77 self.rect.y = HEIGHT
    78 self.hide_time = pygame.time.get_ticks()
  • 动态地图的实现

     1 class Dynamic_Background1(pygame.sprite.Sprite):
    2
    3 def __init__(self):
    4 pygame.sprite.Sprite.__init__(self)
    5 self.image = pygame.transform.flip(background_img1,False,False)
    6 self.rect = self.image.get_rect()
    7 self.speed = 3
    8 self.last_time = pygame.time.get_ticks()
    9
    10 def update(self):
    11 now = pygame.time.get_ticks()
    12 if now - self.last_time > 5:
    13 self.rect.y += self.speed
    14 self.last_time = now
    15 while self.rect.y >= HEIGHT:
    16 self.rect.y = -self.rect.height
    17 dynamic_background2.update()
    18
    19
    20 for event in pygame.event.get():
    21 if event.type == pygame.QUIT:
    22 game_over == True
    23 if event.type == pygame.KEYDOWN:
    24 if event.type == pygame.K_ESCAPE:
    25 game_over == True
    26
    27
    28 class Dynamic_Background2(pygame.sprite.Sprite):
    29
    30 def __init__(self):
    31 pygame.sprite.Sprite.__init__(self)
    32 self.image = pygame.transform.flip(background_img2,False,False)
    33 self.rect = self.image.get_rect()
    34 self.rect.y = -self.rect.height
    35 self.speed = 3
    36 self.last_time = pygame.time.get_ticks()
    37
    38 def update(self):
    39 now = pygame.time.get_ticks()
    40 if now - self.last_time > 5:
    41 self.rect.y += self.speed
    42 self.last_time = now
    43 while self.rect.y >= HEIGHT:
    44 self.rect.y = -self.rect.height
    45 dynamic_background1.update()
    46
    47 for event in pygame.event.get():
    48 if event.type == pygame.QUIT:
    49 game_over == True
    50 if event.type == pygame.KEYDOWN:
    51 if event.type == pygame.K_ESCAPE:
    52 game_over == True
  • UI界面的实现

     1 def show_menu():
    2 global game_state,screen
    3 font_name = pygame.font.match_font('arial')
    4 font = pygame.font.Font(font_name,40)
    5 screen.blit(background_img3,background_rect)
    6
    7 # rect1 = pygame.draw.rect(screen,(255,255,255),(WIDTH/20,80, 550, 100), 10)
    8 # screen.blit(font.render('SPACE SHOOTER',True,(0,255,0)), (150, 100))
    9 draw_text('SPACE SHOOTER',screen,(0,255,0),70,WIDTH/2,100)
    10 rect2 = pygame.draw.rect(screen,(0,255,0),(WIDTH/7 + 80,350, 400, 50), 10)
    11 screen.blit(font.render('Press Space key to start',True,(255,255,0)), (220, 350))
    12 rect3 = pygame.draw.rect(screen,(0,255,0),(WIDTH/7 + 80,450, 400, 50), 10)
    13 screen.blit(font.render('Press Esc key to quit',True,(255,255,0)), (220, 450))
  • 爆炸,太空站等动态效果的实现

     1 explosion_animation = []
    2 for i in range(9):
    3 explosion_dir = path.join(img_dir,'regularExplosion0{}.png'.format(i))
    4 explosion_img = pygame.image.load(explosion_dir).convert()
    5 explosion_animation.append(explosion_img)
    6
    7 spaceship_zhan_animation = []
    8 for i in range(14,16):
    9 spaceship_zhan_dir = path.join(img_dir,'spaceBuilding_0{}.png'.format(i))
    10 spaceship_zhan_img = pygame.image.load(spaceship_zhan_dir).convert()
    11 spaceship_zhan_animation.append(spaceship_zhan_img)
    12
    13
    14 space_plant_animation = []
    15 for i in range(6,10):
    16 space_plant_dir = path.join(img_dir,'spaceBuilding_00{}.png'.format(i))
    17 space_plant_img = pygame.image.load(space_plant_dir).convert()
    18 space_plant_animation.append(space_plant_img)
    19
    20 powerup_imgs = {}
    21 powerup_add_hp_dir = path.join(img_dir,'gem_red.png')
    22 powerup_imgs['add_hp'] = pygame.image.load(powerup_add_hp_dir).convert()
    23 powerup_add_life_dir = path.join(img_dir,'heartFull.png')
    24 powerup_imgs['add_life'] = pygame.image.load(powerup_add_life_dir).convert()
    25 powerup_add_missile_dir = path.join(img_dir,'gem_yellow.png')
    26 powerup_imgs['add_missile'] = pygame.image.load(powerup_add_missile_dir).convert()
  • 游戏精灵对象实例化

     1 dynamic_background1 = Dynamic_Background1()
    2 dynamic_background2 = Dynamic_Background2()
    3 space_plant_entity = Space_plant_entity()
    4 # spaceship_boss_one =Spaceship_Boss_One()
    5 player = Player()
    6 spaceship_zhan_shiwu = Spaceship_zhan_shiwu()
    7 enemys = pygame.sprite.Group()
    8 for i in range(7):
    9 enemy = Enemy()
    10 enemys.add(enemy)
    11 spaceships = pygame.sprite.Group()
    12 for i in range(5):
    13 spaceship = Spaceship()
    14 spaceships.add(spaceship)
    15 bullets = pygame.sprite.Group()
    16 spaceship_bullets = pygame.sprite.Group()
    17 missiles = pygame.sprite.Group()
    18 explosions = pygame.sprite.Group()
    19 powerups = pygame.sprite.Group()
  • 游戏画面的动态更新

     1                 dynamic_background1.update()
    2 dynamic_background2.update()
    3 player.update()
    4 enemys.update()
    5 bullets.update()
    6 missiles.update()
    7 explosions.update()
    8 powerups.update()
    9 spaceships.update()
    10 spaceship_bullets.update()
    11 # spaceship_boss_one_bullets.update()
    12 spaceship_zhan_shiwu.update()
    13 space_plant_entity.update()
  • 游戏精灵之间的碰撞检测

     1                 hits = pygame.sprite.spritecollide(player,enemys,True,pygame.sprite.collide_circle)
    2 for hit in hits:
    3 player.hp -= 30
    4 if player.hp<0:
    5 player.lives -= 1
    6 player.hp = 100
    7 player.hide()
    8 if player.lives == 0:
    9 game_over = True
    10 hits = pygame.sprite.spritecollide(player,spaceships,True,pygame.sprite.collide_circle)
    11 for hit in hits:
    12 player.hp -= 40
    13 if player.hp<0:
    14 player.lives -= 1
    15 player.hp = 100
    16 player.hide()
    17 if player.lives == 0:
    18 game_over = True
    19 hits = pygame.sprite.spritecollide(player,spaceship_bullets,True,pygame.sprite.collide_circle)
    20 for hit in hits:
    21 player.hp -= 10
    22 if player.hp<0:
    23 player.lives -= 1
    24 player.hp = 100
    25 player.hide()
    26 if player.lives == 0:
    27 game_over = True
  • 游戏精灵组之间的碰撞检测

     1                 hits_bullets = pygame.sprite.groupcollide(enemys,bullets,True,True)
    2 hits_missiles = pygame.sprite.groupcollide(enemys,missiles,True,True)
    3 hits_spaceships = pygame.sprite.groupcollide(spaceships,bullets,True,True)
    4 hits_spaceships_and_missiles = pygame.sprite.groupcollide(spaceships,missiles,True,False)
    5 hits = {}
    6 hits.update(hits_bullets)
    7 hits.update(hits_missiles)
    8 hits.update(hits_spaceships)
    9 hits.update(hits_spaceships_and_missiles)
    10 for hit in hits:
    11 enemy = Enemy()
    12 enemys.add(enemy)
    13 explosion = Explosion(hit.rect.center)
    14 explosions.add(explosion)
    15 player.score += (100 - hit.radius)
    16 if random.random() > 0.9:
    17 powerup = Powerup(hit.rect.center)
    18 powerups.add(powerup)
    19
    20
    21 hits = pygame.sprite.spritecollide(player,powerups,True)
    22 for hit in hits:
    23 if hit.type == 'add_hp':
    24 player.hp += 50
    25 if player.hp > 100:
    26 player.hp = 100
    27 elif hit.type == 'add_life':
    28 player.lives += 1
    29 if player.lives > 3:
    30 player.lives = 3
    31 else:
    32 player.fire_missile()
  • 玩家生命进度UI的实现

     1 def draw_ui():
    2 pygame.draw.rect(screen,(0,255,0),(10,10,player.hp,15))
    3 pygame.draw.rect(screen,(255,255,255),(10,10,100,15),2)
    4
    5 draw_text(str(player.score),screen,(255,255,255),20,WIDTH/2,10)
    6
    7 img_rect = player_img_small.get_rect()
    8 img_rect.right = WIDTH - 10
    9 img_rect.top = 10
    10 for _ in range(player.lives):
    11 screen.blit(player_img_small,img_rect)
    12 img_rect.x -= img_rect.width + 10
  • 游戏初始化

    1 pygame.mixer.pre_init(44100,-16,2,2048)
    2 pygame.mixer.init()
    3 pygame.init()
    4 screen = pygame.display.set_mode((WIDTH,HEIGHT))
    5 pygame.display.set_caption("My Game")
    6 clock = pygame.time.Clock()
  • 游戏主程序的运行

     1 if __name__ == '__main__':
    2 while not game_over:
    3 clock.tick(60)
    4 if game_state == 0:
    5 show_menu()
    6 else:
    7 event_list = pygame.event.get()
    8 for event in event_list:
    9 if event.type == pygame.QUIT:
    10 game_over = True
    11 if event.type == pygame.KEYDOWN:
    12 if event.key == pygame.K_ESCAPE:
    13 game_over = True
    14 if event.key == pygame.K_SPACE:
    15 player.shoot()
    16
    17 now = pygame.time.get_ticks()
    18 if now - last_enemy_generate_time > NEW_ENEMY_GENERATE_INTERVAL:
    19 enemy = Enemy()
    20 enemys.add(enemy)
    21 last_enemy_generate_time = now
    22
    23 if now - last_spaceship_generate_time > NEW_SPACESHIP_GENERATE_INTERVAL:
    24 spaceship = Spaceship()
    25 spaceships.add(spaceship)
    26 last_spaceship_generate_time = now

     注意bgm及音效的路径,我的是相对路径,路径一定要对,否则程序无法读取图片及音乐哦!

游戏画面

  • UI界面

  • 玩家生命条数及生命数UI画面

     

  • 游戏画面

     

                       

由于博客园不能上传视频,在此我提供游戏视频观看连接:https://mp.weixin.qq.com/s/j7PhvAJKzrN0ntLgpowcqA

更进一步设计:你可以添加boss,关卡,游戏动态特效等等

Sublime Text 官网:https://www.sublimetext.com

Pygame官网:https://www.pygame.org/news

Python官网:https://www.python.org


扫码关注我的个人公众号,回复 “太空大战” 获取完整项目,包括源码,游戏图片素材及音乐和音效


——  ——  ——  ——  —  END  ——  ——  ——  ——  ————

         欢迎扫码关注我的公众号

          Maker陈

    

Python+Pygame开发太空大战/飞机大战完整游戏项目(附源代码)的更多相关文章

  1. python之基础总结(飞机大战)

    一.学习python有一段时间了,总体上手还是挺好的,但是有些东西还是和Java存在着一定的区别,这里主要是通过学习,然后自己去编写一个案例.从中学习到的一些东西,这里分享出来,如果存在不正确的地方还 ...

  2. ORM开发之解析lambda实现完整查询(附测试例子)

    上次讲解了怎么解析匿名对象(ORM开发之解析lambda实现group查询),这次来实现解析二元运算,完成基本条件语法 先看一个表达式 query.Where(b => b.Number == ...

  3. 【COCOS2D-HTML5 开发之三】演示样例项目附源代码及执行的GIF效果图

    本站文章均为李华明Himi原创,转载务必在明显处注明:(作者新浪微博:@李华明Himi) 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/cocos2d- ...

  4. 用Darwin开发RTSP级联server(拉模式转发)(附源代码)

    源代码下载地址:https://github.com/EasyDarwin orwww.easydarwin.org 在博客 在Darwin进行实时视频转发的两种模式 中,我们描写叙述了流媒体serv ...

  5. 11.pygame飞机大战游戏整体代码

    主程序 # -*- coding: utf-8 -*- # @Time: 2022/5/20 22:26 # @Author: LiQi # @Describe: 主程序 import pygame ...

  6. python+pygame游戏开发之使用Py2exe打包游戏

    最近在用python+pygame 开发游戏,写完以后在分享给朋友玩的时候遇到了很大的问题,只有搭建了环境才能运行python脚本. 这会吓退99%以上的人……所以把我们的游戏打包(注意是打包而不是编 ...

  7. Python之游戏开发-飞机大战

    Python之游戏开发-飞机大战 想要代码文件,可以加我微信:nickchen121 #!/usr/bin/env python # coding: utf-8 import pygame impor ...

  8. python(pygame)滑稽大战(类似飞机大战) 教程

    成品已录制视频投稿B站(本文目前实现了基础的游戏功能),点击观看项目稽忽悠不(github)地址:https://github.com/BigShuang/From-simple-to-Huaji 本 ...

  9. Python飞机大战实例有感——pygame如何实现“切歌”以及多曲重奏?

    目录 pygame如何实现"切歌"以及多曲重奏? 一.pygame实现切歌 初始化路径 尝试一 尝试二 尝试三 成功 总结 二.如何在python多线程顺序执行的情况下实现音乐和音 ...

随机推荐

  1. 基于RT1052 Aworks 内存扩容记录(一)

    本文主要是通过迁移的思维,记录本人初次使用周立功的Aworks框架进行BSP开发 1. 首先阅读原理图 内存容量由32M扩容至64M. 2. 再则比较两颗芯片的参数 通过比较32M和64M SDRAM ...

  2. OSPF的DR与BDR

    一.实验拓扑 二.实验编址 三.实验步骤: 1.设置路由器的端口IP等信息 2.搭建ospf网络 重启(退出系统模式):reset ospf process 查看: 查看完整的邻居信息: 可以看到DR ...

  3. (五)Linux之文件与目录管理以及文本处理

    Linux之文件与目录管理 目录 Linux之文件与目录管理 前言 绝对路径与相对路径说明: 一.目录常用命令 常用处理目录的命令: 切换目录 cd 显示当前路径 pwd 查看目录下文件 ls 创建目 ...

  4. Windows内核基础知识-1-段寄存器

    Windows内核基础知识-1-段寄存器 学过汇编的应该都知道段寄存器,在Windows里段寄存器有很多,之前可能只接触了ds数据段,cs 代码段这种,今天这个博客就介绍Windows一些比较常用的段 ...

  5. TypeScript 入门指南 【大白话】

    前言 聊聊为何要学习TypeScript? 从开发角度来讲, TypeScript 作为强类型语言,对属性有类型约束.在日常开发中少了减少了不必要的因参数类型造成的BUG,当你在使用同事封装好的函数时 ...

  6. 解决log4net多进程日志文件被占用

    <log4net debug="true"> <appender name="RollingLogFileAppender" type=&qu ...

  7. 深入浅出Mybatis系列(三)---配置简介(mybatis源码篇)

    上篇文章<深入浅出Mybatis系列(二)---Mybatis入门>写了一个Demo简单体现了一下Mybatis的流程.本次,将简单介绍一下Mybatis的配置文件: 上次例子中,我们以  ...

  8. Spring详解(八)------常用的连接池配置

    首先,我们准备Jdbc属性文件 jdbc.properties,用于保存连接数据库的信息,利于我们在配置文件中的使用 jdbc.driver=com.mysql.jdbc.Driver jdbc.ur ...

  9. BeanUtils使用:从一个map集合中,拷贝到javaBean中(四)

    package beanutil; import java.lang.reflect.InvocationTargetException; import java.util.HashMap; impo ...

  10. 老鼠走迷宫I

    转自:http://blog.csdn.net/holymaple/article/details/8582517 说明:老鼠走迷宫是递回求解的基本提醒,我们在二维阵列中使用2来表示迷宫墙壁,使用1来 ...