年末航天有大事,嫦五揽月取岩石。

这几天,有被嫦娥五号刷屏吗?就在本周二晚11点11分,嫦娥五号的着陆器–上升器组合体成功登月,现已正式开展月面采样任务。嫦娥五号将为我国科学家带回约两千克月球岩石和土壤。时隔44年,人类终于能再次从月球带回“土特产”了!

嫦娥五号(图源:中国探月工程)

作为科技爱好者斜杠程序员爸爸,想不想写一个酷炫的月球着陆游戏,给娃秀一秀专业技能 让娃一起开心开心?

今天就来用Python写一个月球着陆仿真游戏吧!

太长不看提示:本例来源于由“Python之父”吉多·范罗苏姆推荐的《父与子的编程之旅》。请滑至文末了解如何获取完整代码。

我们的飞船正准备登月。它携带定量的燃料,这些燃料会为反推发动机提供推力。

在游戏开始时,飞船离月球表面有一定的距离。月球的重力把它向下拉,我们必须使用反推发动机减缓降落速度,让飞船的纵向速度变为0,从而平缓着陆。

注意,必须小心地操作反推发动机。如果用力不足,飞船就会重重地摔在月面;如果用力过猛,则燃料会很快耗尽,飞船会向上飞入太空!

左下角的小灰条表示反推发动机的操作杆,用鼠标上下拖动即可控制推力。

燃料表(绿色)显示当前剩余的燃料。界面上方的文本给出动态变化的速度、加速度、高度和推力。

反推发动机的推力取决于消耗了多少燃料,有时推力会大于重力,有时则会小于重力。当发动机关闭时,推力为0,此时只剩下重力。

要得到飞船所受的净作用力,只需把推力和重力相加。由于二者的方向相反,因此可以用一个正数和一个负数来表示。一旦得到飞船所受的净作用力,就可以利用公式得出它的速度和位置。

我们的程序必须跟踪以下几点。

- 飞船相对于月面的高度,以及飞船的速度和加速度。

- 飞船的质量(随着燃料的消耗,质量会变化)。

- 反推发动机的推力。推力越大,燃料消耗得就越快。

- 飞船剩余多少燃料。当反推发动机消耗燃料时,飞船会变轻,但是如果燃料耗尽,就不再有推力了。

- 飞船所受的重力。这取决于月球的大小、飞船的质量、燃料的消耗情况等。

提示:本文假定你已经安装了Pygame模块。如果还没有安装,请滑至文末查看安装说明。

我们使用Pygame模块编写该游戏,用单次时钟“嘀嗒”作为时间单位。每“嘀嗒”一次,程序就要检查飞船当前所受的净作用力,并更新高度、速度、加速度和剩余燃料等信息,然后根据这些信息更新图片和文本。

1  首先初始化游戏。创建Pygame窗口,加载图像,并为变量设置一些初始值。

import pygame, syspygame.init()
screen = pygame.display.set_mode([400,600])
screen.fill([0, 0, 0])
ship = pygame.image.load('lunarlander.png')
moon = pygame.image.load('moonsurface.png')
ground = 540start = 90
clock = pygame.time.Clock()
ship_mass = 5000.0
fuel = 5000.0
velocity = -100.0
gravity = 10
height = 2000
thrust = 0
delta_v = 0
y_pos = 90
held_down = False

2  为反推发动机定义Sprite类。

class ThrottleClass(pygame.sprite.Sprite):def __init__(self, location = [0,0]):pygame.sprite.Sprite.__init__(self)image_surface = pygame.surface.Surface([30, 10])image_surface.fill([128,128,128])self.image = image_surface.convert()self.rect = self.image.get_rect()self.rect.left, self.rect.centery = location

3  计算飞船的高度、速度、加速度和燃料消耗量。

def calculate_velocity():global thrust, fuel, velocity, delta_v, height, y_posdelta_t = 1/fps #对应Pygame循环的一帧thrust = (500 - myThrottle.rect.centery) * 5.0 #将反推发动机精灵的y坐标转换为推力fuel -= thrust /(10 * fps) #根据推力减少燃料if fuel < 0: fuel = 0.0if fuel < 0.1: thrust = 0.0delta_v = delta_t * (-gravity + 200 * thrust / (ship_mass + fuel)) #物理公式velocity = velocity + delta_vdelta_h = velocity * delta_theight = height + delta_hy_pos = ground - (height * (ground - start) / 2000) - 90 #将高度转换为Pygame的y坐标

4  使用字体对象显示统计信息。

