A simulator simulating a 3D variant of Factorio
Posted: August 27th, 2024, 12:38 am
This is a script used to simulate user-specified patterns in a 3D variant of Factorio (R3,C2,S2,B3,N+), using a 3D variant of the Cross neighbourhood. The birth/survival conditions remain the same.
Specifically, it simulates this rule in a bounded 3-torus (whose size is given by the variable arraysize).
This script is written completely in Python 3. Feel free to ask questions about the script.
Specifically, it simulates this rule in a bounded 3-torus (whose size is given by the variable arraysize).
This script is written completely in Python 3. Feel free to ask questions about the script.
Code: Select all
import random
arraysize = 16
ticks = 256
oscdetection = True
maxperiod = 256
alivecells = [[0,0,1],[0,1,0],[1,0,0],[1,1,1]]
array = []
for i in range(0, arraysize):
newplane = []
for j in range(0, arraysize):
newrow = []
for k in range(0, arraysize):
if [k,j,i] in alivecells:
newrow.append(1)
else:
newrow.append(0)
newplane.append(newrow)
array.append(newplane)
def runforonetick(array):
arraytortured = []
newarray = []
for i in range(0, arraysize):
newplane = []
for j in range(0, arraysize):
newrow = []
for k in range(0, arraysize):
nb = 0
for b in [-3,-2,-1,1,2,3]:
nb = nb + array[(i+b)%arraysize][j][k]
nb = nb + array[i][(j+b)%arraysize][k]
nb = nb + array[i][j][(k+b)%arraysize]
state = array[i][j][k]
if state == 1 and nb == 2:
newrow.append(1)
elif state == 0 and nb == 3:
newrow.append(1)
else:
newrow.append(0)
newplane.append(newrow)
newarray.append(newplane)
return newarray
def formarray(array):
s = ''
for i in range(0, arraysize):
for j in range(0, arraysize):
for k in range(0, arraysize):
if array[i][j][k] == 1:
s = s + '*'
if array[i][j][k] == 0:
s = s + '.'
s = s + '\n'
s = s + '\n\n\n\n\n'
return s
if oscdetection == False:
for a in range(0, ticks):
print(a)
array = runforonetick(array)
if oscdetection == True:
soup = array
arraylist = [soup]
for i in range(0, maxperiod):
array = runforonetick(array)
arraylist.append(array)
isosc = False
p = []
for i in range(0, maxperiod):
index = maxperiod-i-1
if arraylist[index] == arraylist[-1]:
isosc = True
p.append(maxperiod-index)
if isosc == True:
print('Configuration evolves to an oscillator with period '+str(p[0])+'.')
if isosc == False:
print('Configuration is either a high-period oscillator or a methuselah.')