热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何利用Python实现星空大战游戏

小编给大家分享一下如何利用Python实现星空大战游戏,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大

小编给大家分享一下如何利用Python实现星空大战游戏,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

一.游戏画面

如何利用Python实现星空大战游戏

二.游戏结束画面

如何利用Python实现星空大战游戏

三.游戏素材

如何利用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=&#39;res/ufo.png&#39;,visible=False,pos=(x,y),tag=&#39;enemy&#39;)
    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=&#39;circle&#39;,visible=False,tag=&#39;bullet&#39;)
     b.scale(0.5)
     b.color(&#39;yellow&#39;)    
     b.goto(player.pos())        # 移到player坐标
     b.show()                    # 显示子弹
     shoot.play()                # 播放射击声

7.播放背景音乐与生成声效对象

# 播放背景音乐与生成声效对象
pygame.mixer.init()
pygame.mixer.music.load(&#39;audio/FrozenJam.ogg&#39;)
pygame.mixer.music.play(-1,0)
explosion = pygame.mixer.Sound(&#39;audio/expl3.wav&#39;)
shoot = pygame.mixer.Sound(&#39;audio/pew.wav&#39;)

8.新建屏幕

width,height = 480,640
screen = Screen()               # 新建屏幕
screen.bgcolor(&#39;black&#39;)         # 屏幕背景色为黑
screen.setup(width,height)
screen.title("星空飞碟大战by大海老师")
screen.addshape(&#39;res/fighter.png&#39;)
screen.addshape(&#39;res/ufo.png&#39;)
frames = [&#39;res/explosion0.png&#39;,&#39;res/explosion1.png&#39;]
[screen.addshape(frame) for frame in frames]

9.移动图章实现星星

# 星星,用来做向下滚动背景,星星的移动也可以通过移动图章实现
# 这样可以有更多的星星。如果用克隆的话有数量限制,根据计算机配置不同而不同。
star = Sprite(shape=&#39;circle&#39;)
star.color(&#39;white&#39;)
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=&#39;cry.png&#39;,visible=False,pos=(0,100))

11.玩家

player = Sprite(shape=&#39;res/fighter.png&#39;,pos=(0,-200))
player.scale(0.65)
player.alive = True             # 表示player是活的

m1 = Mouse()                    # 鼠标左键检测实例
clock = Clock()                 # 实钟对象,用来控制fps
framecounter = 0
counter = 0                     # 统计击中的ufo数量
bullets = Group(&#39;bullet&#39;)       # 子弹组
enemys = Group(&#39;enemy&#39;)         # 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(&#39;星空飞碟大战,当前击毙:&#39; +  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(&#39;yellow&#39;)
t.write(&#39;成功闯关!&#39;,align=&#39;center&#39;,fOnt=(&#39;黑体&#39;,32,&#39;normal&#39;))

while True:
  player.goto(mousepos()) 
  star_move()                   # 星空滚动背景  
  clock.tick(60)

以上是“如何利用Python实现星空大战游戏”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程笔记行业资讯频道!


推荐阅读
  • 本文介绍了贝叶斯垃圾邮件分类的机器学习代码,代码来源于https://www.cnblogs.com/huangyc/p/10327209.html,并对代码进行了简介。朴素贝叶斯分类器训练函数包括求p(Ci)和基于词汇表的p(w|Ci)。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • EPPlus绘制刻度线的方法及示例代码
    本文介绍了使用EPPlus绘制刻度线的方法,并提供了示例代码。通过ExcelPackage类和List对象,可以实现在Excel中绘制刻度线的功能。具体的方法和示例代码在文章中进行了详细的介绍和演示。 ... [详细]
  • Python使用Pillow包生成验证码图片的方法
    本文介绍了使用Python中的Pillow包生成验证码图片的方法。通过随机生成数字和符号,并添加干扰象素,生成一幅验证码图片。需要配置好Python环境,并安装Pillow库。代码实现包括导入Pillow包和随机模块,定义随机生成字母、数字和字体颜色的函数。 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • 本文讨论了如何使用GStreamer来删除H264格式视频文件中的中间部分,而不需要进行重编码。作者提出了使用gst_element_seek(...)函数来实现这个目标的思路,并提到遇到了一个解决不了的BUG。文章还列举了8个解决方案,希望能够得到更好的思路。 ... [详细]
  • 花瓣|目标值_Compose 动画边学边做夏日彩虹
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Compose动画边学边做-夏日彩虹相关的知识,希望对你有一定的参考价值。引言Comp ... [详细]
  • 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 2.对于随机访问get和set,ArrayList优于LinkedList,因为Ar ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
author-avatar
书友68610983
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有