首先声明一下,这个所谓的三体气候模拟程序还是很简单的,没有真的3D效果或数学模型之类的,只不过是一个文字表示的模拟程序。该程序的某些地方可能不太严谨,所以也请各位多多包涵。

所谓三体气候模拟,就是将太阳出现的情况进行分类讨论,然后将其呈现出来。比如说一颗太阳就是恒纪元,两颗太阳可能是二日凌空或二日连珠,三颗太阳也可能是三日凌空或三日连珠。只要明白了这一点,这个三体气候模拟的程序就很好写了。

在写程序前,得先导入一个库。由于三体问题的复杂性,我们姑且将三颗太阳出现的概率定位三分之一,也就是说要用到随机的方法。所以我们这里需要导入random库中的randint——随机数函数。

from random import randint

在插入完random库后,要先确定几个变量。由于三体世界有三颗太阳,且可能出现在不同的位置,所以姑且定义变量:

# 其中0代表该太阳为飞星,1代表该太阳出现
sun1 = randint(0, 1)
sun2 = randint(0, 1)
sun3 = randint(0, 1)
# 1~3分别代表不同的位置,如果位置相同就是连珠
sun1_pos = randint(1, 3)
sun2_pos = randint(1, 3)
sun3_pos = randint(1, 3)

除了这几个基础变量,还需要两个用来输出气候类型和纪元类型的变量:weather和era_mode

weather = ""
era_mode = ""

因为后面将这两个变量以文字形式输出,所以是String的形式

完成变量设定后,就该考虑三体世界的气候情况了。

依照书中的描述,我们可以分为(恒纪元就不讨论了):三颗飞星(即没有太阳)、二日凌空、二日连珠、三日凌空和三日连珠

这么一来,就可以开始写程序了。

首先是没有太阳,即三颗飞星情况:

if sun1 == sun2 == sun3 == 0:   # 三颗太阳都没有出现
weather = "三颗飞星"
era_mode = "乱纪元"
print(era_mode, weather) # 输出气候情况

然后检测是否为恒纪元,即一颗太阳:

if sun1 == 1 and sun2 == sun3 == 0:
era_mode = "恒纪元"
print(era_mode)
elif sun2 == 1 and sun1 == sun3 == 0:
era_mode = "恒纪元"
print(era_mode)
elif sun3 == 1 and sun1 == sun2 == 0:
era_mode = "恒纪元"
print(era_mode)

接着是三颗太阳的情况:

if sun1 == sun2 == sun3 == 1:
if sun1_pos == sun2_pos == sun3_pos:
weather = "三日连珠"
era_mode = "乱纪元"
print(era_mode, weather)
else:
weather = "三日凌空"
era_mode = "乱纪元"
print(era_mode, weather)

最后是两颗太阳的情况,就相对比较麻烦了:

if sun1 == sun2 == 1:
if sun1_pos == sun2_pos:
weather = "二日连珠"
era_mode = "乱纪元"
print(era_mode, weather)
else:
weather = "二日凌空"
era_mode = "乱纪元"
print(era_mode, weather)
elif sun1 == sun3 == 1:
if sun1_pos == sun2_pos:
weather = "二日连珠"
era_mode = "乱纪元"
print(era_mode, weather)
else:
weather = "二日凌空"
era_mode = "乱纪元"
print(era_mode, weather)
elif sun2 == sun3 == 1:
if sun2_pos == sun3_pos:
weather = "二日连珠"
era_mode = "乱纪元"
print(era_mode, weather)
else:
weather = "二日凌空"
era_mode = "乱纪元"
print(era_mode, weather)

注意,这个从三颗飞星、一颗太阳、三颗太阳、两颗太阳的顺序是不能打乱的,否则就会出现气候判断不准的情况,因为这个程序的运行是从上往下走的,是线性的。举个例子,如果现在有三颗太阳,而两颗太阳的判定在三颗太阳的判定之前,程序运行时就会出现只输出二日连珠或二日凌空的情况,而不会输出三日凌空或三日连珠。

