首先声明一下,这个所谓的三体气候模拟程序还是很简单的,没有真的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. HDU-4553 约会安排(线段树维护连续区间)

    http://acm.hdu.edu.cn/showproblem.php?pid=4553 Problem Description 寒假来了,又到了小明和女神们约会的季节.  小明虽为屌丝级码农,但 ...

  2. POJ-3264 Balanced Lineup(区间最值,线段树,RMQ)

    http://poj.org/problem?id=3264 Time Limit: 5000MS     Memory Limit: 65536K Description For the daily ...

  3. 三十四、www服务apache进阶

    9.虚拟主机:部署多个站点,每个站点希望用不同的站点域名和站点目录,或者是不同的端口和不同的IP,则需要虚拟主机,简单理解就是一个http服务要配置多个站点,就要虚拟主机. apache虚拟主机分为三 ...

  4. 关于 SQLServer Express 2012 的连接字符串

    调试的时候,使用的是 LocalDB,SqlConnection 的连接字符串很简单 Data Source=(localdb)\ProjectsV12;Initial Catalog=master; ...

  5. js之意想不到的结果

    js 是弱类型语言 ,在进行计算时 如果遇到不能计算的单位,就会进行默认转换 1.typeof NaN  结果为 “number”  原因:NaN 表示 不是不是一个数字(Not a Number), ...

  6. ef codefirst VS里修改数据表结构后更新到数据库

    2.根据已建立table的数据库建立ADO.NET数据模型在修改表后进入 工具->nuget包管理器->程序包管理器控制台 输入  enable-migrations   后vs会添加一个 ...

  7. TPO3-2 Depletion of Ogallala Aquifer

    Estimates indicate that the aquifer contains enough water to fill Lake Huron, but unfortunately, und ...

  8. Mac环境下安装Redis

    转自:http://www.jianshu.com/p/6b5eca8d908b -安装 下载安装包 redis-3.0.7.tar.gz 官网地址:http://redis.io/download ...

  9. 深入JVM内核--JVM简介

    JVM概念 jvm是指通过软件模拟的具有完整硬件系统功能的.运行在一个完全隔离环境中的完成计算机系统. 目前主要有vmMare.visual Box和JVM三款虚拟机. JVM使用软件模拟java字节 ...

  10. gitbook安装及初步使用

    gitbook安装 https://www.jianshu.com/p/421cc442f06c https://blog.csdn.net/lu_embedded/article/details/8 ...