噪声生成地形 v1.0 v1.1 v2.0 v2.1
写到第四版才想起来还没发(虽然第一版很水很水)
第一版


#噪声算法 自己先写写玩玩呗
#介绍
print('噪声地形生成v1.0')
print('''生成一个区块内的地形(其实就是条直线XD)
两端点数值可手动输入或随机 有检错功能
''')
#输入
print('输入一个区块的大小, 按回车则默认为16')
while True:
try:
chunk = input()
if chunk == '':
chunk = 16
if float(chunk) <= 1:
print(float(chunk))
chunk = ''
chunk = int(chunk)
break
except ValueError:
print('输入大于1的数字')
print('输入区块两端点大小, 按回车则随机')
while True:
try:
val_1 = input('val_1 = ')
if val_1 == '':
import random
val_1 = random.randint(0,chunk-1)
print('val_1 = ', val_1)
if float(val_1) < 0:
print(float(val_1))
val_1 = ''
val_1 = int(float(val_1))
break
except ValueError:
print('输入大于0的数字')
while True:
try:
val_2 = input('val_2 = ')
if val_2 == '':
import random
val_2 = random.randint(0,chunk-1)
print('val_2 = ', val_2)
if float(val_2) < 0:
print(float(val_2))
val_2 = ''
val_2 = int(float(val_2))
break
except ValueError:
print('输入大于0的数字')
#计算
noise = [val_1]
for x in range(1,chunk):
noise.append(int(val_2*x/chunk+val_1*(chunk-x)/chunk))
noise.append(val_2)
print(noise)
for x in noise:
print('██'*x)
print('\n\n\n')
for x in noise:
print(' '*(x-1),end='')
print('██')
第二版


#噪声算法 自己先写写玩玩呗
print('噪声地形生成v1.1')
print('1 随机生成区块大小 各区块大小不一样')
print('2 随机生成端点大小')
print('3 一定程度上减小了过大的斜率')
print('4 对于不同高度的地形加以改变组成的字符 可以生成 水 地面 山 有雪的高山')
print('5 会无限绘制区块 每行时间间隔0.02s')
print('6 删除了输入界面')
#输入
import random,time
chunk = random.randint(12,32)
val_1 = random.randint(0,72)
val_2 = random.randint(0,72)
while True:
#生成端点
k1 = (val_2-val_1)/chunk
chunk = random.randint(12,32)
if val_2 > 64:
chunk = random.randint(2,24)
val_3 = val_2
val_2 = random.randint(0,72)
n = 0
while n < 5:
if val_2 > 64 or val_2 <32 or (val_2-val_3)*(val_3-val_1) < -0.2 or ((val_2-val_3)*(val_3-val_1) < -0.2 and val_2-val_3 > 0):
val_2 = random.randint(0,72)
n+=1
if k1 < -1:
chunk = random.randint(4,16)
val_2 = random.randint(val_3-10,val_3+10)
if val_3 <= 30 and val_2-val_3 > 30:
val_2 = random.randint(val_3-10,val_3+30)
#计算 int(val_2*x/chunk+val_1*(chunk-x)/chunk)
val_1 = val_3
noise = [val_1]
for x in range(1,chunk):
noise.append(int(val_2*x/chunk+val_1*(chunk-x)/chunk))
noise.append(val_2)
#绘图 ██ ░░ ░░ ▓▓ ꧁꧂
for x in noise:
if x <= 20:
print('~~'*2,end='')
print('~~'*(x-2),end='')
print('||'*(20-x))
elif x <= 40:
print('~~'*x)
elif x <= 60:
print('~~'*40,end='')
print('**'*(x-40))
else:
print('~~'*40,end='')
print('**'*20,end='')
print('██'*(x-60))
time.sleep(0.02)
第三版