当然,你也可以用其他的方法让气候判断的排序改变,比如可以全部把这些判断啥的写道不同的函数里在进行判断,但在这里就不加以赘述。

最后把全部代码放上来:

 from random import randint

 # 其中0代表该太阳为飞星,1代表该太阳出现
sun1 = randint(0, 1)
sun2 = randint(0, 1)
sun3 = randint(0, 1)
# 1~3分别代表不同的位置,如果位置相同就是连珠
sun1_pos = randint(1, 3)
sun2_pos = randint(1, 3)
sun3_pos = randint(1, 3) weather = ""
era_mode = "" if sun1 == sun2 == sun3 == 0: # 三颗太阳都没有出现
weather = "三颗飞星"
era_mode = "乱纪元"
print(era_mode, weather) # 输出气候情况
elif sun1 == 1 and sun2 == sun3 == 0:
era_mode = "恒纪元"
print(era_mode)
elif sun2 == 1 and sun1 == sun3 == 0:
era_mode = "恒纪元"
print(era_mode)
elif sun3 == 1 and sun1 == sun2 == 0:
era_mode = "恒纪元"
print(era_mode)
elif sun1 == sun2 == sun3 == 1:
if sun1_pos == sun2_pos == sun3_pos:
weather = "三日连珠"
era_mode = "乱纪元"
print(era_mode, weather)
else:
weather = "三日凌空"
era_mode = "乱纪元"
print(era_mode, weather)
elif sun1 == sun2 == 1:
if sun1_pos == sun2_pos:
weather = "二日连珠"
era_mode = "乱纪元"
print(era_mode, weather)
else:
weather = "二日凌空"
era_mode = "乱纪元"
print(era_mode, weather)
elif sun1 == sun3 == 1:
if sun1_pos == sun2_pos:
weather = "二日连珠"
era_mode = "乱纪元"
print(era_mode, weather)
else:
weather = "二日凌空"
era_mode = "乱纪元"
print(era_mode, weather)
elif sun2 == sun3 == 1:
if sun2_pos == sun3_pos:
weather = "二日连珠"
era_mode = "乱纪元"
print(era_mode, weather)
else:
weather = "二日凌空"
era_mode = "乱纪元"
print(era_mode, weather)

总行数不超过100行,还是挺精简的

如果要查看太阳的生成,可以在添加完变量后(即上述代码的11行处)添加:

print("sun1: %u , sun2: %u , sun3: %u" % (sun1, sun2, sun3))
print("sun1_pos: %u , sun2_pos: %u , sun3: %u" % (sun1_pos, sun2_pos, sun3_pos))

欸嘿?你问我print里输入%是什么意思?python3 语法小记可以帮到你,毕竟这个语法还是蛮重要的,可以免去在print中加逗号所带来的一格空格。

2020/3/3

