利用Python写个简易版星空大战游戏
目录
前言一.游戏画面二.游戏结束画面三.游戏素材四.游戏代码五、核心代码1.导入模块2.动态星空背景函数3.不定时产生敌机函数4.飞碟的移动5.子弹的移动6.玩家射击函数7.播放背景音乐与生成声效对象8.新建屏幕9.移动图章实现星星10.哭脸11.玩家12.飞碟移动与子弹移动13.敌机的碰撞检测14.闯关成功把子弹删除六、总结前言
通过辣条最近观察,大家好像对划水摸鱼是情有独钟啊。于是乎我重操旧业又写上了这么一个简单版的星空大战小游戏。
当然了辣条的初衷绝对不是让你们划水摸鱼啊,是真想你们能从中学习那么一点点东西的,总而言之希望大家在Python这条路上少踩坑吧,因为昨天还有人在跟学长说,以后增删改查一样拿高薪,我不信现在都堕落成这样子了
就像问一下懂事理的兄弟姐妹们,你们觉得有可能嘛?
一.游戏画面
二.游戏结束画面
三.游戏素材
四.游戏代码
星空飞碟大战.py
由于配音需要混音器,这里用到了pygame的混音器,
五、核心代码
1.导入模块
from sprites import * import pygame.mixer
2.动态星空背景函数
def star_move(): """动态星空背景函数""" for star in stars: star.move(0,-20) if star.ycor() < -height//2: x = random.randint(-width//2,width//2) y = random.randint(10+height//2,height*2) star.reborn(x,y,0,-20)
3.不定时产生敌机函数
def spawn_enemy(): """不定时产生敌机函数""" if random.randint(1,10)==1 and len(enemys)<10: x = random.randint(-200,200) y = random.randint(100,300) enemy = Sprite(shape="res/ufo.png",visible=False,pos=(x,y),tag="enemy") enemy._rotatemode = 1 enemy.scale(0.5) enemy.setheading(random.randint(1,360)) enemy.show()
4.飞碟的移动
def enemymove(): """飞碟的移动""" for e in enemys: e.fd(3) # 设定一定的机率让ufo朝向player if random.randint(10,100) == 10 and \ abs(e.xcor())<200 and abs(e.ycor()<250): e.heading(player) e.bounce_on_edge()
5.子弹的移动
def bulletmove(): """子弹的移动""" for b in list(bullets): b.move(0,10) if b.collide_edge():b.remove()
6.玩家射击函数
def player_shoot(): """玩家射击函数""" if player.alive == False : return if m1.down() and framecounter % 5 == 0 : b = Sprite(shape="circle",visible=False,tag="bullet") b.scale(0.5) b.color("yellow") b.goto(player.pos()) # 移到player坐标 b.show() # 显示子弹 shoot.play() # 播放射击声
7.播放背景音乐与生成声效对象
# 播放背景音乐与生成声效对象 pygame.mixer.init() pygame.mixer.music.load("audio/FrozenJam.ogg") pygame.mixer.music.play(-1,0) explosion = pygame.mixer.Sound("audio/expl3.wav") shoot = pygame.mixer.Sound("audio/pew.wav")
8.新建屏幕
width,height = 480,640 screen = Screen() # 新建屏幕 screen.bgcolor("black") # 屏幕背景色为黑 screen.setup(width,height) screen.title("星空飞碟大战by大海老师") screen.addshape("res/fighter.png") screen.addshape("res/ufo.png") frames = ["res/explosion0.png","res/explosion1.png"] [screen.addshape(frame) for frame in frames]
9.移动图章实现星星
# 星星,用来做向下滚动背景,星星的移动也可以通过移动图章实现 # 这样可以有更多的星星。如果用克隆的话有数量限制,根据计算机配置不同而不同。 star = Sprite(shape="circle") star.color("white") star.scale(0.1) stars = [star] stars.extend([star.clone() for _ in range(20)]) for star in stars: x = random.randint(-width//2,width//2) y = random.randint(10+height//2,height*2) star.goto(x,y)
10.哭脸
cry = Sprite(shape="cry.png",visible=False,pos=(0,100))
11.玩家
player = Sprite(shape="res/fighter.png",pos=(0,-200)) player.scale(0.65) player.alive = True # 表示player是活的 m1 = Mouse() # 鼠标左键检测实例 clock = Clock() # 实钟对象,用来控制fps framecounter = 0 counter = 0 # 统计击中的ufo数量 bullets = Group("bullet") # 子弹组 enemys = Group("enemy") # ufo敌人组
12.飞碟移动与子弹移动
while counter<100: framecounter += 1 # 帧计数器 spawn_enemy() # 不定时产生敌机UFO player_shoot() # 单击鼠标左键,射击子弹 enemymove() # 飞碟们的移动 bulletmove() # 子弹的移动 if player.alive: player.goto(mousepos()) else: cry.show() # 显示哭脸,表示失败 star_move() # 星空滚动背景
13.敌机的碰撞检测
for e in list(enemys): # 对每架敌机进行碰撞检测 if e.collide(player,scale=0.6): explode(e.position(),frames) e.remove() explode(player.pos(),frames) player.remove() player.alive = False explosion.play() # 爆炸声 break # 敌机是否碰到任意一颗子弹 for b in list(bullets): if b.collide(e,scale=0.6): # 如果子弹碰到UFO explode(e.position(),frames) e.remove() b.remove() explosion.play() # 爆炸声 counter +=1 # 进行统计 break screen.title("星空飞碟大战,当前击毙:" + str(counter) + " 架UFO") clock.tick(60)
14.闯关成功把子弹删除
[b.remove() for b in list(bullets)] # 闯关成功把子弹删除 for e in list(enemys): # 每架飞碟都爆炸 explode(e.position(),frames) e.remove() clock.tick(10) t = Turtle(visible=False) t.color("yellow") t.write("成功闯关!",align="center",font=("黑体",32,"normal")) while True: player.goto(mousepos()) star_move() # 星空滚动背景 clock.tick(60)
六、总结
看到这里的都是妥妥的铁粉无疑了,既然是铁粉那就给你们一次亲密接触机会,底下是我的个人ming片找到我的可是有大把源码,学习路线啥的,多的我就不透露,看大家自己的积极性了啊~
其次呢再次重申辣条我真的不是想让你们摸鱼的,虽然说是个很简单的东西,但是对于初学者,或者基础不扎实的弟弟妹妹们而言估计也很难实现出来的,所以最后大家加油吧~
以上就是利用Python写个简易版星空大战游戏的详细内容,更多关于Python星空大战的资料请关注脚本之家其它相关文章!
X 关闭
X 关闭
- 15G资费不大降!三大运营商谁提供的5G网速最快?中国信通院给出答案
- 2联想拯救者Y70发布最新预告:售价2970元起 迄今最便宜的骁龙8+旗舰
- 3亚马逊开始大规模推广掌纹支付技术 顾客可使用“挥手付”结账
- 4现代和起亚上半年出口20万辆新能源汽车同比增长30.6%
- 5如何让居民5分钟使用到各种设施?沙特“线性城市”来了
- 6AMD实现连续8个季度的增长 季度营收首次突破60亿美元利润更是翻倍
- 7转转集团发布2022年二季度手机行情报告:二手市场“飘香”
- 8充电宝100Wh等于多少毫安?铁路旅客禁止、限制携带和托运物品目录
- 9好消息!京东与腾讯续签三年战略合作协议 加强技术创新与供应链服务
- 10名创优品拟通过香港IPO全球发售4100万股 全球发售所得款项有什么用处?