def display_stats():v_str = "velocity: %i m/s" % velocityh_str = "height: %.1f" % heightt_str = "thrust: %i" % thrusta_str = "acceleration: %.1f" % (delta_v * fps)f_str = "fuel: %i" % fuelv_font = pygame.font.Font(None, 26)v_surf = v_font.render(v_str, 1, (255, 255, 255))screen.blit(v_surf, [10, 50])a_font = pygame.font.Font(None, 26)a_surf = a_font.render(a_str, 1, (255, 255, 255))screen.blit(a_surf, [10, 100])h_font = pygame.font.Font(None, 26)h_surf = h_font.render(h_str, 1, (255, 255, 255))screen.blit(h_surf, [10, 150])t_font = pygame.font.Font(None, 26)t_surf = t_font.render(t_str, 1, (255, 255, 255))screen.blit(t_surf, [10, 200])f_font = pygame.font.Font(None, 26)f_surf = f_font.render(f_str, 1, (255, 255, 255))screen.blit(f_surf, [60, 300])

5  画出尾焰三角形,尾焰大小会随推力变化而变化。

def display_flames():flame_size = thrust / 15for i in range (2):startx = 252 - 10 + i * 19starty = y_pos + 83pygame.draw.polygon(screen, [255, 109, 14], [(startx, starty),(startx + 4, starty + flame_size),(startx + 8, starty)], 0)

6  Pygame程序主事件循环,画出所有内容。

myThrottle = ThrottleClass([15, 500]) #创建反推发动机对象
running = True
while running:clock.tick(30)fps = clock.get_fps()if fps < 1: fps = 30if height > 0.01:calculate_velocity()screen.fill([0, 0, 0])display_stats()pygame.draw.rect(screen, [0, 0, 255], [80, 350, 24, 100], 2)fuelbar = 96 * fuel / 5000pygame.draw.rect(screen, [0,255,0],[84,448-fuelbar,18, fuelbar], 0) #燃料量pygame.draw.rect(screen, [255, 0, 0],[25, 300, 10, 200],0) #画出反推发动机滑块screen.blit(moon, [0, 500, 400, 100]) #画出月球pygame.draw.rect(screen, [60, 60, 60],[220, 535, 70, 5],0) #着陆点screen.blit(myThrottle.image, myThrottle.rect) #画出操纵杆display_flames()screen.blit(ship, [230, y_pos, 50, 90]) #画出飞船instruct1 = "Land softly without running out of fuel"instruct2 = "Good landing: < 15m/s Great landing: < 5m/s"inst1_font = pygame.font.Font(None, 24)inst1_surf = inst1_font.render(instruct1, 1, (255, 255, 255))screen.blit(inst1_surf, [50, 550])inst2_font = pygame.font.Font(None, 24)inst2_surf = inst1_font.render(instruct2, 1, (255, 255, 255))screen.blit(inst2_surf, [20, 575])pygame.display.flip()

7  收尾部分:检查鼠标是否拖动反推发动机,更新反推发动机位置。

else:display_final()
for event in pygame.event.get():if event.type == pygame.QUIT:running = Falseelif event.type == pygame.MOUSEBUTTONDOWN:held_down = Trueelif event.type == pygame.MOUSEBUTTONUP:held_down = Falseelif event.type == pygame.MOUSEMOTION:if held_down:myThrottle.rect.centery = event.pos[1]if myThrottle.rect.centery < 300:myThrottle.rect.centery = 300if myThrottle.rect.centery > 500:myThrottle.rect.centery = 500
pygame.quit()

搞定!到底能不能像嫦娥五号一样成功登月呢?今晚就和娃一起试试吧!Happy landing!

沃伦·桑德  卡特·桑德   著

杨文其  苏金国  易郑超   译

老少咸宜的Python编程启蒙书

“Python之父”龟叔推荐,获Jolt生产效率奖

新版全彩印刷,插图生动活泼

“孩子会喜欢上这一本以他们的视角所写的书,也会学到很多。”

——“Python之父”吉多·范罗苏姆

“Python,是00后的BASIC。据我观察,这本书是众多70后和80后教孩子编程的优选图书,也是很多家长自己学Python编程的开始。”

——爱编程的魏校长,知名教育博主

“这本书用Python语言教你如何写程序,是一本老少咸宜的编程书。”

——左耳朵耗子(陈皓)

“近年来少儿编程非常火爆。如果你是一位‘码农’家长,不如发挥自己的专长,做孩子的启蒙老师和学习伙伴,这本书就是很棒的‘亲子编程学习实践手册’。”

——周自恒,公众号“周花卷”主理人


购书传送门

文末提示:随书附赠无毒安装程序,一键式安装Python 3及Pygame模块,并获取本书所有游戏代码。请在桌面端单击“阅读原文”,下载随书资源。

