-
Notifications
You must be signed in to change notification settings - Fork 1
/
NewTree_codigo_gubi.gd
88 lines (75 loc) · 1.87 KB
/
NewTree_codigo_gubi.gd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
extends SceneTree
# Árvore de exemplo
var tree = {
"00":[0,1,0],
"10":[0,0,1],
"20":[1,0,0],
"1":[.7,0,.3],
"02":[0,0,1],
"12":[1,0,0],
"22":[0,1,0]
}
# Árvore "canalha"
# var tree = {
# "0": [.6,.4],
# "11": [.8,.2],
# "001": [.5,.5],
# "101": [.2,.8]
#}
# Classe principal que define uma árvore
class Tree:
var trans ={} # Tabela de transições
var tam # Tamanho da tabela
var estado="" # Histórico das escolhas
func _init(desc):
trans = desc
tam = desc.size()
# internamente armazenamos a acumulada
for v in desc.values():
for i in range(1,v.size()):
v[i] += v[i-1]
# Seleciona o próximo valor para o sufixo idx
func sel(idx):
var p = randf()
var pps = trans[idx]
for i in range(0,pps.size()-1):
if p < pps[i]:
return str(i)
return str(pps.size()-1)
##################################################################
# As duas funções abaixo poderiam ser agrupadas em um único
# gerador/iterador, mas aparentemente o GDScript possui limitações
# quanto a isso
# Inicializa a árvore
func disparo():
var ix = int(rand_range(0,tam))
estado = trans.keys()[ix]
# Devolve o próximo valor em função do estado corrente
func prox():
#procura um sufixo a partir da direita
var pos = estado.length()-1
var sufix = estado.right(pos)
while !trans.has(sufix) && pos >= 0:
pos -= 1
# teste para o caso onde não existe sufixo registrado
# marquei o erro com "X", mas o programa poderia para
# imediatamente
if pos < 0 :
estado += "X"
return "X"
sufix = estado.right(pos)
# sufixo encontrado, sorteia o próximo valor
var x = sel(sufix)
estado += x
return x
v
# Programa principal, cria a árvore e gera uma string
func _init():
randomize()
var st = Tree.new(tree)
st.disparo()
for i in range(1,100):
printraw(st.prox())
print()
print(tree.to_json())
quit()