-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.hsp
75 lines (60 loc) · 1.8 KB
/
main.hsp
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
rule_code = 30
;mes "Wolfram code : " + rule_code
dim rule, 8
/*ルールの生成
2のcnt乗のビットが1なら配列の対応する箇所に1を代入
ただのintである筈のモノをビットごとに切り出して配列にする*/
repeat 8
if rule_code and int(powf(2,cnt)) : rule(cnt) = 1
loop
/*状態遷移と表示
なんとも言えないので逐行解説する*/
cell_size = 1
size = ginfo_winx / cell_size
height = ginfo_winy / cell_size
dim cells, size
//真ん中に1を置く
cells(int(size/2)) = 1
//ランダム化
; randomize
; repeat size
; cells(cnt) = rnd(2)
; loop
//次のセルの状態を表す配列
dim tmp, size
//現在の表示座標
x = 0 : y = 0
font "", 8
repeat height
redraw 0
x = 0
//端点の処理
//1.反射的境界条件
//cells(0) = cells(1)
//cells(size - 1) = cells(size - 2)
//2.周期的境界条件
//cells(0) = cells(size-2)
//cells(size-1) = cells(1)
//3.固定的境界条件
//
repeat size - 2, 1
//出力
;mes cells(cnt),1
if cells(cnt) == 0 {
color 255, 255, 255
} else : cells(cnt) == 1 {
color 0, 0, 0
}
boxf x * cell_size, y * cell_size, x * cell_size + cell_size, y * cell_size + cell_size
//現在のセルと両隣とを抜き出して数にし、ルールから対応する0或いは1を次の状態に代入
tmp(cnt) = rule((cells(cnt - 1) * 4) + (cells(cnt) * 2) + (cells(cnt+1) * 1))
x += 1
loop
repeat size - 2, 1
//次が現在になる
cells(cnt) = tmp(cnt)
loop
//y座標に1を足す
y += 1
redraw 1
loop