怎么用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中加逗号所带来的一格空格。
2020/3/3
怎么用Python写一个三体的气候模拟程序的更多相关文章
- 用Python写一个简单的Web框架
一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...
- 十行代码--用python写一个USB病毒 (知乎 DeepWeaver)
昨天在上厕所的时候突发奇想,当你把usb插进去的时候,能不能自动执行usb上的程序.查了一下,发现只有windows上可以,具体的大家也可以搜索(搜索关键词usb autorun)到.但是,如果我想, ...
- [py]python写一个通讯录step by step V3.0
python写一个通讯录step by step V3.0 参考: http://blog.51cto.com/lovelace/1631831 更新功能: 数据库进行数据存入和读取操作 字典配合函数 ...
- 【Python】如何基于Python写一个TCP反向连接后门
首发安全客 如何基于Python写一个TCP反向连接后门 https://www.anquanke.com/post/id/92401 0x0 介绍 在Linux系统做未授权测试,我们须准备一个安全的 ...
- Python写一个自动点餐程序
Python写一个自动点餐程序 为什么要写这个 公司现在用meican作为点餐渠道,每天规定的时间是早7:00-9:40点餐,有时候我经常容易忘记,或者是在地铁/公交上没办法点餐,所以总是没饭吃,只有 ...
- 用python写一个自动化盲注脚本
前言 当我们进行SQL注入攻击时,当发现无法进行union注入或者报错等注入,那么,就需要考虑盲注了,当我们进行盲注时,需要通过页面的反馈(布尔盲注)或者相应时间(时间盲注),来一个字符一个字符的进行 ...
- python写一个能变身电光耗子的贪吃蛇
python写一个不同的贪吃蛇 写这篇文章是因为最近课太多,没有精力去挖洞,记录一下学习中的收获,python那么好玩就写一个大一没有完成的贪吃蛇(主要还是跟课程有关o(╥﹏╥)o,课太多好烦) 第一 ...
- python写一个邮箱伪造脚本
前言: 原本打算学php MVC的思路然后写一个项目.但是贼恶心, 写不出来.然后就还是用python写了个邮箱伪造. 0x01 第一步先去搜狐注册一个邮箱 然后,点开设置,开启SMTP服务. 当然你 ...
- 用python写一个非常简单的QQ轰炸机
闲的没事,就想写一个QQ轰炸机,按照我最初的想法,这程序要根据我输入的QQ号进行轰炸,网上搜了一下,发现网上的案列略复杂,就想着自己写一个算了.. 思路:所谓轰炸机,就是给某个人发很多信息,一直刷屏, ...
随机推荐
- Cesium 生成terrain地形数据----CTB方式及步骤
背景:项目前端使用Cesium,地形服务一直使用外网的,常常因为翻墙访问的问题,导致地形数据取不到,进而导致地球不能加载,故决定搭建自己的地形服务,彻底解决这个问题.博文包含以下几个过程: 下载原始地 ...
- TOJ-2811 Bessie's Weight Problem(DP、背包问题)
链接:https://ac.nowcoder.com/acm/contest/1082/K 题目描述 Bessie, like so many of her sisters, has put on a ...
- PAT甲级——1050 String Subtraction
1050 String Subtraction Given two strings S1 and S2, S=S1−S2 is defined to be the remain ...
- ubuntu .bashrc文件添加jdk后无法登录的解决方案
1. 快捷键(ctl-alt-f2)进入虚拟终端 2. 执行export PATH=/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/ ...
- winform显示word和ppt文档
最近所做的项目中需要在Winform窗体中显示Office文档.刚开始就使用webBrowser控件实现的,但是后来发现这个控件在显示Office文档的时候有个限制:只支持Office2003之前的版 ...
- thinking in java学习笔记:14章 类型信息
14.2 Class 对象 https://github.com/zhaojiatao/javase 1.什么是Class对象,Class对象是用来做什么的? Class对象是java程序用来创建类的 ...
- EXAM-2018-7-29
EXAM-2018-7-29 未完成 [ ] H [ ] A D 莫名TLE 不在循环里写strlen()就行了 F 相减特判 水题 J 模拟一下就可以发现规律,o(n) K 每个数加一减一不变,用m ...
- nonparametric method|One-Mean t-Interval Procedure|
8.4 Confidence Intervals for One Population Mean When σ Is Unknown 原先是 standardized version of x bar ...
- FFT算法的verilog实现
首先需要明白傅里叶相关的基本知识:还是 借用这位英雄的文章,真心写的让人佩服不已http://blog.jobbole.com/70549/ 然后是卷积的理解http://blog.csdn.net/ ...
- SHELL用法五(Case语句)
1.SHELL编程Case语句案例实战 1)Case选择条件语句的格式: case $INPUT in Pattern1) 语句1 ;; Pattern2) 语句2 ;; esac 2)Case语句企 ...