python与打飞机(飞碟)
打飞机小游戏应该算得上是入门python最经典的游戏了,在大部分教程中都有所介绍,不过一般缺乏一定的创新性和可玩性,例如ALIEN INVASION项目的介绍中作出了就是极其单调平庸的游戏,因此本文在这里给出更有意思的一种项目游戏,也增加一点游戏性和可拓展性。
那么闲话不多说,在此提醒大家不像其它教程要你下代码,我这里的可是可以全部复制黏贴的哦!唯一需要额外做的就是把你设计好的图片改名称后放到工程文件夹中即可。那么开始吧!
大家可以先看到我的工程文件的基本状况,请忽视掉那个Rec视频文件……
然后在文件夹images与music中即存放游戏过程中你要展示的图像和音乐。
在这里给大家看一下images:
可以看到每个图像对应名称,如果大家需要素材的话推荐去icon网上找找看,有不少很合适的图
然后是音乐类:
这里提醒一下可能需要大家自己找曲子和音效,当然如果你喜欢可以用嘴bbox……
素材准备好了,那么下面进入代码环节啦!
首先给大家看下主游戏程序alien_invasion.py的导入
import sys
import pygame
from pygame.locals import *
import time
from pygame.sprite import Group
from settings import Settings
from ship import Ship
from stars import *
from meteorite import *
import game_functions as gf
from level0 import *
from Vorgon_bossfight import Vorgon
from button import Button
time,sys,pygame等属于本来就需要的库。
其它则是自己写的类,为了便于模块化而分门别类放在了不同py文件中。
在主游戏运行程序,也就是这个py文件中,我们只需要不断引用他们并集成运行即可:
函数1是游戏运行函数:
def run_game():
pygame.init()
#music reset
pygame.mixer.init()
#music load
pygame.mixer.music.load('music/In_to_the_Universe.mp3')
#music play
pygame.mixer.music.play(loops=-1, start=0.0)
ai_settings = Settings()
screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
pygame.display.set_caption("Aliens' invasion") #set window title
sta = Formstar(screen)
roc = Meteorite(screen)
ship = Ship(ai_settings,screen)
bullets = Group()
B = Ufo_of_vorgon(screen)
play_button = Button(ai_settings,screen,"Play")
COUNT = pygame.USEREVENT +1
pygame.time.set_timer(COUNT,1000)
fail = True
while play_button.notpressed:
play_button.draw_button()
pygame.display.update()
play_button.checkcase()
if play_button.notpressed == False:
ai_settings.game_active = True
while ai_settings.game_active:
#randomly processing stars
sta.gettingstar()
#sta has to come first(as its a background)
gf.check_events(ai_settings,screen,ship,bullets,COUNT)
ship.update()
roc.gettingrock()
if ai_settings.level == 0:
B.gettingufo(ship)
gf.update_bullets(B.uf,bullets)
B.judgeufohitting(ship)
ship.judgegameending(ai_settings)
gf.update_screen(ai_settings,screen,ship,sta,bullets)
roc.judgerockhitting(ship)
if ai_settings.levelAcount >= 40 and B.stopufoonscreen():
ai_settings.level += 1
B.uf.clear()
break
A = Vorgon(screen,ai_settings)
while ai_settings.game_active and ai_settings.level == 1:
sta.gettingstar()
gf.check_events(ai_settings,screen,ship,bullets,COUNT)
ship.update()
roc.gettingrock()
A.showingboss(ship)
gf.update_bullets_aboutboss(A.vorg,bullets,A)
ship.judgegameending(ai_settings)
gf.update_screen(ai_settings,screen,ship,sta,bullets)
roc.judgerockhitting(ship)
if ai_settings.wining:
ai_settings.bullets_allowed = 0
while True:
#show victory
sta.gettingstar()
ship.update()
roc.gettingrock()
gf.check_events(ai_settings,screen,ship,bullets,COUNT)
showText("Victory!",screen)
gf.update_screen(ai_settings,screen,ship,sta,bullets)
else:
ai_settings.bullets_allowed = 0
while True:
if fail:
pygame.mixer.music.stop()
fail = False
sta.gettingstar()
ship.update()
roc.gettingrock()
gf.check_events(ai_settings,screen,ship,bullets,COUNT)
showText("game over",screen)
gf.update_screen(ai_settings,screen,ship,sta,bullets)
#show failure
第二个函数则是显示文字的函数,主要是用于显示按钮开始游戏等等的模块:
def showText(text,screen):
fontObj = pygame.font.SysFont(None,48)
textSurfaceObj = fontObj.render(text, True, (255,255,255), (0,0,0))
textRectObj = textSurfaceObj.get_rect()
textRectObj.center = (300, 350)
screen.blit(textSurfaceObj, textRectObj)
pygame.display.update()
最后点睛之笔,也就是运行整个游戏的主框架:
run_game()
虽然你可能看得一头雾水,但别急,这只是一个概括的导览,我们制作的是一个有两个关卡,有boss战的小游戏,并且在if语句中,你一定也看出来了这个游戏还有输赢。那么就够了,因为其它其实也就是查查表看看自己代码的活。
那么下面来解释下其它py文件的用途:
bullet.py给飞船装载子弹并控制子弹数目
button.py在游戏开始时显示play按钮并控制游戏是否开始
game_functions.py读取键盘事件并作出反应,例如飞船的移动,攻击等。
level0.py游戏第一关的敌军飞船绘制,运动和碰撞分析
meteorite.py随机的在屏幕两侧飞出陨石攻击飞船
settings.py控制屏幕大小,飞船初始大小,子弹数等
ship.py绘制飞船并赋予飞船各个属性,如子弹数,速度等
stars.py背景绘制,外太空肯定有那种流星飞过的感觉啦,那么折衷一下就是白线飞舞,给人你的船在往前飞的感觉。
Vorgon_bossfight.py这就是boss关,做了个boss飞船攻击你,子弹还能追踪。vorgon是来自银河系搭车客指南的灵感(_)。
因为无法一 一列举所有的程序,这里先放个链接给大家下载,并且提醒一下,如果没有安装pygame是无法跑的,而且请务必给电脑设置python的环境。在下载pygame时一定要确保版本一致,你也可以用终端输入代码控制下载,具体可以参考其它博客啦。
游戏源码+素材
最后说说小小的改进,如果有各位能看懂代码并且看过文件,就会发现几个不足:1.游戏胜利画面会跳屏,这是由于我用的背景刷新总是会在显示胜利后刷成黑色。循环导致的屏闪。同理于失败界面。
2.我的星球背景容易覆盖子弹和流星显示,这可能因为图层没有调好,应该是让星球作为背景在最底下的。
3.游戏图片里放了个blaster,是想飞船碰到后可以强化的,比如子弹变大无敌等等,可惜没时间做了,大家可以试试。