怎么用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号进行轰炸,网上搜了一下,发现网上的案列略复杂,就想着自己写一个算了.. 思路:所谓轰炸机,就是给某个人发很多信息,一直刷屏, ...
随机推荐
- nginx限制IP访问网站
需求:网站只允许指定IP访问,其他访问一律拒绝server { listen 80; server_name a.com; index index.html index.htm index.php; ...
- 为什么wget只下载某些网站的index.html? wget --random-wait -r -p -e robots=off -U mozilla http://www.example.com wget 下载整个网站,或者特定目录
wget -c -r -np -k -L -p http://blog.hesheyou.me -c, –continue 接着下载没下载完的文件 -r, –recursive 递归下载 -np, – ...
- ubuntu 更新源 或者 apt-get install 出错404 not found ,Failed to fetch
1.考虑是不是能上网 2.用apt-get update ,然后再试试apt-get install 如果apt-get update 也出现很多 404 not found 或者 failed to ...
- dubbo接口泛化调用例子
@ApiOperation(value = "dubbo泛化调用工具接口") public Result dubboApiTool( @ApiParam(value = " ...
- Python爬虫之爬取站内所有图片
title date tags layut Python爬虫之爬取站内所有图片 2018-10-07 Python post 目标是 http://www.5442.com/meinv/ 如需在非li ...
- kettle的基本使用
一.下载下载kettlehttp://sourceforge.net/projects/pentaho/files/Data%20Integration/7.0/pdi-ce-7.0.0.0-25.z ...
- python语法基础-基础-赋值与深浅拷贝
##################################### 预备知识一——python的变量及其存储 在详细的了解python中赋值.copy和deepcopy之前,我们还是要花一点时 ...
- 求求你,下次面试别再问我什么是 Spring AOP 和代理了!
https://mbd.baidu.com/newspage/data/landingsuper?context=%7B%22nid%22%3A%22news_9403056301388627935% ...
- Angular开发者指南(六)作用域
什么是作用域? 作用域是引用应用程序模型的对象. 它是表达式的执行上下文. 作用域以层次结构排列,模仿应用程序的DOM结构,它可以观察表达式和传播事件. 作用域的特征 Scope提供API($watc ...
- 深入JVM内核--常用JVM配置参数
Trace跟踪参数 -verbose:gc -XX:+printGC 可以打印GC的简要信息 [GC 4790K->374K(15872K), 0.0001606 secs] [GC 4790K ...