怎么用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)

注意,这个从三颗飞星、一颗太阳、三颗太阳、两颗太阳的顺序是不能打乱的,否则就会出现气候判断不准的情况,因为这个程序的运行是从上往下走的,是线性的。举个例子,如果现在有三颗太阳,而两颗太阳的判定在三颗太阳的判定之前,程序运行时就会出现只输出二日连珠或二日凌空的情况,而不会输出三日凌空或三日连珠。

当然,你也可以用其他的方法让气候判断的排序改变,比如可以全部把这些判断啥的写道不同的函数里在进行判断,但在这里就不加以赘述。

最后把全部代码放上来:

 1 from random import randint
 2
 3 # 其中0代表该太阳为飞星,1代表该太阳出现
 4 sun1 = randint(0, 1)
 5 sun2 = randint(0, 1)
 6 sun3 = randint(0, 1)
 7 # 1~3分别代表不同的位置,如果位置相同就是连珠
 8 sun1_pos = randint(1, 3)
 9 sun2_pos = randint(1, 3)
10 sun3_pos = randint(1, 3)
11
12 weather = ""
13 era_mode = ""
14
15 if sun1 == sun2 == sun3 == 0:   # 三颗太阳都没有出现
16     weather = "三颗飞星"
17     era_mode = "乱纪元"
18     print(era_mode, weather)    # 输出气候情况
19 elif sun1 == 1 and sun2 == sun3 == 0:
20     era_mode = "恒纪元"
21     print(era_mode)
22 elif sun2 == 1 and sun1 == sun3 == 0:
23     era_mode = "恒纪元"
24     print(era_mode)
25 elif sun3 == 1 and sun1 == sun2 == 0:
26     era_mode = "恒纪元"
27     print(era_mode)
28 elif sun1 == sun2 == sun3 == 1:
29     if sun1_pos == sun2_pos == sun3_pos:
30         weather = "三日连珠"
31         era_mode = "乱纪元"
32         print(era_mode, weather)
33     else:
34         weather = "三日凌空"
35         era_mode = "乱纪元"
36         print(era_mode, weather)
37 elif sun1 == sun2 == 1:
38     if sun1_pos == sun2_pos:
39         weather = "二日连珠"
40         era_mode = "乱纪元"
41         print(era_mode, weather)
42     else:
43         weather = "二日凌空"
44         era_mode = "乱纪元"
45         print(era_mode, weather)
46 elif sun1 == sun3 == 1:
47     if sun1_pos == sun2_pos:
48         weather = "二日连珠"
49         era_mode = "乱纪元"
50         print(era_mode, weather)
51     else:
52         weather = "二日凌空"
53         era_mode = "乱纪元"
54         print(era_mode, weather)
55 elif sun2 == sun3 == 1:
56     if sun2_pos == sun3_pos:
57         weather = "二日连珠"
58         era_mode = "乱纪元"
59         print(era_mode, weather)
60     else:
61         weather = "二日凌空"
62         era_mode = "乱纪元"
63         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

原文地址:https://www.cnblogs.com/PekingMan/p/ThreeBodyWeatherMaker.html

时间: 2024-11-11 14:56:32

怎么用Python写一个三体的气候模拟程序的相关文章

用Python写一个ftp下载脚本

用Python写一个ftp下载脚本 ----基于Red Hat Enterprise Linux Server release 6.4 (Santiago):python 2.6.6 Ps:少侠我接触Python半个月以来接到的第一个需求,虽然如此简单的一个脚本,少侠我磕磕绊绊却用了将近一天半的时间才写出来,但还是很开心,毕竟也粗来了,废话不多说,切入正题.因为一开始没有用过ftplib模块,所以各种谷歌度娘一堆资料杂乱不堪,话不清,理不乱的,本文实现的功能简单,下面介绍一下,以免误导读者. 需

老男孩教育每日一题-2017-04-17:使用Shell或Python写一个脚本,CPU使用率超过80%或硬盘超过85%邮件报警

