利用Python写个简易版星空大战游戏

 更新时间:2022年03月30日 10:06:53   作者:五包辣条!  
通过小编观察,大家好像对划水摸鱼是情有独钟啊。所以本文给大家带来了一个用Python编写的简单版的星空大战小游戏,感兴趣的小伙伴可以动手试一试

前言

通过辣条最近观察,大家好像对划水摸鱼是情有独钟啊。于是乎我重操旧业又写上了这么一个简单版的星空大战小游戏。

当然了辣条的初衷绝对不是让你们划水摸鱼啊,是真想你们能从中学习那么一点点东西的,总而言之希望大家在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星空大战的资料请关注脚本之家其它相关文章!

相关文章

  • PyQt5 QFrame控件的用法详解

    PyQt5 QFrame控件的用法详解

    在PyQt5中,QFrame是一个重要的基类,它提供了边框样式、阴影效果、形状等属性,可以帮助开发者实现丰富多彩的界面效果,本文将结合实际案例,详细介绍QFrame在PyQt5中的用法,需要的朋友可以参考下
    2024-08-08
  • python爬虫利用代理池更换IP的方法步骤

    python爬虫利用代理池更换IP的方法步骤

    这篇文章主要介绍了python爬虫利用代理池更换IP的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • Python在Console下显示文本进度条的方法

    Python在Console下显示文本进度条的方法

    Python是一门与php有点像的编辑语言了,下文来给各位在利用Python实现进度条了,对Python在Console下显示文本进度条的方法相关知识感兴趣的朋友一起学习吧
    2016-02-02
  • python小项目之五子棋游戏

    python小项目之五子棋游戏

    这篇文章主要为大家详细介绍了python小项目之五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • Python+Opencv实现数字识别的示例代码

    Python+Opencv实现数字识别的示例代码

    这篇文章主要介绍了Python+Opencv实现数字识别的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • 详解Python的hasattr() getattr() setattr() 函数使用方法

    详解Python的hasattr() getattr() setattr() 函数使用方法

    这篇文章主要介绍了详解Python的hasattr() getattr() setattr() 函数使用方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-07-07
  • 解决Python下json.loads()中文字符出错的问题

    解决Python下json.loads()中文字符出错的问题

    今天小编就为大家分享一篇解决Python下json.loads()中文字符出错的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • django框架自定义模板标签(template tag)操作示例

    django框架自定义模板标签(template tag)操作示例

    这篇文章主要介绍了django框架自定义模板标签(template tag)操作,结合实例形式分析了Django框架自定义模板标签原理、操作步骤与相关实现技巧,需要的朋友可以参考下
    2019-06-06
  • Python使用socket的UDP协议实现FTP文件服务功能

    Python使用socket的UDP协议实现FTP文件服务功能

    这篇文章主要介绍了Python使用socket的UDP协议实现FTP文件服务,本示例主要是用Python的socket,使用UDP协议实现一个FTP服务端、FTP客户端,用来实现文件的传输,需要的朋友可以参考下
    2023-10-10
  • python之实现两个或多个列表相加

    python之实现两个或多个列表相加

    这篇文章主要介绍了python之实现两个或多个列表相加方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08

最新评论