给娃写个游戏,庆祝嫦娥五号登月相关推荐

  1. 计算机游戏的英语怎么写,电脑游戏英语怎么写

    随着电脑的普及,电脑游戏在我们的生活中也越来越常见.下面小编为大家带来电脑游戏的英语意思和相关用法,欢迎大家一起学习! 电脑游戏的英语意思 Computer game 电脑游戏的相关英语例句 1. A ...

  2. 扫雷php,PHP也可以写扫雷游戏 不信看这里 PHP挖地雷

    时间:2019-07-31 概述:PHP游戏 挖地雷 扫雷 PHP也可以写扫雷游戏 不信看这里 PHP挖地雷,是根据微软 Windows中的挖地雷游戏编写,虽然外观上没有Winform版的那么漂亮,但 ...

  3. 为英雄无敌3写个游戏修改器

    我是比较铁杆的英雄无敌3的fans,在网上看到这样的文章:http://game.china.com/zh_cn/play/10002765/20021113/11362720.html 就是让我方英 ...

  4. 快来试试Python写的游戏《我的世界》

    <我的世界 Minecraft>大家应该都听说过,但你有没有想过自己用Python写一个这样的游戏呢?太难.太复杂了?也许吧,但是不试一试你怎么知道能不能成呢? 国外有位叫fogleman ...

  5. c语言写rpg游戏,第1章 序(来,我们一起写个角色扮演游戏)

    一.为什么自己写一个游戏 如果你对玩游戏有足够的热情,这个问题可以不用回答了.我知道你认为游戏是一项融合了美术.音乐和故事的艺术.在你鉴赏他人艺术的同时,你自己也会有创造艺术的冲动. 我们玩了许多游戏 ...

  6. 使用Android Studio 写骰子游戏

    使用Android Studio 写骰子游戏 骰子游戏## 标题 详细代码如下: class MainActivity : AppCompatActivity() {override fun onCr ...

  7. 用python写跑酷游戏脚本,用Python写一个天天酷跑

    感觉上次写的植物大战僵尸与俄罗斯方块的反应还不错,这次这个文章就更有动力了 这次就写一个天天酷跑吧 写出来的效果图就是这样了 下面就更新一下全部的代码吧 还是老样子先定义`import pygame, ...

  8. 对话腾讯马晓轶:游戏投资布局稳健,发起“登月项目”探索未来

    文 | 竞核 "一个人的一小步,却是人类的一大步."1969年7月20日宇航员阿姆斯特丹登陆月球后,留下这句名言. 探索月球是中西方共同的母题,代表着对浩瀚宇宙的求知欲.中国古老神 ...

  9. 纯c语言游戏引擎开发,C++ 写个游戏引擎—(基础篇) 1

    目标:用 c++ 写个游戏引擎打基础 基本要求:有一定编程基础,对游戏编程有热情 开发平台:windows 开发工具:visual studio 2017 communicty 前言 今天 C++ 视 ...

最新文章

  1. AI和机器学习如何改善用户体验?
  2. rp软件app流程图_如何开发app软件,流程怎样
  3. 本地文件上传、下载服务器文件事物码
  4. 【转】关于DCMTK中像素存储以及getoutdata()函数的使用
  5. 中职计算机技术教学计划,中职计算机教学计划
  6. 使用maven构建多模块项目
  7. Flex 基于数据源的Menu Tree
  8. 运筹说 第41期 | 运输问题硬核知识点梳理—表上作业法求解运输问题
  9. 在word中强制换行方法如下
  10. 5年内在豫投资超30亿元 重点助力河南智慧城市运营
  11. Android:微信授权登录与微信分享全解析
  12. oracle 渗透,ODAT:一款专门用于Oracle渗透的工具
  13. 2021/4/29刷题
  14. C语言中的fprintf函数
  15. js-PhotoSwipe相册功能
  16. iOS 音频视频制作
  17. EZ CD Audio Converter
  18. Fedora16+XAMPP+Drupal7建站,从零开始全程指导
  19. 有哪些「神奇」的数据获取方式?
  20. hbuilderx使用字体图标

热门文章

  1. c语言fd变量,有哪位大神会用FD程序包计算功能多样性呀,在线等......
  2. python 函数调用列表_在项目列表上调用一个函数的最简洁方法 - python
  3. 鼠标右击 html5,认识HTML--写出第一个简易网页 -------16岁的小前端
  4. matlab 算法设计,计算方法——算法设计及其MATLAB实现
  5. 编写一个程序,实现将c语言源程序中的注释全部删除
  6. 函数实现十进制转二进制
  7. 【Zookeeper系列】ZooKeeper管理分布式环境中的数据(转)
  8. Mac拷贝/复制文件夹路径快捷键
  9. Android 判断字符串是否为空
  10. centos6.5下系统编译定制iptables防火墙扩展layer7应用层访问控制功能及应用限制QQ2016上网...