老男孩教育每日一题-2017-04-17: 使用Shell或Python写一个脚本,CPU使用率超过80%或硬盘超过85%邮件报警. 今天是老男孩教育每日一题陪伴大家的第29天.

python写一个脚本解析文件

Python写一个脚本解析文件 ----基于Red Hat Enterprise Linux Server release 6.4 (Santiago):python 2.6.6 需求: 1.去掉空行 2.去掉空行后输出到一个新文件 附加需求(排版):1.'-'缩进n个字符 '-'缩进2n个字符 以此类推 2.'-'开头的所有句子输出在一行 '-'开头的句子输出在一行 以此类推 --------------------------------------------分隔线------------

python写一个通讯录V2.0

python写一个通讯录step by step V2.0 引用知识 list + dict用于临时存储用户数据信息 cPickle用于格式化文件存取 依旧使用file来进行文件的存储 解决问题 1.操刀开始去做 原始代码 实现功能(可做模板) 1.判断输入内容是否在给出的menu目录内,在的话,返回对应结果,不在就报错 2.调用os模块的exit功能 3.字典配合循环加上函数实现switch的功能 #!/usr/bin/env python #coding:utf8 #Author:zhuim

[py]python写一个通讯录step by step V3.0

python写一个通讯录step by step V3.0 参考: http://blog.51cto.com/lovelace/1631831 更新功能: 数据库进行数据存入和读取操作 字典配合函数调用实现switch功能 其他:函数.字典.模块调用 注意问题: 1.更优美的格式化输出 2.把日期换算成年龄 3.更新操作做的更优雅 准备工作 db准备 - 创建数据库 mysql> create database txl charset utf8; Query OK, 1 row affecte

十行代码--用python写一个USB病毒 (知乎 DeepWeaver)

昨天在上厕所的时候突发奇想,当你把usb插进去的时候,能不能自动执行usb上的程序.查了一下,发现只有windows上可以,具体的大家也可以搜索(搜索关键词usb autorun)到.但是,如果我想,比如,当一个usb插入时,在后台自动把usb里的重要文件神不知鬼不觉地拷贝到本地或者上传到某个服务器,就需要特殊的软件辅助. 于是我心想,能不能用python写一个程序,让它在后台运行.每当有u盘插入的时候,就自动拷贝其中重要文件. 如何判断U盘的插入与否? 首先我们打开电脑终端,进入/Volume

python写一个通讯录

闲着没事,用python写一个模拟通讯录,要求要实现常用的通讯录的功能,基本流程如下 ? 接下来就按照这个流程实现各个模块的功能 1. 定义一个类,并初始化 1 import json 2 import time 3 4 5 class Address(object): 6 def __init__(self): 7 with open("通讯录.txt", 'r', encoding='utf-8') as f: 8 self.data = json.loads(f.read())

基于zabbix用Python写一个运维流量气象图

前言:同事问我,你写运维平台最先写哪一部分?好吧,还真把我问倒了,因为这是在问最应该放在放在第一位的东西~作为一个工作不足两年,运维不足一年的新手来说,还真不敢妄下评论,其实按照我的思路,觉得最重要的部分肯定是故障处理,报警,但是这一块怎么写?怎么说?肯定不能重复造轮子了,不过我最想写的是报表系统,思路是有的,但是一直耽搁了,详情参考http://youerning.blog.51cto.com/10513771/1708925. 好吧,在回到那个问题,应该先写哪个部分.我没回答,反问他了. 他

用 Python 写一个 NoSQL 数据库

本文译自 What is a NoSQL Database? Learn By Writing One In Python. 完整的示例代码已经放到了 GitHub 上, 请 点击这里, 这仅是一个极简的 demo, 旨在动手了解概念. 如果对译文有任何的意见或建议,欢迎 提 issue 讨论, 批评指正. 后续如有更新,可见 博客 . NoSQL 这个词在近些年正变得随处可见. 但是到底 "NoSQL" 指的是什么? 它是如何并且为什么这么有用? 在本文, 我们将会通过纯 Pytho