#通过缓和曲线加权
import random,time
print('噪声地形生成v2.0')
print('1 将加权方式由原来的线性改为 6x⁵-15x⁴+10x³,x∈[0,1] 使图像更平滑')
print('2 加快了刷新速度 约为每秒66.67行')
print('3 固定了区块大小为16 且每个区块的后一个端点值与该区块后一个区块的前一个端点的值相同')
print('4 地面 水 山 有雪的高山 的高度不在固定 而是受预设的高度限制影响 尽管高度限制只能在代码里改')
chunk,len = 16,72
val_1,val_2 = random.randint(int(len/72),len),random.randint(int(len/72),len)
def smth(x,chunk):
return(chunk*(6*(x/chunk)**5-15*(x/chunk)**4+10*(x/chunk)**3))
while True:
val_3 = val_2
val_2 = random.randint(int(len/36),len)
val_1 = val_3
noise = [val_1]
for x in range(1,chunk):
noise.append(int(val_1*(chunk-smth(x,chunk))/chunk+val_2*smth(x,chunk)/chunk))
noise.append(int(val_2*smth(x,chunk)/chunk+val_1*(chunk-smth(x,chunk))/chunk))
noise.append(val_2)
for x in noise:
if x <= int(len/3): #24
print('~~'*x, end='')
print('||'*int(len/3-x))
elif x <= int(len*4/9): #32
print('~~'*x)
elif x <= int(len*7/9): #56
print('~~'*(int(len*4/9)), end='')
print('**'*(x-int(len*4/9)))
else:
print('~~'*int(len*4/9), end='')
print('**'*(int(len*7/9)-int(len*4/9)), end='')
print('██'*(x-int(len*7/9)))
time.sleep(0.015)
第四版



#通过缓和曲线加权
import random,time
print('噪声地形生成v2.1')
print('1 增加了自定义 区块大小 高度限制 刷新速度 的功能')
print('2 使山没那么平淡 连接处变得粗糙')
print('3 使生成平均斜率大于30度的地形的概率减半 即增加了平地的量')
print('4 我写代码注释了')
#输入
def TypeIn(default):
while True:
try:
v = input('')
if v == '':
v = default
if float(v) <= 1 or float(v) != int(float(v)):
v = ''
v = int(float(v))
break
except ValueError:
print('输入大于1的整数')
return(v)
print('输入区块两端点大小, 按回车则默认16 (不确定就默认)')
chunk = TypeIn(16)
print('输入高度限制大小, 按回车则默认72 (如果图像有错误应减小)')
len = TypeIn(72)
print('输入每秒刷新的行数, 按回车则默认 50 行/s')
speed = TypeIn(50)
#取随机数
val_1,val_2 = random.randint(int(len/72),len),random.randint(int(len/72),len)
def smth(x,chunk):
return(chunk*(6*(x/chunk)**5-15*(x/chunk)**4+10*(x/chunk)**3))
while True:
val_3 = val_2
val_2 = random.randint(int(len/36),len)
if ((val_2-val_3)/chunk)**2 >= 1/3: #让地形平一点 平均斜率超过30°就再尝试一次生成
val_2 = random.randint(int(len/36),len)
val_1 = val_3
#计算值
noise = [val_1]
for x in range(1,chunk):
noise.append(int(val_1*(chunk-smth(x,chunk))/chunk+val_2*smth(x,chunk)/chunk))
noise.append(int(val_2*smth(x,chunk)/chunk+val_1*(chunk-smth(x,chunk))/chunk))
noise.append(val_2)
#显示图像
for x in noise:
mis = random.randint(0,int(round(len/18,0))) #让图像没那么平淡
if x <= int(len/3): #24
print('~~'*x, end='')
print('||'*int(len/3-x))
elif x <= int(len*4/9): #32
print('~~'*x)
elif x <= int(len*7/9): #56
print('~~'*(int(len*4/9)-1), end='')
print('~'*mis, end='')
print('**'*(x-int(int(len*4/9)-1+0.5*mis)))
else:
print('~~'*(int(len*4/9)-1), end='')
print('~'*mis, end='')
print('**'*(int(len*7/9)-int(int(len*4/9)-1+0.5*mis)), end='')
print('██'*(x-int(len*7/9)))
time.sleep(1/speed)