怎么用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号进行轰炸,网上搜了一下,发现网上的案列略复杂,就想着自己写一个算了.. 思路:所谓轰炸机,就是给某个人发很多信息,一直刷屏, ...
随机推荐
- js window.onload 加载多个函数和追加函数
平时做项目 经常需要使用window.onload, 用法如下: function func(){alert("this is window onload event!");ret ...
- 《C程序设计语言》练习 1-6,1-7
#include<stdio.h> /*验证表达式getchar()!=EOF的值是0还是1*/ main () { int c; c=getchar()!=EOF; printf(&qu ...
- Pulsar、ZooKeeper、BookKeeper 作用简述
Pulsar:采取了存储计算分离的技术ZooKeeper 集群的作用和在 Kafka 中是一样的,都是被用来存储元数据.BookKeeper 集群则被用来存储消息数据.BookKeeper 有点儿类似 ...
- python面向对象类的约束和设计的统一化规范
.封装 定义:将一些东西内容封存到一个地方,你还可以再取出, 类设置静态属性,设置一些方法 对象可以在其对象空间中封装一些属性 2.多态 定义:一个事物的多种形态 就想a可以是一个字符串,可以是一个列 ...
- 堆优DIJ模板
Dij:贪心思想的单源最短路,时间复杂度O(n^2). Dij算法流程: d数组记录源点s到每个点的距离,若无边则设为inf,标记源点: 选出d数组中未标记的最小值,该节点记为k,并标记k为已求出最短 ...
- [LC] 253. Meeting Rooms II
Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],...] (si ...
- 安装VSCODE和typora黑屏
工欲善其事必先利其器,本来是为了学git为了保存代码,然后网上一顿搜索研究之后发现,用git来保存笔记也不错,因为现在用的onenote搜索实在在在在是太不方便了,除了搜索不行,其他方面她还是很好的, ...
- LeetCode Day 11
LeetCode0021 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1 ...
- OpenWrt Web 开发 LuCI框架 lua语言
LuCI作为“FFLuCI”诞生于2008年3月份,目的是为OpenWrt固件从 Whiterussian 到 Kamikaze实现快速配置接口.Lua是一个小巧的脚本语言,很容易嵌入其它语言.轻量级 ...
- hadoop datanode 启动正常,但master无法识别(50030不显示datanode节点)
start-all.sh 启动 坑爹 找不出错 试了各种办法,重新formaet 查看 集群ID是否相同.都无效 日志也没看到错 按官网方法手动一步步启,问题照旧 master节点,yarn name ...