python物理引擎模拟三体_怎么用Python写一个三体的气候模拟程序

首先声明一下,这个所谓的三体气候模拟程序还是很简单的,没有真的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中加逗号所带来的一格空格。

1、打开已有的一组三体配置文件(.tbc)并运行(点击播放按钮)。 "File"菜单下有导入(Import)、导出(Export)功能,在不能上传附件时方便以纯文本方式交流自己搜索出来的三体配置! 2、手工设定初始条件的全部数值(点击魔术棍按钮)。分别指定三个物体的初始条件(X、Y、Z坐标,质量,初始速度的幅度、在XY平面上的角度0~360、在XZ平面上的角度0~360)。四个圆形选项(Radio Button)是参照系选择:默认的"Normalize to Centroid"是按三体系统质心作为参照系进行速度平衡,相当于观察者总是跟随三体的质心运动。另外三个选项分别是以第一、二、三个天体作为参照系,即总是把这个天体放在中心位置从不移动--注意这是非惯性参照系!(一般应选取行星主要围绕的那个恒星,方便观察行星轨道) 如果XZ平面上的初始速度角度都是0,则退化为二维的三体。 不过手工设定的条件通常都很难稳定运行。 3、设定搜索条件,让软件自动搜索。搜索分为两步: 3.1、搜索稳定的三体解(点击望远镜按钮) 第一部分是每个物体的约束条件:坐标最大值、最小质量、最大质量、最小速度幅度、最大速度幅度。 第二部分是是否要求三体在最初N步里超出一个边长为M的方框范围。这样看起来比较有趣,但搜索起来可能很慢。 第三部分是三体必须在N步里不超出一个边长为M的方框范围。否则它们很快发散就不好玩了。 然后那个复选框是:是否只进行二维搜索。 搜索结束后会出现一组初始条件值,点OK就开始运行了。 3.2、在三体解的基础上,搜索稳定的行星解(点击右下有小球的望远镜按钮) 手工设定或者自动搜索出来的解,如果喜欢的话,可以存盘,也可以导出为纯文本贴在论坛上与大家共享。压缩包里的.tbc也是偶自己用这个软件搜出来的。 四个播放按钮: 第一个播放形状的,是开始或者继续运行; 第二个暂停形状的,是暂停; 第三个短箭头,是减速运行; 第三个双箭头,是加速运行。 速度有很多档次,从减速6倍到加速运行100倍,直到加速100倍跳3125帧(相当于加倍312500倍,但每隔3125帧才显示一帧,所以看起来很不连续),每5倍为一个档次。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值