怎么用Python写一个三体的气候模拟程序的更多相关文章

  1. 用Python写一个简单的Web框架

    一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...

  2. 十行代码--用python写一个USB病毒 (知乎 DeepWeaver)

    昨天在上厕所的时候突发奇想,当你把usb插进去的时候,能不能自动执行usb上的程序.查了一下,发现只有windows上可以,具体的大家也可以搜索(搜索关键词usb autorun)到.但是,如果我想, ...

  3. [py]python写一个通讯录step by step V3.0

    python写一个通讯录step by step V3.0 参考: http://blog.51cto.com/lovelace/1631831 更新功能: 数据库进行数据存入和读取操作 字典配合函数 ...

  4. 【Python】如何基于Python写一个TCP反向连接后门

    首发安全客 如何基于Python写一个TCP反向连接后门 https://www.anquanke.com/post/id/92401 0x0 介绍 在Linux系统做未授权测试,我们须准备一个安全的 ...

  5. Python写一个自动点餐程序

    Python写一个自动点餐程序 为什么要写这个 公司现在用meican作为点餐渠道,每天规定的时间是早7:00-9:40点餐,有时候我经常容易忘记,或者是在地铁/公交上没办法点餐,所以总是没饭吃,只有 ...

  6. 用python写一个自动化盲注脚本

    前言 当我们进行SQL注入攻击时,当发现无法进行union注入或者报错等注入,那么,就需要考虑盲注了,当我们进行盲注时,需要通过页面的反馈(布尔盲注)或者相应时间(时间盲注),来一个字符一个字符的进行 ...

  7. python写一个能变身电光耗子的贪吃蛇

    python写一个不同的贪吃蛇 写这篇文章是因为最近课太多,没有精力去挖洞,记录一下学习中的收获,python那么好玩就写一个大一没有完成的贪吃蛇(主要还是跟课程有关o(╥﹏╥)o,课太多好烦) 第一 ...

  8. python写一个邮箱伪造脚本

    前言: 原本打算学php MVC的思路然后写一个项目.但是贼恶心, 写不出来.然后就还是用python写了个邮箱伪造. 0x01 第一步先去搜狐注册一个邮箱 然后,点开设置,开启SMTP服务. 当然你 ...

  9. 用python写一个非常简单的QQ轰炸机

    闲的没事,就想写一个QQ轰炸机,按照我最初的想法,这程序要根据我输入的QQ号进行轰炸,网上搜了一下,发现网上的案列略复杂,就想着自己写一个算了.. 思路:所谓轰炸机,就是给某个人发很多信息,一直刷屏, ...

随机推荐

  1. win10+CUDA9.0176、CUDNN7.6.0安装

    在github上下载了一个文本分类的代码,包含了CNN.LSTM等分类模型,运行时说我的CUDA版本不行,我原来是9.1,让我安装9.0 然后开始卸载9.1啊,在此感谢博主:https://blog. ...

  2. iOS 部分API理解

    - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typica ...

  3. idea新建maven项目后生成web.xml方法和添加到tomcat方法

    idea新建maven项目后生成web.xml方法和添加到tomcat方法 参考:https://www.cnblogs.com/Liang-Haishan216/p/9302141.html 1.首 ...

  4. servlet打包成war

    1.maven pom文件里指定打包类型 2.jdk工具 进入servlet目录,执行jar -cf war名 *

  5. linux重定向与管道符(一)

    linux重定向和管道符 为什么要使用重定向 1.当屏幕输出的信息很重要,而且我们需要将他存下来的时候: 2.后台执行中的程序,不希望他干扰屏幕正常的输出结果时: 3.系统的例行命令,例如定时任务的执 ...

  6. Django实现注册,往邮箱发送验证链接

    由于最近要做个平台,在GitHub上下载了一个系统框架,想着为了安全,实现注册时往一个邮箱发送注册信息,由管理员来确认是否同意其注册. 感谢博主:https://blog.csdn.net/geek_ ...

  7. android形状属性、锁屏密码、动态模糊、kotlin项目、抖音动画、记账app、视频播放器等源码

    Android精选源码 直观了解Android的"形状"属性如何影响Drawable的外观. 一个灵活的视频播放器, 可替换播放器内核. android锁屏输入密码功能源码 背景动 ...

  8. C++ List的用法

    Lists将元素按顺序储存在链表中. 与 向量(vectors)相比, 它允许快速的插入和删除,但是随机访问却比较慢. assign() 给list赋值 back() 返回最后一个元素 begin() ...

  9. 蓝桥杯-PREV31-小朋友排队

    解法: 这题有点像冒泡排序,但是做这题并不需要冒泡排序. 假设第i个小朋友比第j个小朋友高,而且i < j 为了把队伍排成从小到大,第i个小朋友一定要去第j个小朋友的右边.又因为只能交换位置相邻 ...

  10. 项目中spring容器加载的问题

    今天做一个项目采用的是传统架构,没有采用分布式,部署时出现了异常,信息是: org.springframework.beans.factory.NoSuchBeanDefinitionExceptio ...