我用python3编了一个系统熵变模拟软件,改了几次运行后使用另一个读取器读取产生的结果显示模拟器产生的结果为空,不知道是显示系统错了还是软件错了、怎么改错。现在代码已经有240行了,注意调试认真点,主要代码在类里。
超级模拟器.py:
import platform
import random
import pickle
import ctypes
import os
debug = 1
class Main:
def __init__(self):
self.speed = random.uniform(1, 4)
self.data = []
self.size = random.randint(5, 10)
for i in range(1, self.size+1):
self.data.append([0 for i in range(round(i*self.speed))])
self.now = 0
def nock(self):
try:
exec("self.data[self.now]")
except:
return 2
try:
self.data[self.now][len(self.data[self.now]) - 1]
except:
return 1
num = 0
for i in self.data[self.now]:
if i != 0:
num += 1
if num > self.size // 2:
if self.data[self.now][len(self.data[self.now]) - 1] != 0:
self.now += 1
try:
range(len(self.data[self.now]))
except:
pass
else:
for i in range(len(self.data[self.now])):
if self.data[self.now][i] != 0:
self.data[self.now][i][0] += 1
self.data[self.now][i][1] += random.randint(-1, 1)
if self.data[self.now][i][0] >= self.data[self.now][i][1]:
self.data[self.now][i] = 0
if self.data[self.now][i] != 0:
if self.data[self.now][i][0] > 18:
if self.data[self.now][i][0] / self.data[self.now][i][1] > 0.6:
if self.data[self.now][i-1] != 0:
self.data[self.now][i-1][0] += 10
self.data[self.now][i][0] -= 10
self.data[self.now][i][2].append(self.data[self.now][i-1])
if self.data[self.now][i+1] != 0:
self.data[self.now][i+1] += 10
self.data[self.now][i] -= 10
self.data[self.now][i][2].append(self.data[self.now][i+1])
if not all(self.data[self.now][i][2]):
if self.data[self.now].find(self.data[self.now][i][2]) != -1:
self.data[self.data[self.now].index(self.data[self.now][i][2])][0] += 10
self.data[self.now][i][0] -= 10
def insert(self):
live = self.size / (self.now * self.size / 2 + 1) + random.randint(-5, 5)
index = []
try:
self.data[self.now]
except IndexError:
return 1
for i in range(len(self.data[self.now])):
if self.data[self.now][i] == 0:
index.append(i)
if index != []:
i = random.choice(index)
self.data[self.now][i] = [0, live, [], {}]
for j in range(20):
key = j + 1
value = random.randint(1, 9)
self.data[self.now][i][3][key] = value
def connect(self):
temp1 = []
try:
self.data[self.now]
except IndexError:
return 1
for i in range(len(self.data[self.now])):
if self.data[self.now][i] != 0:
temp1.append(i)
connnum = []
for i in temp1:
connnum.append(len(self.data[self.now][i][2]))
if connnum == []:
return 2
temp3 = min(connnum)
for temp2 in range(len(self.data[self.now])):
if self.data[self.now][temp2] == 0:
return 2
if len(self.data[self.now][temp2][2]) == temp3:
break
big = random.randint(2, 5)
small = -big
for i in range(small, big):
try:
if self.data[self.now][temp2 + i] != 0:
if random.randint(0, 1):
self.data[self.now][temp2][2].append(self.data[self.now][temp2 + i])
except IndexError:
pass
def move(self):
temp1 = []
for i in range(len(self.data[self.now])):
if self.data[self.now][i] != 0:
temp1.append(i)
if temp1 != []:
temp2 = random.choice(temp1)
temp3 = []
for i in range(len(self.data[self.now])):
if self.data[self.now][i] == 0:
temp3.append(i)
temp4 = random.choice(temp1)
self.data[self.now][temp4] = self.data[self.now][temp2]
del self.data[self.now][temp2]
def newinfo(self):
for i in range(len(self.data[self.now])):
if self.data[self.now][i] != 0:
if len(self.data[self.now][i][2]) != 0:
temp = i
break
if "temp" in dir():
for i in os.listdir(r"C:\Users\CK\Desktop"):
if i.find(".txt") != -1:
_data_ = open(rf"E:\entropy\{i}", encoding="utf-8").read()
break
if "_data_" in dir():
self.data[self.now][temp][3][random.randint(1, 9)] = random.choice(_data_.splitlines())
if "temp" in dir():
try:
self.data[self.now].index(random.choice(self.data[self.now][temp][2]))
except:
pass
else:
try:
self.data[self.now].index(random.choice(self.data[self.now][temp][2]))
except:
pass
else:
try:
self.data[self.now].index(random.choice(self.data[self.now][temp][2]))
except:
pass
else:
try:
self.data[self.now].index(random.choice(self.data[self.now][temp][2]))
except:
pass
else:
try:
self.data[self.now].index(random.choice(self.data[self.now][temp][2]))
except:
pass
else:
index1 = self.data[self.now].index(random.choice(self.data[self.now][temp][2]))
for i in range(random.randint(5, 10)):
index2 = random.randint(1, 20)
index3 = random.randint(1, 20)
temp1 = self.data[self.now][temp][3][index2]
self.data[self.now][index1][3][index2] = temp1
temp2 = self.data[self.now][index1][3][index2]
self.data[self.now][temp][3][index2] = temp2
self.data[self.now][index1][1] += 1
def run(self):
for i in range(self.size//3*2):
self.insert()
self.nock()
i = 1
for i in range(self.size ** 2):
if self.now > self.size:
return self.data
entropy = 0
for i in range(len(self.data)):
for j in range(len(self.data[i])):
try:
entropy += self.data[i][j][0]
except:
pass
if random.uniform(0, 1) < (self.size / 2) / i:
if self.insert() == 1:
return self.data
if random.uniform(0, 1) < i/self.size:
if self.connect() == 1:
return self.data
if random.uniform(0, 1) < i/self.size/1.75:
self.newinfo()
if random.uniform(0, 1) < i/self.size/2.5:
self.move()
self.nock()
return self.data
def gls(folder):
"""
获取磁盘剩余空间
:param folder: 磁盘路径 例如 D:\\
:return: 剩余空间 单位 G
"""
folderTemp = folder
if not os.path.exists(folderTemp):
folderTemp = os.getcwd()
if platform.system() == 'Windows':
free_bytes = ctypes.c_ulonglong(0)
ctypes.windll.kernel32.GetDiskFreeSpaceExW(ctypes.c_wchar_p(folderTemp), None, None, ctypes.pointer(free_bytes))
return free_bytes.value / 1024 / 1024 / 1024
else:
st = os.statvfs(folderTemp)
return st.f_bavail * st.f_frsize / 1024 / 1024
if __name__ == "__main__":
x = 0
while gls("E:") > 0.75:
with open(r"E:\entropy\001.num", "r") as f:
num = int(f.read())
with open(r"E:\entropy\001.num", "w") as f:
f.write(str(num + 1))
while True:
datas = []
try:
main = Main()
datas.append(main.run())
except:
if debug:
print(f"stop in {x} to save!!!count to {x}...")
break
x = x + 1
if debug:
print(f"no.{x} made from com.{id(main)}")
with open(fr"E:\entropy\{num}.pkl", "wb") as f:
pickle.dump(datas, f)
```python
读取模拟器.py:
from tkinter.filedialog import *
from tkinter import *
import pickle
import re
import os
root = Tk()
t1 = Text()
t1.pack()
data = []
file = ""
def op_en():
global file
global data
file = askopenfilename()
with open(file, "rb") as f:
data = pickle.load(f)
def getinfo():
for k in data:
for i in range(len(k)):
for j in range(len(k[i])):
if k[i][j] != 0:
t1.insert(END, f"age:{k[i][j][0]}\tlife:{k[i][j][1]}\n")
t1.insert(END, f"friend:{k[i][j][2]}\tdata:{k[i][j][3]}\n\n")
if os.path.isfile(file):
os.remove(file)
def draw():
for d in data:
for i in range(len(d)):
for j in range(len(d[i])):
if d[i][j] == 0:
t1.insert(END, chr(1))
else:
t1.insert(END, "■")
t1.insert(END, "\n")
t1.insert(END, "\n\n")
if os.path.isfile(file):
os.remove(file)
Button(root, text="打开", command=op_en).pack()
Button(root, text="信息", command=getinfo).pack()
Button(root, text="绘图", command=draw).pack()
Button(root, text="清空", command=lambda:t1.delete(0.0, END)).pack()
mainloop()
超级模拟器:
no.1 made from com.30294672
no.2 made from com.59649200
no.3 made from com.31998992
no.4 made from com.30325136
no.5 made from com.30294672
no.6 made from com.30325136
no.7 made from com.30294672
no.8 made from com.59646576
no.9 made from com.30294672
no.10 made from com.59646352
no.11 made from com.30294672
no.12 made from com.59646352
no.13 made from com.59649200
no.14 made from com.59646352
no.15 made from com.30395536
no.16 made from com.30395696
no.17 made from com.30395856
no.18 made from com.30395504
no.19 made from com.30395792
no.20 made from com.30395504
no.21 made from com.59646576
no.22 made from com.30294672
stop in 22 to save!!!count to 22...
no.23 made from com.30294672
no.24 made from com.30325392
no.25 made from com.59649232
no.26 made from com.30325392
no.27 made from com.59649168
no.28 made from com.59649200
no.29 made from com.30395824
no.30 made from com.59649232
no.31 made from com.30395824
no.32 made from com.30395472
no.33 made from com.30395792
no.34 made from com.30395472
no.35 made from com.30395792
no.36 made from com.30395472
no.37 made from com.30395792
no.38 made from com.30395760
no.39 made from com.30395792
no.40 made from com.30395696
no.41 made from com.30396016
no.42 made from com.30395472
no.43 made from com.30396016
no.44 made from com.30395696
no.45 made from com.30395856
no.46 made from com.30396048
no.47 made from com.30395856
no.48 made from com.30395696
stop in 48 to save!!!count to 48...
no.49 made from com.30396112
no.50 made from com.30395728
读取模拟器.py:
由于软件不改时很多格子是空的,所以进行了更改,但更改后软件生成结果里读取出是全空的。我尝试减少代码中被隐藏的错误,开始调试,之后出现很多错误。调试完成后,软件就读取不出任何数据了,我觉得是模拟器的问题,但是调试不出到底是什么问题。于是尝试继续改错,最后问题没有解决,代码就已经240行了,记得也检查读取器的问题,不知道适不适用这个软件,因为也在模拟器上看到过问题没有解决(模拟器产生了多个系统, 但读取器绘图只有一个系统被读。)。
我想要的结果是模拟器的结果不变,读取器按绘图后能显示很多黑格(读取器读取的是模拟器产生的文件,pkl后缀名。)。