噪聲生成地形 v1.0 v1.1 v2.0 v2.1
寫到第四版才想起來(lái)還沒(méi)發(fā)(雖然第一版很水很水)
第一版


#噪聲算法 自己先寫寫玩玩唄
#介紹
print('噪聲地形生成v1.0')
print('''生成一個(gè)區(qū)塊內(nèi)的地形(其實(shí)就是條直線XD)
兩端點(diǎn)數(shù)值可手動(dòng)輸入或隨機(jī) 有檢錯(cuò)功能
''')
#輸入
print('輸入一個(gè)區(qū)塊的大小, 按回車則默認(rèn)為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的數(shù)字')
print('輸入?yún)^(qū)塊兩端點(diǎn)大小, 按回車則隨機(jī)')
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的數(shù)字')
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的數(shù)字')
#計(jì)算
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 隨機(jī)生成區(qū)塊大小 各區(qū)塊大小不一樣')
print('2 隨機(jī)生成端點(diǎn)大小')
print('3 一定程度上減小了過(guò)大的斜率')
print('4 對(duì)于不同高度的地形加以改變組成的字符 可以生成 水 地面 山 有雪的高山')
print('5 會(huì)無(wú)限繪制區(qū)塊 每行時(shí)間間隔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:
? ? #生成端點(diǎn)
? ? 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)
? ? #計(jì)算 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)
第三版


#通過(guò)緩和曲線加權(quán)
import random,time
print('噪聲地形生成v2.0')
print('1 將加權(quán)方式由原來(lái)的線性改為 6x?-15x?+10x3,x∈[0,1] 使圖像更平滑')
print('2 加快了刷新速度 約為每秒66.67行')
print('3 固定了區(qū)塊大小為16 且每個(gè)區(qū)塊的后一個(gè)端點(diǎn)值與該區(qū)塊后一個(gè)區(qū)塊的前一個(gè)端點(diǎn)的值相同')
print('4 地面 水 山 有雪的高山 的高度不在固定 而是受預(yù)設(shè)的高度限制影響 盡管高度限制只能在代碼里改')
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)
第四版



#通過(guò)緩和曲線加權(quán)
import random,time
print('噪聲地形生成v2.1')
print('1 增加了自定義 區(qū)塊大小 高度限制 刷新速度 的功能')
print('2 使山?jīng)]那么平淡 連接處變得粗糙')
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的整數(shù)')
? ? return(v)
print('輸入?yún)^(qū)塊兩端點(diǎn)大小, 按回車則默認(rèn)16 (不確定就默認(rèn))')
chunk = TypeIn(16)
print('輸入高度限制大小, 按回車則默認(rèn)72 (如果圖像有錯(cuò)誤應(yīng)減小)')
len = TypeIn(72)
print('輸入每秒刷新的行數(shù), 按回車則默認(rèn) 50 行/s')
speed = TypeIn(50)
#取隨機(jī)數(shù)
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: ? #讓地形平一點(diǎn) 平均斜率超過(guò)30°就再嘗試一次生成
? ? ? ? val_2 = random.randint(int(len/36),len)
? ? val_1 = val_3
? ? #計(jì)算值
? ? 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))) ? #讓圖像沒(méi)那么平淡
? ? ? ? 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)